前序:ROS 2 | 行动-actions- 啥,开了十几个窗口,机器人还没有动起来…… 是时候了解一下launch文件啦。 课程目标:使用启动文件运行复杂的ROS 2系统。 ROS 2启动launch 1. 什么是launch? 翻译为启动文件未必准确 到目前为止,在教程中,一直在为运行的每个新节点打开新终端。当创建越来越多的节点同时运行更复杂的系统时,打开终端并重新输入配置详细信息将变得乏味和低效。 启动文件launch可以同时启动和配置许多包含ROS 2节点的可执行文件。 使用命令ros2 launch运行一个启动文件将立即启动整个系统-包括所有节点及其配置。 这里,只讲一个最简单的案例。 2. 编写launch: 使用如下命令: type nul > turtlesim_mimic_launch.py
具体代码如下: from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='turtlesim',
node_namespace='turtlesim1',
node_executable='turtlesim_node',
node_name='sim'
),
Node(
package='turtlesim',
node_namespace='turtlesim2',
node_executable='turtlesim_node',
node_name='sim'
),
Node(
package='turtlesim',
node_executable='mimic',
node_name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
])
3. 解释一下吧: 代码是python规范的。 导入模块: from launch import LaunchDescription
from launch_ros.actions import Node
启动文件: def generate_launch_description():
return LaunchDescription([
])
内部LaunchDescription是一个由三个节点组成的系统 启动描述中启动两个turtlesim窗口: Node(
package='turtlesim',
node_namespace='turtlesim1',
node_executable='turtlesim_node',
node_name='sim'
),
Node(
package='turtlesim',
node_namespace='turtlesim2',
node_executable='turtlesim_node',
node_name='sim'
),
注意,两个节点之间的唯一区别是它们的node_namespace值。 唯一的名称空间使系统可以启动两个模拟器,而不会出现节点名或主题名冲突的情况。 该系统中的两个海龟都接收同一主题的命令,并在同一主题上发布其姿势。如果没有唯一的名称空间,就无法区分用于一只乌龟或另一只乌龟的消息。 可以试一下重名后问题在哪里??? 然后是最后一个节点mimic: Node(
package='turtlesim',
node_executable='mimic',
node_name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
该节点以重新映射的形式添加了配置详细信息。 4. 运行launch启动节点
ros2 launch turtlesim_mimic_launch.py
如果需要使用标准格式: ros2 launch <package_name> <launch_file_name>
需要编写功能包中配置文件,此处不支持。
两个小龟同时运动命令如下: ros2 topic pub -r 1 /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.8}}"
看到两只乌龟都走相同的路径。
如何实现标准命令格式呢? 需要在CMakeLists.txt加入: install(DIRECTORY launch
DESTINATION share/${PROJECT_NAME})
5. 小结 启动文件简化了具有许多节点和特定配置详细信息的复杂系统的运行。使用Python创建启动文件,然后使用命令ros2 launch运行它们。 该部分与ROS1差异比较大,需多查阅官网和源码。 https://github.com/ros2/launch https://index.ros.org/doc/ros2/Tutorials/Launch-system/