实时数据
扫描过程中,设备会主动上报实时点云与位姿,并通过 RTSP 推送相机视频流。本篇讲清楚怎么拿到并解码这些数据。
实时点云
实时点云通过 lixel/application/report/lio_pcl 上报,消息类型为 MqttCompressMsg。为减小传输体积,点云数据经过压缩封装。
message LioPclReport {
message Point {
sint64 x = 1; // val = raw value * header.scaler
sint64 y = 2; // val = raw value * header.scaler
sint64 z = 3; // val = raw value * header.scaler
uint32 rgbi = 4; // R + G + B + Intensity
}
Header header = 1;
repeated Point points = 2; // 点云数据
}
message MqttCompressMsg {
enum CompressionType {
CompressionLz4 = 0;
CompressionZstd = 1;
}
Header header = 1;
CompressionType compression = 2; // 压缩类型
uint32 compressed_size = 3; // 压缩前大小(序列化后的 LioPclReport 大小)
bytes compressed_data = 4; // 压缩数据(压缩后的序列化 LioPclReport)
}
解码步骤
收到 MqttCompressMsg 后,需要二次解压解码:
- 反序列化
MqttCompressMsg,得到compression(Lz4 / Zstd)与compressed_data。 - 按压缩类型解压
compressed_data。CompressionLz4是 LZ4 block 格式,不是 LZ4 frame 格式;解压时必须给出解压后的长度,即compressed_size(压缩前大小)。Python 写法:lz4.block.decompress(data, uncompressed_size=compressed_size)。用lz4.frame.decompress会报ERROR_frameType_unknown。 - 将解压结果按
LioPclReport反序列化,得到点云数组。
坐标还原:设备把真实坐标乘以 header.scaler 后向零截断取整(不是四舍五入),再以 sint64 发送,还原后的误差小于 1/scaler。还原时用线上整数除以 header.scaler,即 x_真实 = int(x) / int(header.scaler),y、z 同理。设备实测发送的 scaler 为 1000,线上整数 2921 对应 2.921。按 protobuf 的 JSON 映射,sint64 解码成字典后是字符串,做运算前先转成整数。上方 proto 注释里的 raw value 指真实坐标,不是线上整数,也就是线上整数 = 真实坐标 × header.scaler。设备端代码把 scaler 固定设为 1000;做除法前先确认 scaler 不为 0。
rgbi 是 32 位无符号整数,从高位到低位依次为 R、G、B、强度,每项 8 位(依据设备端打包代码和 proto 注释的顺序,未对照实际颜色逐点核对)。
注:解压需要额外依赖。使用项目用例脚本时,安装
pip install lz4 zstandard后才能解码点云;未安装时脚本会提示并跳过。示例脚本example/usage/lio_pcl.py从 1.0.1 起使用 LZ4 block 解压;1.0.0 的该脚本按 frame 解压,在真机上收到的点云帧全部解码失败,且不输出错误信息。
实时位姿
实时位姿通过 lixel/application/report/lio_pose 上报,消息类型为 LioPoseReport:
message LioPoseReport {
Header header = 1;
PoseStamped pose = 2;
float distance = 3; // 距离(米)
float pose_accuracy = 4; // 暂未使用
}
位姿结构 PoseStamped 包含时间戳与位姿,位姿由位置(Point)和姿态(Quaternion)组成:
message PoseStamped {
sint64 stamp = 1;
Pose pose = 2;
}
message Pose {
Point position = 1; // x / y / z
Quaternion orientation = 2; // x / y / z / w
}
RTSP 视频流
设备内置 RTSP 服务器。成功开始扫描后,设备会实时推送相机视频流,同一时刻最多推送一路。视频流地址格式:
rtsp://<lixel_device_ipaddr>:8554/live/chn_<camera_name>
示例:
rtsp://192.168.55.1:8554/live/chn_leftrtsp://192.168.55.1:8554/live/chn_right
| 参数 | 说明 |
|---|---|
lixel_device_ipaddr | 设备 IP:有线固定为 192.168.55.1;无线需通过蓝牙获取 Wi-Fi 地址;快连模式固定为 192.168.56.1 |
camera_name | 相机名称,需通过设备信息请求获取(DeviceInfoResponse.device_info.camera_info.camera_list)。列表中可能含空字符串(例如 ["left", "", "right"]),设备端在该槽位的相机不存在或未启用预览时放入空字符串,不要用它拼 RTSP 地址,构造地址时跳过 |