目錄
一、ROS2節點
1.概念
2.實例
(1)ros2 run
(2)ros2 node list
(3)remapping重映射
(4)ros2 node info
二、話題
(1) ros2 topic list
(2) ros2 topic echo
?(3) ros2 topic info
(4)ros2 inerface show
?(5) ros2 topic pub
(6)ros2 topic hz
三、服務
(1) ros2 service list?
(2)ros2 services type
(3)ros2 service find
?(4)ros2 service call
一、ROS2節點
1.概念
? ? ? ? 在ROS2中,每個節點都負責單一模塊,不比如輪子的電機或者是傳感器的數據等。每個節點都可以接受和發送信息,這些信息通過話題,服務,動作或者是參數服務器進行傳遞。
? ? ? ? ?所有的機器人系統都由許都節點組成。在ROS2中每個可執行文件(C++程序或者python文件)可以保護多個或者單個節點。
2.實例
(1)ros2 run
ros2 run <package_name> <executable_name>
比如我們打開小海龜的功能包:
ros2 run turtlesim turtlesim_node
?其中turtlesim為功能包名稱,可執行程序的名稱為turtlesim_node。
(2)ros2 node list
如果我需要查詢目前運動的節點,可以直接使用該語句進行查找。
在終端中則會顯示:
(3)remapping重映射
? ? ? ? 節點重映射運行修改節點原始的屬性(名字,話題名,服務屬性等)
這里我們測試修改turtle_teleop_key
?的屬性。
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
這里將節點名稱修改為了:
/my_turtle
可以使用ros2 node list進行查看。
(4)ros2 node info
將剛剛重映射的話題,查看節點信息:
ros2 node info /my_turtle
有興趣的讀者可以查看一下原始節點的信息發現那里做出了更改。
二、話題
? ? ? ? ROS2將復雜的系統分解為多個模塊的節點,話題則是充當節點之間信息交換的總線。
節點可以將數據發布到任意數量的話題,并同時訂閱任意數量的話題。
使用rqt_graph我們可以清晰的看見節點和話題之間的關系。
打開小海龜和控制小海龜鍵盤的節點:
?/teleop_turtle節點發布數據給/turtle1/cmd_vel話題,這個話題將數據傳遞給/my_turtle節點。對于一個比較復雜的系統可以使用rqt很方便的看清楚程序內部話題節點信息接收關系。
(1) ros2 topic list
? ? ? ? 該語句可現實當前的話題,如果在指令的后面帶上-t選項則可以顯示出話題的類型
(2) ros2 topic echo
如果已知話題的名字,可以使用該語句輸出話題的信息在終端當中。
ros2 topic echo <topic_name>ros2 topic echo /turtle1/cmd_vel
如果此時你移動鍵盤方向鍵:
?(3) ros2 topic info
ros2 topic info /turtle1/cmd_vel
這個語句和node info類似,終端會輸出話題的類型發送和接受者的相關信息。
(4)ros2 inerface show
如果我們需要查詢一個話題使用的類型是有那些信息可以使用該語句,話題的類型可以通過
ros2 topic list -t
ros2 interface show geometry_msgs/msg/Twist
?(5) ros2 topic pub
同時我們也可以在終端中發布和修改話題,該語句的使用格式:
ros2 topic pub <topic_name> <msg_type> '<args>'
我們需呀知道話題的名稱,話題發布信息的類型,args則是按照話題的類型輸入的信息(ROS2中規定要以yaml的格式進行輸入)。
比如我希望小海龜x軸移動2,z軸旋轉1.8弧度。
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表示發布出這個信息后就退出。
可以看見小海龜轉動了1/4圈,當然如果你希望它一直旋轉則可以設置發布的頻率:
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表示這個話題以1HZ的形式進行發布,這樣我們可以看見小海龜一直在花圈運動。
當然最后你也可以去rqt_graph中查看話題和節點的變換。
(6)ros2 topic hz
?改語句在終端中輸出需要查詢話題的頻率。
ros2 topic hz /turtle1/pose
三、服務
????????服務通信是是ROS中的另一種通信方式。這種方式不同于發布于訂閱的方式,服務通訊可以理解為呼叫和響應的模型。多個節點使用同一個服務通信,只能是一個進行。
(1) ros2 service list?
運行該語句會再終端中輸出目前運行的服務通信:
可以看出一個節點中帶有6個參數的名字,在ROS2中幾乎大部分的服務都是這樣的結構。
同樣的如果在最后加上-t 則可以顯示出服務的類型。
(2)ros2 services type
該語句的作用是查看服務的類型。服務的類型類似于話題。服務有兩個部分組成:
信息的請求+響應
ros2 service type <service_name>
ros2 service type /clear
?Empty類型表示的是這個服務沒有發送任何請求和響應。
?
(3)ros2 service find
如果你知道服務使用的類型,想找到服務的名字則可以使用:
ros2 service find std_srvs/srv/Empty
?(4)ros2 service call
如果你知道服務的名字和類型,則可以調用這個服務:
#ros2 service call <service_name> <service_type> <arguments>
ros2 service call /clear std_srvs/srv/Empty
?如果你打開了小海龜的節點,并且使用鍵盤控制運行了一段軌跡。啟動這個服務會發現小海龜走的路徑都被清除了。
同時我們可以再對/spawn進行操作
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
?我們再次調用/spawn這個服務,并且在小海龜串口中再生成一只,同時指定了小海龜的位姿。
服務的小總結:
對比話題:話題可以一對多,一個發布者多個訂閱者。服務式一種請求/響應模式,客戶端提出請求,服務段生成響應。是只能單獨進行的。
未完待更新...