一、ROS2 话题Topic 示意图


ROS2的Topic可以是一对一,一对多,多对一,多对多,同一个话题Topic可以被不同的节点Node订阅与发布

二、与ros1区别

topic下有多种命令,以下是ros1的topic命令:
可以看到和ros2的topic没有什么区别

Commands: rostopic bw display bandwidth used by topic rostopic delay
display delay of topic from timestamp in header rostopic echo print
messages to screen rostopic find find topics by type rostopic hz
display publishing rate of topic rostopic info print information about
active topic rostopic list 获取话题列表 list active topics rostopic pub
发布话题数据 publish data to topic rostopic type print topic or field type

三、ros2 topic

① ros2 topic list

输出当前存在的话题Topic列表

ros2 topic list
OUTPUT:
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

输出话题名同时输出话题类型

当添加 -t 后缀时将同时输出话题列表与各个话题的消息类型Message Type

ros2 topic list -t
OUTPUT:
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]

② ros2 topic echo

如果要查看topic list中某个具体的的话题正在发布的内容,可以使用ros2 topic echo + 话题名

ros2 topic echo /turtle1/cmd_vel
OUTPUT:
---
linear:x: 2.0y: 0.0z: 0.0
angular:x: 0.0y: 0.0z: 0.0
---
linear:x: 2.0y: 0.0z: 0.0
angular:x: 0.0y: 0.0z: 0.0
---

③ ros2 topic pub

pub可以在终端中直接发布命令,这在需要直接在命令行中简单输入即可调试时比较好用

ros2 topic pub <topic_name> <msg_type> '<args>'

不同的发布方式

单次发布
其中–once代表仅循环发布一次,然后退出,输入的结构内容是用yaml语法写的,因此在命令行中看起来比较繁杂。

ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
OUTPUT:
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

循环发布
在pub后加入 --rate 1,代表循环频率为1HZ

ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
OUTPUT:
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))publishing #2: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))publishing #3: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

④ ros2 topic info

info可以显示话题Topic的类型与多少个节点Node正在发布它与订阅它

ros2 topic info /turtle1/cmd_vel
OUTPUT:
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2

⑤ ros2 topic type

查看话题Topic的消息类型Message Type

ros2 topic type /turtle1/cmd_vel
OUTPUT:
geometry_msgs/msg/Twist

以下命令用的不多:

⑥ ros2 topic hz

查看话题Topic发布的平均频率HZ

ros2 topic hz /turtle1/cmd_vel
OUTPUT:
average rate: 1.000min: 1.000s max: 1.000s std dev: 0.00001s window: 2
average rate: 1.000min: 0.999s max: 1.000s std dev: 0.00030s window: 4
average rate: 1.000min: 0.999s max: 1.000s std dev: 0.00025s window: 6
average rate: 1.000min: 0.999s max: 1.001s std dev: 0.00042s window: 7

⑦ ros2 topic bw

查看话题所占用的带宽

ros2 topic bw /turtle1/cmd_vel
OUTPUT:
91 B/s from 3 messagesMessage size mean: 52 B min: 52 B max: 52 B
153 B/s from 8 messagesMessage size mean: 52 B min: 52 B max: 52 B
126 B/s from 9 messagesMessage size mean: 52 B min: 52 B max: 52 B
198 B/s from 18 messagesMessage size mean: 52 B min: 52 B max: 52 B
191 B/s from 21 messagesMessage size mean: 52 B min: 52 B max: 52 B
186 B/s from 24 messagesMessage size mean: 52 B min: 52 B max: 52 B

⑧ ros2 topic find

由消息类型Message Type 反查消息类型为该类型Type的话题Topic

ros2 topic find geometry_msgs/msg/Twist
OUTPUT:
/turtle1/cmd_vel

⑨ ros2 topic delay

delay Display delay of topic from timestamp in header

四、查看Message Type的具体结构

当要查看具体消息类型Message Type的结构时,可以使用如下命令:

ros2 interface show geometry_msgs/msg/Twist
OUTPUT:
Vector3  linearfloat64 xfloat64 yfloat64 z
Vector3  angularfloat64 xfloat64 yfloat64 z

五、Topic机制

在ROS2中已经没有了Master的概念,避免master挂了,以提升系统的稳定性

六、发布者Publisher

1.新建功能包

ros2 pkg create --build-type ament_python py_pub_sub

2.新建源码文件

在py_pub_sub功能包的py_pub_sub文件夹下新建源码文件publisher_member_function.py

touch publisher_member_function.py

3.编写源码

ros2中提供的消息接口可以通过以下命令来查看

ros2 interface list

进而查看具体的消息类型的结构

ros2 interface show std_msgs/msg/String
OUTPUT:
# This was originally provided as an example message.
# It is deprecated as of Foxy
# It is recommended to create your own semantically meaningful message.
# However if you would like to continue using this please use the equivalent in example_msgs.string data

编写步骤

