launch文件用来批量启动文件(想来大家是知道滴)。
前言
首先,ros2功能包下创建文件夹——launch;
接着,launch文件夹下创建xxx.launch.py文件;
最后,在文件中敲代码。
1、先来个简单例程:
# 导入库
# LaunchDescription,用于对launch文件内容进行描述
from launch import LaunchDescription
# Node,用于声明节点所在的位置,就是交代想运行的节点在哪个位置
from launch_ros.actions import Node
def generate_launch_description():
"""launch内容描述函数,由ros2 launch 扫描调用"""
# 这部分就是告诉系统啊,我要运行的节点在yolo_detect_2d文件中,而yolo_detect_2d这个文件
# 在yolov5_ros2这个包中
camera_driver = Node(
# 替换yolov5_ros2,为你想运行的节点所在包的名字
package="yolov5_ros2",
# 替换yolo_detect_2d为你运行的节点所在执行文件的名字
executable="yolo_detect_2d"
)
# 创建LaunchDescription对象ld,用于描述launch文件
# 低(通)俗点说,就是系统知道了我们想要运行的节点的位置,然后通过LaunchDescription函数运行
ld = LaunchDescription()
ld.add_action(camera_driver)
# 返回让ROS2根据launch描述执行节点
return ld
具体解释在代码中了。
然后呢,由于系统运行的是install目录下的launch文件,而不是我们编写的src文件夹中的,因而要
2、拷贝launch文件到install
操作如下:
如果,我们用的是
2.1 ament_cmake
类型功能包,
要使用cmake命令进行文件的拷贝,即在CMakeLists.txt文件中加入以下代码
install(
DIRECTORY launch config param maps
DESTINATION share/${PROJECT_NAME}
)
# 以上的四行
ament_package()
如果是
2.2 ament_python
类型功能包,
在setup.py文件中加入以下代码:
from setuptools import setup
from glob import glob
import os
setup(
name=package_name,
version='0.0.0',
packages=[package_name],
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
# 就是加入这行
(os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),
],
},
)
最后,编译、source、运行即可。
3、我要运行多个节点
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
# 第一个节点
node1 = Node(
package='package1-name',
executable='executable1-name',
)
# 第二个节点
node2 = Node(
package='package2-name',
executable='executable2-name',
)
# 第三个节点
node3 = Node(
package='package3-name',
executable='executable3-name',
)
ld = LaunchDescription()
ld.add_action(node1)
ld.add_action(node2)
ld.add_action(node3)
return ld
4、豪华套餐——节点相关所有配置
example-node = Node(
package='package-name', #节点所在的功能包
namespace='package-namespace', #命名空间。如果存在同名节点,这一选项会有用
executable='execute-name/script-name.py', #表示要运行的可执行文件名或脚本名字.py
parameters=[{'parameter-name': parameter-value}], #参数
arguments=['-xxx', xxx, '-xxx', xxx ], #启动参数
output='screen', #用于将节点信息打印到屏幕
name='node-name' #表示启动后的节点名,可以没有
remappings=[ #重映射
('/xxx/xxx-new', '/xxx/xxx-old'),
]
)