ROS launch file: <arg> vs <param> vs <rosparam>

  本文介绍在 ROS 的 launch 文件中经常被使用到的三个与参数设置有关的标签 <arg><param>rosparam   

$\lt arg \gt$

  • 声明 argument
  • 1
    <arg name="arg-name" .../>
  • 指定 argument 的值
  • 1
    2
    3
    4
    5
    # 在命令行赋值
    roslaunch package-name launch-file-name arg-name:=arg-value
    # 在声明 argument 时赋值
    <arg name="arg-name" default="arg-value" />
    <arg name="arg-name" value="arg-value" />
    • defaultvalue 的区别在于,在命令行中赋值的参数可以覆盖 default,但是不能重写 value 的值。
  • 获取变量值
  • 1
    $(arg arg-name)
    • 我们可以通过 $arg$ 来使用该变量,roslaunch 会用给定的参数 $arg-name$ 的值替换整个表达式的值。
  • 将 argument 值传递给 included launch 文件
  • 1
    2
    3
    4
    <include file="path-to-file">
    <arg name="arg-name" value="arg-value" />
    ...
    </include>
    • 注意:若 launch 文件及其 include 的 launch 文件出现相同的 argument,通过如下方式传递给 include launch 文件
  • 1
    <arg name="arg-name" value="$(arg arg-name)" />
    • 第一个 arg-name 表示 include launch 文件中的变量;第二个则表示当前 launch 文件中的变量 $\Longrightarrow$ 指定的变量在当前 launch 文件以及 included launch 文件中都有相同的值。

$\lt rosparam \gt$

  • 尽管 argument(变量)和 parameter(参数)优势可互换,但二者在 ROS 中的意义完全不同:parameters 是 ROS 系统使用的数值,存在 parameter server 上,nodes 可通过ros::param::get函数编程得到,用户可通过rosparam命令获取;与之不同,arguments 仅在 launch 文件内部有意义,nodes 不能直接获取它们的值
  • 前面介绍的<arg>用于设置变量;接下来介绍的两个<param><rosparam>标签用于设置参数。
  • 参数访问有三种方式
    • 命令行:rosparam setrosparam get
    • launch 文件:<param><rosparam>
    • API
      • roscpp: ros::param::setros::param::get
      • rospy: set_paramset_param
  • <rosparam> 通过配置文件*.yaml文件加载参数
  • 1
    <rosparam file="$(find navigation_launch)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />
  • <rosparam> 其他常见方式
  • 1
    2
    3
    4
    5
    6
    <rosparam command="delete" param="my/param" />
    <rosparam param="a_list">[1, 2, 3, 4]</rosparam>
    <rosparam>
    a: 1
    b: 2
    </rosparam>

$\lt param \gt$

  • <param>更像是 define 宏,必须在本地 launch 文件中赋值,无法用于在 launch 文件中获取命令中的参数(但可以通过下面介绍 rosrun 方式),通过以下方式接收和传递。定义的参数均会保留在 ROS 参数服务器(PARAMETERS)中,该参数会被节点(NODES)使用进行节点配置。
  • 1
    2
    3
    4
    5
    6
    7
    <launch>
    <param name="param-name-1" value="false" />
    <node ....>
    <param name="param-name-2" value="...">
    </node>
    ...
    </launch>
    • 第一个参数 param-name-1 是整个 launch 全局(global)有效;第二个参数 param-name-2 相对(relative)节点局部(private)有效。
  • rosrun 本身的设计是可以让使用者直接修改节点内的参数,通过以下的方式:
  • 1
    rosrun package-name node-name _param-name:=param-value
  • ROS ANSWERS: When to use param and rosparam on launch file?

      I believe that the main difference is that <param> may be used to set a single command on the ROS parameter server, while <rosparam> can be used to evaluate groups of parameters.
      So, in the cases above, <param> is setting a single parameter, and that parameter is an entire URDF file. The <rosparam> tag is reading in the rosparam yaml format from within the launch file.
      The value set by the <param> tag may only be a string, int, bool, or double, which may be set through the xml attribute value, or by reading in from a text file, bin file, or the output of a command line command.
      The value set by the <rosparam> tag is most commonly a batch of related parameters, read in from a YAML file (or from the output of rosparam dump). You can think of it as a programmatic way to access the functionality of rosparam from a launch file.

文章目录
  1. 1. $\lt arg \gt$
  2. 2. $\lt rosparam \gt$
  3. 3. $\lt param \gt$