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.hstd_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::initmaster::initthis_node::initfile_log::initparam::init

 

使用NodeHandle接口时使用此种参数形式,第四个参数options缺省(3个选择)

 

NodeHandle是句柄类,在ros/node_handle.h中定义,最主要是很多函数集合,本身数据很少(命名空间名之类).

roscpp用于创建订阅者和发布者等的接口。必须在使用前用ros::init()实例化。

NodeHandle下的advertise方法返回一个Publisher对象,携带要发布的topic

 

结尾的advertise是下面这种重载形式,功能在注释中。

 

Publisherros/publisher.h中定义的一个类,其中有重载的publish方法,只传递一个msg信息就可以进行发布。

 

 

ros::ok()定义在init.cpp中的一个函数,定义如下

g_ok初始默认为false,经过init()后变为true,当程序遇到shutdown()g_ok变为false

ok()用来判定程序是否应该继续运行。

 

ROS_INFO()相当于c中的printfROS_INFO_STREAM()相当于c++中的cout

源码未找到。

 

ros_Rateros/rate.h中定义的类,构造函数需要一个频率数据,常用的是其两个公共方法sleep()reset();

 

 

ros::spinOnce()ros::spin()都是ROS消息回调函数,用于处理callback函数

 

消息发布器在一个while里面一直循环发送“hello world”topic上。消息订阅器一旦知道chatter上面有data,就会将这data作为参数传入callback函数中,但是此时还没有执行callback函数,而是把callback函数放到了一个回调函数队列中。所以当发布器不断发送datachatter上面时,就会有相应的callback函数进入队列中,它们函数名一样,只是实参不一样。。

spinOnce函数被调用时,spinOnce就会调用回调函数队列中第一个callback函数,此时callback函数才被执行,然后等到下次spinOnce函数又被调用时,回调函数队列中第二个callback函数就会被调用,以此类推。

所以,这会有一个问题。因为回调函数队列的长度是有限的,如果发布器发送数据的速度太快,spinOnce函数调用的频率太少,就会导致队列溢出,一些callback函数就会被挤掉,导致没被执行到。

而对于spin函数,一旦进入spin函数,它就不会返回了,相当于它在自己的函数里面死循环了。只要回调函数队列里面有callback函数在,它就会马上去执行callback函数。如果没有的话,它就会阻塞,不会占用CPU

(本大段是粘贴自其他博客)

 

Subscriberros/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 { }

posted @ 2018-08-03 17:06  许氏Forwards  阅读(1213)  评论(1编辑  收藏  举报