XGRIDS文档
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 灵视 P1

    • 产品概述
    • 设备基本操作
    • 使用 LCC Scan App
    • 维护及保养
    • 常见问题
  • 灵光 K 系列

    • 灵光 K1

      • 产品概述
      • 设备基本操作
      • 设备激活与连接
      • 设备采集
      • 获取绝对坐标点云数据
      • 地图融合
      • 典型场景路线规划建议
      • 注意事项
      • 常见问题
    • 灵光 K2

      • 产品概述
      • 设备基本操作
      • 设备激活与连接
      • 设备采集
      • 获取绝对坐标点云数据
      • 地图融合
      • 典型场景路线规划建议
      • 注意事项
      • 常见问题
  • 灵光 L 系列

    • 灵光 L2 Pro

      • 产品概述
      • 设备基本操作
      • 设备激活与连接
      • 设备采集
      • 获取绝对坐标点云数据
      • 实时测量功能
      • 附录
      • 常见问题
    • 灵光 L3

      • 产品概述
      • 设备基本功能
      • 设备激活与连接
      • 设备采集
      • 获取绝对坐标点云数据操作流程
      • 附录
  • 配件

    • 补光灯

      • 安装指导
      • 基本操作
      • 常见问题
  • Lixel Studio

    • 版权
    • 安装与激活
    • 界面说明
    • 文件
    • 工程处理
    • 工具
    • 平面绘制
    • 行业应用
    • 设置
    • 设备感知
    • 常见问题 / FAQ
  • Lixel CyberColor

    • LCC Studio

      • 入门
      • 版本与更新
      • 下载与安装
      • 界面概览与导航
      • 重建前工作
      • 模型重建
      • 单模型重建
      • 地图融合
      • 空地融合
      • 航拍重建
      • 我的模型
      • 其他功能
      • 设置与账号
      • 转换工具
      • 视频重建
      • 常见问题 / FAQ
    • LCC Scene Editor

      • 版本与更新
      • 账号与登录
      • 产品概览与主页
      • 编辑器界面介绍
      • 三种场景漫游快捷操作
      • 文件
      • 设置
      • 编辑操作
      • 窗口
      • 视图工具栏
      • 资产与属性
      • 左侧工具栏
      • 视点
      • 跳转点
      • 天空盒
      • 标注
      • 测量
      • 场景漫游
      • 场景报告
      • 智能户型图(3D Layout)
      • 小地图
      • 预览模式(Viewer)
      • 帮助
      • 常见问题 / FAQ
      • 出生点
    • LCC Model Editor

      • 版本与更新
      • 新手指引
      • 概览与界面
      • 文件操作
      • 选择器
      • 编辑操作
      • 测量
      • 调色
      • 资产管理
      • 设置与帮助
      • 常见问题 / FAQ
    • 采集指南

      • 概述
      • 采集设备总览
      • 通用采集原则
      • 室内场景采集
      • 室外场景采集
      • 大场景采集(地图融合)
      • 空地融合采集
      • 物体采集
      • 人物采集
      • 视频重建采集
      • 高清补拍
      • 控制点(灵视 P1)
      • 常见问题与排查
    • LCC Studio Linux

      • 产品概要说明
      • 基本架构说明书
      • 安装部署说明书
      • 容器启动参数说明书
      • CodeMeter离线授权部署说明书
      • API指令集说明书
      • 附录-开发者数据说明书
      • 附录-错误码列表
      • 单机多卡集群部署QuickStart
    • 使用技巧

      • 多个大型 3DGS 模型融合工作流
    • 历史版本
  • Plugin & SDK

    • Unreal

      • 介绍
      • 快速入门 - Windows
      • 快速入门 - Linux
      • 快速入门 - Quest3
      • 版本与授权
      • 渲染
      • Tiled 光栅化(实验性)
      • 画面调节
      • 法线与光照
      • 场景编辑
      • 性能参数说明
      • 性能优化指南
      • 第三方与引擎插件集成
      • 代理网格
      • 加载动画
      • 碰撞
      • 寻路系统支持
      • 单层水支持
      • 本地化
      • 常见问题
      • 故障排查
      • 日志与诊断
      • 联系我们
      • 最佳实践

        • 用 LixelStudio 网格为 3DGS 重打光
      • API 参考

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • SOG / SPZ / PLY Actors
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enums
        • Structs
      • 更新日志

        • v3.4.0
        • v3.3.1
        • v3.0.0
        • v2.2.1
        • v1.0.0
        • v0.9.0
        • v0.8.0
        • v0.7.1
        • v0.6.1
        • v0.5.2
        • v0.4.1
        • v0.4.0
        • v0.3.0
        • v0.0.5
        • v0.0.4
        • v0.0.3
        • v0.0.2
        • v0.0.1
    • X-Brain

      • 产品概述
      • 硬件接口
      • 快速开始
      • 核心概念
      • 集成指南
      • API 参考
      • 数据类型
      • ROS2 桥接
      • 示例程序
      • 部署与网络
      • 排障与 FAQ
      • 版本与发布
    • Web

      • 介绍
      • 渲染性能优化指南
      • 显卡配置
      • 常见开发问题
      • API参考

        • LCCRender::clearIndexDB
        • LCCRender::dispose
        • LCCRender::load
        • LCCRender::setCamera
        • LCCRender::unload
        • LCCRender::update
        • LCCObject::checkRenderNextFrame
        • LCCObject::clearRenderNextFrame
        • LCCObject::ecef2Prj
        • LCCObject::getBounds
        • LCCObject::getEnvInstancedMesh
        • LCCObject::getInstancedMesh
        • LCCObject::getLodInfos
        • LCCObject::getOriginPosition
        • LCCObject::getProjectionCoordinateSystemInfos
        • LCCObject::hasCollision
        • LCCObject::hasEnvironment
        • LCCObject::hasShcoef
        • LCCObject::intersectsCapsule
        • LCCObject::intersectsRayExt
        • LCCObject::intersectsRayFromOriginExt
        • LCCObject::intersectsSphere
        • LCCObject::lowerToBottom
        • LCCObject::prj2Ecef
        • LCCObject::raiseToTop
        • LCCObject::raycast
        • LCCObject::raycastFromOrigin
        • LCCObject::setAlpha
        • LCCObject::setClipBox
        • LCCObject::setClipPlane
        • LCCObject::setEndLod
        • LCCObject::setLodAutoLevelUp
        • LCCObject::setMaxDistance
        • LCCObject::setMaxNodeSplats
        • LCCObject::setMaxSplats
        • LCCObject::setOriginPosition
        • LCCObject::setPointsColor
        • LCCObject::setRenderState
        • LCCObject::setRotation
        • LCCObject::setScale
        • LCCObject::setSemantic
        • LCCObject::setSemanticColor
        • LCCObject::setSmooth
        • LCCObject::setStartLod
        • LCCObject::setTranslation
        • LCCObject::setVisible
        • LCCObject::togglePointsDisplayMode
        • LCCObject::useEnvironment
        • LCCObject::useShcoef
      • 更新日志

        • v0.6.3
        • v0.6.2
        • v0.6.1
        • v0.6.0
        • v0.5.5
        • v0.5.4
        • v0.5.3
        • v0.5.2
        • v0.5.1
        • v0.5.0
        • v0.4.1
        • v0.4.0
        • v0.3.1
        • v0.3.0
        • v0.2.0
    • Lixel OpenAPI

      • 概述
      • 连接与鉴权
      • 消息模型与编解码
      • 接口清单
      • 实时数据
      • 项目文件访问
      • 错误码
      • Python

        • 快速开始
        • 客户端封装与工具
        • 常见问题
      • C++

        • 快速开始
        • 客户端与示例
        • 常见问题

