相机-雷达标定(一):禾赛 QT128C2X 雷达点云采集程序封装说明
文档目的说明qt_capture程序如何封装禾赛HesaiLidar_SDK_2.0实现点击按钮采集一帧点云的功能。帮助快速理解架构、维护和扩展。一、程序概览功能启动后自动连接禾赛 QT128C2X 雷达实时显示帧数、点数、连接状态点击采集一帧按钮 → 保存当前一帧点云为 PCD 文件文件结构qt_capture/ ├── CMakeLists.txt # 构建配置链接 SDK Qt ├── config.ini # 雷达连接配置IP/端口 ├── main.cpp # 程序入口 ├── MainWindow.h/.cpp # 主窗口界面 ├── LidarWorker.h/.cpp # SDK 封装层核心 └── pointcloud_output/ # PCD 输出目录二、整体架构程序采用双线程 信号槽架构UI 与数据采集分离┌─────────────────────────────────────────────────┐ │ 主线程 (UI 线程) │ │ │ │ MainWindow │ │ ├── 界面控件 (按钮/状态标签) │ │ ├── 按钮点击 → 调用 worker-requestCapture() │ │ └── 接收信号 → 更新界面 │ │ │ └───────────────────▲─────────────────────────────┘ │ Qt 信号/槽 (跨线程队列) ┌───────────────────┴─────────────────────────────┐ │ 工作线程 (QThread) │ │ │ │ LidarWorker ← SDK 封装层 │ │ ├── 管理一个 HesaiLidarSdk 实例 │ │ ├── 注册回调函数 │ │ └── 通过 emit 信号通知主线程 │ │ │ │ ┌────────────────────┐ │ │ │ HesaiLidarSdk │ │ │ │ (禾赛官方 SDK) │ │ │ │ 内部自带收数线程 │ │ │ └────────────────────┘ │ └─────────────────────────────────────────────────┘为什么需要工作线程禾赛 SDK 的Init()和Start()会阻塞等待 PTC 连接、加载修正文件。如果放在主线程界面会卡死。用QThreadmoveToThread把LidarWorker移到工作线程执行UI 保持流畅。三、LidarWorker 封装层核心LidarWorker是整个封装的关键把禾赛 SDK 包成三个简单操作3.1 对外接口接口类型作用start()槽函数启动 SDK加载配置 → 初始化 → 连接雷达requestCapture()槽函数请求保存下一帧设置标志位frameUpdated信号每帧触发通知 UI 更新帧数/点数frameCaptured信号一帧保存完成通知 UI 弹提示statusChanged信号连接状态变化通知3.2 关键成员classLidarWorker:publicQObject{private:HesaiLidarSdkLidarPointXYZICRT*sdk_;// 禾赛 SDK 实例std::atomicboolcapture_flag_;// 采集请求标志线程安全std::string output_dir_;// PCD 输出目录};3.3 启动流程start()start() │ ├─ 1. 读 config.ini → DriverParam ├─ 2. 创建 SDK 实例sdk_ new HesaiLidarSdk() ├─ 3. 初始化sdk_-Init(param) ├─ 4. 注册点云回调sdk_-RegRecvCallback(...) ├─ 5. 启动sdk_-Start() ← SDK 内部开线程收 UDP └─ 6. emit statusChanged(已连接)四、核心机制标志位 回调这是整个封装最巧妙的设计。4.1 问题禾赛 SDK 是持续推数据模型 — 启动后每秒发 10 帧到回调函数。但用户需求是点击才存一帧。4.2 解决方案用一个原子标志位capture_flag_作为开关// ① 用户点击按钮 → 只设标志瞬时操作不阻塞voidLidarWorker::requestCapture(){capture_flag_true;}// ② SDK 每收到一帧都进这里voidLidarWorker::onFrameCallback(constLidarDecodedFrameframe){// 每帧都更新状态栏实时性emitframeUpdated(frame.points_num,frame.frame_index);// 检查是否有采集请求if(capture_flag_.load()frame.points_num0){capture_flag_false;// 立刻复位防止存多帧QString pathsaveFrameAsPCD(frame);emitframeCaptured(path,frame.points_num);// 通知主线程}}4.3 工作时序时间 → SDK 后台: ─帧─帧─帧─帧─帧─帧─帧─帧─帧─帧─→ (每秒10帧) ↓ 回调检查: flag0 flag0 flag1 flag0(存!) flag0 ... ↑ 用户点击: 点击按钮→flag1 ↓ emit frameCaptured → UI弹框优点SDK 持续运行无需反复建连/断开点击后最多等 100ms下一帧即保存标志位用std::atomic保证线程安全五、跨线程通信SDK 回调运行在SDK 内部线程界面在主线程。通过 Qt 信号槽安全通信// MainWindow 构造函数中连接信号connect(worker_,LidarWorker::frameUpdated,this,MainWindow::onFrameUpdated,Qt::QueuedConnection);// ← 关键跨线程自动排队工作原理Qt::QueuedConnection让信号在接收线程主线程的事件队列里执行Qt 自动处理线程安全。因此回调函数里可以直接emit不必担心 UI 操作的线程冲突。六、PCD 保存saveFrameAsPCD()把一帧点云写成标准 PCD v0.7 格式// 写 PCD 头部ofsVERSION 0.7\nFIELDS x y z intensity confidence ring\nWIDTH frame.points_num\nDATA ascii\n;// 遍历点数组for(uint32_ti0;iframe.points_num;i){ofspts[i].x pts[i].y pts[i].z (int)pts[i].intensity (int)pts[i].confidence pts[i].ring\n;}文件命名frame_时间戳_序号.pcd避免重复点击覆盖。七、界面交互流程程序启动 │ ├─ 创建 LidarWorker移到工作线程 ├─ 线程启动 → worker-start() │ └─ 连接雷达按钮禁用状态正在连接... │ ├─ 收到第一帧 → emit frameUpdated │ └─ 按钮启用状态已连接显示帧数/点数 │ ├─ 用户点击按钮 → worker-requestCapture() │ └─ 状态采集请求已发送等待下一帧... │ ├─ 下一帧回调 → 存 PCD → emit frameCaptured │ └─ 弹出成功框显示文件路径 │ └─ 用户关闭窗口 → 退出工作线程 → SDK 停止八、构建与运行依赖组件版本Qt5.15.2 (msvc2019_64)Visual Studio2019/2022HesaiLidar_SDK_2.0v2.0.12编译cdqt_capture/build cmake-GVisual Studio 17 2022-Ax64..cmake--build.--configRelease运行cdbuild/ReleasesetPATHC:\Qt\5.15.2\msvc2019_64\bin;%PATH% qt_capture.exe九、常见问题问题原因解决方案界面中文乱码源文件编码CMake 加/utf-8选项源文件存 UTF-8 BOM一直显示正在连接端口被占用或雷达异常taskkill /IM qt_capture.exe /F重启雷达收不到数据雷达未发数据或端口不对用 PowerShell UDP 监听验证检查 config.ini 端口关闭后下次连不上僵尸进程占端口用窗口 X 正常关闭勿强制结束十、扩展指南连续保存多帧修改回调去掉capture_flag_复位或加帧数计数if(capture_flag_){saveFrameAsPCD(frame);if(saved_count_target_count_){// 存够 N 帧capture_flag_false;}}添加实时可视化在MainWindow添加 OpenGL Widget收到frameCaptured信号后渲染点云需引入 PCL 或自写 OpenGL。改用其他雷达型号只需改config.ini中的device_ip_address、udp_port和 correction 文件路径代码无需改动SDK 自动识别协议。

