本人ROS小白,利用寒假时间学习ROS,在此以笔记的方式记录自己每天的学习过程。争取写满20篇(6/20)。
环境:Ubuntu20.04、ROS1:noetic
环境配置:严格按照下方学习链接的教程配置,基本一次成功。
学习链接:【Autolabor初级教程】ROS机器人入门
对应链接文档:ROS机器人入门课程《ROS理论与实践》
笔记绝大部分代码使用Python语言编写。
本期关键词:launch文件标签
launch
标签是所有launch文件的根标签deprecated="弃用声明"
,表示该版本的launch
文件已被弃用。(但仍可使用,会有Warning提示)
WARNING: [/home/用户名/XXX_ws/src/helloworld/launch/start_turtle.launch] DEPRECATED: discard
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文件后,执行rosnode list
命令,结果如下:
/hello111/gui
/hello222/key
include
标签用于将另一个xml格式的launch文件导入到当前文件。<launch>
<include file="$(find helloworld)/launch/start_turtle.launch" ns="test"/>
launch>
ns
属性最好加上,确保节点的唯一性。以乌龟运动控制为例,如果这里不加上ns
属性,我们运行该launch文件的同时,运行被导入的launch文件,这时先运行的节点就会被强制退出。<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
节点来控制乌龟运动,但是在使用的过程中我们可以感受到,这个节点的控制操作局限性很大,控制起来也不方便。teleop_twist_keyboard
节点来控制乌龟运动,而这个节点发布的话题名称为“cmd_vel”,原来乌龟运动控制节点发布的话题名称为“/turtle1/cmd_vel”rosrun teleop_twist_keyboard teleop_twist_keyboard.py
# 注意:第一次输入这个指令,按tab键是不会自动补全的
# 如果显示没安装,就运行下面这条指令
sudo apt-get install ros-noetic-teleop-twist-keyboard
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
标签可以从YAML文件导入参数或导出参数,也可删除参数。param
标签类似,rosparam
标签也有两种格式。一种是位于launch下,node外,另一种是在node内。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
标签具有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
标签用于动态传参。<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