ROS2—理解话题(Topic)

大道至简,ROS2将复杂的机器人系统拆解成许多模块节点,而这些节点之间则是通过一个至关重要的通道完成数据交换的,这个通道就是“话题”。

一个节点可以通过多个话题向外发布数据,也可以同时订阅多个其他节点发布的话题,相当于话题是一个多对多的订阅/发布模型。

  可见,话题是节点之间实现数据传输的重要途径,也是机器人各个子系统之间交换数据的重要方式。  

1.启动小海龟仿真器

还是先来启动小海龟仿真器吧,相信你已经很熟练了:

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

  没错,你现在应该可以用键盘控制小海龟移动啦。

2.rqt_graph

在ROS1中我们就极力推荐rqt_graph这个工具,可以从上帝视角看到整个系统的状态,ROS2中依然如此,我们还是使用这个工具来可视化显示节点和话题的连接关系。   在一个新的终端中,输入

rqt_graph

  看到熟悉的界面,里边清晰的展示了ROS计算图的网络形态。  

  先忽略图中的action,把鼠标放置到中间的话题上,可以立刻看到高亮效果,清晰的展示了该话题的发布者和订阅者。话题/turtle1/cmd_vel的发布者是teleop_turtle节点,而订阅者是turtlesim节点,这个话题中传输的数据就是我们按下键盘之后形成的速度指令。   在更加复杂的机器人系统中,rqt_graph工具可以帮助我们快速理清节点之间通过话题的牵连。  

3.ros2 topic list

当前系统中所有的话题如何查看呢,不如来试下这个命令:

ros2 topic list

 

  不清楚这些话题传输的是什么数据,没问题,这个命令试一下:

ros2 topic list -t

  这回我们不仅可以看到所有话题的列表,还可以清晰的看到每个话题传输的数据类型是什么。

4.ros2 topic echo

如果想看到节点之间的话题到底发了什么数据内容,可以这样:

ros2 topic echo <topic_name>

  我们现在好奇键盘节点到底给小海龟发了什么,小海龟这么听话的动起来呢?

ros2 topic echo /turtle1/cmd_vel

  输入之后可能暂时看不到任何内容,这是因为我们还没有发布数据,在运行键盘控制节点的终端中点击键盘,很快就可以看到数据啦:  

  原来键盘控制节点将点击的键盘按键变成了线速度和角速度,通过话题发送给海龟仿真器,海龟才动起来的。  

5.ros2 topic info

  类似查看节点的详细信息一样,我们也可以用如下命令查看话题的详细信息:

ros2 topic info /turtle1/cmd_vel

  就可以看到详细信息啦:  

 

6.ros2 interface show

节点之间要想成功建立数据传输,必须发布和订阅同样数据类型的消息,发布者发布的是速度指令,订阅者想订阅位置信息可是行不通的。如何查看话题的数据类型呢?使用刚才说的这个命令就可以啦:

ros2 topic list -t

  可以看到, cmd_vel 话题的消息类型是:

geometry_msgs/msg/Twist

  熟悉ROS1的小伙伴应该并不陌生,这就是在ROS中常用的标准速度指令,以上内容表示在geometry_msgs包的msg中有一个数据类型Twist。   这个数据类型的具体数据结构什么样的,继续通过如下指令看一下:

ros2 interface show geometry_msgs/msg/Twist

 

  原来Twist中包含了两个三维向量,分别表示线速度和角速度。  

7.ros2 topic pub

现在我们了解了消息的结构,有没有可能直接通过命令行来发布一个话题消息呢?当然是可以的。

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

  这里的 '<args>'就是具体的消息内容啦,我们需要使用YAML的语法来描述,比如要发布速度指令Twist:   --once表示这个消息只发布一次就退出。   终端中会出现如下提示:  

  小海龟也会动起来啦:  

  如果希望小海龟一直运动,那就得以某个频率持续发布:

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}}"

  --rate参数就表示频率啦,单位是hz  

 

8.ros2 topic hz

如果我们想查看某一个话题的发布频率,依然可以通过命令行来实现:

ros2 topic hz /turtle1/pose

  很快就可以看到turtlesim节点发布pose话题的频率啦:  

  好啦,Ctrl+C即可关闭运行的终端内容。  

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我知道你想了解ROS中的发布和订阅话题。在ROS中,节点之间通过话题Topic)来进行通信,话题是一种发布者-订阅者(Publisher-Subscriber)模式的通信机制。 节点可以发布一个话题,其他节点可以订阅该话题以接收发布者发布的消息。消息可以是任何类型的数据,比如图像、激光数据、传感器数据等。 下面是ROS中发布和订阅话题的基本步骤: 1. 创建一个发布者或订阅者对象,指定话题名称和消息类型。 2. 启动节点,开始发布或订阅该话题。 3. 发布者将消息发布到话题中,订阅者从话题中接收消息。 例如,在Python中创建一个发布者对象的代码如下: ```python import rospy from std_msgs.msg import String rospy.init_node('publisher_node') pub = rospy.Publisher('my_topic', String, queue_size=10) ``` 这个例子创建了一个名为"publisher_node"的节点,创建了一个名为"my_topic"的话题,并指定了消息类型为String。queue_size指定了发布者的消息缓冲队列大小。 然后,我们可以在节点中调用发布者的publish()方法来发布消息,例如: ```python msg = String() msg.data = "Hello, ROS!" pub.publish(msg) ``` 这个例子发布了一个值为"Hello, ROS!"的字符串消息到"my_topic"话题中。 同样地,我们可以在Python中创建一个订阅者对象的代码如下: ```python import rospy from std_msgs.msg import String def callback(msg): rospy.loginfo("Received message: %s", msg.data) rospy.init_node('subscriber_node') sub = rospy.Subscriber('my_topic', String, callback) rospy.spin() ``` 这个例子创建了一个名为"subscriber_node"的节点,创建了一个名为"my_topic"的话题,并指定了消息类型为String。callback函数是接收到消息后的回调函数,rospy.spin()用于让节点保持运行状态。 当订阅者接收到消息时,callback函数将被调用。例如,当我们运行上面的发布者代码时,将会在终端中看到类似如下的输出: ``` [INFO] [1630675978.253078]: Received message: Hello, ROS! ``` 希望这个例子能够帮助你理解ROS中发布和订阅话题的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值