目标 创建一个launch文件来运行一个复杂的ROS 2系统。
背景知识
直到这个教程之前,你已经尝试过通过打开新的终端,运行新的节点。随着你创建越来越复杂的系统,系统中有越来越多需要同时运行的节点,打开多个终端并且重新输入设置就变得让人厌烦。
Launch文件让你可以同时启动并配置多个多执行的ROS 2 节点。
使用ros2 launch
命令运行一个launch文件就可以一次性启动你的整个系统,包括全部的节点以及他们的配置文件。
前提条件
这个教程会用到rqt_graph以及turtlesim包。
你也会使用到文本编辑器。
最好,别忘记了在每个新开启的终端上source你的ROS 2。
任务
1. 设置
创建一个文件夹来存储你的launch文件:
mkdir launch
通过在终端输入下面的命令,创建一个名字叫turtlesim_mimic_launch.py
的launch文件:
touch launch/turtlesim_mimic_launch.py
你也可以通过系统的文件夹使用图形界面的方式来创建一个新的文件。
使用你喜欢的文本编辑器打开这个新的文件。
2. 编写launch文件
让我们用turtlesim
包以及它的可执行文件来组成一个ROS 2 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'),
]
)
])
2.1 检查launch文件
这些import的声明,引入了一些Python的launch
模块。
from launch import LaunchDescription
from launch_ros.actions import Node
接下来开始的是launch文件的描述。
def generate_launch_description():
return LaunchDescription([
])
在LaunchDescription
之内是由三个节点组成的系统,三个节点全部都是来自turtlesim
包。这个系统的目标是启动两个turtlesim窗口,以及让一个turtle模仿另外一个的运动。
launch描述文件的前两个动作是启动两个turtlesim窗口:
Node(
package='turtlesim',
namespace='turtlesim1',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
namespace='turtlesim2',
executable='turtlesim_node',
name='sim'
),
注意到,两个节点之间的唯一差别就是它们的namespace的值不一样。不一样的namespace允许系统中启动两个模拟器,他们的节点名字和话题名字不会冲突。
两个turtle在这个系统中通过相同的话题接受命令,通过相同的话题发布他们的位姿。没有了独特的namespace的话,没有办法区分这些消息是给哪一个turtle的。
最后一个节点也是来自turtlesim
包,但是它是不同的可执行文件:mimic
:
Node(
package='turtlesim',
executable='mimic',
name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
这个节点已经通过remapping的方式添加了配置细节。
mimic
的/input/pose
话题被重新映射到 /turtlesim1/turtle1/pose
并且它的 /output/cmd_vel
话题被重新映射到/turtlesim2/turtle1/cmd_vel
。这意味着 mimic
将会订阅 /turtlesim1/sim
的位姿话题,并且重新发布它到 /turtlesim2/sim
的速度命令所订阅的话题。也就是说, 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>
你可以通过这个教程学习如何创建包。
两个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]
为了看到系统运行,打开一个新的终端并且运行 ros2 topic pub
通过 /turtlesim1/turtle1/cmd_vel
这个话题让第一个turtle移动起来:
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}}"
你将会看到两个turtle沿着相同的路径移动。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v0SjpFfN-1628648460396)(https://docs.ros.org/en/foxy/_images/mimic.png)]
4. 使用rqt_graph查看系统内部的运行情况
当系统还在运行的时候,打开一个新的终端,并且运行rqt_graph
以便对你launch文件中的节点之间的关系有更好的理解。
运行下面的命令:
rqt_graph
一个隐藏的节点(你运行ros2 topic pub
命令生成的)正在将数据发布到在左边的 /turtlesim1/turtle1/cmd_vel
这个话题,这个话题是被 /turtlesim1/sim
这个节点所订阅的。图中剩下的部分显示的是之前所描述的:mimic
订阅 /turtlesim1/sim
的位姿话题,然后发布到/turtlesim2/sim
的速度命令话题。
总结
launch文件简化了拥有多个节点以及特定配置细节的复杂的系统的运行。你可以使用Python创建启动文件,然后通过ros2 launch
命令运行它们。
学习更多关于ROS 2相关的内容,可以关注我或者订阅我的专栏:ROS 2专栏。