通过 WebSocket 实时获取 ROS 机器人数据
从零开始:通过 WebSocket 实时获取 ROS 机器人数据 (小白终极教程)
前言
本教程旨在帮助初学者解决一个常见的需求:如何从一台运行ROS(机器人操作系统)的机器人上,将实时数据(例如IMU、里程计、摄像头等)传输到另一台普通的电脑上,并用Python等通用编程语言进行处理。
我们将使用rosbridge这个强大的工具,它就像一座桥梁,将ROS复杂的通信协议转换成大家所熟知的WebSocket协议,让非ROS程序也能轻松与机器人交互。
核心架构
在开始之前,我们先理清整个数据流动的路径,这会让你对接下来的步骤有更清晰的认识:
1 | 机器人端 (数据发送方) → 客户端 (数据接收方) |
这里的关键点是:rosbridge_server必须和你的机器人节点运行在同一台设备上!
第一部分:机器人端配置 (以 IP: 192.168.9.32 为例)
这部分的所有操作都在你的机器人或装有ROS的主控电脑上进行。
第1步:确定并记录机器人的IP地址
这是所有网络通信的基础。打开一个终端,输入以下命令之一:
1 | ifconfig |
在输出的信息中找到你的主网络接口(通常是wlan0, wlp3s0等无线网卡,或是eth0, enp4s0等有线网卡),记下它的inet地址。在本案例中,我们确定了机器人IP是192.168.9.32。
第2步:安装rosbridge_server
如果你的机器人上没有安装过,请在终端中运行:
1 | sudo apt-get update |
(请将noetic替换成你对应的ROS版本,如melodic)
第3步:启动并验证数据源(IMU话题)
确保你的机器人底盘驱动或传感器节点已经正常运行。这是数据的源头,必须先启动。
启动机器人节点 (请替换成你自己的命令):
1 | roslaunch my_robot_control robot_start.launch |
验证 /imu 话题是否正常发布 (非常关键的检查步骤):
打开一个新的终端,输入:
1 | rostopic info /imu |
如果你看到类似下面的输出,特别是Publishers:部分不为空,说明数据源正常。
1 | Type: sensor_msgs/Imu |
第4步:配置并启动rosbridge_server
找到并编辑launch文件,将其监听的IP地址配置为机器人的IP。
1 | roscd rosbridge_server/launch/ |
在打开的文件中,找到 <param name="address" ... />
这一行,将其value修改为你在第1步中查到的机器人IP地址。
1 | <param name="address" value="192.168.9.32" /> |
为何要这样做?
默认情况下rosbridge可能只监听本地127.0.0.1,修改为局域网IP后,网络内的其他设备才能访问到它。
启动rosbridge_server:
1 | roslaunch rosbridge_server rosbridge_websocket.launch |
此时,你的机器人端已经准备就绪。它正在发布 /imu 数据,并且rosbridge正在将这些数据通过 ws://192.168.9.32:9090
这个地址向全网络广播。
第二部分:客户端配置 (你的电脑)
这部分操作在你自己的电脑(例如笔记本)上进行。
第1步:准备Python环境
安装pip (如果还没有):
1 | sudo apt-get update |
安装websocket-client库:
1 | pip3 install websocket-client |
第2步:编写并配置Python脚本
在你电脑上创建一个名为test.py的文件,将以下代码完整地复制进去:
1 | import websocket |
第3步:运行脚本,见证奇迹
在test.py文件所在的目录打开终端,运行:
1 | python3 test.py |
如果一切顺利,你将看到:
1 | 正在连接到 ws://192.168.9.32:9090... |
恭喜你!你已经成功地从ROS机器人获取了实时数据!
第三部分:常见问题与排错 (FAQ)
问题1:Python脚本报错 ConnectionRefusedError (连接被拒绝)
- 原因A: 你忘记在机器人端启动rosbridge_server。
解决方法: 在机器人端运行roslaunch rosbridge_server rosbridge_websocket.launch
- 原因B: test.py里的ws_url IP地址填错了,不是机器人的IP。
解决方法: 重新检查机器人IP地址并更新脚本 - 原因C: 机器人或你的电脑开启了防火墙,阻止了9090端口的通信。
解决方法: 在机器人端关闭防火墙或开放9090端口1
2
3sudo ufw disable # 关闭防火墙(不推荐在生产环境使用)
# 或者开放9090端口
sudo ufw allow 9090/tcp
问题2:rosbridge终端报错 Cannot infer topic type… not yet advertised
- 唯一原因: 你没有启动发布/imu话题的机器人节点(/base_driver),或者该节点启动后崩溃了。
解决方法: 请务必先用rostopic info /imu
确认数据源正常。检查机器人节点是否正确启动,查看节点日志排查问题。
问题3:脚本能连接,也显示订阅成功,但就是不打印 [IMU Data]
- 原因A: 话题名称写错了。
解决方法: 请检查test.py中"topic": "/imu"
是否与rostopic list
显示的完全一致。 - 原因B: 机器人节点虽然启动了,但由于某种原因停止发布数据了。
解决方法: 可以在机器人端用rostopic echo /imu
监听一下,看看是否有数据滚动。 - 原因C: JSON解析错误导致数据处理失败。
解决方法: 打开调试模式websocket.enableTrace(True)
查看详细的消息内容,检查数据格式是否符合预期。
问题4:数据接收不稳定,经常断线
原因: 网络连接不稳定或ROS消息发布频率过高。
解决方法:- 优化网络环境,确保机器人和客户端在同一局域网且信号良好
- 降低ROS话题发布频率
- 调整订阅参数,增加队列长度和节流率:
1
2
3
4
5
6
7subscribe_message = {
"op": "subscribe",
"topic": "/imu",
"throttle_rate": 200, # 增加节流率到200ms
"queue_length": 50, # 增加队列长度到50
"compression": "cbor"
}
第四部分:进阶应用
1. 订阅多个话题
如果你需要同时订阅多个话题,只需在on_open函数中发送多个订阅消息:
1 | def on_open(ws): |
2. 数据可视化
使用matplotlib库可以实时绘制IMU数据曲线:
1 | import matplotlib.pyplot as plt |
3. 发送命令到ROS
除了订阅话题接收数据,你还可以通过WebSocket向ROS发布消息:
1 | def send_command(ws, topic, message_type, data): |
通过这些步骤和代码,你不仅可以获取ROS机器人的实时数据,还可以实现数据可视化和机器人控制,为开发更复杂的机器人应用打下基础。
- Title: 通过 WebSocket 实时获取 ROS 机器人数据
- Author: John Doe
- Created at : 2025-07-25 19:31:20
- Updated at : 2025-07-27 13:06:23
- Link: https://redefine.ohevan.com/2025/07/25/通过-WebSocket-实时获取-ROS-机器人数据/
- License: This work is licensed under CC BY-NC-SA 4.0.