You're reading the documentation for a development version. For the latest released version, please have a look at Galactic.
创建 launch 文件
目标:创建一个启动文件来运行一个复杂的 ROS 2 系统。
Tutorial level: Beginner
Time: 10 minutes
背景
到目前为止,在本教程中,您已经为运行的每个新节点打开了新的终端。当您创建同时运行越来越多节点的更复杂系统时,打开终端并重新输入配置细节将变得非常繁琐。
启动文件允许您同时启动和配置多个包含 ROS 2 节点的可执行文件。
使用 ros2 launch
命令运行单个启动文件将立即启动整个系统——所有节点及其配置。
任务
1 设置
创建一个新的目录来存储你的 launch 文件:
mkdir launch
在终端中输入以下命令,创建一个名为 turtlesim_mimic_launch.py
的启动文件:
touch launch/turtlesim_mimic_launch.py
touch launch/turtlesim_mimic_launch.py
type nul > launch/turtlesim_mimic_launch.py
您还可以使用 GUI 进入系统的文件目录,并以这种方式创建一个新文件。
在首选文本编辑器中打开新文件。
编写 launch 文件
让我们使用 turtlesim
包及其可执行文件来组合一个 ROS 2 启动文件。
将完整的代码复制并粘贴到 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'),
]
)
])
2.1 检查 launch 文件
这些导入语句会导入一些 Python launch
模块。
from launch import LaunchDescription
from launch_ros.actions import Node
接下来,开始描述 launch 本身:
def generate_launch_description():
return LaunchDescription([
])
LaunchDescription
中有一个由三个节点组成的系统,所有节点都来自 turtlesim
包。该系统的目标是启动两个海龟模拟窗口,让一只海龟模仿另一只的动作。
启动描述中的前两个动作启动两个 turtlesim 窗口:
Node(
package='turtlesim',
namespace='turtlesim1',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
namespace='turtlesim2',
executable='turtlesim_node',
name='sim'
),
注意,这两个节点之间的唯一区别是它们的名称空间值。唯一的名称空间允许系统启动两个没有节点名称或主题名称冲突的模拟器。
在这个系统中,两只海龟都接收关于同一主题的命令,并发布它们在同一主题上的姿势。如果没有惟一的名称空间,就没有办法区分海龟的消息。
最后一个节点也来自 turtlesim 包,但它是一个不同的可执行文件:mimic
。
Node(
package='turtlesim',
executable='mimic',
name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
该节点以重新映射的形式添加了配置细节。
mimic
的 /input/pose
主题被映射到 /turtlesim1/turtle1/pose
,它的 /output/cmd_vel
主题被映射到 /turtlesim2/turtle1/cmd_vel
。这意味着 mimic
将订阅 /turtlesim1/sim
的 pose
主题,并为 /turtlesim2/sim
的 velocity 命令主题重新发布它。换句话说,turtlesim2
会模仿 turtlesim1
的动作。
3 ros2 launch
要启动 turtlesim_mimic_launch.py
,请进入之前创建的目录并运行以下命令:
cd launch
ros2 launch turtlesim_mimic_launch.py
注解
可以直接启动 launch 文件(如上所述),也可以由包提供。当它由包提供时,语法是:
ros2 launch <package_name> <launch_file_name>
您将在后面的教程中了解更多关于 创建包 的内容。
注解
对于有启动文件的软件包,最好在你的软件包的 package.xml
中添加一个 exec_depend
对 ros2launch
软件包的依赖:
<exec_depend>ros2launch</exec_depend>
这有助于确保在构建你的软件包后,ros2 launch
命令是可用的。它还确保所有 launch文件格式 被识别
两个 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
节点订阅的。graph 的其余部分显示了前面描述的内容:mimic
订阅 /turtlesim1/sim
的 pose
主题,并发布 /turtlesim2/sim
的 velocity 命令主题。
下一步
注解
你也可以使用 XML 和 YAML 来创建启动文件。你可以在 Using Python, XML, and YAML for ROS 2 Launch Files 中看到这些不同的 ROS 2 launch 格式的比较。
在下一个教程中,记录和回放数据,你将了解另一个有用的工具,ros2bag
。