ROS2入门教程—创建一个launch文件
到现在为止,每次启动一个ROS2中的节点,我们都需要开启一个新的终端运行
ros2 run
指令,如果机器人系统中的节点很多,这样就会非常麻烦,而且还需要对每个节点进行配置。ROS2针对这个问题,专门设计了launch启动文件,可以通过一个类似脚本的文件,一起启动多个节点并允许在文件中对节点进行配置。使用
ros2 launch
命令运行单个launch文件将立即启动整个系统—所有节点及其配置。接下来我们就看看如何才能创建并使用一个launch文件。
1 配置
首先创建一个launch文件夹,作为后续放置launch文件的目录:
mkdir launch
接着,进入到上述文件夹,然后输入以下命令创建一个launch文件:
touch launch/turtlesim_mimic_launch.py
可以看出,ROS2中的launch文件其实是一个python的脚本。
2 创建launch文件内容
接下来我们尝试使用launch文件来启动小海龟仿真器中的几个节点,可以将以下内容拷贝到上面创建的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',
name='sim'
),
Node(
package='turtlesim',
node_namespace='turtlesim2',
node_executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
node_executable='mimic',
name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
])
类似python程序一样,首先应该引用需要的模块。
from launch import LaunchDescription
from launch_ros.actions import Node
接下来是launch文件起始的描述:
def generate_launch_description():
return LaunchDescription([
])
在LaunchDescription
中有一个由三个节点组成的系统,都来自turtlesim
功能包。该系统的目标是启动两个turtlesim窗口,让一只海龟模仿另一只海龟的动作。
LaunchDescription
中的前两个操作启动两个turtlesim窗口:
Node(
package='turtlesim',
node_namespace='turtlesim1',
node_executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
node_namespace='turtlesim2',
node_executable='turtlesim_node',
name='sim'
),
请注意,这两个节点之间的唯一区别是它们的namespace
(命名空间)。唯一的命名空间允许系统启动两个模拟器,而不存在节点名或话题名冲突。这个系统中的两只海龟都在同一话题上接收命令,并在同一话题上发布它们的姿态。如果没有唯一的命名空间,就无法区分两只海龟之间的消息。package
表示节点所在的功能包,executable
表示要运行的可执行文件名,name
表示启动后的节点名。
最后一个节点启动的是turtlesim
功能包中的mimic
节点:
Node(
package='turtlesim',
node_executable='mimic',
name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
其中主要是在配置mimic
的remapping
重映射参数。mimic
的输入话题从/input/pose
重映射为/turtlesim1/turtle1/pose
,输出话题从/output/cmd_vel
重映射为/turtlesim2/turtle1/cmd_vel
。我们基本可以猜到,mimic
节点通过订阅turtle1的位置,转换成对turtle2的速度指令发布出去,最后应该可以达到让turtle2模仿turtle1完成同样的运动。
3 启动launch文件
要启动turtlesim_mimic_launch.py
,请进入到先前创建的目录并运行以下命令:
cd launch
ros2 launch turtlesim_mimic_launch.py
注意:这里我们可以直接启动launch文件,如果launch文件在功能包中的话,也可以用如下语法启动:
ros2 launch <package_name> <launch_file_name>
执行上述命令之后,将打开两个小海龟仿真窗口,并且在终端中您将看到以下[INFO]
消息,告诉您launch文件已启动的节点:
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [sim-1]: process started with pid [11429]
[INFO] [sim-2]: process started with pid [11430]
[INFO] [mimic-3]: process started with pid [11431]
使用ros2 topic list
命令查看当前系统中存在的话题:
/parameter_events
/rosout
/turtlesim1/parameter_events
/turtlesim1/rosout
/turtlesim1/turtle1/cmd_vel
/turtlesim1/turtle1/color_sensor
/turtlesim1/turtle1/pose
/turtlesim2/parameter_events
/turtlesim2/rosout
/turtlesim2/turtle1/cmd_vel
/turtlesim2/turtle1/color_sensor
/turtlesim2/turtle1/pose
为了验证turtle2是否会模仿turtle1运动,可以开启一个新终端,并在/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/turtlesim
节点订阅的。图的其余部分显示了前面所描述的内容:/turtle_mimic
节点订阅/turtlesim1/turtlesim
发布的位姿话题/turtlesim1/turtle1/pose
,然后转化为速度指令/turtlesim2/turtle1/cmd_vel
并发布到/turtlesim2/turtlesim
。
launch文件简化了具有许多节点和特定配置详细信息的复杂系统的运行。您可以使用Python创建launch文件,并使用ros2 launch
命令运行它们。