当前位置: 首页 > 工具软件 > xml-eval > 使用案例 >

ROS入门(二)roslaunch的.launch文件的XML格式

宦宏爽
2023-12-01

前言

哭。。英语啊英语,要好好学英语啊!!!!
参考链接:
roslaunch
xml

1. 什么是roslaunch

roslaunch是一个工具,可以轻松地通过SSH在本地和远程启动多个ROS节点,以及在参数服务器上设置参数。它包含了自动打开,重启以及关闭进程的选项。roslaunch接受一个或多个XML配置文件(扩展名为.launch),这些文件中可指定要设置的参数和启动的节点,以及在哪些机器上运行这些环境。

1.2 roslaunch的使用

roslaunch的通常用法如下:
roslaunch package_name file.launch
package_name是功能包的名称,file.launch是对应launch文件的名称。
具体见roslaunch命令行的使用

2. 赋值顺序

roslaunch是一次性解析XML文件的,按深度优先遍历顺序处理includes。如果某一个Tags被连续赋值,则该Tags为最后一次赋值的结果。同样的,如果一个参数被多次赋值,则使用最后规定的值。
依赖于这样的覆盖行为是很脆弱的,不能保证参数是否被正确赋值(例如,在include的文件中修改了参数名)。所以,建议使用$(agr)/<arg>这样的设置来实现设置。

3. 参数替换

roslaunch的Tag属性可以使用参数替换,roslaunch会在启动节点之前优先解析这些参数。

3.1 $(env ENVIRONMENT_VARIABLE)

替换当前环境中变量的值。如果没有设置环境变量,则启动失败。如果使用了标签则值不能被覆盖。

3.2 $(optenv ENVIRONMENT_VARIABLE)

3.2 或$(optenv ENVIRONMENT_VARIABLE default_value)

如果环境变量已设置,则可以替换它的值。当default_value是已经提供的时,如果没有设置环境变量则使用default_value。当default_value没有提供时,则使用空的字符串。default_value的值可以时多个被空格分隔开的单词。

3.2.1 例子

  <param name="foo" value="$(optenv NUM_CPUS 1)" />
  <param name="foo" value="$(optenv CONFIG_PATH /home/marvin/ros_workspace)" />
  <param name="foo" value="$(optenv VARIABLE ros rocks)" />

3.3$(find pkg)

指定一个功能包的相对路径,功能包的绝对路径(包目录的文件系统路径??)将会被相对路径替换。强烈鼓励使用功能包的相对路径,因为硬编码路径(绝对路径)会抑制launch配置的可移植性。至于是使用/还是\取决于本地文件系统。

3.3.1 例子

$(find rospy)/manifest.xml
rospy是功能包的名称,后面的/可跟着文件在功能包下的路径。

3.4 $(anon name)

首先要理解匿名(anonymous name),因为在ros系统中用一个名字的节点只能出现一次,所以后出现的同名节点会杀死前面在运行的同名节点。匿名节点可防止节点间的名字重复。
故可使用该$(anon name)创建匿名id,匿名后的id为name,name可修改。

3.4.1 例子

  <node name="$(anon foo)" pkg="rospy_tutorials" type="talker.py" />
  <node name="$(anon foo)" pkg="rospy_tutorials" type="talker.py" />

如上设置时将会有错误,因为ros系统中只允许一个名称对应一个节点,所以单行存在时是正确的。

3.5 $(arg foo)

$(arg foo)将指向标签所指定的值。在声明arg的同一个launch文件中必须有一个对应的标记。

3.5.1 例子

 <param name="foo" value="$(arg my_foo)" />

将my_foo参数的值赋给了foo。

<node name="add_two_ints_server" pkg="beginner_tutorials" type="add_two_ints_server" />
<node name="add_two_ints_client" pkg="beginner_tutorials" type="add_two_ints_client" args="$(arg a) $(arg b)" />

在add_two_ints示例中启动服务端和客户端,启动客户端时将a和b的值作为参数传递。
当发生启动luanch文件时使用如下:
roslaunch beginner_tutorials launch_file.launch a:=1 b:=5

3.6 $(eval <expression>)

$(eval <expression>)允许对任意复杂的python表达式进行求值。

3.6.1 例子

<param name="circumference" value="$(eval 2.* 3.1415 * arg('radius'))"/>

以上是将计算radius半径的圆周长并赋给适当的参数。
作为一个限制,$(eval)表达式需要占据整个属性字符串,在单个字符串中混合使用其他替换参数是不可能的,如下是不可能的:

<param name="foo" value="$(arg foo)$(eval 6*7)bar"/>

为了弥补以上限制,需要注意的是所有替换命令可作为eval中的函数使用

"$(eval arg('foo') + env('PATH') + 'bar' + find('pkg')"

为了让您方便,参数也将隐式解析的,即以下两种表达方式是相同的:

"$(eval arg('foo'))"
"$(eval foo)"

