前言、
ROS通常具有很多的节点,部分节点需要带参启动,部分节点还分布在其他设备上。
这都需要一个统一的管理策略,ROS通过roslaunch管理分布式节点。放置在launch文件夹中
launch文件本质是一个以launch为后缀的XML文件,位于launch目录下。
对于本地进程,ROS通过popen创建管道启动进程,利用POSIX信号来杀死进程,
对于远程节点, ROS基于SSH来实现远程通信,这导致roslaunch无法保证启动顺序。
若需要 设置启动顺序时,可通过bash脚本进行顺序启动。
当没有ROS Master启动时,launch在启动时会自动检测并启动ROS Master节点。
launch的标签 根标签为launch。
launch文件 TF坐标变换 QT工具箱 Rviz可视化平台 Gazebo物理仿真环境
launch文件
通过xml文件实现多节点的配置和启动(可以自动启动ros master)
打开很多节点,发布很多数据
子标签包括node、machine、include、param、rosparam、group、test、arg等。
子标签下有属性和子标签。
<node name="listener" pkg="example_1" type="listener" output="screen">
<remap from="chatter" to="hello"/>
<node/>
# node name : 节点名字
# pkg : 节点所在的包
# type : 节点类型
# output : 日志输出到屏幕
# remap : 消息输出转移
<launch>
<node pkg="xxxxxx" name="xxxxx" type="xxxxx_node">
<node pkg="xxxxxx" name="xxxxx" type="xxxxx_node">
</launch>
#pkg :所在功能包的名字
#type :节点的可执行文件名称
#name :节点运行时的名称
#output 输出
#rsspawn 节点失效重新启动
#required 请求的是什么没有不能执行
#ns name space
#args 指节点其中的所有参数
param 可以设置内部参数名测试参数,存储在参数服务器中,相当于全局变量
<param name ="output_frame "value="odom"/>
name 参数名
value 参数值
好的现在我有很多的全局变量 设置起来极其麻烦
在params.yaml 中设置所有的参数,并通过命令将所有的参数都加载进当前的params
<rosparam file="params.yaml" command="load" ns="params"/>
使用rosparam file
<arg> launch 内部文件中的局部变量 相当于局部变量只针对launch其中的变量
<remap> 重映射ROS计算图资源的命名 改变接口变成自己的接口
from 原命名
to 映射之后的命名
<include> 包含其他launch文件,类似C 语言包含的头文件
file : 包含的其他launch文件的路径
node必选标签:
在node标签中,存在多个可用属性,其中name表示节点的名称,name为必选属性;
pkg表示包名称,pkg为必选属性;
type表示节点类型,需与节点生成的可执行文件名同名,
type为必选属性。
node可选标签:
respawn表示是否复位,当节点因为某种原因终止运行时,
若respawn设为true,则roslaunch会重启该节点,
respawn默认为false。 output表示日志输出的位置,
若设为log,则输出到日志文件中,若设为screen,则输出到终端上,默认为log。
clear_params表示是否在启动前删除节点私有名字空间中的所有参数,
若设为true则删除。launch-prefix表示启动前缀,用于启动gdb、valgrind、xterm、nice等工具。
<node name="client" pkg="example_3" type="client" output="screen" launch-prefix="valgrind"/>
rosparam子标签
rosparam支持load、dump、delete三种参数操作。
load操作表示加载一个YAML文件,并将其中的参 数存入ROS参数服务器中;
dump操作表示将ROS参数服务器中的参数存入 YAML文件中;
delete操作表示删除参数。 file表示YAML文件名;param表示参数名;ns表示 名字空间,为可选属性;subst_value表示是否运行 在YAML文件中使用替代参数,为可选属性。
<!--加载YAML文件->
<rosparam command="load" file="$(findrosparam)/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" subst_value="True">$(arg whitelist)
</rosparam>
machine子标签:
machine定义了ROS节点运行的设备,当节点在本地运行时,无需使用machine标签
跨设备的ROS节点基于SSH进行通信。
name属性表示设备的主机名;address属性表示设备的网络地址或者主机名(hostname);env-loader属性表示远程设备上的环境变量文件。
usr属性表示远程登录方法的SSH的用户名,password属性表示远程登录方法的SSH的密码。
<machine name="miaozl" address="miaozl.example.com" env-loader="/opt/ros/melodic/env.sh"
user="miaozl">
<env name="LUCKY_NUMBER" value="88" />
</machine>
include和group子标签:
标签group可以将不同的launch文件、节点组合起来,
放在同一个名字空间中或者同时终止、启动一组节点。
标签include用于其他的launch文件、参数文件,通常利用find命令指明要搜索的程序包。
<group name="wg">
<include file="$(find pr2_alpha)/$(env ROBOT).machine" />
<include file="$(find 2dnav_pr2)/config/new_amcl_node.xml" />
<include file="$(find 2dnav_pr2)/config/base_odom_teleop.xml" />
<include file="$(find 2dnav_pr2)/config/lasers_and_filters.xml" />
</group>
如果希望同时启动一组节点
<group if="1">
......
</group>
启动launch文件:
launch文件可以通过命令行、脚本、嵌入等方式进行调用。
命令行启动: roslaunch [选项] [程序包名] [可变参数]
嵌入启动:
<include file="$(find turtlesim_launch)/teleop.launch"/>
bash脚本启动,可以保证启动顺序
#!/bin/bash
roslaunch bhand_controller bhand_controller.launch &
sleep 5
echo "bhand controller startingsuccess!"roslaunch beginner_tutorialsbhand_force_control.launch &
sleep 0.1
#wait表示等待前面的后台任务全部完成才往下执行
wait
exit 0