客户端与示例

C++ 客户端库位于命名空间 lixel::openapi,公共头文件在 cpp/include/lixel/openapi/。本篇介绍它提供的能力与用法。

头文件一览

头文件提供什么
client.hClient:Connect、Request、Publish、Subscribe、SubscribeMessage、RemoveSubscription
scan.hRunScan:开始扫描、等设备真正进入扫描、停止、等回到待机
pointcloud.hDecodePointCloud:把 lio_pcl 负载解码为带缩放的点
codec.h按名字取消息,protobuf 与 JSON 互转
catalog.h18 个接口、34 个主题的表
codes.h、result.h设备状态码,Result 与 Errc

客户端 Client

连接

lixel::openapi::ClientOptions options;
options.transport.host = "192.168.55.1";
options.openapi_key = "<由 XGRIDS 提供>";

lixel::openapi::Client client(options);
lixel::openapi::Result r = client.Connect();   // 阻塞到连接完成

Connect() 失败返回 Errc::ConnectFailed 或 Errc::ConnectTimeout,之后客户端仍可再次 Connect()。

请求-响应

openapi::aiot_msgs::DeviceInfoRequest req;
openapi::aiot_msgs::DeviceInfoResponse rsp;
lixel::openapi::Result r = client.Request(
    "lixel/application/request/device_info", req,
    "lixel/application/response/device_info", &rsp);

Request 的返回码:

