19 rosbridge 原理与环境部署

rosbridge 原理与环境部署

关联:索引

要解决的问题

章节内容(本讲核心):

与前置知识衔接(避免重复):

本讲主要部署的是 rosbridge_server(服务端)。但为了避免“服务跑起来了却不知道用什么连”的困惑,需要明确:rosbridge 并不是“装完就自动推送数据”,它是一个需要客户端发起 WebSocket 连接并按 JSON 协议交互的接口。

rosbridge client 是什么:

常见工程客户端(只做认知,不在本讲展开):


1. rosbridge 解决的“接口不兼容”问题

原生能力 不方便点
ROS2 节点 发布/订阅/服务调用(ROS2 API) Web 端不能直接参与 ROS2 Graph
Web 客户端 WebSocket/HTTP + JSON 不理解 ROS2 消息类型与 graph 机制

rosbridge_server 的角色:

1.1 术语澄清:rosbridge_suite、rosbridge_server 的关系(避免名词混淆)

在 ROS2(Humble)里常见的构成关系(概念级):

本讲为什么主要讲 rosbridge_server:

2. 数据流向(必须画出来)

以“订阅话题”为例:

  1. Web 客户端通过 WebSocket 连接到 rosbridge_server
  2. Web 客户端发送 JSON:op=subscribe,指定 topic 与(可选)type
  3. rosbridge_server 在 ROS2 侧创建订阅者
  4. ROS2 话题有新消息时,rosbridge_server 把消息打包为 JSON,通过 WebSocket 推送给 Web 客户端

以“发布话题”为例:

  1. Web 客户端发送 JSON:op=publish,带 topicmsg
  2. rosbridge_server 在 ROS2 侧创建发布者(或复用)
  3. 把 JSON 里的 msg 转换为 ROS2 消息并发布到指定话题

3. 重要边界与风险(只讲必须的)

本讲以 Ubuntu + ROS2(示例:Humble)为例。若你的 ROS2 发行版不同,把命令里的 humble 替换为你的发行版名称(例如 iron/jazzy)。

1. 前置检查:ROS2 是否已就绪

ros2 --version

如果你每次新开终端都无法使用 ros2,先执行(按你的发行版替换路径):

source /opt/ros/humble/setup.bash

2. 安装 rosbridge_server(apt 安装方式)

sudo apt update
sudo apt install ros-humble-rosbridge-server

可用以下命令做快速自检(任选其一):

ros2 pkg list | grep rosbridge

或:

ros2 pkg executables rosbridge_server

3. 启动 rosbridge WebSocket 服务(最小可用)

ros2 launch rosbridge_server rosbridge_websocket_launch.xml
  1. 终端日志持续运行,无反复崩溃重启。

四、练习(至少 2 题)

  1. 用自己的话解释:为什么“学会 WebSocket”不等于“能直接连 ROS2”,rosbridge 在中间补了哪一层?
  2. 你认为 rosbridge 暴露到局域网有哪些风险?写出至少 2 条“最小化风险”的做法。

六、学生任务(提交物与标准)

七、大模型任务(给 AI 的指令模板 + 校验点)

把下面提示词发给大模型,要求生成“可执行的安装与启动教程”,并在你本机执行后做二次修订。

提示词:

我要在 Ubuntu(ROS2 已安装)上部署 rosbridge_server,请输出一份可执行的教程,必须包含:
1) 如何确认 ROS2 环境已就绪(给出检查命令与预期输出)
2) 如何用 apt 安装 rosbridge_server(包名要用 ros-<distro>-rosbridge-server 的形式,并说明如何替换 distro)
3) 如何启动 rosbridge websocket(给出 ros2 launch 命令)
4) 如何验证端口监听与 WebSocket 连接可用(至少给出 1 种验证工具与步骤)
5) 常见错误与修复:命令找不到、包找不到、端口占用、连接被拒绝
输出格式:分步骤编号,每步都要有“命令 + 解释 + 预期现象”。

校验点(你必须人工检查):

  1. 服务是否在跑:启动命令窗口是否存活、有无报错
  2. 端口是否在监听:本机 9090(或你设置的端口)是否 LISTEN
  3. WebSocket 是否可连接:能否握手成功
  4. 协议是否可用:subscribe/publish(必要时 call_service)是否按预期响应

二、工程选型提示:直连 rosbridge vs 网关转发(与第 18 衔接)

方案 A(工程更常用):ROS2/数据源 → 网关(FastAPI WebSocket)→ 浏览器页面

对比要点(把“为什么更推荐网关模式”说清楚):

维度 方案 A:网关转发(业务协议) 方案 B:直连 rosbridge(通用 ROS 协议)
暴露能力面 通常只暴露少量业务动作与状态(可控) 订阅/发布/服务调用能力强(暴露面更大)
协议与耦合 Web 只认 type + payload,ROS2 内部 topic 可调整 Web 代码会出现大量 topic/type,迭代时更“前端跟着 ROS 改”
安全与治理 鉴权/限流/审计/协议校验集中在网关 需要在 ROS2 侧自行承担安全与治理成本
网络可达性 对虚拟机/NAT 友好:ROS2 只要能“出向连接网关” 对 NAT/多网段更敏感:浏览器要能访问到 ROS2 侧端口
HTTPS/WSS 网关更容易统一做 TLS/反向代理(https 页面通常需要 wss) ROS2 侧要做 wss 成本更高,混合内容更容易踩坑

rosbridge_server 默认常见端口是 9090,但以你启动日志为准。

用以下命令检查端口监听(任选其一):

