服務(services)是節點之間通訊的另一種方式。服務允許節點發送請求(request ) 并獲得一個響應(response)
使用 rosservice
rosservice 可以很輕松的使用 ROS 客戶端/服務器框架提供的服務。rosservice 提供了很多可以在topic 上使用的命令,可以通過下列命令查看:
rosservice -h
rosservice list
輸出可用服務的信息,如打開 turtlesim_node:
roscore
rosrun turtlesim turtlesim_node
rosservice list
可以查看到 turtlesim 節點提供的服務:重置(reset), 清除(clear), 再生(spawn), 終止(kill)
等。
- 1.1 rosservice type
輸出服務類型 使用方法:
rosservice type [service]
我們來看看 clear 服務的類型:
rosservice type clear
結果顯示std_srvs/Empty
,即服務的類型為空(empty),這表明在調用這個服務是不需要參數(比如,請求不需要發送數據,響應也沒有數據)。 - 1.2 rosservice call
使用方法:
rosservice call [service] [args]
因為服務類型是空,所以進行無參數調用:
rosservice call clear
正如我們所期待的,服務清除了turtlesim_node
的背景上的軌跡。
對于帶參數的服務,比如再生(spawn)服務:
rosservice type spawn| rossrv show
根據結果這個服務可以在給定的位置和角度生成一只新的烏龜。名字參數是可選的,這里我們不設具體的名字,讓 turtlesim 自動創建一個。
rosservice call spawn 2 2 0.2 ""
2,使用 rosparam
rosparam 能夠存儲并操作 ROS 參數服務器(Parameter Server)上的數據。參數服務器能夠存儲整、型、浮點、布爾、字符串、字典和列表等數據類型。rosparam 使用 YAML 標記語言的語法。
- 2.1
rosparam list
列出參數名,執行此命令
可以看到 turtlesim 節點在參數服務器上有 3 個參數用于設定背景顏色,下列通過 set 參數來改變背景色 - 2.2
rosparam set, rosparam get
用法:rosparam set [param_name]
和rosparam get [param_name]
如使用 rosparam set 修改背景顏色的紅色通道:(rgb)
rosparam set background_r 150
上述指令修改了參數的值,現在我們調用清除服務使得修改后的參數生效:
rosservice call clear
再來使用 param get 查看參數服務器上的參數值 —— 獲取背景的綠色通道的值:
rosparam get background_g
特別地,如果想顯示參數服務器上的所有內容,可以執行下面命令rosparam get parameter_name
例如:rosparam get /background_r
如果想存儲這些信息以備今后重新讀取。這通過 rosparam 的 dump, load 參數很容易就可以實現。 - 2.3 rosparam dump, rosparam load
使用方法:
rosparam dump [file_name]
rosparam load [file_name] [namespace]
現在我們將所有的參數寫入 params.yaml 文件:
rosparam dump params.yaml
甚至可以將 yaml 文件重載入新的命名空間,比如說 copy 空間:
rosparam load params.yaml copy
通過 rosparam get 命令來驗證:
rosparam get copy/background_b
使用 rqt_console 和 roslaunch
- 使用 rqt_console 和 rqt_logger_level
rqt_console 屬于 ROS 日志框架(logging framework)的一部分,用來顯示節點的輸出信息。
rqt_logger_level 允許我們修改節點運行時輸出信息的日志等級(logger levels )(包括DEBUG、WARN、INFO 和 ERROR)。
現在讓我們來看一下 turtlesim 在 rqt_console 中的輸出信息,同時在 rqt_logger_level 中修改日志等級。在啟動 turtlesim 之前先在另外兩個新終端中運行 rqt_console 和 rqt_logger_level:
roscore
rosrun rqt_console rqt_console
rosrun rqt_logger_level rqt_logger_level
會看到彈出的兩個窗口 rqt_console , rqt_logger_level。
現在在一個新標簽頁中啟動 turtlesim:
rosrun turtlesim turtlesim_node
因為默認日志等級是 INFO,所以你會看到 turtlesim 啟動后輸出的所有信息,刷新一下
rqt_logger_level 窗口并選擇 Warn 將日志等級修改為 WARN。
現在我們讓 turtle 動起來并觀察 rqt_console 中的輸出:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]'
日志等級說明
修改后的日志等級按以下優先順序排列:
Fatal
Error
Warn
Info
Debug
Fatal 是最高優先級,Debug 是最低優先級。通過設置日志等級你可以獲取該等級及其以上優先等級的所有日志消息。比如,這里將日志等級設為 Warn 時,會得到 Warn、Error 和 Fatal 這三個等級的所有日志消息。
現在讓我們按 Ctrl-C 退出 turtlesim 節點,接下來我們將使用 roslaunch 來啟動多個 turtlesim 節點和一個模仿節點以讓一個 turtlesim 節點來模仿另一個 turtlesim 節點。
- 使用 roslaunch
roslaunch 可以用來啟動定義在 launch 文件中的多個節點。
用法:
roslaunch [package] [filename.launch]
先切換到 hello_test 程序包目錄下:
cd ~/test/devel
source setup.bash # 執行 devel 里的 setup.bash 腳本將這geworkspace 的信息配置到環境里面
roscd hello_test
然后創建一個 launch 文件夾:
mkdir launch
cd launch
- Launch 文件
現在我們來創建一個名為 turtlemimic.launch 的 launch 文件并復制粘貼以下內容到該文件里面:
<launch>
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
</launch>
- 使用 roslaunch
現在通過 roslaunch 命令來啟動 launch 文件:
roslaunch hello_test turtlemimic.launch
現在將會有兩個 turtlesims 被啟動,然后我們在一個新標簽頁中使用 rostopic 命令發送速度設定消息:
rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0,0.0, -1.8]'
會看到兩個 turtlesims 會同時開始移動,雖然發布命令只是給turtlesim1 發送了速度設定消息。
也可以通過 rqt_graph 來更好的理解在 launch 文件中所做的事情。運行rqt并在主窗口中選擇rqt_graph:
運行rqt_graph
到此,我們算是已經學會了rqt_console和roslaunch命令的使用.