2026.05.13征图日记13(添加标定法测量)

上来就研究LiDAR对于微小表面的测量精度问题。发现激光雷达其实并不适合工业检测,但是作为展示还是够用。
关于mentor昨天提的一次标定+LiDAR测量方法,我持有怀疑态度,今天我搜了一下,发现市面上基本没有人这么做,要么是多此一举,要么就是精确度太拉垮
总之我是不太赞成这个方法的,如果硬要做,那就做呗。反正我只负责执行,他们也都不会听我的建议,我也只是个实习生公司又不是我家,学到东西就走。


  1. 微小表面测量的影响因素对于“微小表面”,LiDAR 的测量能力有明显限制:

最佳工作距离:0.5 - 5m

分辨率限制: LiDAR 属于中低分辨率传感器。对于特别小的物体(如毫米级零部件、精细纹理),LiDAR 很难获取足够的点云数据来重现表面细节。
表面材质: 光滑、透明或高反光(如镜子、玻璃、高亮金属)表面会严重影响激光反射,导致扫描结果空缺或产生误差。
设备稳定性: 抖动是提升测量精度的最大敌人。手持扫描时,手部轻微抖动会显著影响微小表面的测量结果。

  1. 应用定位

适用于: 室内快速建模、物体表面轮廓扫描、增强现实(AR)物体放置、家具尺寸测量等。
不适用于: 工业级高精度零件测量、微米级裂纹检测等需要微米级或亚微米级精度的工业计量任务。

总结: 苹果的 LiDAR 擅长记录大尺寸的微小形变或宏观结构,对于米级物体的表面起伏表现良好,但对于毫米级的微观纹理则处于其能力边界之外。


下午主要就是把之前写好但是没用的标定法代码的入口加上,做了一下两种方法测量结果的数据隔离问题,还有检测结果、标定界面的操作逻辑的优化

今天摸鱼摸爽了~

AI的知识深度肯定比你深,那么知识的深度不像之前那么重要了,因为 AI 比人了解的更深,但是知识的广度很重要,这个可以在使用 AI 出现问题后,人来及时纠正。那么如何提升知识广度呢?你需要自己去学,怎么学?问 AI 啊~那么其实这里面最重要的就是你需要自己去学,就是主观能动性,也就是自驱力。

不管是上班刷L站也好还是下班刷dy,都有很多关于AI,就业,裁员的信息,总是在担心自己的未来,但是朋友我们不应该活在当下吗?好好感受一下下班出公司大楼的时候迎面而来的微风,感受下班的夕阳,想想今天又要薅公司的晚饭还是零食饮料,感受健身房的杠铃今天有没有变重,想想今天晚上练完吃什么,周末要去哪玩。这些才是我们应该更多考虑的
要把自己从这个虚拟世界里面割离出来,接触真实的人,感受真实的世界

最后,一边看力扣的第31题:下一个排列的题解,一边坐等下班!~
写完了,还有半小时下班,再摸会鱼~


今日工作内容:
1、研究LiDAR对于微小表面的测量精度问题
2、研究一次标定+LiDAR测量方法
3、app添加标定测量方法
4、简化检测结果界面

下阶段计划
1、标定界面交互优化
2、持久化标定数据
3、历史记录测量方法隔离


会话总结:测量方法切换功能实现

日期:2026-05-13
任务:measurement-method-switch
状态:代码已完成,待提交


一、需求概述

在设置页添加测量方法切换(LiDAR 法 / 标定法),优化标定流程的交互体验,修复数据持久化和历史记录的测量方法隔离问题。

二、实现内容

1. 设置页测量方法切换

文件mobile/src/screens/SettingsScreen.tsx

  • 添加 SegmentedControl 切换 LiDAR / 标定法
  • LiDAR 模式:显示默认距离、fx/fy 参数
  • 标定法模式:仅显示默认参照物长度(mm),移除了手动 fx/fy 输入
  • 切换时自动保存到 settingsStore

2. 标定流程修复

文件mobile/src/screens/ResultScreen.tsx

问题:标定法下点击「测定缺陷面积」直接输出数据,没有进入标定流程。

