ROS2学习笔记之创建启动文件篇
学习目标:能够通过启动文件启动一个复杂的ROS系统
背景
在前面的教程当中我们每次都要打开两个终端去启动节点,今后我们会有越来越多的节点,这种操作将会变得十分无聊。
启动文件可以同时启动多个节点,同时对他们进行配置。
通过ros2 launch
可以一次启动所有节点,而且一次对所有节点完成配置
准备条件
需要安装rqt_graph 和 turtlesim,同时需要一个文本编辑器
学习内容
1. 准备操作
我们创建一个文件夹存储启动文件
mkdir launch
我们通过下面的命令创建一个启动文件,从ros1过来的同学就发现有点东西啊,启动文件变为.py
了继续看戏吃瓜
touch launch/turtlesim_mimic_launch.py
2 编写启动文件
找一个你最喜欢的文本编辑器打开刚刚创建的文件
我们把下面的内容粘贴到文件中
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',
node_name='sim'
),
Node(
package='turtlesim',
node_namespace='turtlesim2',
node_executable='turtlesim_node',
node_name='sim'
),
Node(
package='turtlesim',
node_executable='mimic',
node_name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
])
2.1 启动文件详解
这部分不多解释,学过Python的都知道,首先我们导入点东西和C++include类似
from launch import LaunchDescription
from launch_ros.actions import Node
接下来定义了一个函数
def generate_launch_description():
return LaunchDescription([
])
LaunchDescription
描述这个系统结构,一共三个节点,全部来自turtlesim
包,我们要实现的功能就是启动两个乌龟界面让其中一个乌龟的动作跟随另外一个乌龟。
我们接着往下看前面两部分很简单就是启动了两个乌龟
Node(
package='turtlesim',
node_namespace='turtlesim1',
node_executable='turtlesim_node',
node_name='sim'
),
Node(
package='turtlesim',
node_namespace='turtlesim2',
node_executable='turtlesim_node',
node_name='sim'
),
我们可以发现两个节点只有node_namespace
不同,我们可以通过设置命名空间不同的方式同时启动两个节点,并且保证话题和节点名字不会发生冲突。
如果没有命名空间的区分,两个海龟都接收同一话题的命令,并且在同一个话题上发布其息,就无法区分两只海龟的消息。
最后一个节点也是来自turtlesim
包,但是是另外一个可执行文件
Node(
package='turtlesim',
node_executable='mimic',
node_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
。这个节点的话题重映射过后订阅turtlesim1
的位置给turtlesim2
发送速度,执行效果就会让海龟二号跟随海龟一号的动作。
3 ros2 launch
我们通过下面的方式运行这个启动文件
ros2 launch launch/turtlesim_mimic_launch.py
我们可以通过直接运行一个文件的方式启动一个launch文件,就像上面那样,我们还可以启动一个ros包内的启动文件语法格式如下
ros2 launch <package_name> <launch_file_name>
,在后面的教程当中会慢慢讲到这种启动方式
运行过后我们看到出现了两个海龟界面,同时终端也有相关消息输出
[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 -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
通过这个节点关系图我们可以很清楚的看到当前ros的节点连接情况
总结
启动文件是启动多个节点同时进行节点配置的很方便的形式,我们可以创建一个Python脚本通过ros2 launch
来启动这个脚本进而启动整个系统。