理解节点
3.理解节点
背景
ROS2中的两个节点
ROS中的每个节点应该负责一个单一的模块化功能,例如控制轮子马达或发布来自激光测距仪的传感器数据。每个节点可以通过主题(topics)、服务(services)、动作(actions)或参数(parameters)与其他节点进行数据的发送和接收。
一个完整的机器人系统由许多协同工作的节点组成。在ROS 2中,单个可执行文件(C++程序、Python程序等)可以包含一个或多个节点。
1.ROS2 run
命令ros2 run会从一个软件包中启动一个可执行文件。
ros2 run <package_name> <executable_name>要运行turtlesim,请打开一个新的终端,并输入以下命令:
ros2 run turtlesim turtlesim_nodeturtlesim窗口将会打开。 这里,包名是[[#2.使用turtlesim、ros2和rqt]],可执行文件名是 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_turtle2.1 重映射
重映射 允许你重新分配默认节点属性,如节点名称、话题名称、服务名称等,以自定义的值。在上一个教程中,你在turtle_teleop_key上使用了重映射来改变cmd_vel话题和目标节点为turtle2。
现在,让我们重新分配/turtlesim节点的名称。在一个新的终端中运行以下命令:
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle由于您再次调用ros2 run启动了turtlesim,将会打开另一个turtlesim窗口。但是,现在如果您返回到之前运行ros2 node list的终端,并再次运行该命令,您将看到三个节点名称:
/my_turtle
/turtlesim
/teleop_turtle3.ros2 节点信息
既然您知道了节点的名称,您可以使用以下命令访问有关它们的更多信息:
ros2 node info <node_name>要查看您最新的节点my_turtle,请运行以下命令:
ros2 node info /my_turtleros2 node info返回订阅者、发布者、服务和动作的列表,即与该节点进行交互的ROS图连接。输出应该如下所示:
/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有何不同。
# 执行 `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_node和turtle_teleop_key可执行文件。
你学会了如何使用 ros2 node list 命令来发现活动节点的名称,以及使用 ros2 node info 命令来内省单个节点。这些工具对于理解复杂的实际机器人系统中的数据流非常重要。
