在ROS 2(Robot Operating System version 2)中,launch.py
文件用于定义启动配置,它允许用户同时启动多个节点和/或ROS服务。launch.py
使用 Python 的 launch
库来编写,这个库提供了一系列API来定义启动行为。
以下是 launch.py
中一些基本的语法和元素:
1. 导入语句
在文件顶部,你需要导入 launch
和 launch_ros
库中的必要组件:
from launch import LaunchDescription
from launch_ros.actions import Node
2. 定义 LaunchDescription
LaunchDescription
是一个列表,其中包含了所有要启动的节点和其他配置。
def generate_launch_description():
return LaunchDescription([
# 这里添加节点和其他配置
])
3. 添加节点
使用 Node
类来添加节点到启动配置中。你需要指定节点所属的包、节点的可执行文件名称,以及任何需要的参数。
Node(
package='demo_nodes_cpp',
executable='talker',
name='talker_node',
output='screen',
arguments=['--ros-args', '-p', 'param:=value']
),
4. 使用 IncludeLaunchDescription
如果你想要包含另一个 launch.py
文件中的启动配置,可以使用 IncludeLaunchDescription
。
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
IncludeLaunchDescription(
PythonLaunchDescriptionSource([另一个Python文件的路径]),
launch_arguments={'arg1': 'value1', 'arg2': 'value2'}.items(),
),
5. 使用条件启动
你可以使用 Condition
来根据某些条件决定是否启动某个节点或配置。
from launch.conditions import IfCondition
Node(
condition=IfCondition(launch_configuration['condition']),
package='demo_nodes_cpp',
executable='listener',
name='listener_node',
),
6. 环境变量
设置环境变量可以使用 SetEnvironmentVariable
动作。
from launch.actions import SetEnvironmentVariable
SetEnvironmentVariable('ENV_VAR_NAME', 'value'),
7. 使用透明传输参数
有时,你可能需要将命令行参数传递给节点,这可以通过 OpaqueFunction
实现。
from launch.actions import OpaqueFunction
OpaqueFunction(function='some_function', args=['arg1', 'arg2']),
8. 使用实例
以下是一个 launch.py
文件的实例,它演示了如何在ROS 2中使用Python编写启动文件来同时启动多个节点。在这个例子中,我们将使用 turtlesim
包中的节点来展示如何配置和启动它们。
# 导入必要的库
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
"""生成launch描述"""
return LaunchDescription([
# 启动第一个turtlesim节点,命名空间为turtlesim1
Node(
package='turtlesim',
namespace='turtlesim1',
executable='turtlesim_node',
name='sim'
),
# 启动第二个turtlesim节点,命名空间为turtlesim2
Node(
package='turtlesim',
namespace='turtlesim2',
executable='turtlesim_node',
name='sim'
),
# 启动mimic节点,用于让第二个turtlesim模仿第一个turtlesim的动作
Node(
package='turtlesim',
executable='mimic',
name='mimic',
output='screen', # 在屏幕上显示输出
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'), # 输入位姿话题重映射
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel') # 输出速度指令话题重映射
]
)
])
# 这个脚本可以直接通过ros2 launch命令运行,前提是它位于ROS 2的工作空间中的某个包的launch目录下
# 例如,如果你的包名为my_turtlesim_launch,并且launch.py位于my_turtlesim_launch/launch目录下
# 那么你可以通过以下命令运行它:
# ros2 launch my_turtlesim_launch launch.py
在这个实例中,我们定义了三个节点:
-
第一个和第二个节点都是
turtlesim_node
,但是它们被放置在不同的命名空间中(turtlesim1
和turtlesim2
)。这样做是为了避免节点名称和话题名称的冲突,允许同时运行两个turtlesim
模拟器。 -
第三个节点是
mimic
,它订阅第一个turtlesim
的位姿话题,并将相应的速度指令发布到第二个turtlesim
的速度指令话题上,从而实现模仿功能。
要运行这个 launch.py
文件,你需要确保它位于ROS 2工作空间中的一个包的 launch
目录下,并且该包已经被编译。然后,你可以使用 ros2 launch
命令加上包名和 launch.py
文件名来启动它。
结论
launch.py
文件是ROS 2中用于定义复杂启动配置的强大工具。通过组合使用上述元素,你可以创建灵活的启动脚本,以适应不同的开发和测试需求。