编写步骤:
1.编程接口初始化
2.创建节点并初始化
3.创建发布者对象
4.创建话题并填充话题消息
5.发布话题消息
6.销毁节点并关闭接口

示例源码

import rclpy # rclpy是ROS Client Library for Python的缩写,与Node有关的内容在这个库中
from rclpy.node import Node
from std_msgs.msg import String # std_msgs是ROS内置的数据类型库,里面有msg、srv等一系列基础的数据类型 class MinimalPublisher(Node): # Node为这个类的父类def __init__(self):super().__init__('minimal_publisher') # 调用父类中Node的构造函数,在此处直接为其赋名minimal_publisher# 创建publisher,数据类型为String,话题名为topic_name, 队列长度为10,它是QoS (quality of service) setting之一self.example_publisher = self.create_publisher(String, 'topic_name', 10)   # 创建发布者对象     timer_period = 0.5  # 定时器周期 in secondsself.timer = self.create_timer(timer_period, self.timer_callback) # 创建定时器 每个周期调用一次回调函数self.timer_callbackself.i = 0 # 用于回调函数的一个计数器counterdef timer_callback(self): # 定时器的回调函数msg = String() # 定义消息类型为String类msg.data = 'Hello World: %d' % self.i # 添加消息内容self.example_publisher.publish(msg) # 发布消息self.get_logger().info('Publishing: "%s"' % msg.data) # 可选的打印日志到控制台consoleself.i += 1# 上面的部分为类内容
# 下面的部分是main函数
def main(args=None): # 主函数rclpy.init(args=args) # 初始化 rclpyminimal_publisher = MinimalPublisher() # 定义MinimalPublisher类rclpy.spin(minimal_publisher) # 循环# Destroy the node explicitly# (optional - otherwise it will be done automatically# when the garbage collector destroys the node object)minimal_publisher.destroy_node() # 可以不写,会自动执行rclpy.shutdown() #关闭if __name__ == '__main__': # 该条下的所有代码仅当本脚本直接执行时会触发,如果在其他文件引用本文件,则不会触发以下的代码main()

4.添加依赖

在功能包目录下打开package.xml,修改以下内容[可选,不影响使用]
例子:

<description>Examples of minimal publisher/subscriber using rclpy</description>
<maintainer email="hermanye233@icloud.com">Herman Ye</maintainer>
<license>Apache License 2.0</license>

继续添加内容[必须]
当功能包里的代码被执行时,这些语句声明了功能包的依赖

<exec_depend>rclpy</exec_depend>
<exec_depend>std_msgs</exec_depend>

5.添加入口点

打开setup.py,添加入口点

maintainer='Herman Ye',
maintainer_email='hermanye233@icloud.com',
description='Examples of minimal publisher/subscriber using rclpy',
license='Apache License 2.0',

在entry_points下的这个位置添加以下命令

'talker = py_pub_sub.publisher_member_function:main',

最终效果:

entry_points={'console_scripts': ['talker = py_pub_sub.publisher_member_function:main',],
},

6.检查setup.cfg

setup.cfg是自动填写的,它将功能包的可执行文件放入lib中,ros2 run将会在lib中查找这些执行性文件是否存在并调用

[develop]
script_dir=$base/lib/py_pub_sub
[install]
install_scripts=$base/lib/py_pub_sub

七、订阅 subscription

1.新建源码文件

在功能包src文件夹下新建源码文件pose_subscriber.cpp

touch pose_subscriber.cpp

2.编写源码

编写步骤

1.编程接口初始化
2.创建节点并初始化
3.创建订阅者对象
4.通过回调函数处理话题数据
5.销毁节点、关闭接口
源码部分注释同publisher

示例源码

import rclpy
from rclpy.node import Nodefrom std_msgs.msg import String class MinimalSubscriber(Node):def __init__(self):super().__init__('minimal_subscriber')# 订阅者的构造函数和回调函数不需要定时器Timer,因为当收到Message时,就已经启动回调函数了# 注意此处不是subscriber,而是subscription# 数据类型,话题名,回调函数名,队列长度self.subscription = self.create_subscription(String,'topic_name',self.listener_callback,10)self.subscription  # prevent unused variable warningdef listener_callback(self, msg):self.get_logger().info('I heard: "%s"' % msg.data) #回调函数内容为打印msg.data里的内容def main(args=None):rclpy.init(args=args)minimal_subscriber = MinimalSubscriber()rclpy.spin(minimal_subscriber)# Destroy the node explicitly# (optional - otherwise it will be done automatically# when the garbage collector destroys the node object)minimal_subscriber.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

3.添加依赖

因为之前添加过了,所以不用再添加,如果subscriber有额外要使用的库,则需要添加新增的库

4.添加入口点

打开setup.py,添加入口点
在entry_points下的这个位置添加以下命令

'listener = py_pub_sub.subscriber_member_function:main',

最终效果:

    entry_points={'console_scripts': ['talker = py_pub_sub.publisher_member_function:main','listener = py_pub_sub.subscriber_member_function:main',],},

