您一直在为运行的每个新节点打开新终端。当您创建越来越多的节点同时运行的更复杂的系统时,打开终端并重新输入配置详细信息将变得乏味。
Launch 文件使您可以同时启动和配置许多包含 ROS 2 节点的可执行文件。
使用 ros2 launch
命令运行一个启动文件将立即启动整个系统-所有节点及其配置。
1 配置
首先创建一个 launch 文件夹,作为后续放置 launch 文件的目录:
$ mkdir launch
接下来就可以创建 launch 文件啦:
Linux:
$ touch launch/turtlesim_mimic_launch.py
macOs:
$ touch launch/turtlesim_mimic_launch.py
Winows:
$ type nul > launch/turtlesim_mimic_launch.py
没错,ROS2 中的 launch 文件其实是一个 python 的脚本。
2 Write the launch file¶
接下来我们尝试使用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'),
]
)
])
在 LaunchDescription
中描述了三个节点的启动,都是 turtlesim
包中的节点。
Node(
package='turtlesim',
namespace='turtlesim1',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
namespace='turtlesim2',
executable='turtlesim_node',
name='sim'
),
这是前两个节点的描述,可以看到除了命名空间之外,其他的内容都是一样的,这里是启动了两个海龟仿真器,通过命名空间区分开,不然会有同名节点的问题。唯一的名称空间使系统可以启动两个模拟器,而不会出现节点名或主题名冲突的情况。
package
表示节点所在的功能包,executable
表示要运行的可执行文件名,name
表示启动后的节点名。
该系统中的两个海龟都接收同一主题的命令,并在同一主题上发布其姿势。如果没有唯一的名称空间,就无法区分用于一只乌龟或另一只乌龟的消息。最后一个节点启动的是 turtlesim
功能包中的 mimic
节点,其中主要是在配置 mimc
的 remapping
重映射参数。
该节点以重新映射的形式添加了配置详细信息。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¶
为了验证我们的猜想,可以试下启动launch文件看看效果啦。
$ cd launch
$ ros2 launch turtlesim_mimic_launch.py
注意:
这里我们可以直接启动 launch 文件,如果 launch 文件在功能包(参考 creating packages )中的话,也可以用如下语法启动:
$ ros2 launch <package_name> <launch_file_name>
很快可以看到两个小海龟仿真窗口启动啦,终端中也有如下提示:
为了看到 turtle2
是否会模仿 turtle1
,我们需要在让 turtle1
动起来:
$ 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}}"
没错,turtle2
和 turtle1
的动作完全一致。
3 使用 rqt_graph 观测系统
为了看到更明确的节点关系,我们可以使用之前介绍的 rqt_graph
工具来观测下系统:
$ rqt_graph
这样是不是很清晰,和我们前边的猜想一样,mimic
节点订阅 turtle1
的位姿,然后转换成速度指令发布给 turtle2
。
好啦,这就是 launch 文件,可以实现多个节点的配置和启动,我们可以使用 python 完成 launch 文件,使用 ros2 launch
命令启动 launch 文件。