1. 程式人生 > >7.理解ROS服務與引數

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