a.编写一个ROS订阅器
我们在同样的程序包my_minimal nodes里创建这个节点源代码放在子目录src下。打开编辑器并在目录~/ros_ws/src/my_minimal_nodes/src中创建minimal_subscriber.cpp
文件,内容如下,代码内容也可以在文章最开始给出的github中找到。
#include<ros/ros.h> #include<std_msgs/Float64.h> void myCallback(const std_msgs::Float64& message_holder) { // 打印出我们接收到的值 ROS_INFO("received value is: %f",message_holder.data); } int main(int argc, char **argv) { ros::init(argc,argv,"minimal_subscriber"); //初始化节点 // 节点名定义为 minimal_subscriber ros::NodeHandle n; // 节点句柄,用来创建订阅器 // 订阅话题‘topic1‘ // subscribe中的mycallback是回调函数,每当有新数据到来时,该函数 // 便会被调用 // 实际的工作是在回调函数中完成的 ros::Subscriber my_subscriber_object= n.subscribe("topic1",1,myCallback); ros::spin(); // 类似于 `while(1)`语句,但是当有新消息到来时,会调用回调函数 return 0; }
最小订阅器中的大多数代码都与最小发布器中的相同(尽管在第11行,节点名已经变成("minimal_subscriber”) 。有四行重要的新代码行需要注意。
b.修改CMakeLists.txt
文件:
为了编译我们刚写的订阅器,我们还需要修改CMakeLists.txt
文件,以便让编译器知道应该编译我们新增的文件。类比上篇文章的发布器,我们在CMakeLists.txt
文件中加入如下两行:
add_executable(my_minimal_subscriber src/minimal_subscriber.cpp) # 第一个参数是生成后的可执行文件名 第二个参数是源文件路径名 target_link_libraries(my_minimal_subscriber ${catkin_LIBRARIES}) # 链接库
c.编译和运行订阅器:
打开终端,导航到工作区目录下~/catkin_ws,然后执行命令:
catkin_make
等待编译完成后,依次执行命令(这些命令都是在不同的终端下输入):
roscore rosrun my_minimal_nodes my_minimal_publisher rosrun my_minimal_nodes my_minimal_subscriber
在另一个终端,输入:
rosnode list //检查节点
运行命令:
rqt_graphs
生成了运行系统的图行显示,如下图所示。
由上面的直观展示可以看出,消息由发布器流出到话题topic1然后再流向订阅器。
该图形显示展示了两个节点。最小发布器节点显示为发布到topic1, 而最小订阅器显示为订阅了该话题。