相关新闻

基于TMS320F28379D的双电机FOC快速电流环控制与SFRA分析实践

基于TMS320F28379D的双电机FOC快速电流环控制与SFRA分析实践

1. 项目概述与核心价值如果你正在从事伺服驱动、工业机器人或任何需要高精度、高动态响应电机控制的领域,那么对快速电流环(FCL)和磁场定向控制(FOC)的深入理解与实践是绕不开的坎。这次分享的项目,正是基于…

2026/10/10 22:34:31 阅读更多 →
离线人像抠图工具,太快太骚太强了

离线人像抠图工具,太快太骚太强了

聊一聊之前分享过一键抠图软件。软件很好用,操作也非常简单。唯一就是那款软件需要安装。有些人不喜欢安装版软件。其中我就是,我喜欢绿色免安装版软件。安装的软件我不是很喜欢。今天给大家分享一款免安装抠图软件。软件介绍离线照片人像提取工具工具无…

2026/9/29 16:59:55 阅读更多 →
C6EZRun:降低ARM+DSP异构开发门槛,实现高效计算卸载

C6EZRun:降低ARM+DSP异构开发门槛,实现高效计算卸载

1. 项目概述:为什么我们需要C6EZRun这样的工具?在嵌入式开发领域,尤其是音视频处理、工业控制和通信设备这些行当里,我们经常会遇到一个经典的性能瓶颈:主控的ARM处理器(通常跑着Linux)在处理复…

