创建启动文件
目标: 创建启动文件来运行复杂的 ROS 2 系统。
教程级别: 中级
时间: 10 分钟
先决条件
本教程使用 rqt_graph 和 turtlesim 包。
您还需要使用您喜欢的文本编辑器。
与往常一样,不要忘记在 每次打开新终端 中获取 ROS 2。
背景
ROS 2 中的启动系统负责帮助用户描述其系统的配置,然后按照描述执行。 系统配置包括要运行哪些程序、在哪里运行它们、向它们传递哪些参数以及 ROS 特定的约定,通过为每个组件提供不同的配置,可以轻松地在整个系统中重用组件。 它还负责监视已启动进程的状态,并报告和/或对这些进程状态的变化做出反应。
用 Python、XML 或 YAML 编写的启动文件可以启动和停止不同的节点,以及触发和响应各种事件。
有关不同格式的描述,请参阅 使用 Python、XML 和 YAML 生成 ROS 2 启动文件。
提供此框架的软件包是 launch_ros
,它使用非 ROS 特定的 launch
框架。
设计文档 详细说明了 ROS 2 启动系统的设计目标(目前并非所有功能都可用)。
任务
1 设置
创建一个新的目录来存储您的启动文件:
mkdir launch
2 编写启动文件
让我们使用“turtlesim”包及其可执行文件组合一个 ROS 2 启动文件。 如上所述,它可以是 Python、XML 或 YAML。
将完整代码复制并粘贴到“launch/turtlesim_mimic_launch.py”文件中:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='turtlesim',
namespace='turtlesim1',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
namespace='turtlesim2',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
executable='mimic',
name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
])
将完整代码复制并粘贴到“launch/turtlesim_mimic_launch.xml”文件中:
<launch>
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim1"/>
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2"/>
<node pkg="turtlesim" exec="mimic" name="mimic">
<remap from="/input/pose" to="/turtlesim1/turtle1/pose"/>
<remap from="/output/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
</node>
</launch>
将完整代码复制并粘贴到“launch/turtlesim_mimic_launch.yaml”文件中:
launch:
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim1"
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim2"
- node:
pkg: "turtlesim"
exec: "mimic"
name: "mimic"
remap:
-
from: "/input/pose"
to: "/turtlesim1/turtle1/pose"
-
from: "/output/cmd_vel"
to: "/turtlesim2/turtle1/cmd_vel"
2.1 检查启动文件
上述所有启动文件都在启动一个由三个节点组成的系统,这些节点均来自 turtlesim
包。
该系统的目标是启动两个 turtlesim 窗口,并让一只海龟模仿另一只海龟的动作。
启动两个 turtlesim 节点时,它们之间的唯一区别是它们的命名空间值。
唯一的命名空间允许系统启动两个节点,而不会发生节点名称或主题名称冲突。
该系统中的两只海龟都通过同一主题接收命令,并通过同一主题发布其姿势。
使用唯一的命名空间,可以区分针对不同海龟的消息。
最后一个节点也来自 turtlesim
包,但可执行文件不同:mimic
。
此节点已以重新映射的形式添加了配置详细信息。
mimic
的 /input/pose
主题被重新映射到 /turtlesim1/turtle1/pose
,而它的 /output/cmd_vel
主题被重新映射到 /turtlesim2/turtle1/cmd_vel
。
这意味着 mimic
将订阅 /turtlesim1/sim
的姿势主题,并将其重新发布给 /turtlesim2/sim
的速度命令主题进行订阅。
换句话说,turtlesim2
将模仿 turtlesim1
的动作。
这些导入语句引入了一些 Python“启动”模块。
from launch import LaunchDescription
from launch_ros.actions import Node
接下来,启动描述本身开始:
def generate_launch_description():
return LaunchDescription([
])
启动描述中的前两个操作启动两个 turtlesim 窗口:
Node(
package='turtlesim',
namespace='turtlesim1',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
namespace='turtlesim2',
executable='turtlesim_node',
name='sim'
),
最后的操作是使用重新映射启动模拟节点:
Node(
package='turtlesim',
executable='mimic',
name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
前两个操作启动两个 turtlesim 窗口:
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim1"/>
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2"/>
最后的操作是使用重新映射启动模拟节点:
<node pkg="turtlesim" exec="mimic" name="mimic">
<remap from="/input/pose" to="/turtlesim1/turtle1/pose"/>
<remap from="/output/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
</node>
前两个操作启动两个 turtlesim 窗口:
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim1"
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim2"
最后的操作是使用重新映射启动模拟节点:
- node:
pkg: "turtlesim"
exec: "mimic"
name: "mimic"
remap:
-
from: "/input/pose"
to: "/turtlesim1/turtle1/pose"
-
from: "/output/cmd_vel"
to: "/turtlesim2/turtle1/cmd_vel"
3 ros2 launch
要运行上面创建的 launch 文件,请进入您之前创建的目录并运行以下命令:
cd launch
ros2 launch turtlesim_mimic_launch.py
cd launch
ros2 launch turtlesim_mimic_launch.xml
cd launch
ros2 launch turtlesim_mimic_launch.yaml
Note
可以直接启动启动文件(如上所示),也可以通过包提供启动文件。 当由包提供启动文件时,语法为:
ros2 launch <package_name> <launch_file_name>
您在:doc:创建包 中了解了有关创建包的信息。
Note
对于带有启动文件的软件包,最好在软件包的“package.xml”中添加对“ros2launch”包的“exec_depend”依赖项:
<exec_depend>ros2launch</exec_depend>
这有助于确保在构建包后可以使用“ros2 launch”命令。
它还确保所有:doc:启动文件格式<../../../How-To-Guides/Launch-file-different-formats>都被识别。
将打开两个 turtlesim 窗口,您将看到以下“[INFO]”消息,告诉您启动文件已启动哪些节点:
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [turtlesim_node-1]: process started with pid [11714]
[INFO] [turtlesim_node-2]: process started with pid [11715]
[INFO] [mimic-3]: process started with pid [11716]
要查看系统运行情况,打开一个新终端并在“/turtlesim1/turtle1/cmd_vel”主题上运行“ros2 topic pub”命令,以使第一只海龟移动:
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}}"
你会看到两只乌龟沿着同一条路径行走。
4 使用 rqt_graph 检查系统
在系统仍在运行时,打开一个新终端并运行“rqt_graph”以更好地了解启动文件中节点之间的关系。
运行命令:
rqt_graph
一个隐藏节点(您运行的 ros2 topic pub
命令)正在将数据发布到左侧的 /turtlesim1/turtle1/cmd_vel
主题,/turtlesim1/sim
节点订阅了该主题。
图表的其余部分显示了前面描述的内容:mimic
订阅了 /turtlesim1/sim
的姿势主题,并发布到 /turtlesim2/sim
的速度命令主题。
摘要
启动文件简化了运行具有许多节点和特定配置详细信息的复杂系统。
您可以使用 Python、XML 或 YAML 创建启动文件,并使用 ros2 launch
命令运行它们。