roslaunch工具是ros中python实现的程序启动工具,通过读取launch文件中的参数配置、属性配置等来启动一系列节点; 很多ROS包或源码包中都有launch文件,一般为该程序包能够运行起来的基本demo配置,运行下面指令自动补全会提示该包现有的launch文件: $roslaunch package_name file.launch launch文件的位置并不是很重要,如果放在任意一个位置,可以运行下面指令: $roslaunch path-to-where/file.launch launch文件是XML格式标记文本,后缀名无关紧要,一般为.launch/.xml/.test/无后缀 最简单的配置如下: <launch> <node name="you_define_node_name" pkg="package_name" type="exe_name" /> </launch> 启动上面的launch文件就会启动package_name包下的exe_name执行文件,you_define_node_name自定义的node_name <launch> tag是launch文件根元素/根标签,其他标签包含在其中,/标志结束,多行时标签tag成对存在可以包含其他标签 一个复杂的配置: <launch> <!-- comment注释 --> <!-- top-level arg must be set from command line:roslaunch file.launch arg_1:=value --> <arg name="arg_1" /> <!--pass arg to param--> <param name="param_1" value="$(arg arg_1)"/> <!-- arg can be set from high level like this --> <!-- this is the include launch file content: <launch> <!-- declare arg to be passed in --> <arg name="arg_2" /> <!-- read value of arg --> <param name="param_2" value="$(arg arg_2)"/> </launch> --> <include file="$(find pkg_name)/path-to/included.launch" ns="namespace"> <!-- pass value from high level to included.launch --> <arg name="arg_2" value="value" /> </include> <arg name="arg_3" default="value" /> <arg name="arg_4" value="value" /> <node pkg="pkg_name" type="exe_name" name="node_name1" args="arg1 arg2 arg3" respawn="true" output="screen"> <param name="name1" type="double" value="10.0"/> <param name="name2" value="$(arg arg_1)"/> <param name="name3" value="$(env ENVIRONMENT_VARIABLE_NAME)"/> <param name="name4" command="$(find pkg_name)/path-to/exe '$(find pkg_name)/path-to/arg.txt'"/> <remap from="laser_topic" to="/scan"/> <remap from="base_link" to="$(arg arg_1)"/> <rosparam command="load" file="$(find pkg_name)/example.yaml"/> <param name="frame_id" value="$(arg frame_id)"/> </node> <node pkg="pkg_name" type="exe_name" name="node_name2" args="arg1 arg2 arg3" respawn="true" output="screen"> <param name="name1" type="double" value="10.0"/> <param name="name2" value="$(arg arg_1)"/> <param name="name3" value="$(env ENVIRONMENT_VARIABLE_NAME)"/> <param name="name4" command="$(find pkg_name)/path-to/exe '$(find pkg_name)/path-to/arg.txt'"/> <remap from="laser_topic" to="/scan"/> <remap from="base_link" to="$(arg arg_1)"/> <rosparam command="load" file="$(find pkg_name)/example.yaml"/> <param name="frame_id" value="$(arg frame_id)"/> </node> <node pkg="pkg2_name" type="exe_name" name="node_name3" args="arg1 arg2 arg3" respawn="true" output="screen"> <param name="name1" type="double" value="10.0"/> <param name="name2" value="$(arg arg_1)"/> <param name="name3" value="$(env ENVIRONMENT_VARIABLE_NAME)"/> <param name="name4" command="$(find pkg_name)/path-to/exe '$(find pkg_name)/path-to/arg.txt'"/> </node> <group if="$(arg use_rviz)"> <node pkg="rviz" type="rviz" name="rviz" args="-d $(find pkg_name)/launch/VLP16_2D.rviz"/> </group> </launch> 上面的launch文件首先声明了一些参数,之后include另一个launch文件,included.launch文件中的节点会按深度优先执行配置和启动; 之后该launch文件启动3个节点,前两个节点来自同一个包的同一个可执行文件,节点命名不能相同,每个节点可以进行自己的参数配置; 之后该launch文件启动rviz节点,参数传递 rviz的配置文件,不同配置用于显示不同的信息 <group>可以作为一组标签的容器,从而使该组有独立的名称空间 所以标签可使用 if/unless属性,如果条件成立则包含标签 launch常用标签tag: <arg> 参数声明,arg_1 通过命令行传递,arg_2 传递到included.launch, arg_3 默认值可以被重写覆盖,agr_4不能被重写 <include> 包含其他文件,包含文件中定义的参数、变量、节点都会按深度优先遍历依次执行生效 <param>:设置变量到参数服务器,参数服务器的概念看ros wiki <rosparam>: dump/load、delete parameters from/to Parameter Server,常用来加载程序的参数配置文件到参数服务器,然后程序从参数服务器取得参数值; <remap>:名称映射 from:被映射名称 to:目标名称,名称映射的概念看ros wiki <node> 启动节点, <node>常用属性tag: pkg:"pkg_name" 包名 type:"exe_name" 节点类型,即编译生成的可执行文件 name:"node_name" 节点名称,自定义但不能重复 args:"arg1 ..." 传递节点的参数列表 respawn:"true" 如果节点退出自动重启 default:false output:"screen" 标准输出/标准错误输出重定向屏幕,log重定向log文件,default:log required:"true" 如果节点退出,杀死全部launch进程 launch-prefix:"prefix arguments" 前置的参数,可以使用其他工具如gdb,valgrind等 <node>常用标签tag: param remap rosparam lannch机制不保证节点的启动顺序,虽然launch文件是顺序分析,但节点初始化的时间长度不一,启动时间不一 </node>
roslaunch工具是ros中python实现的程序启动工具,通过读取launch文件中的参数配置、属性配置等来启动一系列节点; 很多ROS包或源码包中都有launch文件,一般为该程序包能够运行起来的基本demo配置,运行下面指令自动补全会提示该包现有的launch文件: $roslaunch package_name file.launch launch文件的位置并不是很重要,如果放在任意一个位置,可以运行下面指令: $roslaunch path-to-where/file.launch launch文件是XML格式标记文本,后缀名无关紧要,一般为.launch/.xml/.test/无后缀 最简单的配置如下: <launch> <node name="you_define_node_name" pkg="package_name" type="exe_name" /> </launch> 启动上面的launch文件就会启动package_name包下的exe_name执行文件,you_define_node_name自定义的node_name <launch> tag是launch文件根元素/根标签,其他标签包含在其中,/标志结束,多行时标签tag成对存在可以包含其他标签 一个复杂的配置: <launch> <!-- comment注释 --> <!-- top-level arg must be set from command line:roslaunch file.launch arg_1:=value --> <arg name="arg_1" /> <!--pass arg to param--> <param name="param_1" value="$(arg arg_1)"/> <!-- arg can be set from high level like this --> <!-- this is the include launch file content: <launch> <!-- declare arg to be passed in --> <arg name="arg_2" /> <!-- read value of arg --> <param name="param_2" value="$(arg arg_2)"/> </launch> --> <include file="$(find pkg_name)/path-to/included.launch" ns="namespace"> <!-- pass value from high level to included.launch --> <arg name="arg_2" value="value" /> </include> <arg name="arg_3" default="value" /> <arg name="arg_4" value="value" /> <node pkg="pkg_name" type="exe_name" name="node_name1" args="arg1 arg2 arg3" respawn="true" output="screen"> <param name="name1" type="double" value="10.0"/> <param name="name2" value="$(arg arg_1)"/> <param name="name3" value="$(env ENVIRONMENT_VARIABLE_NAME)"/> <param name="name4" command="$(find pkg_name)/path-to/exe '$(find pkg_name)/path-to/arg.txt'"/> <remap from="laser_topic" to="/scan"/> <remap from="base_link" to="$(arg arg_1)"/> <rosparam command="load" file="$(find pkg_name)/example.yaml"/> <param name="frame_id" value="$(arg frame_id)"/> </node> <node pkg="pkg_name" type="exe_name" name="node_name2" args="arg1 arg2 arg3" respawn="true" output="screen"> <param name="name1" type="double" value="10.0"/> <param name="name2" value="$(arg arg_1)"/> <param name="name3" value="$(env ENVIRONMENT_VARIABLE_NAME)"/> <param name="name4" command="$(find pkg_name)/path-to/exe '$(find pkg_name)/path-to/arg.txt'"/> <remap from="laser_topic" to="/scan"/> <remap from="base_link" to="$(arg arg_1)"/> <rosparam command="load" file="$(find pkg_name)/example.yaml"/> <param name="frame_id" value="$(arg frame_id)"/> </node> <node pkg="pkg2_name" type="exe_name" name="node_name3" args="arg1 arg2 arg3" respawn="true" output="screen"> <param name="name1" type="double" value="10.0"/> <param name="name2" value="$(arg arg_1)"/> <param name="name3" value="$(env ENVIRONMENT_VARIABLE_NAME)"/> <param name="name4" command="$(find pkg_name)/path-to/exe '$(find pkg_name)/path-to/arg.txt'"/> </node> <group if="$(arg use_rviz)"> <node pkg="rviz" type="rviz" name="rviz" args="-d $(find pkg_name)/launch/VLP16_2D.rviz"/> </group> </launch> 上面的launch文件首先声明了一些参数,之后include另一个launch文件,included.launch文件中的节点会按深度优先执行配置和启动; 之后该launch文件启动3个节点,前两个节点来自同一个包的同一个可执行文件,节点命名不能相同,每个节点可以进行自己的参数配置; 之后该launch文件启动rviz节点,参数传递 rviz的配置文件,不同配置用于显示不同的信息 <group>可以作为一组标签的容器,从而使该组有独立的名称空间 所以标签可使用 if/unless属性,如果条件成立则包含标签 launch常用标签tag: <arg> 参数声明,arg_1 通过命令行传递,arg_2 传递到included.launch, arg_3 默认值可以被重写覆盖,agr_4不能被重写 <include> 包含其他文件,包含文件中定义的参数、变量、节点都会按深度优先遍历依次执行生效 <param>:设置变量到参数服务器,参数服务器的概念看ros wiki <rosparam>: dump/load、delete parameters from/to Parameter Server,常用来加载程序的参数配置文件到参数服务器,然后程序从参数服务器取得参数值; <remap>:名称映射 from:被映射名称 to:目标名称,名称映射的概念看ros wiki <node> 启动节点, <node>常用属性tag: pkg:"pkg_name" 包名 type:"exe_name" 节点类型,即编译生成的可执行文件 name:"node_name" 节点名称,自定义但不能重复 args:"arg1 ..." 传递节点的参数列表 respawn:"true" 如果节点退出自动重启 default:false output:"screen" 标准输出/标准错误输出重定向屏幕,log重定向log文件,default:log required:"true" 如果节点退出,杀死全部launch进程 launch-prefix:"prefix arguments" 前置的参数,可以使用其他工具如gdb,valgrind等 <node>常用标签tag: param remap rosparam lannch机制不保证节点的启动顺序,虽然launch文件是顺序分析,但节点初始化的时间长度不一,启动时间不一 </node>