ROS2學習之旅(5)——理解ROS2 Graph中的話題
ROS2將複雜系統分解為許多模組化的節點,話題(topics)是ROS Graph中的一個重要元素,它充當節點傳遞訊息的匯流排。
節點可以釋出任意數量的話題,並可以同時訂閱任意數量的話題。話題是資料在節點之間(在系統的不同部分之間)移動的重要方式之一。
1.啟動節點
開啟終端並執行:
ros2 run turtlesim turtlesim_node
開啟另一個終端並執行:
ros2 run turtlesim turtle_teleop_key
此時,啟動了兩個節點turtlesim_node
和turtle_teleop_key
。
2.rqt_graph
通過rqt_graph
rqt_graph
。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_vel
向turtlesim
傳送資料,可以通過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 pub
以1 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
和命令列工具檢查話題上節點之間的連線。
如果給您帶來幫助,希望能給點個關注,以後還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。