Advertisement

ROS 初级 - 服务和参数

阅读量:

1、ROS Services

ROS 服务是 ROS 提供的一种节点之间相互通信的方式,一个服务允许节点发送一个请求 request 或者接收一个响应 response。

2、rosservice

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

list 命令能够列出当前运行的节点提供的所有服务,让我们先来运行上一篇博客的小乌龟节点,先运行 roscore:

复制代码
    roscore
    
    
      
    

再开启一个新终端启动小乌龟节点,也可以在一个终端中分屏,参考这篇文章:

复制代码
    rosrun turtlesim turtlesim_node
    
    
      
    

然后使用 list 命令查看当前运行的小乌龟节点提供的服务:

复制代码
    rosservice list
    
    /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
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

你的输出应该跟上面类似,再来详细看看一个服务的类型。

2.2 rosservice type

type 命令显示服务的类型,即这个服务发送和接收请求的数据类型:

复制代码
    rosservice type [service]
    
    
      
    

来看看 clear 服务的 type:

复制代码
    rosservice type /clear
    
    std_srvs/Empty
    
    
      
      
      
    

输出显示这个 clear 服务的类型为空,为什么呢?这是因为 clear 服务是清除功能,调用这个服务不需要传递参数,自然也就不需要指定服务的 type 了。

那如何来调用服务呢?

2.3 rosservice call

Call 命令使用方法如下:

复制代码
    rosservice call [service] [args]
    
    
      
    

来调用 clear 服务试试,这个服务不需要传递参数:

复制代码
    rosservice call /clear
    
    
      
    

可以发现小乌龟窗口背景中的白色路劲线被清除了,恢复成刚运行的样子:

那🈶参数的服务如何调用呢?再来看看 spawn 服务的参数,这个服务可以在指定的位置和方向产生一个新的小乌龟:

复制代码
    rosservice type /spawn | rossrv show
    
    float32 x
    float32 y
    float32 theta
    string name
    ---
    string name
    
    
      
      
      
      
      
      
      
      
    

来调用这个服务试试吧:

复制代码
    rosservice call /spawn 2 2 0.2 ""
    
    
      
    

上面的调用命令中的 2 2 0.2 “” 分别对应 spawn 服务的 4 个参数,其中 name 没有指定,但系统会自动赋值一个名称,运行的结果如下,产生一个新的小乌龟:

并且运行完 spawn 服务后,命令行会返回新产生小乌龟的名称,我们调用的时候没有指定名称 name,所以系统就自己取了名字:

复制代码
    name:tutle2
    
    
      
    

3、rosparam

rosparam 命令允许我们在 ROS 参数服务器上存储和操作数据,数据类型包括:整数,浮点,字符串,布尔,字典,列表,rosparam 使用 YAML 标记语言来作为数据的语法,如下:

  • 1:整数
  • 1.0:浮点
  • one:字符串
  • true:布尔
  • {a:b, c:d}:字典
  • [1, 2, 3]:列表

rosparam 常用的命令如下:

复制代码
    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
    
    
      
      
      
      
      
      
    

下面就用这些命令来看看小乌龟有哪些参数。

3.1 rosparam list

保持之前的小乌龟节点运行,然后在命令行键入 list 命令:

复制代码
    rosparam list
    
    
      
    

输出以下参数,其中前 3 个是小乌龟窗口的背景颜色参数:

复制代码
    /background_b
    /background_g
    /background_r
    /rosdistro
    /roslaunch/uris/host_57aea0986fef__34309
    /rosversion
    /run_id
    
    
      
      
      
      
      
      
      
    

我们可以使用 set 和 get 命令来修改和获取对应参数的值。

3.2 rosparam set & get

我们先来改变以下背景颜色中 red 通道的颜色值:

复制代码
    # using: rosparm set [param_name] [param_value]
    rosparam set /background_r 150
    
    
      
      
    

修改了参数后,我们需要重新调用 clear 服务:

复制代码
    rosservice call /clear
    
    
      
    

可以看到小乌龟窗口的背景颜色改变了:

再来使用 get 命令获取 G 通道的值:

复制代码
    rosparam get /background_g
    
    86
    
    
      
      
      
    

如何获取全部的参数呢?get / 即可:

复制代码
    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
    
    
      
      
      
      
      
      
      
      
    

3.3 rosparam dump & load

dump 和 load 命令可以存储和恢复我们设置的参数,方便直接恢复已经设置过的参数:

复制代码
    rosparam dump [file_name] [namespace]
    rosparam load [file_name] [namespace]
    
    
      
      
    

我们来将刚才的小乌龟的参数存储到文件中:

复制代码
    rosparam dump params.yaml
    
    
      
    

再重新将这个文件加载回来,放到一个新的命名空间 copy 中:

复制代码
    rosparam load params.yaml copy
    rosparam get /copy/background_b
    
    255
    
    
      
      
      
      
    

本文原创首发于同名微信公号「程序小哥」,微信搜索关注回复「1024」你懂的!

全部评论 (0)

还没有任何评论哟~