ROS2 数据不在现场也能看:Ubuntu 22.04 用 Foxglove Bridge + cpolar 远程看话题和图像流
ROS2 数据不在现场也能看:Ubuntu 22.04 用 Foxglove Bridge + cpolar 远程看话题和图像流
机器人调试最烦的一件事:机器在实验室,人不在现场。
只想让老师、同事或者外场人员临时看一下 ROS2 话题、TF、图像流,结果一上来就要 VPN、远程桌面、开 SSH、改网络。说实话,这种做法很容易把一个小问题搞成安全事故。
我更推荐的方式是:机器人主机只启动 Foxglove Bridge,再用 cpolar 临时映射这个 WebSocket 端口。别人只需要打开 Foxglove Web,连上一个临时地址,就能看数据;演示结束后关掉隧道,不长期暴露主机。
这篇文章要跑通什么
环境按最常见的来:
- Ubuntu 22.04
- ROS2 Humble
- Foxglove Bridge
- cpolar 临时公网访问
- demo 话题 / 可选图像流
这里不假装有真实机器人硬件。为了让你能复现,我用 ROS2 自带 demo 和image_tools/cam2image演示。真实机器人上只要有话题在发布,思路一样。
最终效果是:
- Ubuntu 上启动 ROS2 示例话题;
- 启动
foxglove_bridge,监听本机8765端口; - 用 cpolar 把
8765临时映射到公网; - 远程浏览器打开 Foxglove Web,通过
wss://xxx连接; - 看完后关闭 cpolar 隧道。
划重点:不要暴露 SSH,不要把整个 ROS2 网络扔到公网,不要开放控制类话题写入权限。
先检查系统和 ROS2 环境
先确认系统版本:
lsb_release -a正常应该能看到 Ubuntu 22.04:
Description: Ubuntu 22.04.x LTS Codename: jammy再检查 ROS2 是否已经装好:
source /opt/ros/humble/setup.bash ros2 --version ros2 topic list如果ros2命令不存在,说明 ROS2 Humble 还没装。这里给一份最小前置流程,完整安装建议以 ROS 官方文档为准。
sudo apt update sudo apt install -y software-properties-common curl gnupg lsb-release sudo add-apt-repository universe sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \ -o /usr/share/keyrings/ros-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \ http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | \ sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null sudo apt update sudo apt install -y ros-humble-desktop装完后建议把环境写进 shell 配置:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc如果你用的是 zsh,就写到~/.zshrc:
echo "source /opt/ros/humble/setup.bash" >> ~/.zshrc source ~/.zshrc安装 Foxglove Bridge 和示例包
Foxglove Bridge 在 ROS2 Humble 下可以直接用 apt 安装:
sudo apt update sudo apt install -y \ ros-humble-foxglove-bridge \ ros-humble-demo-nodes-cpp \ ros-humble-turtlesim \ ros-humble-image-tools确认包能找到:
ros2 pkg list | grep foxglove_bridge如果能输出:
foxglove_bridge说明安装没问题。
启动一个可复现的 ROS2 demo 话题
先开一个终端,启动 talker:
source /opt/ros/humble/setup.bash ros2 run demo_nodes_cpp talker再开一个终端,检查话题:
source /opt/ros/humble/setup.bash ros2 topic list你应该能看到:
/chatter /parameter_events /rosout看一下/chatter数据:
ros2 topic echo /chatter如果能持续输出Hello World,说明 demo 正常。
想演示图像流的话,可以再开一个终端启动cam2image:
source /opt/ros/humble/setup.bash ros2 run image_tools cam2image --ros-args -p burger_mode:=true这个命令不依赖真实摄像头,会发布一张示例图像,适合教程复现。如果你要接真实 USB 摄像头,再按自己的驱动和权限处理。
检查图像话题:
ros2 topic list | grep image常见会看到类似:
/image启动 Foxglove Bridge
现在启动 Foxglove Bridge。为了让 cpolar 能映射,建议监听0.0.0.0,端口用默认常见的8765:
source /opt/ros/humble/setup.bash ros2 launch foxglove_bridge foxglove_bridge_launch.xml \ address:=0.0.0.0 \ port:=8765正常情况下,终端会显示 bridge 已启动,并监听 WebSocket 服务。
再开一个终端检查端口:
ss -lntp | grep 8765能看到类似输出就可以:
LISTEN 0 ... 0.0.0.0:8765 ...本机也可以用 Foxglove Web 先试一下:
ws://127.0.0.1:8765Foxglove Web 地址是:
https://app.foxglove.dev/打开后选择连接 Foxglove WebSocket,填入ws://127.0.0.1:8765。如果能看到/chatter、/image等话题,说明本地链路已经通了。
用 cpolar 临时映射 Foxglove Bridge 端口
接下来处理远程访问。
安装 cpolar:
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash如果是第一次使用,需要登录 cpolar 控制台获取 authtoken,然后执行:
cpolar authtoken <你的 authtoken>把本地8765映射成公网 HTTP/HTTPS 地址:
cpolar http 8765启动后终端里会出现类似:
Forwarding https://xxxx.cpolar.top -> http://localhost:8765Foxglove Bridge 本质是 WebSocket 服务。远程连接时,把 HTTPS 地址改成 WSS:
wss://xxxx.cpolar.top然后让远程同事打开:
https://app.foxglove.dev/选择 Foxglove WebSocket 连接,填入:
wss://xxxx.cpolar.top如果配置正常,远程浏览器就能看到 ROS2 话题列表。比如/chatter、/image、/rosout。
在 Foxglove 里看什么
连接成功后,可以先看几个基础项:
- Topics:确认
/chatter、/image是否出现; - Raw Messages:查看
/chatter原始消息; - Image 面板:选择
/image看图像流; - Logs:查看
/rosout; - Layout:保存一个临时调试布局,方便别人复看。
如果是团队协作,我建议只让对方看必要话题,不要把调试过程变成远程控制过程。
这也是我喜欢这种方案的原因:cpolar 只负责临时打洞,Foxglove 只负责展示数据,边界很清楚。
演示结束后怎么关闭
用完以后,按顺序关闭。
关闭 cpolar:
# 在运行 cpolar http 8765 的终端里按 Ctrl+C关闭 Foxglove Bridge:
# 在运行 ros2 launch foxglove_bridge ... 的终端里按 Ctrl+C关闭 demo 节点:
# 在 talker / cam2image 对应终端里按 Ctrl+C如果你想确认端口已经不再监听:
ss -lntp | grep 8765 || echo "8765 已关闭"常见问题和排查
1. Foxglove Web 连不上
先确认 bridge 是否在监听:
ss -lntp | grep 8765再确认本地能不能连。远程之前,先在本机 Foxglove Web 用下面地址测试:
ws://127.0.0.1:8765本地都不通,就先别排查 cpolar,问题大概率在 ROS2 或 bridge。
2. 远程地址填了 https 还是不行
Foxglove 连接 WebSocket 时要用wss://,不是普通网页访问的https://。
比如 cpolar 给的是:
https://abcd.cpolar.topFoxglove 里填:
wss://abcd.cpolar.top3. 话题列表是空的
检查 ROS2 环境是否一致:
source /opt/ros/humble/setup.bash ros2 topic list如果你用了自定义ROS_DOMAIN_ID,确保 demo 节点和 Foxglove Bridge 在同一个 domain:
echo $ROS_DOMAIN_ID不要为了远程访问去把 ROS2 DDS 网络大范围暴露出去。这里远程只走 Foxglove Bridge 的 WebSocket 端口。
4. 图像面板没画面
先确认/image是否有数据:
ros2 topic hz /image如果没有频率输出,说明图像发布节点没跑起来。用 demo 的话重新启动:
ros2 run image_tools cam2image --ros-args -p burger_mode:=true安全注意:这部分别省
这套方案适合临时调试,不适合长期裸奔。
我建议至少做到这几条:
- 只映射
8765这一个 Foxglove Bridge 端口; - 不要映射 SSH 端口;
- 不要把 ROS2 DDS 发现端口直接暴露到公网;
- 不要开放控制类话题的写入权限给不可信人员;
- cpolar 地址只发给需要参与调试的人;
- 演示结束立即
Ctrl+C关闭 cpolar; - 真实机器人调试时,最好断开危险执行机构,或者只发布只读观测数据。
简单说:远程看数据可以,远程接管机器人不行。
写在最后
ROS2 远程调试不一定非要上来就搞复杂网络。
如果你的目标只是让不在现场的人临时看话题、看图像、看日志,Foxglove Bridge + cpolar 这个组合就够直接:本地 ROS2 不用大改,远程只需要一个浏览器,演示完关隧道。
它不是万能方案,也不应该替代正式的安全接入体系。但在实验室联调、课程演示、外场临时排查这种场景里,确实能少折腾很多网络配置。
我的建议是:先用 demo 跑一遍,把端口、WebSocket 地址、安全关闭流程确认好,再接真实机器人数据。这样现场出问题时,排查会轻松很多。
