1. 程式人生 > 其它 >ROS2學習之旅(5)——理解ROS2 Graph中的話題

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

ROS2中的話題...

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_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和命令列工具檢查話題上節點之間的連線。

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

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

未經允許,禁止轉載。