编写一个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文件会包含如下声明:
XML
<launch>
<!-- ROS launch文件内容 -->
</launch>
3 .设置ROS环境变量 : 可以通过<env>
标签来设置环境变量,如设置ROS主目录:
XML
<launch>
<env name="ROS_PACKAGE_PATH" value="$(find your_package)/..:${env{ROS_PACKAGE_PATH}}" />
<!-- 其他ROS环境变量设置 -->
</launch>
4. 加载参数 : 使用<param>
标签将参数加载到参数服务器。可以指定参数的值或从文件中读取:
XML
<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等):
XML
<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>
标签重映射话题、服务或动作的名称:
XML
<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)
进行循环操作:
XML
<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文件组合在一起:
XML
<launch>
<include file="$(find other_package)/launch/other_launch_file.launch" />
<!-- 其他内容 -->
</launch>
9. 定义和使用参数 : 使用<arg>
标签定义参数,通过$(arg parameter_name)
引用:
XML
<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>
完整示例:
XML
<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>