2026/10/14 16:52:51 阅读更多 →

最新新闻

Gitea局域网服务器Local: No connection could be made because the target machine actively refused it.

Gitea局域网服务器Local: No connection could be made because the target machine actively refused it.

现象:使用Gitea 当git仓库管理A电脑当服务器,B电脑推送,有lfs大文件A电脑可以自己推送。B电脑推送失败:提示git.exe push --progress -- "192" master:master warning: use of unencrypted HTTP remote URLs is not re…

2026/10/15 1:59:12 阅读更多 →
细腻手绘齿轮与机械时钟摆动:SVG 矢量齿形数学建模与 CSS 连续啮合旋转

细腻手绘齿轮与机械时钟摆动:SVG 矢量齿形数学建模与 CSS 连续啮合旋转

在复古手账与蒸汽朋克风格的插画设计中,机械齿轮与单摆时钟一直是最具象征意义的美学符号。 发条拧紧时的金属微颤、大小齿轮齿面之间严丝合缝的连续啮合咬合、老式钟摆在两极点之间迟疑而笃定的回摆……这些机械运动所传达的,不仅是纯粹的工科几何理性&…

2026/10/15 1:59:12 阅读更多 →
软考 系统架构设计师历年真题集萃(56)

软考 系统架构设计师历年真题集萃(56)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(55) 第91题 商业智能关注如何从业务数据中提取有用的信息,然后采用这些信息指导企业的业务开展。商业智能系统主要包括数据预处理、建立()、数据分析和数据展现4个主要阶段。其中数据预处理是整合企业原始数据的第…

2026/10/15 1:59:12 阅读更多 →
【Unity开发】StreamingAssets、Assets Bundle、Resources区别对比

【Unity开发】StreamingAssets、Assets Bundle、Resources区别对比

🐾 个人主页 🐾 阿松爱睡觉,横竖醒不来🏅你可以不屠龙,但不能不磨剑🗡文章一、前言二、StreamingAssets文件夹1. 用途2. 访问方式3. 优点4. 缺点三、AssetBundle1. 用途2. 访问方式3. 优点4. 缺点四、Resou…

2026/10/15 1:59:12 阅读更多 →
ECharts地图JS选型与下钻渲染避坑全指南

ECharts地图JS选型与下钻渲染避坑全指南

简介:一套覆盖全国、地市、区县三级地图的js资源共343个文件,专为ECharts使用设计,压缩包约25.79MB。所有文件按“行政区划代码_省份_城市”命名,涵盖黑龙江、吉林、新疆等多省市,便于按区域定位并引入对应地图。开发者…

2026/10/15 1:59:12 阅读更多 →
STM32U5xx HAL 驱动组件解析:在 Arduino_Core_STM32 中的角色、结构与配置

STM32U5xx HAL 驱动组件解析:在 Arduino_Core_STM32 中的角色、结构与配置

嵌入式固件驱动开发硬件开发 【免费下载链接】Arduino_Core_STM32 STM32 core support for Arduino 项目地址: https://gitcode.com/gh_mirrors/ar/Arduino_Core_STM32 点击查看 免费下载 STM32Cube 是意法半导体(STMicroelectronics)面向整…

2026/10/15 1:58:11 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →