前言:目前还在学习ROS+无人机框架中,,,
更多更新文章详见我的个人博客主页【前往】
视频参考:https://www.bilibili.com/video/BV1zt411G7Vn?p=19
roslaunch 命令允许我们一次启动 launch 文件中定义的多个 ROS 节点,启动参数等在启动文件(launch 文件)中配置,并且如果系统之前没有启动 roscore,则 roslaunch 会自动启动它。
roslaunch 的命令行用法如下:
roslaunch [package] [filename.launch]
例如:
roslaunch beginner_tutorials turtlemimic.launch
其中 beginner_tutorials 是 turtlemimic.launch 文件中定义的一个节点,那 launch 文件是什么呢?我们来看下。
简单来说 launch 文件就是一堆节点和参数的集合,使用 launch 文件的目的是为了一键启动。
因为目前运行在机器人上的 ROS 系统一般都要同时运行多个节点,如果我们开机启动时,一个一个的输入命令来启动每一个节点,想想就可怕,所以 ROS 系统就给我们提供了这么一个 launch 文件,可以方便我们将要启动的节点和对应的参数全部写到这个文件中,然后使用 roslaunch 命令一键启动!
一个 lanunch 文件例子:
<launch>
<machine name="local_alt" address="localhost" default="true" ros-root="/u/user/ros/ros/" ros-package-path="/u/user/ros/ros-pkg" />
<node name="listener-1" pkg="rospy_tutorials" type="listener" />
<node name="listener-2" pkg="rospy_tutorials" type="listener" args="-foo arg2" />
<node name="listener-3" pkg="rospy_tutorials" type="listener" respawn="true" />
<node ns="wg1" name="listener-wg1" pkg="rospy_tutorials" type="listener" respawn="true" />
<group ns="wg2">
<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">
<param name="talker_1_param" value="a value" />
<remap from="chatter" to="hello-1"/>
<env name="ENV_EXAMPLE" value="some value" />
node>
group>
launch>
下面是一个简单的 launch 文件格式,我带你一步一步解析它的标签用法:
<launch>
<node .../>
<rosparam .../>
<param .../>
<include .../>
<env .../>
<remap .../>
<arg .../>
<group> group>
launch>
launch 标签是 launch 文件的根节点,它只作为其他子标签的容器,没有其他功能。
<launch>
...
launch>
node 标签指定一个将要运行的 ROS 节点,node 标签可以说是 launch 文件中最重要的标签,因为我们配置 launch 文件的目的就是一次启动多个 ROS node。
常见的用法如下:
<node name="bar1" pkg="foo_pkg" type="bar" args="--test" respawn="true" output="sceen">
在 node 标签下页可以嵌套使用以下标签:
在项目中某些参数需要经常改变,如果在程序中写死了,以后我们每次修改参数都需要重新 build 一遍程序,非常麻烦,param 便签给我们提供了一个传递参数的方法。
param 标签定义一个将要被设置到参数服务器的参数,它的参数值可以通过文本文件、二进制文件或命令等属性来设置,另外 param 标签可以嵌入到 node 标签中,以此来作为该 node 的私有参数。
常见用法如下:
<param name="publish_frequency" type="double" value="10.0">
param 标签也可以为一组 group 节点同时设置参数。
remap 标签提供了一种节点名称的重映射方法,每个 remap 标签包含一个元素名称和一个新名称,在系统运行后原始名称会被替换为新名称。
常见用法如下:
<remap from="chatter" to="hello">
可以这样理解这个替换标签:你有一个节点订阅了「chatter」主题,但是你只有一个节点发布「hello」主题,而「hello」和「chatter」的类型相同,所以我们可以将「chatter」简单地替换为「hello」,从而实现订阅「hello」主题。
machine 标签定义了节点所运行的机器信息,如果只是在本地运行节点则不需要配置这个标签,它主要使用在 SSH 和远程机器,不过也可以用来配置本地机器的相关信息。
常见用法如下:
<launch>
<machine name="foo" address="foo-address" env-loader="/opt/ros/kinetic/env.sh" user="someone">
<node machine="foo" name="footalker" pkg="test_ros" type="talker.py">
launch>
rosparam 标签允许节点从参数服务器上 load、dump 和 delete YAML 文件,也可以使用在远程机器上,需要注意的是 delete 必须在 load 或者 dump 之后进行。
常见用法如下:
# 参数较多使用 yaml 文件
<rosparam command="load" file="$(find rosparam)/example.yaml">
<rosparam command="delete" param="my/param">
# 传递数组
<rosparam param="a_list">[1, 2, 3, 4]rosparam>
<rosparam>
a: 1
b: 2
rosparam>
<arg name="whitelist" default="[3, 2]"/>
<rosparam param="whitelist" subt_value="True">$(arg whitelist)rosparam>
补充下 yaml 文件基本用法,yaml 文件就是单纯的来存储启动参数,格式如下:
a: 1
str: hello
c: 2.0
其中不需要指定变量类型,yaml 文件会自动确定类型。使用 yaml 文件的目的就是方便配置参数,如果有很多参数需要配置,不需要写很多 rosparam 命令。
yaml 文件还有挺多复杂的写法,后续项目中用到再总结出来。
include 类似编程语言中的 include 预处理,它可以导入其他 roslaunch 的启动文件到当前 include 标签所在的位置。
常见用法如下:
<include file="$(find package_name)/launch_file_name">
项目中使用绝对路径不太方便,可以使用 find 来查找。
env 标签可以在启动的节点上设置环境变量,这个标签基本只会使用在 launch、include、node、machine 这 4 个标签内部,当使用在 launch 内部时,env 设置的环境标量会应用到内部定义的节点。
常见用法如下:
<env name="ENV_EXAMPLE" value="some value" />
test 标签在语法上类似 node 标签,但在功能上只表示当前的节点作为测试节点去运行。
常见用法如下:
<test test-name="test_1" pkg="my_pkg" type="test_1.py" time-limit="10.0" args="--test1">
arg 标签表示启动参数,该标签允许创建更多可重用和可配置的启动文件,其可以通过命令行、include 标签、定义在高级别的文件这 3 种方式配置值。
arg 标签声明的参数不是全局的,只能在声明的单个启动文件中使用,可以当成函数的局部参数来理解。
常见用法如下:
# 1. 命令行传递启动参数
roslaunch my_file.launch my_arg:=my_value
# 2. 定义时赋值
这两者有点区别,命令行传递的 arg 参数可以覆盖 default,但不能覆盖 value。
# 3. 通过 launch 文件传递,两个 launch 文件中的 arg 参数值必须相同!
# my_file.launch
<include file="include.launch">
<arg name="hoge" value="fuga">
include>
# include.launch
<launch>
<arg name="hoge" value="fuga">
launch>
注意 arg 和 param 标签的区别:
group 标签可以方便的将一组配置应用到组内的所有节点,它也具有命名空间 ns 特点,可以将不同的节点放入不同的 namespace。
常见用法如下:
<group ns="namespace">
<node pkg="pkg_name1" .../>
<node pkg="pkg_name2" .../>
...
group>
配合 if 和 unless 使用:
<group if="$(arg foo1)">
<node pkg="pkg_name1" .../>
group>
<group unless="$(arg foo2)">
<node pkg="pkg_name2" .../>
group>
更多标签内容参考官方文档:https://wiki.ros.org/roslaunch/XML