上一篇文章介紹了如何通過topic操作命令實現與機器人的交互,本篇我們介紹如何通過Message(即topic的下一級)實現與機器人的交互。
和topic一樣,首先在一個終端通過ssh命令登錄機器人、啟動機器人,然后打開另外一個終端執行操作命令。
1. Message操作命令
1.1 獲取Message操作命令機器詳解的語句
rosmsg --help
返回的內容,總共6種操作命令?
rosmsg is a command-line tool for displaying information about ROS Message types.Commands:rosmsg show Show message descriptionrosmsg info Alias for rosmsg showrosmsg list List all messagesrosmsg md5 Display message md5sumrosmsg package List messages in a packagerosmsg packages List packages that contain messagesType rosmsg <command> -h for more detailed usage
2. Message操作命令用法
2.1 命令格式
rosmsg show+消息
2.2 以雷達為例
繼續以/scan為例,它封裝的是雷達數據
在室內機器人移動導航過程中,激光雷達是很重要的傳感器,它時刻反饋機器人周邊的障礙物信息,在機器人建圖、定位、導航算法中起到重要的作用。
在提供的樹莓派固件中,已經編寫和編譯了ROS的激光雷達節點。
rostopic type /scan #查看雷達數據格式
sensor_msgs/LaserScan
?我們使用rosmsg show來獲取雷達數據內容
rosmsg show sensor_msgs/LaserScan
std_msgs/Header headeruint32 seqtime stampstring frame_idfloat32 angle_minfloat32 angle_maxfloat32 angle_incrementfloat32 time_incrementfloat32 scan_timefloat32 range_minfloat32 range_maxfloat32[] rangesfloat32[] intensities
Header : 是一個結構體,包含 seq、stamp、frame_id。
-
seq 掃描順序增加的 id 序列
-
stamp 激光數據的時間戳
-
frame-id 是掃描數據的名字
-
angle_min:開始掃描的角度
-
angle_max:結束掃描的角度
-
angle_increment:每次掃描增加的角度
-
time_increment:測量的時間間隔
-
scan_time :掃描的時間間隔
-
range_min:測距的最小值
-
range_max:測距的最大值
-
ranges:測量的距離數據,數組長度和雷達分辨率相關
-
intensities:與設備有關,輸出測距強度數據
3. Msaage和Topic的操作關系
至此我們已經把topic和message都進行了介紹,現在我們說明下兩者之間的操作關系。
通常來說先執行topic操作,再執行message操作,因為message是topic的子集。
以機器人雷達為例,首先需要 訂閱或確認 topic
,即定義數據傳遞的“頻道”。然后,發布消息 才能通過該頻道成功傳遞數據。這樣的操作順序確保了消息在系統中能夠有效流動。
為何先訂閱 topic
后發布消息?
-
消息的傳遞是基于訂閱的:
你可以把訂閱topic
看作是打開一個接收信道,消息必須通過該信道傳遞才能被正確接收。如果你在沒有訂閱topic
的情況下發布消息,系統就不知道應該把消息送給誰。換句話說,消息沒有目的地,無法到達消費者端。 -
話題創建是基礎:
在這個系統中,topic
就是雷達數據的專用通道。要確保消息能被正確分發,必須先確保topic
存在,且有正確的訂閱者。 -
確保系統協調:
如果一個模塊在訂閱topic
后,雷達模塊開始發布數據,那么在發布的同時,系統保證訂閱者可以實時收到這些消息。如果沒有預先訂閱,消息的接收者就會錯過或無法處理這些數據。
結合實際操作步驟
-
先定義
topic
(如果尚未存在),比如"radar/data"
。這告訴系統所有需要接收雷達數據的模塊可以訂閱這個 topic。 -
訂閱
topic
,比如機器人控制模塊、導航模塊、決策模塊會訂閱"radar/data"
,這樣它們就可以接收到雷達傳感器傳來的數據。 -
發布消息,雷達傳感器模塊將通過
topic
"radar/data"
來發布雷達數據。