GrabBag/App/WeldSeam/Doc/PointCloudStorage.md

34 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 点云保存与内存保护
## 自动完整保存
- 扫描开始时同时开启 `enableDebug` 和 `savePointCloud`,基类为每台相机的本次扫描创建一个文件。
- 扫描期间逐帧提交原始点云,后台线程持续写入 TXT;不分段,不等待全部数据进入内存后再保存。
- 此自动采集保存路径固定使用 TXT,不受 `storageType` 的二进制选择影响。手动保存和原有离线保存仍沿用原配置。
- 输出位置沿用 `debugOutputPath`,按应用名和日期建立目录,文件名包含设备和扫描时间。
- 正在写入的文件暂用 `.txt.part` 后缀,内容为 TXT。正常结束时排空待写队列、回填实际扫描线数,再改名为 `.txt`。
- 创建文件失败时不启动该相机的扫描;写入失败、取消或断线时保留 `.part`,不能将它视为完整扫描。异常退出留下的 `.part` 需要人工检查和清理。
- 每台相机的写入队列上限为 8 MiB,包含正在写入的扫描线。队列满时等待写线程,不静默丢帧;超过队列容量的单帧或写入错误会明确标记失败。
- TXT 格式化在后台线程完成,SDK 回调仅复制待写扫描线,不长期保存 SDK 指针。
## WeldSeam 缓存
- 不论调试保存是否开启,WeldSeam 都尝试保留 `m_detectionDataCache`,供右键手动保存使用。
- 每帧复制缓存前检查系统可用物理内存;Windows 使用 `GlobalMemoryStatusEx`,Linux 使用 `/proc/meminfo` 的 `MemAvailable`。
- 预留 1 GiB,并额外考虑下一帧、容器扩容以及 32 MiB 运行余量。继续缓存可能越过保留线时,本次扫描永久停止追加缓存,不因内存稍后恢复而重新追加。
- 内存查询失败也保守停止缓存。内存分配失败同样标记缓存不完整,并安全释放本帧尚未交给缓存的数据。
- 已缓存的前缀数据保留;后续逐帧增量算法处理和自动完整 TXT 写入不受缓存停止影响。
- 扫描/检测完成后仍保留缓存。下一次扫描或加载新数据时,清空旧缓存并重置不完整标记。
- 右键保存时,缓存不完整会提示“内存不足,导致数据不完整”,确认后才能保存部分数据;若一帧都未缓存,直接提示该原因。
- 扫描和检测期间不允许手动导出缓存,避免阻塞采集及将扫描中的前缀误认为完整数据。
- 其他项目的算法缓存策略不变,仅自动点云保存切换为采集期间写入。
## 边界与现场确认
- 1 GiB 是本程序停止增加缓存的保护线,不能保证其他进程或算法的额外分配不会让系统可用内存继续下降。
- 有限队列满时产生背压,是否影响设备帧率取决于 SDK 和硬盘吞吐;需使用实际设备、实际单帧点数确认 500 fps、连续三分钟的吞吐,不能仅凭写入逻辑承诺硬件端不丢帧。
- 正常扫描检查最终 TXT 可复检、扫描线数与接收帧数一致、帧号覆盖整次扫描。
- 低内存扫描检查缓存停止后不再增长,检测正常完成,手动保存明确提示不完整,自动 TXT 仍覆盖后续帧。
- 连续两轮扫描检查文件不覆盖、不串帧,不完整标记在新一轮清零。
- 检查普通项目单相机/多相机扫描、主动停止、取消、断线、无写权限和磁盘写满路径;失败时不能生成看似成功的完整 TXT。