前言
本人ROS小白,利用寒假时间学习ROS,在此以笔记的方式记录自己每天的学习过程。争取写满15篇(6/15)。
环境:Ubuntu20.04、ROS1:noetic
环境配置:严格按照下方学习链接的教程配置,基本一次成功。
学习链接:【Autolabor初级教程】ROS机器人入门
对应链接文档:ROS机器人入门课程《ROS理论与实践》
笔记绝大部分代码使用Python语言编写。
本期关键词:launch文件标签
launch
launch
标签是所有launch文件的根标签- 属性:
deprecated="弃用声明"
,表示该版本的launch
文件已被弃用。(但仍可使用,会有Warning提示) - 如下:
<launch deprecated="discard">
<node pkg="turtlesim" type="turtlesim_node" name="gui" />
<node pkg="turtlesim" type="turtle_teleop_key" name="key" />
</launch>
- 指令执行时会输出:
WARNING: [/home/用户名/XXX_ws/src/helloworld/launch/start_turtle.launch] DEPRECATED: discard
node
- 属性
- pkg=“包名”
- type=“nodeType”,可执行文件
- name=“节点名称”
- args=“xxx xxx xxx” (可选),将参数传递给节点
- respawn=“true | false”(可选),如果节点退出,是否自动重启
- respawn_delay=" N" (可选),如果 respawn 为 true, 那么延迟 N 秒后启动节点
- required=“true | false” (可选),如果为true节点退出时将杀死整个roslaunch
- ns=“xxx” (可选),在指定命名空间中启动节点,可以避免名称冲突
- output=“log | screen” (可选),log为日志文件,设置为log则终端无输出
- node标签的属性比较多,
pkg
、type
、name
、output
我们应该都很熟悉了,下面介绍几个之前没提到的但是也很常用的。 - 需要注意:
roslaunch
指令不能保证顺序执行节点。也就是说launch文件里节点的启动时序是不确定的,以乌龟运动控制为例,roslaunch
指令可能是先启动gui
节点,也有可能先启动key
节点。 respawn
。代码如下:
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="gui" respawn="true"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="key" />
</launch>
令界面显示节点的respawn="true"
,当运行该launch文件时,我们将乌龟显示界面关闭之后,会自动重新打开(节点退出后自动重启)。
4. required
。代码如下:
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="gui" required="true"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="key" />
</launch>
运行该launch文件,我们将乌龟显示界面关闭之后会发现进程也随之关闭。
5. ns="名称"
。会给节点名称添加前缀(私有命名空间),在一定程度上可以避免重名问题。代码如下:
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="gui" ns="hello111"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="key" ns="hello222"/>
</launch>
运行launch文件后,执行rosnode list
命令,结果如下:
/hello111/gui
/hello222/key
include
include
标签用于将另一个xml格式的launch文件导入到当前文件。- 代码如下:
<launch>
<include file="$(find helloworld)/launch/start_turtle.launch" ns="test"/>
</launch>
- 属性:
- file=“$(find 包名)/xxx/xxx.launch”
- ns=“xxx” (可选)
ns
属性最好加上,确保节点的唯一性。以乌龟运动控制为例,如果这里不加上ns
属性,我们运行该launch文件的同时,运行被导入的launch文件,这时先运行的节点就会被强制退出。
remap
- 很常用的一个标签,用于话题重命名。
- 先看示例代码:
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="gui" >
<remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
</node>
<node pkg="turtlesim" type="turtle_teleop_key" name="key" />
</launch>
remap
标签的作用是将原来的/turtle1/cmd_vel
话题重命名为目标话题/cmd_vel
- 这里将话题重命名的目的,是更换乌龟的运动控制方式,原先我们使用的是
turtle_teleop_key
节点来控制乌龟运动,但是在使用的过程中我们可以感受到,这个节点的控制操作局限性很大,控制起来也不方便。 - 在这里我们选择ROS包中自带的
teleop_twist_keyboard
节点来控制乌龟运动,而这个节点发布的话题名称为“cmd_vel”,原来乌龟运动控制节点发布的话题名称为“/turtle1/cmd_vel” - 运行该launch文件后,运行以下指令即可控制乌龟运动。
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
# 注意:第一次输入这个指令,按tab键是不会自动补全的
# 如果显示没安装,就运行下面这条指令
sudo apt-get install ros-noetic-teleop-twist-keyboard
param
param
标签主要用于在参数服务器上设置参数。- 示例代码如下所示:
<launch>
<param name="P_A" type="int" value="123" />
<node pkg="turtlesim" type="turtlesim_node" name="gui" >
<param name="P_B" type="double" value="1.23" />
</node>
<node pkg="turtlesim" type="turtle_teleop_key" name="key" />
</launch>
param
标签有两种格式,一种是位于launch下,node外,另一种是在node内。两者的主要区别是,在node内的param
标签设置的参数,会带上前缀(节点名作为前缀)。type
参数可选的类型有:str
、int
、double
、bool
、yaml
。如果未指定参数类型,roslaunch会尝试确定参数类型:带有.
的数字解析为浮点数(double),否则为整数(int),其他的解析为字符串(str)。
rosparam
rosparam
标签可以从YAML文件导入参数或导出参数,也可删除参数。- 和
param
标签类似,rosparam
标签也有两种格式。一种是位于launch下,node外,另一种是在node内。 - 示例代码如下:我们会发现,下面这个launch文件的保存在yaml文件下的参数和我们
rosparam list
查看到的并不一样,原因见要点4。
<launch>
<rosparam command="dump" file="$(find helloworld)/launch/params.yaml" />
<node pkg="turtlesim" type="turtlesim_node" name="gui" >
<param name="P_B" type="double" value="1.23" />
</node>
<node pkg="turtlesim" type="turtle_teleop_key" name="key" />
</launch>
rosparam
具有执行优先权,只有他执行完了其他才能执行;所以有时候rosparam
的dump
指令结果会不符合预期。- 解决方法就是
rosparam
标签单独在一个launch文件下创建,先执行其他launch文件,最后执行含有rosparam
标签的launch文件。 - 示例代码如下:
<launch>
<rosparam command="dump" file="$(find helloworld)/launch/params.yaml" />
<rosparam command="delete" param="P_A"/>
</launch>
group
group
标签具有ns属性,可以让节点归属某个命名空间。- 示例代码如下:
<launch>
<group ns="first">
<node pkg="turtlesim" type="turtlesim_node" name="gui" />
<node pkg="turtlesim" type="turtle_teleop_key" name="key" />
</group>
<group ns="second">
<node pkg="turtlesim" type="turtlesim_node" name="gui" />
<node pkg="turtlesim" type="turtle_teleop_key" name="key" />
</group>
</launch>
arg
arg
标签用于动态传参。- 属性:
- name=“参数名称”
- default=“默认值” (可选)
- value=“数值” (可选,如果value没有设置,则值为default)
- 代码示例如下:
<launch>
<arg name="test_Arg" default="0.123" />
<param name="test_A" value="$(arg test_Arg)" />
<param name="test_B" value="$(arg test_Arg)" />
</launch>
- 上述文件代码中,
test_A
和test_B
共用test_Arg
的值,只需要改变test_Arg
的值,另外两个值也会跟着改变 - 在终端执行指令时,也可通过以下指令修改
test_Arg
参数的值:
roslaunch helloworld arg_test.launch test_Arg:=666