Appearance
开发路线一:rosbridge WebSocket 开发
这条路线使用当前已经运行的 naviai_rosbridge 容器,通过 WebSocket 访问 ROS。开发端不需要安装 ROS,也不需要进入 Docker 容器。
适合场景:
- Web 前端、H5 页面、Electron、Node.js 服务、Python 非 ROS 程序。
- 只需要订阅状态、展示数据、查询 topic/service。
- 开发机器不方便安装 ROS Noetic 或自定义消息包。
- 需要在局域网内另一台服务器上开发上层应用。
当前 rosbridge 状态
当前只读确认到:
| 项目 | 值 |
|---|---|
| 容器 | naviai_rosbridge |
| ROS 节点 | /rosbridge_websocket、/rosapi |
| WebSocket URL | ws://192.168.217.100:9090 |
| 监听地址 | 0.0.0.0:9090 |
| ROS master | http://192.168.217.1:11311 |
| 认证 | authenticate=false |
| topic/service 过滤 | topics_glob=[*]、services_glob=[*] |
数据链路:
text
你的程序/浏览器
-> ws://192.168.217.100:9090
-> naviai_rosbridge
-> ROS master: 192.168.217.1:11311
-> 真实 ROS 节点/容器/外部设备本机开发配置
这里的“本机”指在 Orin 上开发或运行程序。
推荐配置:
bash
export ROSBRIDGE_URL=ws://127.0.0.1:9090也可以使用 Orin 的 217 网段地址:
bash
export ROSBRIDGE_URL=ws://192.168.217.100:9090注意:
- 如果程序在 Orin 本机运行,
127.0.0.1:9090可以用。 - 如果浏览器实际运行在你的笔记本上,即使前端代码由 Orin 提供,浏览器里的 WebSocket URL 也必须写成
ws://192.168.217.100:9090,不能写127.0.0.1。 - 如果页面是
https://,浏览器通常不允许连明文ws://;开发阶段建议用http://页面,或另行配置wss://反向代理。
局域网其他服务器开发配置
这里的“其他服务器”指不是 Orin 的另一台机器。
前提:
- 服务器能访问
192.168.217.100:9090。 - 如果服务器不在
192.168.217.0/24网段,需要有路由/VPN/转发。 - 不要把
ROSBRIDGE_URL写成localhost,那会指向开发服务器自己。
推荐配置:
bash
export ROSBRIDGE_URL=ws://192.168.217.100:9090连通性检查:
bash
nc -vz 192.168.217.100 9090如果是浏览器前端:
- 前端页面在哪里构建不重要。
- 重要的是最终运行浏览器的那台电脑能连上
ws://192.168.217.100:9090。
如果是 Node.js/Python 后端:
- 后端进程所在服务器能连上
192.168.217.100:9090即可。
前端 roslibjs 开发
前端推荐使用 roslibjs。
配置示例:
js
const ROSBRIDGE_URL = "ws://192.168.217.100:9090";
const ros = new ROSLIB.Ros({
url: ROSBRIDGE_URL,
});
ros.on("connection", () => console.log("rosbridge connected"));
ros.on("error", (err) => console.error("rosbridge error", err));
ros.on("close", () => console.log("rosbridge closed"));订阅只读状态 topic:
js
const robotState = new ROSLIB.Topic({
ros,
name: "/zj_humanoid/robot/robot_state",
messageType: "zj_robot/RobotState",
});
robotState.subscribe((msg) => {
console.log("robot_state", msg);
});查询 topic 列表:
js
const topicsClient = new ROSLIB.Service({
ros,
name: "/rosapi/topics",
serviceType: "rosapi/Topics",
});
topicsClient.callService(new ROSLIB.ServiceRequest({}), (res) => {
console.log(res.topics);
});浏览器原生 WebSocket 调试
不引入库时,可以直接用 rosbridge JSON 协议。
js
const ws = new WebSocket("ws://192.168.217.100:9090");
ws.onopen = () => {
ws.send(JSON.stringify({
op: "call_service",
service: "/rosapi/topics",
args: {}
}));
};
ws.onmessage = (event) => {
console.log(JSON.parse(event.data));
};订阅 topic:
js
ws.send(JSON.stringify({
op: "subscribe",
topic: "/zj_humanoid/robot/robot_state",
type: "zj_robot/RobotState",
throttle_rate: 1000
}));取消订阅:
js
ws.send(JSON.stringify({
op: "unsubscribe",
topic: "/zj_humanoid/robot/robot_state"
}));Node.js 开发
Node.js 可以使用 roslib 或直接使用 WebSocket 客户端。
推荐用环境变量管理地址:
bash
export ROSBRIDGE_URL=ws://192.168.217.100:9090代码中读取:
js
const url = process.env.ROSBRIDGE_URL || "ws://192.168.217.100:9090";适合做:
- Web 后端服务。
- 状态聚合。
- 数据转发。
- 机器人监控面板的数据源。
Python 非 ROS 开发
Python 不安装 ROS 时,可以使用 WebSocket/rosbridge 客户端库,例如 roslibpy,或直接用 websocket 库发送 JSON。
配置:
bash
export ROSBRIDGE_HOST=192.168.217.100
export ROSBRIDGE_PORT=9090典型用途:
- 非 ROS Python 服务读取机器人状态。
- 数据采集。
- 上层业务系统集成。
推荐只读 topic
开发初期建议先订阅这些状态类 topic:
| Topic | 说明 |
|---|---|
/zj_humanoid/robot/robot_state | 机器人整体状态 |
/zj_humanoid/robot/orin_states/resource | Orin 资源状态 |
/zj_humanoid/robot/orin_states/errors | Orin 错误状态 |
/zj_humanoid/robot/pico_states/resource | Pico/外部控制侧资源状态 |
/zj_humanoid/robot/monitor_status | 监控状态 |
/zj_humanoid/hand/joint_states | 灵巧手关节状态 |
/zj_humanoid/upperlimb/joint_states | 上肢关节状态 |
/livox/lidar | MID360 点云,数据量较大,调试时谨慎订阅 |
不建议直接操作的接口
rosbridge 当前无认证,且可以访问全部 topic/service。开发时不要随便发布控制命令。
重点避免:
/cmd_vel类速度控制。/zj_humanoid/cmd_vel/web。/zj_humanoid/upperlimb/servoj/*。/zj_humanoid/upperlimb/speedj/*。/zj_humanoid/upperlimb/servol/*。- action 的
goal、cancel。 - 模式切换、重启、停止类 service。
优缺点
| 项目 | 说明 |
|---|---|
| 优点 | 客户端无需 ROS;适合 Web/业务系统;本机和局域网其他服务器都容易接入 |
| 缺点 | 依赖 rosbridge;大流量 topic 可能较重;类型检查弱于原生 ROS |
| 推荐用途 | Web 控制台、状态面板、业务系统集成、只读数据展示 |