zoukankan      html  css  js  c++  java
  • 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 { }

  • 相关阅读:
    多线程中的wait与sleep到底谁释放了锁?
    Java并发编程:volatile关键字解析
    Spring的bean为什么是单例的?
    Java学习之反射
    Http && Https(绕过证书) 请求工具类 (Java)
    Java工具-检验ftp服务器的指定文件是否存在
    文件读取FileUtil工具类 亲测可用
    MyBatis 遇到的报错
    Mac终端 mysql Operation not permitted错误解决方案
    Kubernetes---修改证书可用年限
  • 原文地址:https://www.cnblogs.com/xuhaoforwards/p/9415198.html
Copyright © 2011-2022 走看看