ROS 命令列指令工具中除了有與節點相關的指令 rosnode
之外,也有包含與話題和服務相關的指令: rostopic
和 rosservice
。這一篇就來介紹這兩類指令該怎麼用。
首先是查看系統資訊的指令,包含查看話題列表、服務列表以及查詢訊息類型等。
rostopic list
查看話題列表使用 rostopic list
指令可以看到當前有哪些話題正在運作中,執行後的結果會類似這樣:
$ rostopic list
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
/rosout
和 /rosout_agg
:
上一篇已經介紹過 rosout
是一個日誌節點,而這兩個則是該節點的話題。前者會收集系統即時的日誌訊息(警告、錯誤、終端機輸出等);後者則是彙整(aggregate)系統中所有節點的日誌,用於事後整理或分析。
/cmd_vel
(command velocity):
這個話題用於控制烏龜機器人 turtle1
的速度。一般在想要控制機器人移動時,會透過向此話題發布指令來控制機器人移動。速度的訊息類型為 geometry_msgs/Twist
,這個消息類型包含:
直線速度(Linear Velocity):定義機器人在 X、Y 和 Z 軸上的直線速度。
角速度(Angular Velocity):定義機器人在每個軸上的旋轉速度。
/color_sensor
:
該話題傳輸烏龜機器人 turtle1
當前感應的顏色。
/pose
:
這個話題提供了 turtle1
當前的座標、面朝向角度、速度。
rosservice list
查看服務列表和話題一樣,也可以使用 rosservice list
會查詢當前可使用的服務,執行後的結果會類似這樣:
$ rosservice list
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level
/get_loggers
和 /set_logger_level
:
這兩個服務是由 rospy
和 roscpp
套件提供的,可以用來調整 ROS 系統或特定節點日誌記錄器的等級(Logger level),讓開發者可以自定義日誌輸出內容的詳細程度。
其他服務:
/reset
(重置烏龜到初始狀態)
/spawn
(生成新的烏龜)
/set_pen
(設置烏龜移動軌跡的顏色)
/clear
(清除軌跡)
/kill
(刪除烏龜)
/teleport_absolute
(絕對位置傳送)
/teleport_relative
(相對位置傳送)
rostopic type
和 rosservice type
顯示話題或服務的訊息類型如果想要了解某個話題或服務具體使用的訊息格式時,可以使用 rostopic type
和 rosservice type
這兩個指令來查詢,它們會告訴你特定話題或服務上使用的訊息類型(Message type)。
格式:
rostopic type <topic-name>
rosservice type <service-name>
例如對 /turtle1/cmd_vel
使用,它會告訴你 /cmd_vel
這個話題的訊息類型是 geometry_msgs/Twist
,這是在 geometry_msgs
(幾何訊息)的訊息類型,/Twist
表示直線速度和角速度,是機器人或無人機控制中的基本訊息格式。而對 /turtle1/pose
使用則會回傳 turtlesim/Pose
,這個是 TurtleSime 自定義的訊息類型。
$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
$ rostopic type /turtle1/pose
turtlesim/Pose
如果是對 /clear
使用,它會回傳 std_srvs/Empty
,這代表它是 std_srvs
(標準服務)中的訊息類型, /Empty
表示這個服務不需要傳遞任何資料即可運行。
$ rosservice type /clear
std_srvs/Empty
rosmsg show
顯示訊息類型的資料結構rosmsg show
這個指令會顯示訊息類型的資料結構,包括所有的數值格式(整數、浮點數或是字串),讓你知道這個訊息類型可以包含什麼形式的資訊。
格式:
rosmsg show <message_type>
例如對 geometry_msgs/Twist
使用,會得到 linear
(直線速度)和 angular
(角速度)這兩個資料,並且它們的資料類別是 geometry_msgs/Vector3
,代表每一個部分又包含三個軸向(x, y, z)的速度值,數值都是 float64
。
$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
這一篇寫完以後發現話題和服務的指令有點太多了,為了避免篇幅過長,所以這次就只先介紹了查詢相關的指令。下一篇再來介紹使用話題和服務的指令與節點進行互動。