ROS运行管理launch文件
文章目录
2 ROS节点运行管理launch文件
launch
文件是一个 XML 格式的文件,可以启动本地和远程的多个节点,还可以在参数服务器中设置参数。
roslaunch 命令执行launch文件时,首先会判断是否启动了 roscore,如果启动了,则不再启动,否则,会自动调用 roscore
下面是一个start_turtle.launch
文件,后面都以这个为例分析
<launch -- deprecated = "弃用声明">
<!--乌龟GUI-->
<node pkg = "turtlesim" type = "turtlesim_node" name = "turtle" output = "screen" />
<!--键盘控制-->
<node pkg = "turtlesim" type = "turtle_teleop_key" name = "key" output = "screen" />
<!--圆周运动-->
<node pkg = "plumbing_test" type = "test01_pub_twist" name = "circle" output = "screen" />
</launch>
2.1 launch标签
<launch>
<launch>
是所有 launch 文件的根标签,充当其他标签的容器。
<launch -- deprecated = "弃用声明">
是表明这个已经弃用。
2.2 节点node
<node pkg = "turtlesim" type = "turtlesim_node" name = "turtle" output = "screen" />
2.1.1 属性
pkg="包名" // 节点所属的包
type="nodeType" // 节点类型(与之相同名称的可执行文件)
name="nodeName" // 节点名称(在 ROS 网络拓扑中节点的名称)
output="log | screen" (可选) // 日志发送目标,可以设置为 log 日志文件,或 screen 屏幕,默认是log
args="xxx xxx xxx" (可选) // 将参数传递给节点
machine="机器名" // 在指定机器上启动节点
respawn="true | false" (可选) // 如果节点退出,是否自动重启
respawn_delay=" N" (可选) // 如果 respawn 为 true, 那么延迟 N 秒后启动节点
required="true | false" (可选) // 该节点是否必须,如果为 true,那么如果该节点退出,将杀死整个 roslaunch
ns="xxx" (可选) // 在指定命名空间 xxx 中启动节点 就是节点名字name前面加上了ns eg,可以通过这个命令rosnode list查看 结果ns/name
clear_params="true | false" (可选) // 在启动前,删除节点的私有空间的所有参数
- ns实验
<!--启动乌龟GUI与键盘控制节点-->
<launch>
<!--乌龟GUI-->
<node pkg = "turtlesim" type = "turtlesim_node" name = "turtle" output = "screen" ns="shaobo"/>
<!--键盘控制-->
<node pkg = "turtlesim" type = "turtle_teleop_key" name = "key" output = "screen" />
<!--圆周运动-->
<node pkg = "plumbing_test" type = "test01_pub_twist" name = "circle" output = "screen" />
</launch>
注意这里加上了ns
之后,节点名字确实变了,但同时launch
文件功能也残缺了,小乌龟不转了!它把话题名前面也加上了shaobo
!这就导致它的话题对应不上,发布方不能正确发出话题.
所以我们只需要把发布方的话题找到,更改话题名就可以实现.
2 子级标签
- env 环境变量设置
- remap 重映射节点名称
- rosparam 参数设置
- param 参数设置
2.3 include标签
include
标签用于将另一个 xml
格式的 launch
文件导入到当前文件,复用之前的launch文件.
2.4 remap标签
用于话题重命名
from=“xxx” 原始话题名称
to=“yyy” 目标名称
<!-- 代码中原先订阅的话题比如是imu,现在映射(订阅)/imu0话题 -->
<remap from="~imu" to="/imu0"/>
<remap from="~cam0_image" to="/cam0/image_raw"/>
<remap from="~cam1_image" to="/cam1/image_raw"/>
2.5 param标签
① 使用方法
<param>
标签主要用于在参数服务器上设置参数,参数源可以在标签中通过 value
指定,也可以通过外部文件加载,在<node>
标签中时,相当于私有命名空间。
1 - name="命名空间/参数名"
参数名称,可以包含命名空间
2 - value="xxx" (可选)
定义参数值,如果此处省略,必须指定外部文件作为参数源
3 - type="str | int | double | bool | yaml" (可选)
指定参数类型,如果未指定,roslaunch 会尝试确定参数类型,规则如下:
- 如果包含 '.' 的数字解析为浮点型,否则为整型
- "true" 和 "false" 是 bool 值(不区分大小写)
- 其他是字符串
② 实验
一种是放在launch
下,一种是放在node
下
<!--启动乌龟GUI与键盘控制节点-->
<launch>
<!--乌龟GUI-->
<!--ns="shaobo"-->
<!--1. 参数设置在launch下-->
<param name = "test1" type = "int" value = "12"/>
<node pkg="turtlesim" type="turtlesim_node" name="turtle" output="screen">
<!--2.参数设置在node下-->
<param name="test2" type="double" value="1.2"/>
</node>
<!--键盘控制-->
<node pkg = "turtlesim" type = "turtle_teleop_key" name = "key" output = "screen" />
<!--圆周运动-->
<node pkg = "plumbing_test" type = "test01_pub_twist" name = "circle" output = "screen" />
</launch>
③ 运行时候遇到了两个问题
1 RLException: Invalid roslaunch XML syntax: mismatched tag: line 10, column 6 The traceback for the exception was written to the log file
这个问题很奇怪,重新编译一遍就可。
2 Use arrow keys to move the turtle. 'q' to quit.
[ WARN] [1690121652.359007669]: Shutdown request received.
[ WARN] [1690121652.360915919]: Reason given for shutdown: [[/key] Reason: new node registered with same name]
[ WARN] [1690121652.365210823]: Shutdown request received.
[ WARN] [1690121652.371896881]: Reason given for shutdown: [[/circle] Reason: new node registered with same name]
[ INFO] [1690121652.607872628]: Starting turtlesim with node name /turtle
意思就是出现了同样节点名字,这个是因为多次运行之后,好像并没有杀死之前的节点,因为之前的param
设置的是param_A
和param_B
,改了其它param
之后即可运行,而且在rosparam list
最前面两个可以看出来,这个好像没有被杀死!
2.6 rosparam标签
① 使用方法
<rosparam>
标签可以从 YAML 文件导入参数,或将参数导出到 YAML 文件,也可以用来删除参数,<rosparam>
标签在<node>
标签中时被视为私有。
1 command="load | dump | delete" (可选,默认 load)
加载、导出或删除参数
2 file="$(find xxxxx)/xxx/yyy...."
加载或导出到的 yaml 文件
3 param="参数名称"
4 ns="命名空间" (可选)
② 实验
1 加载
加载params.yaml
参数,使用命令查看。
<!--启动乌龟GUI与键盘控制节点-->
<launch>
<!--乌龟GUI-->
<!--ns="shaobo"-->
<!--参数设置再launch下-->
<param name = "test1" type = "int" value = "12"/>
<rosparam command = "load" file = "$(find plumbing_test)/launch/params.yaMl"/>
<!--注意下面这个node最后没有/,直到</node>才结束-->
<node pkg="turtlesim" type="turtlesim_node" name="turtle" output="screen">
<!--参数设置再node下-->
<param name="test2" type="double" value="1.2"/>
<rosparam command = "load" file = "$(find plumbing_test)/launch/params.yaMl"/>
</node>
<!--键盘控制-->
<node pkg = "turtlesim" type = "turtle_teleop_key" name = "key" output = "screen" />
<!--圆周运动-->
<node pkg = "plumbing_test" type = "test01_pub_twist" name = "circle" output = "screen" />
</launch>
2 导出
导出的化要单独写一个launch
文件,否则很多的参数不能导出!
<launch>
<rosparam command = "dump" file = "$(find plumbing_test)/launch/params_out.yaMl"/>
</launch>
报错:RLException: Invalid roslaunch XML syntax: no element found: line 1, column 0 The traceback for the exception was written to the log file
删除第一行空行即可
最终结果,将参数导出到指定文件
3 删除
<launch>
<rosparam command = "delete" param = "/bg_B"/>
</launch>
2.7 group标签
<group>
标签可以对节点分组,具有 ns 属性,可以让节点归属某个命名空间。这样可启动多个节点对组而不会使得因为名称重复而报错。
<!--启动乌龟GUI与键盘控制节点-->
<launch>
<!--第一组-->
<group ns = "first">
<node pkg="turtlesim" type="turtlesim_node" name="turtle" output="screen"/>
<!--键盘控制-->
<node pkg = "turtlesim" type = "turtle_teleop_key" name = "key" output = "screen" />
<!--圆周运动-->
<node pkg = "plumbing_test" type = "test01_pub_twist" name = "circle" output = "screen" />
</group>
<!--第二组-->
<group ns = "second">
<node pkg="turtlesim" type="turtlesim_node" name="turtle" output="screen"/>
<!--键盘控制-->
<node pkg = "turtlesim" type = "turtle_teleop_key" name = "key" output = "screen" />
<!--圆周运动-->
<node pkg = "plumbing_test" type = "test01_pub_twist" name = "circle" output = "screen" />
</group>
</launch>
p@p:~/ROS/ros_vscode_test$ rosnode list
/first/circle # 节点名前也多了ns
/first/key
/first/turtle
/rosout
/second/circle
/second/key
/second/turtle
/turtle
因为由了ns,所以话题名称变了,小乌龟它就不会动了。
2.8 arg标签
① 方法
标签是用于动态传参,类似于函数的参数。
1 name="参数名称"
2 default="默认值" (可选)
3 value="数值" (可选) // 不可以与 default 并存
4 doc="描述" // 参数说明
② 实验
<launch>
<arg name = "shaobo" default = "25" doc = "shaobo is 25 years"/>
<param name = "A" value = "$(arg shaobo)"/>
<param name = "B" value = "$(arg shaobo)"/>
</launch>
# 可以直接在命令行修改参数的值
p@p:~/ROS/ros_vscode_test$ roslaunch plumbing_test arg.launch shaobo:=3
p@p:~/ROS/ros_vscode_test$ rosparam get /A
3