本文记录了 ROS2 中 launch 文件学习过程中我个人觉得重要的 6 个基本问题,和大家分享,希望可以帮到初学者。
疑问1:launch 文件有什么用?
通过 launch 文件,ROS2 可以同时启动许多节点,这样简化了用命令行去多次启动不同的 Node。
疑问2:launch 文件怎么用?
完整的命令:
ros2 launch <package_name> <launch_file_name>
也可以直接启动 launch 文件,像这样:
ros2 launch turtlesim_mimic_launch.py
turtlesim_mimic_launch.py 是一个 python 文件,在里面定义了一个 launch 文件的内容。
但 ROS1 launch 是不支持 py 文件的,而事实上 launch 文件在 ROS2 中有 3 种格式可以实现:
- python 脚本
- xml 文件
- yaml 文件
疑问3:launch 文件里面应该有什么?
node 相关
launch file 文件当中最重要的是 node 信息,它指定了包的信息、node 的名字还有可执行文件的路径。
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2">
<param name="background_r" value="$(var background_r)"/>
<param name="background_g" value="$(var background_g)"/>
<param name="background_b" value="$(var background_b)"/>
</node>
include
include 可以在一个 launch file 中包含另外的 launch file
group
group 可以把多个 node 组合在一起
疑问4:如何编写一个 launch file?
无论是 python、xml 还是 yaml,编写 launch file 的步骤差不多一样。
- 设置命令行参数的默认值,
- 设置 launch file 的包含关系,通过 标签
- 设置 Node 信息,包括 name、namespace、parameter
- 如果需要设置 remmaping 则设置 remapping 关系
官方文档有出示个一个例子
# example.launch.py
import os
from ament_index_python import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.actions import IncludeLaunchDescription
from launch.actions import GroupAction
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration
from launch.substitutions import TextSubstitution
from launch_ros.actions import Node
from launch_ros.actions import PushRosNamespace
def generate_launch_description():
# args that can be set from the command line or a default will be used
background_r_launch_arg = DeclareLaunchArgument(
"background_r", default_value=TextSubstitution(text="0")
)
background_g_launch_arg = DeclareLaunchArgument(
"background_g", default_value=TextSubstitution(text="255")
)
background_b_launch_arg = DeclareLaunchArgument(
"background_b", default_value=TextSubstitution(text="0")
)
chatter_ns_launch_arg = DeclareLaunchArgument(
"chatter_ns", default_value=TextSubstitution(text