GrabBag/App/WeldSeam/Doc/PointCloudStorage.md

3.3 KiB
Raw Blame History

点云保存与内存保护

自动完整保存

  • 扫描开始时同时开启 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。