3.7 $(dirname)

$(dirname)会返回启动文件所在目录的绝对路径。这可以与eval和if/unless一起使用,以根据安装路径修改行为,或者只是为了方便引用相对于当前文件而不是相对于包根的启动文件或yaml文件(如$(find PKG))。

3.7.1 例子

<include file="$(dirname)/other.launch" />

将期望在与它出现的启动文件相同的目录中找到other.launch。

3.8 总结

替换参数目前在本地机器上解析。换句话说,环境变量和ROS包的路径将被设置为当前环境中的值,即使是远程启动的进程。

4. ifunless的属性

所有的标签都支持if和unless的属性,根据值的取值来使用或排除标签。“1”和“true”被认为是真值,“0”和“flase”被认为是假值,其他的值都是错误的。

if=value (optional)
		 If value evaluates to true, include tag and its contents. 
		 如果value的值为真,则包含标签及它的内容。
unless=value (optional)
		Unless value evaluates to true (which means if value evaluates to false), include tag and its contents. 
		如果unless的value为真,这意味这if的value为假,则包含标签和内容。

4.1 例子

<group if="$(arg foo)">
  <!-- stuff that will only be evaluated if foo is true -->
  <!-- 这里的东西是当foo为真时才会计算或使用的东西-->
</group>

<param name="foo" value="bar" unless="$(arg foo)" /> 
 <!-- This param won't be set when "unless" condition is met -->
<!-- 当"unless"条件满足时,这个参数将不会被设置 -->

5. tag参考

6. 示例

注意:按照惯例,roslaunch的XML文件扩展名为== .launch ==。

6.1 最简示例

以下示例展示了最简launch文件的配置脚本,它启动了一个“talker”节点,该节点属于功能包“rospy_tutorials”,该节点将使用当前配置的ROS环境(即ROS_ROOT等)在本地机器上启动。

<launch>
  <node name="talker" pkg="rospy_tutorials" type="talker" />
</launch>

6.2 一些更复杂的例子

<launch>
  <!-- local machine already has a definition by default.
       This tag overrides the default definition with
       specific ROS_ROOT and ROS_PACKAGE_PATH values -->
  <machine name="local_alt" address="localhost" default="true" ros-root="/u/user/ros/ros/" ros-package-path="/u/user/ros/ros-pkg" />
  <!-- a basic listener node -->
  <node name="listener-1" pkg="rospy_tutorials" type="listener" />
  <!-- pass args to the listener node -->
  <node name="listener-2" pkg="rospy_tutorials" type="listener" args="-foo arg2" />
  <!-- a respawn-able listener node -->
  <node name="listener-3" pkg="rospy_tutorials" type="listener" respawn="true" />
  <!-- start listener node in the 'wg1' namespace -->
  <node ns="wg1" name="listener-wg1" pkg="rospy_tutorials" type="listener" respawn="true" />
  <!-- start a group of nodes in the 'wg2' namespace -->
  <group ns="wg2">
    <!-- remap applies to all future statements in this scope. -->
    <remap from="chatter" to="hello"/>
    <node pkg="rospy_tutorials" type="listener" name="listener" args="--test" respawn="true" />
    <node pkg="rospy_tutorials" type="talker" name="talker">
      <!-- set a private parameter for the node -->
      <param name="talker_1_param" value="a value" />
      <!-- nodes can have their own remap args -->
      <remap from="chatter" to="hello-1"/>
      <!-- you can set environment variables for a node -->
      <env name="ENV_EXAMPLE" value="some value" />
    </node>
  </group>
</launch>

6.3 设置参数

您也可以在“参数服务器”中设置参数,这些参数在节点启动之后会存储在参数服务器中。
如果值是明确的,则可以省略type属性。支持的类型有str、int、double和bool。也可以使用textfile或binfile属性指定文件的内容。

6.3.1 示例

<launch>
  <param name="somestring1" value="bar" />
  <!-- force to string instead of integer -->
  <!-- 强制转换为字符串而不是整数 -->
  <param name="somestring2" value="10" type="str" />

  <param name="someinteger1" value="1" type="int" />
  <param name="someinteger2" value="2" />

  <param name="somefloat1" value="3.14159" type="double" />
  <param name="somefloat2" value="3.0" />

  <!-- you can set parameters in child namespaces -->
  <!-- 您可以在子命名空间中设置参数 -->
  <param name="wg/childparam" value="a child namespace parameter" />

  <!-- upload the contents of a file to the server -->
  <!-- 将文件的内容上传到服务器 -->
  <param name="configfile" textfile="$(find roslaunch)/example.xml" />
  <!-- upload the contents of a file as base64 binary to the server -->
  <!-- 将文件的内容以base64二进制文件的形式上传到服务器 -->
  <param name="binaryfile" binfile="$(find roslaunch)/example.xml" />

</launch>
 类似资料: