什么是ROS2 nodes
先了解一下ROS2 graph。ROS2 graph是一个ROS2元素同时处理数据的网络。它包含了所有可执行程序和它们之间的连接。
ROS中每个负责单独功能的模块叫做节点(node)(例如,一个节点用于控制轮子电机,一个节点用于控制激光测距等)。每个节点可以通过topics(话题)、services(服务)、actions(动作)或parameters(参数)向其它节点发送和接收数据。
如以下动图所示,包含3个节点,通过话题和服务进行数据传输。
一个完整的机器人系统由许多协同工作的节点组成。在 ROS 2 中,单个可执行程序(C++ 程序、Python 程序等)可以包含一个或多个节点。
节点里面有啥?
在上一篇学习笔记里我已经安装了ROS2,并且可以正常运行海龟模拟器(turtlesim)。那就通过turtlesim来学一下节点。
运行turtlesim
打开一个终端,先加载ROS2环境source /opt/ros/galactic/setup.bash
(每次打开新的terminal必 先source一下 )。然后运行命令:
ros2 run turtlesim turtlesim_node
看到海龟模拟器窗口
查看节点列表
可以通过以下命令才查看当前系统中正在运行的节点。新开一个终端输入:
ros2 node list
终端返回:
/turtlesim
说明当前节点列表中只有一个叫/turtlesim的节点。
再开一个新的终端,运行海龟控制键盘:
ros2 run turtlesim turtle_teleop_key
然后在前一个终端重新查看以下节点列表。
终端返回:
/turtlesim
/teleop_turtle
可以看到现在节点列表中有两个节点。
查看节点信息
通过ros2 node list
命令可以知道当前运行中的节点个数和名称,现在可以用以下命令来看关于节点的更多信息
ros2 node info <node_name>
比如我要查看/turtlesim这个节点,在终端输入
ros2 node info /turtlesim
终端返回下面这一大串的信息,有订阅者列表,发布者列表,服务列表和动作列表。
/turtlesim
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
Service Servers:
/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
/turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
/turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
/turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
/turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
/turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
再来看一下海龟操控键盘节点/teleop_turtle
的信息:
/teleop_turtle
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Service Servers:
/teleop_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
/teleop_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/teleop_turtle/get_parameters: rcl_interfaces/srv/GetParameters
/teleop_turtle/list_parameters: rcl_interfaces/srv/ListParameters
/teleop_turtle/set_parameters: rcl_interfaces/srv/SetParameters
/teleop_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
Action Clients:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
可以看到/turtlesim
和/teleop_turtle
里有几个相同的信息。比如/turtlesim
节点的订阅者列表里有/turtle1/cmd_vel
,而/teleop_turtle
节点的发布者列表也有/turtle1/cmd_vel
。比如/turtlesim
节点的动作服务端里/turtle1/rotate_absolute
,而/teleop_turtle
节点的动作客户端里也有/turtle1/rotate_absolute
。
再看一下,我们启动海龟键盘turtle_teleop_key程序的时候,会返回这一段操作帮助信息:
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
Use G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.
'Q' to quit.
是不是可以想到键盘控制海龟行走的控制数据就是通过两个节点中相同的信息建立数据连接通信的呢?
关于ROS2 节点的学习就先到这吧。
参考:
- ROS 2 Documentation:https://docs.ros.org/en/galactic/index.html