唐伯虎 发表于 2021-7-10 13:51:43

ROS开发 之 数据通信(话题)

  
概述
  ROS中通信方式有三种,分别为话题(msg)、服务(srv)和活动(action),其中话题属于基本的发布/订阅通信方式,适用于单个节点发布消息,一个或多个节点接受消息的情况;服务属于实时获取结果的情况,应用于请求/响应式的应用环境,类似于一个函数调用关系,适用于基本功能的调用或者状态的查看;活动属于无阻塞的执行方式,也应用于请求/响应式的环境,具有比服务更灵活的控制形式,并且在执 行的过程中可以对状态的反馈,适用于运行需要较长时间的情况。

话题说明
  话题是ROS的订阅/发布者模式,用于不同节点间进行通信,通信建立的中间桥梁是roscore,因此每次启动ros程序需要首先启动roscore。对于使用roslaunch启动的项目,如果没有启动roscore,则在roslaunch启动时会自动创建roscore,但随着roslaunch结束也会结束roscore,因此为了保持通信,建议将roscore进行独立启动,或者放置在主的roslaunch文件中。
  本文使用简单的发布和订阅程序做示例,可在下面例子中下载代码:https://github.com/zacSuo/vejoeRos,订阅和发布的顺序没有必然性,即使订阅一个没有发布的话题,ROS也不会报错,而是会进入阻塞状态等待发布者。
  另外,对于项目文件的编辑,可以进入目录使用vim或vi及其他编辑器,也可以在任意位置使用ros的编辑器rosed,其使用的核心也是vim,跟vim不同仅在调用中增加包名,ros会在对应的包下面找到对应的源码文件的。
  实验步骤:对应源码为(demo_subscriber.py,demo_publisher.py)
建立包:catkin_create_pkg vejoe_slam roscpp rospy std_msgs
代码拷贝:代码下载到包的源码文件中(/src)
启动主节点:roscore
启动发布程序:rosrun vejoe_slam demo_publisher.py
启动监听程序:rosrun vejoe_slam demo_subscriber.py
查看话题:rostopic info number_communicate  执行结果,如图所示

  左上角为话题信息,左下角为roscore启动信息,右上角为发布者程序,右下角为订阅者程序
  当然,还可以通过rqt_graph查看订阅之间的关系,如下图:

  同时,还可以直接通过rostopic的pub命令发布消息到该话题上,比如发送1000000给节点,查看结果如下,其中左上角为发布信息,左下角为订阅者信息,可以看到订阅者在7390和7391之间受到了一个数为1000000并打印了出来。


新建消息类型
  消息类型默认可以使用所有基本的数据类型(http://wiki.ros.org/msg#Fields),也可以创建自己的消息类型,创建了新的消息类型后,可以允许所有节点可以共同使用该数据类型进行通信,不过需要进行catkin_make来吧数据类型进行编译。消息类型是放置在包的msg目录下的.msg文件,本实验以个人信息(姓名,性别)作为新的数据类型作为演示,定义步骤如下:

[*] 创建目录:mkdir msg
[*]msg目录中创建文件:Personinfo.msg string name bool sex uint8 age
[*]为构建增加编译库:pakage.xml <build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
[*]为构建增加库说明:CMakeLists.txt find_package(#约在第10行 **** message_generation  #新增 ) catkin_package(#约在第105行 **** CATKIN_DEPENDS message_runtime #新增 ) add_message_files(#约在第50行 **** FILES Personinfo.msg  #新增 ) generate_messages(#约在第71行 ) #去掉注释以启用
[*]进入catkin根目录:cd ~/catkin_ws
[*]编译生成:catkin_make
[*]查看消息:rosmsg show Personinfo
[*]消息包里定义的消息:rosmsg package vejoe_slam 

  编译成功后,通过rosmsg来查看消息具体结果,并非必须步骤。需要强调的是,如果使用了自定义的消息类型,在修改数据类型后,需要执行catkin_make编译才能生效,否则ros依然使用之前的数据结构。下面部分将演示如何使用新定义的消息,基于前面的演示进行修改,对应源码为(demo_subscriber_person.py,demo_publisher_person.py)。

  左侧窗口为订阅者,右侧窗口为发布者

  
文档来源:51CTO技术博客https://blog.51cto.com/u_14819979/3030443
页: [1]
查看完整版本: ROS开发 之 数据通信(话题)