目标: 学习ROS 2关于关于节点的功能,并且通过工具跟它交互。
知识讲解
ROS 2 图 (ROS 2 graph)
经过前面的几个博客,我们通过rqt这个图形界面工具,以及turtlesim大致的了解到ROS 2 的一下核心的概念。这个核心的概念组成了ROS 2 graph(图)。如果你还没有浏览过之前的博客,可以到我的ROS 2专栏中翻一下。
在接下来的几个教程,我们将会详细地学习到一系列关于ROS 2的核心概念。
ROS 图(graph)是一个能够同时地共同进行数据处理的ROS 2的组件。它包含了全部的可执行文件以及它们之间的连接,如果你选择将这些全部可视化出来的话。
ROS 2 的节点
每个节点都应该负责一个单独的模块化的功能,比如一个节点负责控制车轮的电机,一个节点负责控制激光雷达,等等。没一个节点应该可以通过话题、服务、动作或者参数向其它节点发送消息和接收其它节点发送过来的消息。
一个完整的机器人系统是包含了许多个共同工作的节点的。在ROS 2中,一个单独的可执行文件,比如c++程序、Python程序等,可以包含一个到多个节点。
前提条件
前面的turtlesim和rqt的教程已经展示了如何安装turtlesim并使用它,如果还没安装或者不确定是否已经安装,可以戳这个教程:Foxy的turtlesim和rqt。还有,不要忘记在每一个新开启的终端source设置脚本,如果不太记得了,可以看这个教程:如何设置ROS 2的环境。
任务
1. ros2 run
ros2 run
这个命令会从一个包中启动一个可执行文件。
ros2 run <package_name> <executable_name>
为了运行turtlesim,打开一个新的终端,并且输入下面的命令:
ros2 run turtlesim turtlesim_node
turtlesim的窗口会打开,正如你前面的教程所看到的一样。
这里,包的名字是turtlesim
,可执行名字是turtlesim_node
。
可是,我们依然不知道节点的名字是什么,你可以通过ros2 node list
来查找。
2. ros2 node list
ros2 node list
会向你展示所有正在运行的节点的名字。这个在你希望和一个节点进行交互的时候会非常有用,或者当你的系统运行了许多节点,你需要对他们进行追踪的时候。
当turtlesim还在运行的时候,打开一个新的终端,然后输入下面的指令:
ros2 node list
终端会返回节点的名字:
/turtlesim
打开另一个新的终端,通过下面的指令启动teleop节点:
ros2 run turtlesim turtle_teleop_key
这里,我们可以再次搜索turtlesim
这个包,这次的可执行名字是turtle_teleop_key
.
返回你运行 ros2 node list
的终端,并再一次运行它。你会看到两个活跃的节点:
/turtlesim
/teleop_turtle
2.1 Remapping
Remapping让你更改节点的默认属性,比如节点名字、话题名字、服务名字等等。在上一个教程(ROS 2 中的小海龟以及rqt的使用(2))中,我们在turtle_teleop_key
中使用remapping来改变默认被控制的小海龟。
现在,让我们更改/turtlesim
这个节点的名字。在一个新的终端里面,运行下面的命令:
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
因为你使用 ros2 run
又调用了 turtlesim,应外一个turtlesim的窗口会打开。但是,现在如果你返回你运行 ros2 node list
的终端,并且运行它,你会看到下面三个节点的名字:
/turtlesim
/teleop_turtle
/my_turtle
3. ROS2 节点信息
现在你已经知道节点的名字了,你可以通过下面的命令访问更多关于他们的信息:
ros2 node info <node_name>
为了检验你最新打开的节点,my_turtle
,你可以运行下面的命令:
ros2 node info /my_turtle
ros2 node info
会返回跟这个节点有互动的订阅器、发布器、服务以及动作的列表,输出类似下面的样子:
/my_turtle
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/color_sensor: turtlesim/msg/Color
/turtle1/pose: turtlesim/msg/Pose
Services:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
/reset: std_srvs/srv/Empty
/spawn: turtlesim/srv/Spawn
/turtle1/set_pen: turtlesim/srv/SetPen
/turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
/turtle1/teleport_relative: turtlesim/srv/TeleportRelative
/my_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
/my_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/my_turtle/get_parameters: rcl_interfaces/srv/GetParameters
/my_turtle/list_parameters: rcl_interfaces/srv/ListParameters
/my_turtle/set_parameters: rcl_interfaces/srv/SetParameters
/my_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
现在你可以在/teleop_turtle
节点上执行相同的命令,会看到它的连接会跟my_turtle
不一样。
你可以在接下来的教程里面,学习到更多关于ROS图的连接相关的内容。可以关注我或者订阅我的专栏:ROS 2专栏。
总结
节点是ROS 2中最基础的组成部分,它在一个机器人系统中为单一的模块功能服务。