返回码含义
Ok收到响应,且 Error.code 是成功码
DeviceError收到响应,但设备返回错误码(见 Result::device_code、desc),response 已填充
RequestTimeout超时内没有收到同 seq 的响应。设备可能仍执行了请求,判断前先向设备确认
NotConnected未连接,或等待期间连接断开
CalledFromCallback在订阅回调里调用了 Request

订阅上报

client.SubscribeMessage(
    "lixel/application/report/device_status", "DeviceStatusReport",
    [](const std::string& topic, const google::protobuf::Message& msg) {
      // msg 已解析为对应 protobuf 消息
    });

注:订阅回调运行在 MQTT 层的线程上,一次处理一条消息,要尽量简短。回调里不能调用 Connect、Disconnect;调用 Request 会返回 Errc::CalledFromCallback 而不是阻塞。传给回调的字符串仅在调用期间有效,需要留用的要自行拷贝。

点云解码

实时点云(report/lio_pcl,MqttCompressMsg)用 DecodePointCloud 解码,一步完成解压与反序列化:

#include "lixel/openapi/pointcloud.h"

lixel::openapi::PointCloud cloud;
lixel::openapi::Result r = lixel::openapi::DecodePointCloud(payload, &cloud);
// 成功后 cloud.points 里每个点的 x/y/z 已按 header.scaler 还原(设备发送 scaler 为 1000)。

压缩格式是 LZ4 block(不是 frame)。Zstd 压缩的点云与负的 scaler 返回 Errc::Unsupported。点的 rgbi 按设备原样传出(proto 只注明 R+G+B+Intensity,字节序未进一步约定)。

扫描流程

扫描的开始和停止在设备端是异步的:AC_START 的响应只表示请求被接受,设备随后经待机 → 开始扫描 → 扫描中。RunScan 封装了完整流程——订阅设备状态、等待待机、启动、等真正进入扫描、观察一段时间、停止、等回到待机:

#include "lixel/openapi/scan.h"

lixel::openapi::ScanOptions options;
options.project_name = "demo";
options.watch = std::chrono::seconds(8);

lixel::openapi::ScanReport report = lixel::openapi::RunScan(client, options);
return report.exit_code();   // 0 成功,其余见 ScanOutcome

RunScan 会阻塞调用线程,要求客户端已连接,且不能在订阅回调里调用。结果 ScanOutcome:Completed(0)、Timeout(1)、NotStandby(2)、StartRejected(3)、NoResponse(4)、Error(5)、Interrupted(130)。

18 个命令行示例

cpp/examples/ 下每个 python/example/usage/ 脚本都有一个同名、同选项的 C++ 程序,随库一起构建(默认开),产物在 cpp/build/examples/:

./cpp/build/examples/heartbeat --seconds 5                 # 不需要 Key
./cpp/build/examples/device_info --key <由 XGRIDS 提供>
./cpp/build/examples/modeling --key <由 XGRIDS 提供> --project demo --watch 8
./cpp/build/examples/lio_pcl --key <由 XGRIDS 提供> --seconds 20   # 设备扫描期间

通用选项:--host(默认 192.168.55.1)、--port、--tls、--username、--password、--key、--timeout;TLS 另有 --ca-file 和 --insecure。退出码:0 成功,1 连不上或没有响应,2 选项错误(modeling:设备不在待机),3 设备返回错误码,130 被中断。

18 个示例:control_point、data_unpack、device_config、device_control、device_info、device_status、get_ntrip_profile、get_rtk_advance、heartbeat、lio_pcl、lio_pose、measure_point、modeling、modeling_status、project_list、set_ntrip_profile、set_rtk_advance、system_error。

注:其中 device_control、device_config、set_ntrip_profile、set_rtk_advance、control_point、measure_point 会改动设备,device_control 可能关机或格式化磁盘,使用前请确认。

与 Python 客户端的区别

C++ 客户端有意在几处与 Python 不同:

方面C++Python
响应匹配按 header.seq 匹配请求(设备原样带回)取响应主题上的第一条消息
JSON 转换严格:字段名或枚举名写错会报错静默丢弃
MQTTS 证书默认校验服务端证书;设备自签名证书需传 --ca-file 或用 --insecure 关闭从不校验
回调里调用 Request返回 Errc::CalledFromCallback阻塞

其他使用限制:

  • 同一进程多个 Client 共用一个 MQTT 工作线程,建立第二个连接约需 2 秒。每个示例只用一个 Client,不受影响。
  • 正在等待的 Request 无法取消,最迟在 request_timeout 到时结束。

下一步

  • 构建、依赖、集成方式见 快速开始。
  • 协议本身见共用章节 接口清单、实时数据、错误码。