延續Day11系統概念圖,今天和明天來挑戰介紹完Topic、Service、Action這三個通訊界面。
我自己最熟悉的是Topic,所以盡可能的多提一些遇到的Topic問題,另外兩個界面很少用到就依照官方教學帶過~
各節點之間最基礎的通訊方式,像是廣播電台一樣,主持人(publisher)負責播送最新消息,如警廣會即時回報路況,觀眾(subscriber)就可以隨時收聽。
如上所說,一個話題會能有一到多個訂閱者(subscriber)、一到多個發布者(publisher)、話題名稱、話題種類、發送的內容。這些都是可以被查詢的,有分別對應的ROS2指令。
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]
兩者的差別就是有沒有列出話題種類,話題種類是一個ROS2標準化的類型,有對應的訊息格式。
在自己撰寫節點時,這些資訊是非常重要的!
ros2 topic info <topic_name> #列出此話題的種類,訂閱者與接收者數量
ros2 topic info /turtle1/cmd_vel
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2
ros2 interface show <topic_type> #列出話題種類的格式(變數類別和變數名稱)
ros2 interface show geometry_msgs/msg/Twist
# This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
Vector3 angular
在terminal接收話題,直至指令被ctrl+c
。
ros2 topic echo <topic_name>
ros2 topic pub <topic_name> <msg_type> '<args>' #發布一個話題
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}}" #--rate 1 : 以1hz頻率發布
ros2 topic hz <topic_name> #回傳此消息的發布頻率
有些Topic的名稱前面還會有命名空間(/turtle1),如果沒有對應到正確的命名空間會接收或發布不了話題,不過我自己還沒透徹的了解,後續我在慢慢補充在這。
rviz2是一個ROS2提供的軟體,可以用來顯示3D視覺化的各種類話題。那我踩的這個坑和Qos有關,沒有設定好導致pointcloud2的資料一直沒有出現在rviz2中,害我以為是光達沒有設定好,浪費了很多時間調整,預計明天會仔細講講Qos。
本來想要在今天一次把Topic、Service、Action講完,但礙於一些現實因素,還是把Service、Action留到明天,因為沒有實際用過,解釋起來可能有點短,所以會在加上一些Qos的部份,和相關的坑XD