ros2 run 在功能包中所能观测到的可执行文件的名字即此处设置的talker与listener

八、测试发布-话题-订阅通信

1.编译

colcon build --packages-select py_pub_sub

2.运行测试

ros2 run py_pub_sub listener
ros2 run py_pub_sub talker

ROS2教程 04 话题Topic相关推荐

  1. ROS2入门教程—理解话题(Topic)

    ROS2入门教程-理解话题(Topic) 1 启动小海龟仿真器 2 rqt_graph 3 ros2 topic list 4 ros2 topic echo 5 ros2 topic info 6 ...

  2. 【一学就会的ROS基础入门教程 】03-1 ROS基础编程:ROS工作空间的创建、话题topic的发布与接收、以及话题消息的自定义使用

    [一学就会的ROS基础入门教程 ]03-1 ROS基础编程:ROS工作空间的创建.话题topic的发布与接收.以及话题消息的自定义使用 文前白话 1.创建工作空间与功能包 关于工作空间的介绍 创建开发 ...

  3. ROS2 基础概念 话题

    ROS2 基础概念 话题 1. Topics 2. rqt_graph 3. 话题 4. 话题类型 5. 话题发布 6. 话题频率 1. Topics 话题是节点交换消息的总线 节点可以向任意数量的话 ...

  4. [译]Vulkan教程(04)基础代码

    [译]Vulkan教程(04)基础代码 General structure 通用结构 In the previous chapter you've created a Vulkan project w ...

  5. 【OpenCV DNN】Flask 视频监控目标检测教程 04

    欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中 [OpenCV DNN]Flask 视频监控目标检测教程 04 3.4 用Flask构建流媒体服务器 3.4.1 流媒体服务器基本 ...

  6. 计算机硬件 系统安装维护教程 04系统安装-Win-04:Windows To Go便携式系统U盘制作

    文章目录 什么是Windows To Go WTG支持哪些系统 WTG设备性能判定 WTG设备选择 制作WTG [推荐]使用WTGA 使用Dism++ 使用Rufus 什么是Windows To Go ...

  7. ArcGIS二次开发基础教程(04):有关字段的操作和简单属性及空间查询

    ArcGIS二次开发基础教程(04):有关字段的操作和简单属性及空间查询 属性 字段的添加.删除和查找 IFeatureLayer GetLayerByName(string name) {ILaye ...

  8. Linux汇编教程04:寻址方式

    Linux汇编教程04:寻址方式 这一节,我们主要来讨论寻址方式,这一点十分重要. 我们上一节有稍微提了一下,内存地址引用的通用格式: 地址或偏移(%基址寄存器, %索引寄存器, 比例因子 ) 结果地 ...

  9. 【CC2530入门教程-04】CC2530的定时/计数器原理与应用

    [CC2530入门教程-06]CC2530的ADC工作原理与应用 [CC2530入门教程-05]CC2530的串行接口原理与应用 [CC2530入门教程-04]CC2530的定时/计数器原理与应用 [ ...

最新文章

  1. v$open_cursor与session_cached_cursor
  2. python comprehensions_python 列表生成式 List Comprehensions
  3. 华为旗舰陆续升级鸿蒙系统,华为鸿蒙重磅来袭:今年4月起 华为旗舰手机将陆续升级鸿蒙系统!...
  4. 团队-科学计算器-成员简介及分工
  5. 【控制】影响系统响应的因素
  6. 网络模型和TCP协议族
  7. 使用css制作三角,兼容IE6,用到的标签divsspan
  8. mysql int(3)_MySQL中int(11)与int(3)的区别_MySQL
  9. Spring学习总结(31)——Spring Bean 生命周期总结
  10. 关于项目中一些时间转换的问你题 -紫叶and妍
  11. 宠物兽医体层摄影术行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  12. J2EE视频实战教程网址
  13. 回文字符串判断以及最长回文字符串长度判断
  14. 苹果 macOS 系统键盘快捷键列表大全整理
  15. 思维导图与知识树的区别
  16. b和kb的换算_kb和b换算(b kb mb换算)
  17. 计算机c盘如何扩容,C盘空间不足怎么办?4种方法获得更多空间!
  18. 检查字符串是否为合法的日期格式
  19. 各个CPU品牌介绍及散片和盒装CPU区别方法简介
  20. c语言万年历一行打印两个月,万年历 c语言 两月一行

热门文章

  1. MicroPython开发实例之TurniBit开发板DIY自动窗帘模拟系统
  2. UltraISO绿色版虚拟光驱(带注册码)
  3. 清华大学胡事民是计算机视觉,清华团队将Transformer用到3D点云分割上后,效果好极了丨开源...
  4. 朋友合作怎么迈过利益这道坎
  5. 【模型评价指标】分析模型评价常用指标
  6. 情报学的主要学术期刊
  7. 广东省工业和信息化厅财政专项资金支持项目验收管理办法通知
  8. html设置边框颜色
  9. MFC字体磅数与像素CImage
  10. 总结:堡垒机和跳板机