机器人有很多功能,每个功能都有一个launch文件,我们运行机器人时,可能需要同时启动这些launch文件。这时就可以使用IncludeLaunchDescription
在launch文件中嵌套启动launch文件。
1、举个栗子
# 导入描述launch文件的库,这是必须的
from launch import LaunchDescription
# 我们需要告诉现在的launch文件,其他要打开的launch文件,在文件系统的哪个位置
# 然后,去打开
# 于是就需要导入OS库和FindPackageShare库
# FindPackageShare库:找到指定名字的包,得到包的路径,例如/home/m/fishbot/src/fishbot_bringup
# 包下就是launch文件夹和xxx.launch.py文件,即launch/xxx.launch.py
# OS库:将上面两个路径合成一个/home/m/fishbot/src/fishbot_bringup/launch/xxx.launch.py,
# 即xxx.launch.py文件的路径
import os
from launch_ros.substitutions import FindPackageShare
# 导入启动另一个launch文件所需要的库
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
def generate_launch_description():
"""launch内容描述函数,由ros2 launch 扫描调用"""
# 构造被包含launch文件的路径,
# 比如:/home/m/fishbot/src/fishbot_bringup/launch/xxx.launch.py(见上面的分析)
# 找到指定名字的包,得到包的路径,例如/home/m/fishbot/src/fishbot_bringup
yolov5_ros2_pkg_share = FindPackageShare(package='yolov5_ros2').find('yolov5_ros2')
# 将两个路径合成一个/home/m/fishbot/src/fishbot_bringup/launch/xxx.launch.py,
# 即xxx.launch.py文件的路径
yolov5_ros2_launch_file_path = os.path.join(yolov5_ros2_pkg_share, 'launch', 'yolov5_ros2.launch.py')
camera_driver_pkg_share = FindPackageShare(package='fishbot_camera').find('fishbot_camera')
camera_driver_launch_file_path = os.path.join(camera_driver_pkg_share, 'launch', 'camera_driver.launch.py')
# 启动另一个launch的必要格式
yolov5_ros2_launch_file = IncludeLaunchDescription(
# yolov5_ros2_launch_file_path为yolov5_ros2包下launch文件的路径
PythonLaunchDescriptionSource(yolov5_ros2_launch_file_path),
# 可以在这里传递参数,例如:launch_arguments={'arg_name': 'arg_value'}.items(),
)
camera_driver_launch_file = IncludeLaunchDescription(
PythonLaunchDescriptionSource(camera_driver_launch_file_path),
# 可以在这里传递参数,例如:launch_arguments={'arg_name': 'arg_value'}.items(),
)
# 创建LaunchDescription对象launch_description,用于描述launch文件
ld = LaunchDescription()
ld.add_action(yolov5_ros2_launch_file)
ld.add_action(camera_driver_launch_file)
# 返回让ROS2根据launch描述执行节点
return ld
2、豪华大礼包——启动多个launch文件的所有配置
from launch import LaunchDescription
import os
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch_ros.substitutions import FindPackageShare
def generate_launch_description():
"""launch内容描述函数,由ros2 launch 扫描调用"""
yolov5_ros2_pkg_share = FindPackageShare(package='yolov5_ros2').find('yolov5_ros2')
yolov5_ros2_launch_file_path = os.path.join(yolov5_ros2_pkg_share, 'launch', 'yolov5_ros2.launch.py')
another-launch = IncludeLaunchDescription(
PythonLaunchDescriptionSource(yolov5_ros2_launch_file_path),
# 传递参数
launch_arguments={'arg-name': example-arg}.items()
)
ld.add_action(another-launch)
# 返回让ROS2根据launch描述执行节点
return ld