ROS2學習之旅(5)——理解ROS2 Graph中的話題(Topic)


ROS2將復雜系統分解為許多模塊化的節點,話題(topics)是ROS Graph中的一個重要元素,它充當節點傳遞消息的總線。

節點可以發布任意數量的話題,並可以同時訂閱任意數量的話題。話題是數據在節點之間(在系統的不同部分之間)移動的重要方式之一。

1.啟動節點

打開終端並運行:

ros2 run turtlesim turtlesim_node

打開另一個終端並運行:

ros2 run turtlesim turtle_teleop_key

此時,啟動了兩個節點turtlesim_nodeturtle_teleop_key

2.rqt_graph

通過rqt_graph可以將節點和話題以及他們之間的連接可視化,安裝rqt所有插件時,即安裝了rqt_graph。rqt的安裝可以參考:rqt安裝

要運行rqt_graph,打開終端輸入並運行:

rqt_graph

同樣的,也可以打開rqt,選擇Plugins > Introspection > Nodes Graph進行添加。

此時,應該可以看到上面的節點和主題,以及圍繞圖形外圍的兩個動作(暫時忽略)。如果將鼠標懸停在主題中心,會看到像上面的圖片一樣的顏色高亮顯示。該圖描述了/turtlesim節點和/teleop_turtle節點是如何通過一個主題相互通信的,/teleop_turtle節點將數據(用於移動海龜的按鍵)發布到/turtle1/cmd_vel話題,/turtlesim節點訂閱該話題以接收數據。

rqt_graph的突出顯示特性在檢查通過許多不同方式連接的眾多節點和話題時非常有用,是一個圖形化的工具。

3.ros2 topic list

運行ros2 topic list命令,可以得到系統中當前所活躍的所有話題:

/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

ros2 topic list -t將返回相同的話題列表,話題類型被添加在括號后面:

/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]

話題具有名稱和類型兩種屬性。這些屬性,特別是類型,是節點之間在傳遞數據時知道它們正在討論相同信息的方式。如果想知道rqt_graph中所有的話題,可以取消Hide下的所有復選框:

4.ros2 topic echo

為了查看話題發送的數據,可以在終端運行:

ros2 topic echo <topiv_name>

如上所示,teleop_turtle通過話題/turtle1/cmd_velturtlesim發送數據,可以通過echo查看話題的具體數據:

ros2 topic echo /turtle1/cmd_vel

此時,不會返回任何數據,因為/teleop_turtle此時還未發布數據。返回到運行turtle_teleop_key的終端,並使用箭頭移動海龜。 觀察終端,會看到發布的每一個動作:

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

現在返回到rqt_graph並取消Debug復選框。

/_ros2cli_26646是運行的echo創建的節點(數字會改變),可以看到發布者正在通過cmd_vel話題發布數據,並且有兩個訂閱者。

5. ros2 topic info

話題不只是一對一的交流,它可以是一對多、多對一或多對多。可以通過info查看話題的屬性信息,在終端運行:

ros2 topic info /turtle1/cmd_vel

此時會返回:

Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2

6.ros2 interface show

節點使用消息(messages)通過話題發送數據。發布者和訂閱者必須發送和接收相同類型的消息進行通信。運行ros2 topic list -t之后可以看到每個話題發布的消息類型,或者通過info也可以獲得某一消息的類型,回想一下cmd_vel主題的類型:

geometry_msgs/msg/Twist

這表示在geometry_msgs包里,有一個msg叫做Twist

可以通過運行ros2 interface show <type>.msg查看消息的細節,特別是消息的數據結構。

ros2 interface show geometry_msgs/msg/Twist

此時,終端返回:

# This expresses velocity in free space broken into its linear and angular parts.

Vector3  linear
Vector3  angular

根據終端返回的信息,可以得到/turtlesim節點所期望的消息包含兩個向量(線性向量和角向量),每個向量有三個元素,這與/teleop_turtle通過echo命令傳遞給/turtlesim的數據結構是相同的:

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

7.ros2 topic pub

在已知消息結構之后,可以直接從命令行發布數據到話題,使用如下命令:

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

'<args>'參數是傳遞給話題的實際數據。
需要注意的是,這個參數需要以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}}"

--once是一個可選參數,意思是“發布一條消息然后退出”。

將在終端中收到以下消息:

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))

turtlesim此時顯示為:

小海龜(通常是要模擬的真正的機器人)需要一個穩定的命令流來進行連續操作。所以,為了讓小海龜繼續移動,可以在終端運行:

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

這里與上面的區別是刪除了--once選項和增加了--rate 1選項,這告訴ros2 topic pub1 Hz的頻率穩定發布命令。

刷新rqt_graph以圖形化方式查看發生了什么,可以看到ros 2 topic pub ...節點 (/_ros2cli_30358)在/turtle1/cmd_vel話題上發布,並且被兩個ros2話題ros2 topic echo ...節點(/_ros2cli_266461)和/turtlesim節點訂閱。

最后,可以在pose話題上運行echo並重新查看rqt_graph:

ros2 topic echo /turtle1/pose

在本例中,/turtlesim現在發布到pose話題,並由一個新的echo節點訂閱。

8.ros2 topic hz

可以使用以下方法報告數據發布的速率:

ros2 topic hz /turtle1/pose

它將返回關於/turtlesim節點向pose話題發布數據的速率。

average rate: 59.354
  min: 0.005s max: 0.027s std dev: 0.00284s window: 58

9.清理節點

不要忘記在每個終端中輸入Ctrl+C來停止節點運行。

10.總結

節點通過話題發布信息,允許任何數量的其他節點訂閱和訪問該信息。可以使用rqt_graph和命令行工具檢查話題上節點之間的連接。

如果給您帶來幫助,希望能給點個關注,以后還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。

都看到這了,點個推薦再走吧~

未經允許,禁止轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM