7.理解ROS服務與引數
注意:本教程翻譯的日期是2018.9.12,wiki.ros.org可能會有更新,如語意有差異請以官網英文原版為準,我是不負澤任的。
教程等級:初學者
內容 |
---|
1.ROS 服務 |
2.使用rosservice |
1.rosservice list |
2.rsoservice type |
3.rsoservice call |
3.使用 rosparam |
1.rosparam list |
2.rsoparam set與 rosparam get |
3.rosparam dump與 rosparam load |
假設你的turtlesim_node仍然從上一個教程中正在執行,讓我們看看turtlesim提供什麼服務:
1.ROS 服務
Service是另外一種節點之間可以相互溝通的方式。service允許節點發送request與接收response。
2. 使用rosservice
rosservice可以很容易地將service附加到ROS的使用者/服務框架上。rosservice有許多可以用在話題上的指令 ,如下所示:
用法:
rosservice list print information about active services rosservice call call the service with the provided args rosservice type print service type rosservice find find services by service type rosservice uri print service ROSRPC uri
2.1 rosservice list
$ rosservice list
List命令向我們展示了turtlesim節點提供九個服務:reset, clear, spawn, kill, turtle1/set_pen,/turtle1/teleport_absolute,/turtle1/teleport_relative, turtlesim/get_loggers, and turtlesim/set_logger_level.
/clear /kill /reset /rosout/get_loggers /rosout/set_logger_level /spawn /teleop_turtle/get_loggers /teleop_turtle/set_logger_level /turtle1/set_pen /turtle1/teleport_absolute /turtle1/teleport_relative /turtlesim/get_loggers /turtlesim/set_logger_level
讓我們更加接近地看看使用rosservice type的clear服務:
2.2 rosservice type
用法:
rosservice type [service]
讓我們找找clear服務是什麼型別:
$ rosservice type /clear std_srvs/Empty
這個服務是空的,意味著當服務被喚醒的時候,將不會有任何arguments(這就是說它請求的時候不傳送資料,收到回覆的時候不接收資料)。我們稱這種服務使用rosservice call:
2.3 rosservice call
用法:
rosservice call [service] [args]
這兒我們將不用arguments召喚,因為服務是空型別的:
$ rosservice call /clear
結果如我們所預期的,turtlesim_node的背景被清除了。
讓我們看看服務有arguments的情況,通過看看服務結果的資訊:
$ rosservice type /spawn | rossrv show float32 x float32 y float32 theta string name — string name
這個服務讓我們在給定的位置與方向產生了一隻新的turtle。名字域是可選的,所以我們不給我們的新的turtle名字,讓turtlesim為我們創造一個。
$ rosservice call /spawn 2 2 0.2 “”
這個服務召喚返回了新創造的turtle的名字
name:turtle2
我們的turtlesim應該如下所示:
3.使用 rosparam
Rosparam允許你在ROS Parameter Server儲存和操縱資料。parameter server可以儲存整形,浮點,邏輯,詞典和列表。rosparam使用YAML標記語言。在一些簡單的例子中,YAML看起來非常自然:1是一個整形,1.0是一個浮點型,one是一個字串,true是邏輯,【1,2,3】是整形的列表,{a:b,c:d}是詞典。rosparam有許多命令,可以使用在parameter使用,如下所示:
用法:
rosparam set set parameter rosparam get get parameter rosparam load load parameters from file rosparam dump dump parameters to file rosparam delete delete parameter rosparam list list parameter names
讓我們看看param server上現在有什麼引數.
3.1roaparam列表
$ rosparam list
這兒我們可以看見turtlesim節點在param server上有三個引數,對於背景顏色:
/background_b /background_g /background_r /rosdistro /roslaunch/uris/host_57aea0986fef__34309 /rosversion /run_id
讓我們使用rosparam set改變其中一個引數的值:
3.2 rosparam set和rosparam get
用法:
rosparam set [param_name] rosparam get [param_name]
這兒我們會改變背景顏色到紅色:
$ rosparam set /background_r 150
這個改變了引數的數值,現在我們必須召喚clear服務來使引數改變起效果:
$ rosservice call /clear
現在我們的turtlessim看起來是這樣的:
現在讓我們看看param server中其他引數的值,讓我們得到綠色背景:
$ rosparam get /background_g 86
我們也可以使用rosparam get / 來向我們展示完整的parameter server的內容。
$ rosparam get / background_b: 255 background_g: 86 background_r: 150 roslaunch: uris: {‘aqy:51932’: ‘http://aqy:51932/‘} run_id: e07ea71e-98df-11de-8875-001b21201aa8
你可以期望儲存這些在一個檔案裡,這樣就可以下一次使用了。使用rosparam就很簡單:
3.3 rosparam dump和rosparam load
用法:
rosparam dump [file_name] [namespace] rosparam load [file_name] [namespace]
這兒我們寫引數進入params.yaml
$ rosparam dump params.yaml
你甚至可以載入這些yami檔案進入一個新的名稱空間,比如說copy:
$ rosparam load params.yaml copy $ rosparam get /copy/background_b 255