激光雷达(LiDAR)到浏览器的数据全链路

从物理扫描到 WebGL 渲染的完整数据管道

graph LR %% 定义样式 classDef hardware fill:#e2e8f0,stroke:#64748b,stroke-width:2px classDef ros fill:#dbeafe,stroke:#2563eb,stroke-width:2px classDef server fill:#dcfce7,stroke:#16a34a,stroke-width:2px classDef web fill:#fce7f3,stroke:#db2777,stroke-width:2px classDef protocol fill:#fff,stroke:#94a3b8,stroke-dasharray: 5 5 subgraph Physical_Layer [1. 物理层/硬件] LiDAR(激光雷达设备):::hardware end subgraph Robot_ROS_Layer [2. 机器人端 Linux/ROS] Driver(雷达驱动节点
C++ SDK):::ros ROSCore((ROS Core)):::ros Topic[/Topic: point_cloud2/]:::ros Bridge(WebSocket 桥接服务
Go / Python):::server end subgraph Web_Client_Layer [3. 浏览器端 Frontend] WS_Client(JS WebSocket 客户端):::web Parser(数据解析器
ArrayBuffer -> Float32):::web WebGL(Three.js / WebGL 渲染):::web Canvas[屏幕画面]:::web end %% 连接关系 LiDAR --"UDP 广播
(原始二进制包)"--> Driver Driver --"计算 XYZ
(解析协议)"--> ROSCore ROSCore --"Publish
(sensor_msgs)"--> Topic Topic --"Subscribe
(ROS 消息)"--> Bridge Bridge --"WebSocket WSS
(二进制流/ArrayBuffer)"--> WS_Client WS_Client --"接收数据"--> Parser Parser --"构建 BufferGeometry"--> WebGL WebGL --"绘制 Draw Calls"--> Canvas
后端 (C++/ROS)

数据的产生与标准化

  • 原始数据:雷达通过 UDP 发送原始的距离/角度数据。
  • 驱动解算:C++ 驱动程序根据雷达的内参,利用三角函数将原始数据转换为 X, Y, Z 坐标。
  • ROS Topic:数据被封装成通用的 PointCloud2 格式,供系统内其他程序使用。
传输层 (Go/Python)

桥接与压缩

  • 订阅者:桥接程序监听 ROS 消息。
  • 关键优化:为了浏览器性能,这里通常会提取二进制数据(Binary),避免转换成巨大的 JSON 字符串。
  • WebSocket:建立持久连接,像水管一样源源不断地向浏览器推送数据包。
前端 (JS/Three.js)

解析与渲染

  • 接收:onmessage 收到 ArrayBuffer。
  • 重组:利用 Float32Array 重新“理解”这段二进制数据。
  • 上屏:Three.js 将这些点推入 GPU,显卡负责最终在 Canvas 上画出成千上万个彩色像素点。