在上一篇文章中,咱们实现了第一个ROS程序—发布器(publisher),然而在上一篇文章的最后咱们也注意到,尽管咱们的程序很是小,但占据的CPU资源却很是多。node
这是由于在发布器的while
循环里没有执行必要的sleep
操做,使得发布器一直以最高速率运行,长时间占用CPU。c++
本篇文章分为如下两部分:bash
sleep
调用使发布器的频率稳定在1Hz sleep
事实上,咱们所须要作的只有两行工做,首先建立一个ros::Rate
对象,而后在while
循环里调用该对象的.sleep()
函数便可。ide
修改后完整的代码以下:函数
#include <ros/ros.h> #include <std_msgs/Float64.h> int main(int argc, char **argv) { ros::init(argc, argv, "minimal_publisher"); // 初始化节点名 ros::NodeHandle n; // // ++++ ros::Rate s_timer(1.0); // 参数1.0表明发布频率即1.0Hz // ++++ ros::Publisher my_publisher_object = n.advertise<std_msgs::Float64>("topic1", 1); // 建立一个发布器,调用advertise通知ROS Master话题名称以及话题类型 //"topic1" 是话题名 // 参数 "1" 是queue_size,表示缓冲区大小 std_msgs::Float64 input_float; // 建立一个发布器将要使用的消息变量 // 该消息定义在: /opt/ros/indigo/share/std_msgs // 在ROS中发布的消息都应该提早定义,以便订阅者接收到消息后该如何解读 // Float64消息的定义以下,其中包含一个数据字段data: // float64 data input_float.data = 0.0; // 设置数据字段 // 程序所要作的工做将在下面的循环里完成 while (ros::ok()) { // 该循环没有sleep,所以将一直处于运行状态,不断消耗CPU资源 input_float.data = input_float.data + 0.001; //每循环一次+0.01 my_publisher_object.publish(input_float); // 发布消息到对应的话题 // ++++ s_timer.sleep(); // 在这里调用sleep函数可让程序在这里 // 中止一段时间以便达到要求的发布频率 // ++++ } }
将修改后的发布器从新进行编译,而后按照和上篇文章同样依次运行:post
roscore
再打开一个终端,运行spa
rosrun my_minimal_node my_minimal_publisher # 启动发布器
检查发布频率,运行3d
rostopic hz /topic1
能够看到此时发布器的发布频率已经基本稳定在1Hz
了。而后检查系统监视器的状态:code
也一样能够看到此时CPU的占用率已经降下来了。视频
首先将咱们提早修改好的订阅器代码复制到src
目录下,代码以下:
#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; }
而后和上篇文章同样,为了编译咱们刚写的订阅器,咱们还须要修改CMakeLists.txt
文件,以便让编译器知道应该编译咱们新增的文件。类比上篇文章的发布器,咱们在CMakeLists.txt
文件中加入以下两行:
add_executable(my_minimal_subscriber src/minimal_subscriber .cpp) # 第一个参数是生成后的可执行文件名 第二个参数 # 是源文件路径名 target_link_libraries(my_minimal_subscriber ${catkin_LIBRARIES}) # 连接库
打开终端,导航到工做区目录下~/catkin_ws
,而后执行命令
catkin_make
等待编译完成后,依次执行命令(这些命令都是在不一样的终端下输入)
roscore rosrun my_minimal_node my_minimal_publisher rosrun my_minimal_node my_minimal_subscriber
而后在订阅器的终端下就能够看出输出
运行命令rosnode list
检查节点
最后,能够运行命令
rqt_graph
来显示一个图形化的节点-话题链接图:
由上面的直观展现能够看出,消息由发布器流出到话题topic1
而后再流向订阅器。
以上全部过程我录制了一个视频,在浏览文章过程当中若是遇到问题,您能够查看视频来看看我是怎么作的。