节点可以当做对数据加工处理的工厂,对数据进行加工处理,然后输出处理好的数据。
节点的数据来源一般是其他节点的输出,而节点的输出也可能作为后续节点的输入。
人脸识别节点功能中,通过订阅 /camera_raw 主题(topic)获取摄像头每一帧图像数据,然后分析是否存在人脸并与已识别过的进行比对,最后通过 face_recognition/image_jpeg 主题将结果以图像形式发布出来。当然,也可以发布文本形式的识别结果,一个节点订阅和发布主题数量没有限制。
节点之间的通信方式有三种:主题(Topic)、服务(Service)、动作(Action)。
| 通信方式 | 主题 (Topic) | 服务 (Service) | 动作 (Action) |
|---|---|---|---|
| 通信类型 | 异步通信 (Asynchronous) | 同步通信 (Synchronous) | 异步通信 (Asynchronous) |
| 通信双方 | 发布者 (Publisher) 订阅者 (Subscriber) |
服务端 (Server) 客户端 (Client) |
动作服务端 (Action Server) 动作客户端 (Action Client) |
| 数据流 | 单向(只问/只答) 发布者 → 网络 → 订阅者 |
双向 (一问一答) 客户端 → 请求 → 服务端 客户端 ← 响应 ← 服务端 |
双向 (一问多答) 1. 目标 (Client → Server) 2. 反馈 (Server → Client,持续、可选) 3. 结果 (Server → Client) |
| 通信机制 | 基于发布-订阅模型,多对多通信。数据一旦发布,所有订阅者都会收到。 | 基于客户端-服务器 (C/S) 模型,一对多通信。客户端发送一个请求,服务端处理并返回一个响应。 | 基于客户端-服务器模型,但扩展为长时间运行、有进度反馈的任务。 |
| 适用范围 | 适用于持续不断的数据流,如传感器数据(激光雷达、摄像头图像)、机器人状态(里程计、关节角度)、控制指令(速度命令)。 | 适用于瞬时的、需要即时响应的请求/查询,如计算、开关功能、查询状态。例如:求解逆运动学、开关传感器、获取地图。 | 适用于执行时间较长、需要状态反馈和可管理的任务,如导航到目标点、执行复杂的抓取操作、长时间计算任务。 |
| 类比 | 电台广播 (Broadcast Radio):广播者发出信号,任何收听者都能收到,但广播者不知道谁在听。 | 函数调用或API请求:发送参数,等待并获取返回值。 | 下载文件 :你提交一个下载任务,可以定期传输数据和进度(已经传输10%等),最后收到成功或失败的结果,并且可以随时取消它。 |
网页顶部直接点击“通信”页签,列出ROS系统中开启的全部通信方式,未启动节点不显示。
通过点击节点卡片进入页面,列出该节点使用的通信方式。
订阅主题和发布主题以ROS机器人视角来看。
订阅主题: 机器人订阅消息,网页就作为发布端负责发送数据;
发布主题: 机器人发布消息,网页就作为订阅端负责接收数据。
平台提供了订阅主题的示例程序(/hello_topic_listener),运行节点,然后点击节点卡片进入。
字符串类型 std_msgs/msg/String: data字段为要发送的内容。
运动控制类型 geometry_msgs.msg.Twist :提供虚拟手柄发送数据,可自定义调整虚拟按键对应的数据。
点击虚拟手柄上的按钮,或对应的键盘快捷键,发送数据。
平台提供了发布主题的示例程序(/hello_topic_speaker),运行节点,然后点击节点卡片进入。
视频图像 sensor_msgs/msg/CompressedImage : 可实时查看视频流。
选择打开方式“图片”, 点击“订阅”。
平台提供了服务的示例程序(/hello_service),运行节点,然后点击节点卡片进入。
填写要发送的数据后,点击“发送”按钮,在操作日志中可以看到发送成功,收到回应数据“Hello python!”
可循环向机器人发送数据,设置发送间隔和次数。其中间隔单位毫秒(ms),次数为0表示无限循环发送。
循环发送时可点击“停止”按钮中止发送。