ROS 2主題-topics-
- 2019 年 12 月 20 日
- 筆記
本節詳細介紹主題topic。
1. 如何理解主題topic:
ROS 2將複雜的系統分解為許多模組化的節點。主題是ROS圖(ROS graph)的重要元素,功能為節點交換消息的匯流排。節點可以將數據發布到任意數量的主題,與此同時,可以實現對任意數量主題的訂閱。主題是節點間數據交互的重要方式,同樣也適用於系統各種不同模組之間的交互。

2. 主題topic有哪些命令功能:
使用如下命令:
ros2 topic -h
顯示如下:

主要有:
- bw:顯示所查閱主題的頻寬
- delay:顯示延遲
- echo:輸出主題消息
- find:列出選定主題
- hz:輸出平均發布頻率
- info:顯示主題消息
- list:列出可使用的主題表
- pub:發布消息到主題
- type:輸出主題類型
3. 如何掌握主題topic
如之前一節學習類似,先打開turtlesim和teleop節點:
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
rqt_graph工具:

3.1 命令工具
在新終端中運行該命令ros2 topic list將返回系統中當前活動的所有主題的列表:

更詳細的功能:ros2 topic list -t
返回相同的主題列表,這次主題類型顯示在每個主題後面的括弧中:

主題具有名稱和類型。這些屬性(尤其是類型)是節點用於交互相同資訊的基礎。

3.2 顯示主題消息
要查看有關某個主題的發布數據,使用:
ros2 topic echo <topic_name>
例如:/turtle1/cmd_vel
ros2 topic echo /turtle1/cmd_vel
如果沒有消息,該命令不會返回任何數據。
點擊鍵盤方向左鍵。

3.3 顯示主題資訊
主題不必只是點對點的交互;它可以是一對多,多對一或多對多。
使用如下命令查閱主題狀態資訊:
ros2 topic info /turtle1/cmd_vel

一個發布,兩個訂閱,思考分別為哪些?
3.4 訂閱發布類型
節點使用消息通過主題發送和接收數據。發布者和訂閱者必須發送和接收相同類型的消息才能進行通訊。
上述主題對應的類似分別如下:
- /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]
其中,
geometry_msgs/msg/Twist
表示在在geometry_msgs
包中有一個msg
被稱為Twist。
可以運行此類型以了解其詳細資訊,特別是消息期望的數據結構。
ros2 interface show <type>.msg
如:
ros2 interface show geometry_msgs/msg/Twist.msg

3.5 發布主題消息
知道消息結構後,可以使用以下命令直接從命令行將數據發布到主題上:
ros2 topic pub <topic_name> <msg_type> "<args>"
該'<args>'
參數是傳遞給主題的實際數據。
注意,windows使用"<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
是一個可選參數,意思是「發布一條消息然後退出」。


更多參數:

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}}"
以1 Hz的頻率發布速度指令。

改變不同的角速度,可以畫出不同半徑的圓形軌跡。

顯示小烏龜目前的坐標資訊:
ros2 topic echo /turtle1/pose

3.6 主題頻率
查看主題消息發布的頻率使用如下命令:
ros2 topic hz /turtle1/pose
頻率約60hz左右,如下圖所示:

4. 關閉節點
很多節點在運行。不要忘記通過關閉終端窗口或在每個終端中輸入Ctrl+C
停止它們。
這些內容基本於ROS1相似,部分將rostopic更新為ros2 topic。