笔者根据 古月居 · ROS入门21讲 学习整理,并参考《ROS机器人开发实践》一书。
相关课件及源码可参考 Github/huchunxu/ros_21_tutorials
Launch文件常用语法
- : 根元素标签
<launch> </launch>
- : 启动节点
<node pkg="package-name" type="executable-name" name="node-name" />
- pkg: 节点所在功能包名称
- type: 节点的可执行文件名称
- name: 节点运行时的名称
- 可选属性
- output: 是否在终端打印日志信息
- respawn: 节点若发生故障是否重启
- required: 节点是否必须启动
- ns: 命名空间namespace避免命名冲突
- args: 节点所需的运行参数
- : 设置参数 `` * name: 参数名 * value: 参数值
- : 加载参数文件中的多个参数
<rosparam file="params.yaml" command="load" ns="params" />
- file: yaml参数配置文件
- command: 加载指令
- list:列出当前所有参数
- dump:保存参数到文件
- load:从文件读取参数
- ns: 命名空间namespace避免命名冲突
- : launch文件内部的局部变量,仅限于launch文件使用
<arg name="arg-name" default="arg-value" />
- name: 参数名
- value: 参数值
- 调用
<param name="foo" value="$(arg arg-name)" />
<node name="node" pkg="package" type="type" args="$(arg arg-name)" />
- : 重映射ROS计算图资源
<remap from="/turtlebot/cmd_vel" to="/cmd_vel" />
- from: 原命名
- to: 映射之后的命名
- : 嵌套包含其他launch文件,类似C语言中的头文件包含
<include file="$(dirname)/other.launch" />
- file: 包含的其他launch文件的路径
- 更多标签可参见:http://wiki.ros.org/roslaunch/XML
simple.launch实践
- 右键点击 ROS 工作区下的 “catkin_ws/src” ,选择 “新建ROS包” ,输入包名称及其依赖包的名称
learning_launch
,回车后,会创建名为 “learning_launch” 无依赖的 ROS 包。 - 右键点击 catkin_ws/src/learning_launch/launch 文件夹,点击 “新建launch文件” 输入文件名
simple.launch
。 - 编辑 simple.launch 文件如下。
<launch>
<node pkg="learning_topic" type="person_subscriber" name="talker" output="screen" />
<node pkg="learning_topic" type="person_publisher" name="listener" output="screen" />
</launch>
- 在主界面左上角,修改资源管理器旁的构建方式为“Debug”,并点击小锤子进行构建
- 无需启动roscore,因为launch文件启动方式默认启动roscore。
- 在主界面右侧下方点击“+”创建新终端,输入
$ source devel/setup.bash
。输入$ roslaunch learning_launch simple.launch
启动
其他launch实例文件
start_tf_demo_c++.launch
<launch>
<!-- Turtlesim Node-->
<node pkg="turtlesim" type="turtlesim_node" name="sim"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
<node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf_broadcaster" />
<node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf_broadcaster" />
<node pkg="learning_tf" type="turtle_tf_listener" name="listener" />
</launch>
start_tf_demo_py.launch
<launch>
<!-- Turtlesim Node-->
<node pkg="turtlesim" type="turtlesim_node" name="sim"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
<node name="turtle1_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py">
<param name="turtle" type="string" value="turtle1" />
</node>
<node name="turtle2_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py">
<param name="turtle" type="string" value="turtle2" />
</node>
<node pkg="learning_tf" type="turtle_tf_listener.py" name="listener" />
</launch>
turtlesim_parameter_config.launch
<launch>
<param name="/turtle_number" value="2"/>
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
<param name="turtle_name1" value="Tom"/>
<param name="turtle_name2" value="Jerry"/>
<rosparam file="$(find learning_launch)/config/param.yaml" command="load"/>
</node>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen"/>
</launch>
turtlesim_remap.launch
<launch>
<include file="$(find learning_launch)/launch/simple.launch" />
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
<remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
</node>
</launch>