编写一个ROS(Robot Operating System)的launch
文件是为了方便地启动一组相关的节点(nodes)、参数服务器(parameter server)参数、消息发布者/订阅者(publishers/subscribers)、服务(services)以及动作服务器(action servers)。
以下是一个编写ROS launch
文件的基本步骤和示例:
-
创建launch文件: 在项目的
launch
目录下创建一个新的.launch
文件,例如my_launch_file.launch
。 -
声明XML根元素及命名空间: 所有launch文件都以XML格式编写,需包含根元素
<launch>
,并声明必要的命名空间。通常,ROS的launch文件会包含如下声明:
<launch><!-- ROS launch文件内容 --></launch>
3 .设置ROS环境变量: 可以通过<env>
标签来设置环境变量,如设置ROS主目录:
<launch><env name="ROS_PACKAGE_PATH" value="$(find your_package)/..:${env{ROS_PACKAGE_PATH}}" /><!-- 其他ROS环境变量设置 --></launch>
4. 加载参数: 使用<param>
标签将参数加载到参数服务器。可以指定参数的值或从文件中读取:
<launch><param name="my_node/topic_name" type="string" value="/example_topic" /><param name="my_node/config.yaml" command="$(find my_package)/scripts/load_config.py" /></launch>
5. 启动节点: 使用<node>
标签启动一个ROS节点。需要指定节点的可执行文件路径、名称(可选,默认与可执行文件同名)、参数(如果有的话)以及额外的属性(如 respawn、remap、output等):
<launch><node pkg="your_package" type="your_node_executable" name="your_node_name" output="screen"><param name="param1" value="value1" /><param name="param2" value="value2" /></node></launch>
6. 节点间通信设置: 使用<remap>
标签重映射话题、服务或动作的名称:
<launch><node pkg="your_package" type="your_node_executable" name="your_node_name"><remap from="old_topic_name" to="new_topic_name" /></node></launch>
7. 条件语句与循环: 使用<if>
、<unless>
标签实现条件判断,<include>
标签结合$(eval)
进行循环操作:
<launch><group ns="$(arg robot_name)"><!-- 为每个机器人启动相同节点 --><include file="$(find your_package)/launch/node.launch"><arg name="robot_id" value="$(eval robot_name + '_node')" /></include></group></launch>
8. 包含其他launch文件: 使用<include>
标签将多个相关但独立的launch文件组合在一起:
<launch><include file="$(find other_package)/launch/other_launch_file.launch" /><!-- 其他内容 --></launch>
9. 定义和使用参数: 使用<arg>
标签定义参数,通过$(arg parameter_name)
引用:
<launch><arg name="input_topic" default="/default_topic" /><node pkg="your_package" type="your_node_executable" name="your_node_name"><remap from="input" to="$(arg input_topic)" /></node></launch>
完整示例:
<launch><!-- 设置环境变量 --><env name="ROS_PACKAGE_PATH" value="$(find your_package)/..:${env{ROS_PACKAGE_PATH}}" /><!-- 加载参数 --><param name="my_node/topic_name" type="string" value="/example_topic" /><param name="my_node/config.yaml" command="$(find my_package)/scripts/load_config.py" /><!-- 启动节点 --><node pkg="your_package" type="your_node_executable" name="your_node_name" output="screen"><param name="param1" value="value1" /><param name="param2" value="value2" /><remap from="old_topic_name" to="new_topic_name" /></node><!-- 条件语句与循环 --><group ns="$(arg robot_name)"><include file="$(find other_package)/launch/other_launch_file.launch"><arg name="robot_id" value="$(eval robot_name + '_node')" /></include></group><!-- 包含其他launch文件 --><include file="$(find other_package)/launch/other_launch_file.launch" />
</launch>