Skip to content

开发路线一: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 URLws://192.168.217.100:9090
监听地址0.0.0.0:9090
ROS masterhttp://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/resourceOrin 资源状态
/zj_humanoid/robot/orin_states/errorsOrin 错误状态
/zj_humanoid/robot/pico_states/resourcePico/外部控制侧资源状态
/zj_humanoid/robot/monitor_status监控状态
/zj_humanoid/hand/joint_states灵巧手关节状态
/zj_humanoid/upperlimb/joint_states上肢关节状态
/livox/lidarMID360 点云,数据量较大,调试时谨慎订阅

不建议直接操作的接口

rosbridge 当前无认证,且可以访问全部 topic/service。开发时不要随便发布控制命令。

重点避免:

  • /cmd_vel 类速度控制。
  • /zj_humanoid/cmd_vel/web
  • /zj_humanoid/upperlimb/servoj/*
  • /zj_humanoid/upperlimb/speedj/*
  • /zj_humanoid/upperlimb/servol/*
  • action 的 goalcancel
  • 模式切换、重启、停止类 service。

优缺点

项目说明
优点客户端无需 ROS;适合 Web/业务系统;本机和局域网其他服务器都容易接入
缺点依赖 rosbridge;大流量 topic 可能较重;类型检查弱于原生 ROS
推荐用途Web 控制台、状态面板、业务系统集成、只读数据展示