ss -ltnp | grep 9090

如果系统没有 ss,可用 netstat(可能需要安装 net-tools):

netstat -lntp | grep 9090

1. 准备一个 WebSocket 客户端工具(两种常见方案)

方案 A:wscat(Node.js 工具,适合前端同学)

npm i -g wscat

或者:

sudo apt install node-wscat -y

方案 B:websocat(系统工具,适合服务器环境)

sudo apt install websocat

2. 建立连接

以 wscat 为例:

wscat -c ws://localhost:9090

3. 重要说明:ROS2 版 rosbridge 协议通常不支持 ping/pong

如果你在 wscat 中发送下面消息并看到日志报错:

{"op":"ping","id":"ping-1"}

并且 rosbridge_server 提示 Unknown operation: ping,这是“协议不支持该 op”的表现,而不是你环境一定坏了。ROS2 版 rosbridge(v2.0 协议)常见支持的 op 以 advertise/publish/subscribe/call_service 等为主。

下面用更通用、更稳定的方式做“协议最小验证”。

4. 协议最小验证(推荐):advertise + publish + ros2 topic echo

先在虚拟机另开一个终端(不要关 rosbridge),并确保已 source ROS2:

source /opt/ros/humble/setup.bash
ros2 topic echo /wscat_test std_msgs/msg/String

回到 wscat 的交互输入,依次发送两条 JSON:

  1. 先 advertise(声明你要向该话题发布,指定类型):
{"op":"advertise","topic":"/wscat_test","type":"std_msgs/msg/String"}
  1. 再 publish(真正发布一条消息):
{"op":"publish","topic":"/wscat_test","msg":{"data":"hello from wscat"}}

5. 协议最小验证(可选):subscribe /rosout(无需 talker)

如果你只想快速确认“subscribe 能工作”,可以订阅系统日志话题(可能会很密集):

{"op":"subscribe","topic":"/rosout","type":"rcl_interfaces/msg/Log"}

如果连接失败(连接被拒绝/超时):

1. 启动 ROS2 demo talker(让系统里真的有话题在发消息)

新开一个终端(不要关掉 rosbridge 的终端),并确保已 source ROS2:

source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talker

2. 通过 rosbridge 订阅 /chatter(在 wscat 中操作)

在 wscat 的交互输入中发送:

{"op":"subscribe","topic":"/chatter","type":"std_msgs/String"}
{"op":"publish","topic":"/chatter","msg":{"data":"Hello World: 42"}}

你要会读这条消息:

3. 通过 rosbridge 发布一条消息(在 wscat 中操作)

在 wscat 的交互输入中发送:

{"op":"publish","topic":"/chatter","msg":{"data":"hello from rosbridge websocket"}}

可选:运行 listener 验证发布是否进入 ROS2:

source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp listener

1. 监听地址:决定“谁能连上”

如果你确实需要让同学从另一台电脑连接(局域网联调),常见做法是在启动时指定监听地址与端口(参数名以你实际 launch 文件为准):

ros2 launch rosbridge_server rosbridge_websocket_launch.xml port:=9090 address:=0.0.0.0
ros2 launch rosbridge_server rosbridge_websocket_launch.xml --show-args

自检方式:

1.1 VMware Workstation(NAT)场景:宿主机 Windows 如何访问虚拟机里的 rosbridge

关键结论:

步骤 A(宿主机直接连虚拟机 IP,推荐优先用这个):

  1. 在 Ubuntu 虚拟机里查 IP(任选其一):
ip -4 addr show

或:

hostname -I
  1. 确保 rosbridge 监听对外地址(否则即使知道 IP 也连不上):
ros2 launch rosbridge_server rosbridge_websocket_launch.xml port:=9090 address:=0.0.0.0
  1. 在 Windows 宿主机验证端口可达(PowerShell):
Test-NetConnection <虚拟机IP> -Port 9090
  1. 在 Windows 宿主机用 wscat 连接(如果已安装):
wscat -c ws://<虚拟机IP>:9090

步骤 B(需要“用宿主机 localhost 访问”或需要给局域网同学访问时):配置 NAT 端口转发

  1. 在 VMware 里打开:Virtual Network Editor → 选 VMnet8(NAT)→ NAT Settings → Port Forwarding。
  2. 新增规则示例:
  1. 转发成功后,宿主机可用:
wscat -c ws://localhost:19090

2. 防火墙放行(仅在确有需要时)

如果启用 ufw 且需要外部访问,可放行 TCP 9090:

sudo ufw allow 9090/tcp
sudo ufw status

七、练习(至少 2 题)

  1. 解释下面两条地址的差异:ws://localhost:9090ws://192.168.1.10:9090。什么时候必须用后者?

提示词(更偏落地执行):

请为“ROS2 + rosbridge_server 环境部署与启动”写一份教程,要求:
1) 以 Ubuntu + ROS2 Humble 为例,但同时说明如何替换为其他发行版
2) 教程必须包含:安装、启动、端口检查、WebSocket 连接验证(wscat 或 websocat 二选一即可)
3) 每个步骤都要写:命令、解释、预期输出/现象、失败时如何排查
4) 给出一段“学生需要记录的信息清单”(地址、端口、日志关键字、截图点)
输出用 Markdown,结构清晰,可直接发给同学照做。

学生的“落地修订”要求:


课后作业(布置)

  1. 完成 rosbridge 环境部署并成功启动。
  2. 截图运行日志与服务状态。
  3. 撰写部署步骤说明(要求包含:环境信息、启动命令、ws 地址与端口、验证步骤与结果)。

参考与延伸