Skip to content

理解节点

3.理解节点

背景

ROS2中的两个节点

ROS中的每个节点应该负责一个单一的模块化功能,例如控制轮子马达或发布来自激光测距仪的传感器数据。每个节点可以通过主题(topics)、服务(services)、动作(actions)或参数(parameters)与其他节点进行数据的发送和接收。

Nodes-TopicandService.gif一个完整的机器人系统由许多协同工作的节点组成。在ROS 2中,单个可执行文件(C++程序、Python程序等)可以包含一个或多个节点。

1.ROS2 run

命令ros2 run会从一个软件包中启动一个可执行文件。

bash
ros2 run <package_name> <executable_name>

要运行turtlesim,请打开一个新的终端,并输入以下命令:

bash
ros2 run turtlesim turtlesim_node

turtlesim窗口将会打开。 这里,包名是[[#2.使用turtlesim、ros2和rqt]],可执行文件名是 turtlesim_node

然而,我们还不知道节点名称。您可以使用 ros2 node list 命令查找节点名称。

2. ros2 node list

ros2 node list 命令将显示所有正在运行的节点的名称。当您想与节点进行交互或者系统运行多个节点时需要跟踪它们时,这特别有用。

在另一个终端中打开新的终端,同时 turtlesim 仍在运行,请输入以下命令:

bash
ros2 node list

终端将返回节点名称:

bash
/turtlesim

再打开一个新的终端,并使用以下命令启动 teleop 节点:

bash
ros2 run turtlesim turtle_teleop_key

在这里,我们再次引用了“turtlesim”软件包,但这次我们的目标是名为“turtle_teleop_key”的可执行文件。

返回到之前运行ros2 node list的终端,再次运行该命令。你将会看到两个活动节点的名称:

bash
/turtlesim
/teleop_turtle
2.1 重映射

重映射 允许你重新分配默认节点属性,如节点名称、话题名称、服务名称等,以自定义的值。在上一个教程中,你在turtle_teleop_key上使用了重映射来改变cmd_vel话题和目标节点为turtle2

现在,让我们重新分配/turtlesim节点的名称。在一个新的终端中运行以下命令:

bash
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle

由于您再次调用ros2 run启动了turtlesim,将会打开另一个turtlesim窗口。但是,现在如果您返回到之前运行ros2 node list的终端,并再次运行该命令,您将看到三个节点名称:

bash
/my_turtle
/turtlesim
/teleop_turtle
3.ros2 节点信息

既然您知道了节点的名称,您可以使用以下命令访问有关它们的更多信息:

bash
ros2 node info <node_name>

要查看您最新的节点my_turtle,请运行以下命令:

bash
ros2 node info /my_turtle

ros2 node info返回订阅者、发布者、服务和动作的列表,即与该节点进行交互的ROS图连接。输出应该如下所示:

bash
/my_turtle # 节点名称,代表一个具体的功能节点(此处是 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 # 发布日志消息到 rosout 话题,用于输出节点运行中的日志(如调试信息、警告、错误等) 
	/turtle1/color_sensor: turtlesim/msg/Color # 发布海龟底部颜色传感器数据,包含当前位置的RGB颜色信息 
	/turtle1/pose: turtlesim/msg/Pose # 发布海龟当前位姿信息,包括x坐标、y坐标、朝向角度、线速度、角速度 
	
Service Servers: # 服务服务器列表(该节点提供哪些服务,可被其他节点调用) 
	/clear: std_srvs/srv/Empty # 提供清空画布服务,调用后清除海龟运动轨迹,无输入输出参数 
	/kill: turtlesim/srv/Kill # 提供删除海龟服务,输入海龟名称,删除指定海龟 
	/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 # 提供原子化设置参数服务,确保多个参数的设置要么全部成功,要么全部失败(避免部分生效) 
	/reset: std_srvs/srv/Empty # 提供重置服务,调用后将海龟恢复到初始位置和状态,无输入输出参数 
	/spawn: turtlesim/srv/Spawn # 提供生成新海龟服务,输入位置、角度、名称等信息,在指定位置生成新海龟 
	/turtle1/set_pen: turtlesim/srv/SetPen # 提供设置画笔服务,输入颜色、线宽等参数,修改海龟运动轨迹的样式 
	/turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute # 提供绝对位置 teleport 服务,输入目标坐标和角度,将海龟直接移动到指定位置 
	/turtle1/teleport_relative: turtlesim/srv/TeleportRelative # 提供相对位置 teleport 服务,输入相对距离和角度,将海龟从当前位置相对移动 

Service Clients: # 服务客户端列表(该节点会调用哪些其他节点的服务) # 此处为空,表示该节点不主动调用其他服务 

Action Servers: # 动作服务器列表(该节点提供哪些动作服务,支持长时间任务和反馈) 
	/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute # 提供绝对旋转动作服务,输入目标角度,控制海龟旋转到指定角度,过程中会反馈当前角度 
	
Action Clients: # 动作客户端列表(该节点会调用哪些其他节点的动作服务) # 此处为空,表示该节点不主动调用其他动作服务

现在尝试在/teleop_turtle节点上运行相同的命令,观察它的连接与my_turtle有何不同。

bash
# 执行 `ros2 node info /teleop_turtle`命令的输出结果 
There are 2 nodes in the graph with the exact name "/teleop_turtle". 
# 提示:系统中存在2个同名节点 "/teleop_turtle",当前仅显示其中一个的信息 
You are seeing information about only one of them. 

/teleop_turtle # 节点名称(海龟遥控节点,用于通过键盘等设备控制海龟运动) 

Subscribers: # 订阅者列表(该节点接收的话题) 
	/parameter_events: rcl_interfaces/msg/ParameterEvent # 订阅参数事件话题,用于接收系统中参数变化的通知(如其他节点参数修改) 
	
Publishers: # 发布者列表(该节点发布的话题) 
	/parameter_events: rcl_interfaces/msg/ParameterEvent # 发布参数事件话题,当自身参数变化时向系统广播 
	/rosout: rcl_interfaces/msg/Log # 发布日志消息到 rosout 话题,输出运行日志(调试、警告等) 
	/turtle1/cmd_vel: geometry_msgs/msg/Twist # 发布海龟速度控制指令,包含线速度和角速度,用于控制 /turtle1 节点的运动 

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 # 调用海龟绝对旋转动作服务,向 /turtle1 节点发送旋转目标角度,实现精确转向控制

在即将进行的教程中,您将更多地了解ROS图连接概念,包括消息类型。

个人想法:ROS2的这个:

==Subscribers: # 订阅者列表(该节点接收的话题) :相当于编程中的对象的 “输入接口”,用于接收外部传来的数据(类似函数的 “输入参数”,但不是变量本身,而是获取数据的方式)。==

==Publishers: # 发布者列表(该节点发布的话题):相当于编程中的对象的 “输出接口”,用于向外部主动推送数据(类似对象的 “getter 方法” 或 “事件通知”,但更强调主动推送)。==

==Service Servers: # 服务服务器列表(该节点提供的服务):服务是 “请求 - 响应” 模式,和编程中的对象的方法完全对应:其他对象(客户端)调用服务时,服务服务器(当前对象)执行特定逻辑并返回结果。==

==Service Clients: # 服务客户端列表(该节点调用的其他服务):相当于编程中的对象所调用的其他对象的方法,服务客户端主动调用其他节点的服务,和 “对象 A 调用对象 B 的方法” 完全一致。==

==Action Servers: # 动作服务器列表(该节点提供的动作服务):对象的 “耗时方法”,支持进度反馈和中途取消,动作是比服务更复杂的交互模式,适用于需要长时间执行(如移动机器人导航 10 秒)、需要实时反馈(当前走了多少米)、允许中途取消的场景。==

==Action Clients: # 动作客户端列表(该节点调用的其他动作服务):调用其他对象的 “耗时方法”,并处理其进度反馈和结果,动作客户端主动发起一个长时间任务,过程中接收进度、处理结果或发送取消指令,对应 “对象 A 调用对象 B 的耗时方法,并实时获取进度 / 取消任务”。==

总结

节点是ROS 2中的基本元素,在机器人系统中具有单一的模块化功能。

在本教程中,您利用了turtlesim包中创建的节点,通过运行turtlesim_nodeturtle_teleop_key可执行文件。

你学会了如何使用 ros2 node list 命令来发现活动节点的名称,以及使用 ros2 node info 命令来内省单个节点。这些工具对于理解复杂的实际机器人系统中的数据流非常重要。

最近更新