一个实际的机器人一般包括 N 个节点,实际运行调试时每个节点开一个终端去启动效率太低,也不方便管理。 Launch 脚本就是用于启动多个节点,支持不同节点使用不同的配置及参数,方便在不同环境下启动配置不同的机器人程序。

Launch 启动文件支持 XMLYAMLPYTHON 格式

Python 版本 Launch

  1. 我们创建一个包用来保存 launch 文件

    1
    
    ros2 pkg create  launch_demo --destination-directory src --build-type ament_cmake --license Apache-2.0
  2. 在包根目录下创建一个 launch 目录,里面创建一个 demo_launch.py 文件

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    # -*- coding: utf-8 -*-
    from launch import LaunchDescription
    from launch_ros.actions import Node
    
    def generate_launch_description():
        """函数名字不能修改
        """
        # 定义一个节点动作,表示启动这个节点
        topic_publish_node = Node(
            package="cpp_topic_publish_demo", # 包名
            executable="cpp_topic_publish_demo", # 可执行文件名
            output="screen" # 日志输出位置
        )
    
        topic_subscribe_node = Node(
            package="cpp_topic_subscribe_demo",
            executable="cpp_topic_subscribe_demo",
            output="screen"
        )
    
        # 返回启动描述,是一个 launch_ros.actions 类型的数组
        return LaunchDescription([topic_publish_node, topic_subscribe_node])
  3. 在 CMakeLists.txt 中将 launch 目录安装到 share 目录

    1
    2
    3
    
    install(DIRECTORY launch
      DESTINATION share/${PROJECT_NAME}
    )
  4. 然后使用 ros2 launch launch_demo demo_launch.py 启动,就可以看到两个节点启动了,并且将日志输出到屏幕

YAML 格式 Launch 文件

%YAML 1.2
---
launch:
  - node:
      pkg: "cpp_topic_publish_demo"
      exec: "cpp_topic_publish_demo"
      output: "screen"

  - node:
      pkg: "cpp_topic_subscribe_demo"
      exec: "cpp_topic_subscribe_demo"
      output: "screen"

启动命令: ros2 launch launch_demo demo_launch.yaml

XML 格式 Launch 文件

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<launch>
  <node pkg="cpp_topic_publish_demo" exec="cpp_topic_publish_demo" output="screen"/>
  <node pkg="cpp_topic_subscribe_demo" exec="cpp_topic_subscribe_demo" output="screen"/>
</launch>

启动命令: ros2 launch launch_demo demo_launch.xml

Launch 传递节点参数

python 文件创建节点时可以使用 arguments , ros_arguments 或者 parameters 几种方式

1
2
3
4
5
6
7
8
9
int_param_node = Node(
    package="cpp_param_declare_demo",
    executable="cpp_param_declare_demo",
    output="screen",
    # arguments=["--ros-args", "-p", "int_param:=1234578"]
    # ros_arguments=["-p", "int_param:=222333"],

     parameters=[{"int_param": 9999999}]
)

xmlyaml 使用 argsros_args 字段

python 文件从命令行动态传入参数可以声明一个参数动作,解析后传给节点

1
2
from launch import substitutions
from launch.actions import DeclareLaunchArgument
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11

int_param_arg = DeclareLaunchArgument("int_param", default_value="777777")

int_param_node = Node(
    package="cpp_param_declare_demo",
    executable="cpp_param_declare_demo",
    output="screen",
    # arguments=["--ros-args", "-p", "int_param:=1234578"]
    # ros_arguments=["-p", "int_param:=222333"],
    parameters=[{"int_param": substitutions.LaunchConfiguration("int_param")}]
)

启动时就可以传入参数

1
ros2 launch launch_demo demo_launch.py int_param:=555555555