修复

  • 新增 calibratingdraftLinedraftRefLength 状态
  • 点击按钮 → 弹出全屏标定 Modal → 用户绘制标定线 → 确认 → 计算面积
  • handleCalibrationDone() 校验参照物长度 > 0 后保存标定数据到 store
  • 新增「再次标定」按钮(标定法下,测量完成后显示)

标定流程

1
2
3
4
5
点击「测定缺陷面积」
→ 标定法:弹出 CalibrationOverlay 全屏 Modal
→ 用户拖拽标定线端点 + 输入参照物长度
→ 点击「完成标定」→ 保存标定数据 → 计算面积
→ 显示结果 + 「再次标定」按钮

3. 检测结果界面优化

DetectionCanvasmobile/src/components/result/DetectionCanvas.tsx):

  • 移除图片上的文字标签、置信度、面积信息
  • 仅保留检测框轮廓(SVG Rect)

DetectionListmobile/src/components/result/DetectionList.tsx):

  • 默认视图:缺陷类型 + 面积(如有)
  • 点击展开:置信度进度条 + 百分比 + bbox 坐标 + 面积详情
  • 使用 borderLeft 替代独立的 colorBar 元素,解决布局问题

4. 标定交互优化

文件mobile/src/components/result/CalibrationOverlay.tsx

替换把手样式:圆圈点 → 十字箭头(22×22,由两条 2px 线段组成)

解决手指遮挡问题

  • 新增 AnimatedCrosshair 组件
  • 每个端点有十字准星线:水平线贯穿容器宽度,垂直线贯穿容器高度
  • 准星线本身可拖拽(40px 触摸区域,minDistance(0)
  • 使用 Reanimated useAnimatedStyle 实时跟随拖拽
  • 水平线定位:top: fitDy + normY * fitDh - 20
  • 垂直线定位:left: fitDx + normX * fitDw - 20
  • SVG 标定线层:pointerEvents="none" 确保触摸穿透

5. 数据持久化修复

文件mobile/src/store/inferenceStore.ts

问题:应用退到后台再回来,标定数据丢失。

修复:在 partialize 中新增持久化字段:

1
2
3
4
5
partialize: state => ({
params: state.params,
calibrationLine: state.calibrationLine,
referenceLengthMm: state.referenceLengthMm,
}),

6. 历史记录测量方法隔离

文件mobile/src/hooks/useInference.ts

问题:设置改为标定法后,从历史进入 LiDAR 时期的记录,会用标定法重新计算面积。

修复

  • 推理时将当前测量方法写入 HistoryRecord.measurementMethod
  • measurementSession 按方法分别存储所需数据:
    • 标定法:calibrationLine + referenceLengthMm
    • 距离法:cameraDistanceMm + fx + fy
    • LiDAR:depthSnapshot + fx + fy

文件mobile/src/types/models.ts

  • HistoryRecord 新增 measurementMethod?: MeasurementMethod 字段

文件mobile/src/screens/ResultScreen.tsx

  • 新增 effectiveMethod = data?.savedMethod ?? measurementMethod
  • 所有内部计算使用 effectiveMethod,历史记录优先使用保存的方法

7. 运行时错误修复

DetectionCanvasimport i18n from '@/i18n' 改为 useTranslation() hook,解决模块加载顺序导致的 Property 'i18n' doesn't exist 错误。

三、涉及文件清单

文件 变更类型
mobile/src/screens/SettingsScreen.tsx 新增测量方法切换 UI
mobile/src/screens/ResultScreen.tsx 标定流程 + 方法隔离 + 再次标定
mobile/src/components/result/CalibrationOverlay.tsx 十字准星 + 箭头把手
mobile/src/components/result/DetectionCanvas.tsx 移除文字标签
mobile/src/components/result/DetectionList.tsx 默认折叠 + 展开详情
mobile/src/store/inferenceStore.ts 持久化标定数据
mobile/src/hooks/useInference.ts 按方法分别存储测量会话
mobile/src/types/models.ts 新增 measurementMethod 字段

四、已知问题与后续

  • 代码已全部完成,尚未提交 git commit
  • 任务 measurement-method-switch 状态仍为 planning,需执行 task.py start 后才能正常 finish-work