ROS(2)发布器和订阅器

  • Post author:
  • Post category:其他



发布器(publisher)和订阅器(subscriber)


———本质是节点


参考书籍《机器人操作系统浅析》



A


.普通程序的编写:



注意点:


1.roscpp一般需要 catkin_make package_name  roscpp


2.Cmakelist中修改


(1)find_package(catkinREQUIRED COMPONENTS package-names)


(2) 声明可执行文件 接下来,我们需要在CMakeLists.txt中添加两行,来声明我们需要创建的可执行文件。其一般形式是:


add_executable(executable-name source-files)


target_link_libraries(executable-name${catkin_LIBRARIES})


第一行声明了我们想要的可执行文件的文件名,以及生成此可执行文件所需的源文件列表。如果你有多个源文件,把它们列在此处,并用空格将其区分开。如果你的包中包括多个可执行文件,为每一个可执行文件复制和修改上述两行代码。


3.package.xml 申明依赖项


<build_depend>package-name</build_depend>


<run_depend>package-name</run_depend>


注:这边的package是include 里面用到的



程序组成



头文件

:include<ros/ros.h>



ros::init

函数初始化ROS客户端库。请在你程序的起始处调用一次该函数3。函数最后的参数是一个包含节点默认名的字符串。



ros::NodeHandle

(节点句柄)对象是你的程序用于和ROS系统交互的主要机制。





B


.发布器的编写:


程序组成:



1.头文件:

包括用到的message :,这个头文件的目的是定义一个C++类,此类和给定的消息类型含有相同的数据类型成员。


#include<package_name/type_name.h>



2.创建发布器对象

发布消息的实际工作是由类名为ros::Publisher的一个对象来完成的。类似下面这行的代码创建了我们需要的对象:


ros::Publisher pub =node_handle.advertise<message_type>(


topic_name,queue_size);


即包含了需要发布消息的类型,这个消息的载体(话题名),以及消息序列的大小


注意如果你想从同一个节点发布关于多个话题的消息,你需要为每个话题创建一个独立的ros::Publisher对象。



3.创建并填充消息对象

下一步,我们创建消息对象本身。当我们创建ros::Publisher对象时已经引用了消息类。对于消息类型的每个域,这个类都有一个可公共访问的数据成员



4. 发布消息

在所有的前期工作完成后,使用ros::Publisher对象的publish方法可以很简单地发布消息。例如下面所示:


pub.publish(msg);



5.控制消息发布频率


ros::Rate rate(2);


这个对象控制循环运行速度,其构造函数中的参数以赫兹(Hz)为单位,即每秒钟的循环数。这个例子创建了旨在规范每秒钟执行两个迭代循环的速率对象。邻近每次循环迭代的结尾,我们调用此对象的sleep方法:


rate.sleep();


***配置Cmakelist 和package.xml





C


.订阅器的编写:


大部分和发布器相同,都需要包含消息头文件



1.编写回调函数



发布和订阅消息的一个重要的区别是订阅者节点无法知道消息什么时候到达。为了应对这一事实,我们必须把响应收到消息事件的代码放到回调函数里,ROS每接收到一个新的消息将调用一次这个函数。订阅者的回调函数类似于:


void function_name(constpackage_name::type_name &msg)


{


. ..}


其中参数package_name 和type_name和发布消息时的相同,它们指明了我们想订阅的话题的消息类。注意订阅者的回调函数的返回值类型为void



2.创建订阅者对象



为了订阅一个话题,我们需要创建一个ros::Subscriber对象:ros::Subscriber sub = node_handle.subscribe (topic_name,queue_size,pointer_to_callback_function);



3.ROS控制权



:你的程序除了响应回调函数,还有其他重复性工作要做吗?如果答案是“否”,那么使用ros::spin();否则,合理的选择是写一个循环,做其他需要做的事情,并且周期性地调用ros::spinOnce()来处理回调。


Ros::spin()等价于


while(ros::ok())


{


ros::spinOnce();


}


***配置Cmakelist和package.xml



版权声明:本文为qq_35460250原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。