ros程序源码分析1--message篇
ros本地的安装目录为opt/ros/kinetic
ros.h所在绝对路径opt/ros/kinetic/include/ros/ros.h
代码中使用#include “ros/ros.h”
ros.h中的源码
ros.h是一个头文件集合,包含所需的所有基础头文件。
String.h位于include/std_msgs/String.h,std_msgs下都是内建基础类型,String.h
内容比较多,注意String实际是一个别称,它的全称是::std_msgs::String_<std::allocator<void> >
定义的语句是typedef ::std_msgs::String_<std::allocator<void> > String;
String有一个成员是data,用来存数据。注意String定义的对象一定要用它的data成员来存放数据。
以及包含一些运算符重载,更多的内容就看不懂了
ros::init() ROS节点初始化函数
有三种重载形式,ros源代码中的重载大部分都是顶层调用同名底层。1调用2,2调用3.
ros::init中有network::init、master::init、this_node::init、file_log::init、param::init。
使用NodeHandle接口时使用此种参数形式,第四个参数options缺省(3个选择)。
NodeHandle是句柄类,在ros/node_handle.h中定义,最主要是很多函数集合,本身数据很少(命名空间名之类).
是roscpp用于创建订阅者和发布者等的接口。必须在使用前用ros::init()实例化。
NodeHandle下的advertise方法返回一个Publisher对象,携带要发布的topic。
结尾的advertise是下面这种重载形式,功能在注释中。
Publisher是ros/publisher.h中定义的一个类,其中有重载的publish方法,只传递一个msg信息就可以进行发布。
ros::ok()定义在init.cpp中的一个函数,定义如下
g_ok初始默认为false,经过init()后变为true,当程序遇到shutdown()时g_ok变为false。
ok()用来判定程序是否应该继续运行。
ROS_INFO()相当于c中的printf,ROS_INFO_STREAM()相当于c++中的cout。
源码未找到。
ros_Rate为ros/rate.h中定义的类,构造函数需要一个频率数据,常用的是其两个公共方法sleep()和reset();
ros::spinOnce()和ros::spin()都是ROS消息回调函数,用于处理callback函数
消息发布器在一个while里面一直循环发送“hello world”到topic上。消息订阅器一旦知道chatter上面有data,就会将这data作为参数传入callback函数中,但是此时还没有执行callback函数,而是把callback函数放到了一个回调函数队列中。所以当发布器不断发送data到chatter上面时,就会有相应的callback函数进入队列中,它们函数名一样,只是实参不一样。。
当spinOnce函数被调用时,spinOnce就会调用回调函数队列中第一个callback函数,此时callback函数才被执行,然后等到下次spinOnce函数又被调用时,回调函数队列中第二个callback函数就会被调用,以此类推。
所以,这会有一个问题。因为回调函数队列的长度是有限的,如果发布器发送数据的速度太快,spinOnce函数调用的频率太少,就会导致队列溢出,一些callback函数就会被挤掉,导致没被执行到。
而对于spin函数,一旦进入spin函数,它就不会返回了,相当于它在自己的函数里面死循环了。只要回调函数队列里面有callback函数在,它就会马上去执行callback函数。如果没有的话,它就会阻塞,不会占用CPU。
(本大段是粘贴自其他博客)
Subscriber是ros/subscriber.h中定义的类,内容不多,初级也不需要显式用到里面的成员。
NodeHandle类中的subscribe()方法对应advertise(),用来订阅,也定义在ros/node_handle.h中,
@font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋体"; }@font-face { font-family: "Calibri"; }p.MsoNormal { margin: 0pt 0pt 0.0001pt; font-family: Calibri; }span.msoIns { text-decoration: underline; color: blue; }span.msoDel { text-decoration: line-through; color: red; }div.Section0 { }