工厂里的工人就像节点:每个工人(节点)只专注于做好自己的工位(单一功能)。他们通过喊话、手势(话题/服务/动作)来传递信息。
车间里的摄像头网络就像计算图:这个网络实时监控着所有工人的状态、位置以及他们之间的通信流,让你站在监控中心就能看清整个车间的运作全貌。
技术定义:ROS2计算图(Computational Graph)是一个由节点(Nodes)和它们之间的通信链路(Topics, Services, Actions)构成的网络拓扑结构。这个网络是动态的,节点可以随时加入或离开。
| 文件系统结构 | 运行时定义 | 功能描述 |
|---|---|---|
| 包(Package) | 可执行文件(Executable) | 一个包可以包含多个可执行文件,每个可执行文件可以运行多个节点 |
| 节点(Node) | 运行时进程 | 在系统中唯一标识,通过节点名区分,包含发布器、订阅器等 |
| 节点句柄(Node Handle) | rclc:Node对象 | 程序中使用Node类实例来创建通信实体、获取参数 |
我在调试一个多机器人系统时,发现新加入的机器人始终无法被现有节点发现。排查了半天,发现是因为两个机器人的发现端口被办公室防火墙阻断了。ROS2节点发现默认使用UDP端口7400-7500,但在很多企业网络环境中,多播流量会被隔离。如果发现节点无法互相发现,可以先检查网络是否支持UDP多播,或者考虑配置DDS的发现机制,将多播改为单播。
ros2 node list时,看到的是全名。如果发现节点没有出现,先确认启动文件中的命名空间设置是否正确。ros2 node list:列出当前计算图中所有活的节点。ros2 node info /node_name:查看指定节点的详细信息,包括它发布和订阅的话题、提供的服务。ros2 topic list:列出所有话题。ros2 graph:用文本方式显示计算图中的节点和话题连接关系(需要安装rqt_graph图形工具)。# 终端1:启动两个节点
$ ros2 run demo_nodes_cpp talker
$ ros2 run demo_nodes_cpp listener
# 终端2:查看节点
$ ros2 node list
/talker
/listener
# 查看某个节点的详细信息
$ ros2 node info /listener
# 输出会告诉你它订阅了/chatter话题,但没发布任何话题
ros2 run显然不现实。这时就需要启动文件(Launch File)。
启动文件是一个Python或XML/ YAML脚本,它告诉ROS2:你要启动哪些节点、每个节点属于哪个包、节点参数是什么、是否需要重映射话题名称。
import launch
import launch_ros.actions
def generate_launch_description():
return launch.LaunchDescription([
launch_ros.actions.Node(
package='demo_nodes_cpp',
executable='talker',
name='my_talker', # 重命名节点
namespace='robot1' # 指定命名空间
),
launch_ros.actions.Node(
package='demo_nodes_cpp',
executable='listener',
name='my_listener'
),
])
启动后,计算图中会出现两个节点:/robot1/my_talker和/my_listener。
| 状态 | 说明 | 典型操作 |
|---|---|---|
| Unconfigured | 节点刚创建,尚未配置 | 调用configure()进入Inactive |
| Inactive | 已配置但未激活,不会处理数据 | 调用activate()进入Active |
| Active | 正常运行,进行发布/订阅 | 调用deactivate()回到Inactive |
| Finalized | 节点已被销毁 | 清理资源,不可逆 |
ros2 node list和ros2 node info可以实时查看计算图状态。ros2 run demo_nodes_cpp talker;第二个运行ros2 run demo_nodes_cpp listener;第三个运行ros2 node list,观察输出结果。ros2 node info /talker,检查它发布了什么话题。/robot1/talker,然后重新启动,查看节点列表的变化。/camera_driver的节点发布或订阅了哪些话题,你应该使用哪个命令?ros2 node list /camera_driverros2 node info /camera_driverros2 topic info /camera_driver