Commit 49440e10 authored by 尹洪福's avatar 尹洪福

update

parent ccd8de6b
......@@ -432,12 +432,38 @@ moveTo(curPulse + deltaPulse2) // 同样可分步过渡
5. moveTo(peakPos) → 完成
```
**采样形态判断**(拟合前先判断):
- 中间高两边低(fv_left < fv_center > fv_right)→ 正常,执行抛物线拟合
- 单调递增/递减 → 峰值不在采样范围内,往高侧再移一步重新采样(最多重试 2~3 次)
- 三点差异很小 → 无纹理或已在峰顶平台,停在当前位置
**异常处理**
- denom ≈ 0(FV 变化极小)→ 停在当前位置,认为已合焦
- peakPos 超出 ±2×step → clamp(防跑飞)
- 三点 FV 都很低 → 无纹理,放弃精调
**备选**:抛物线拟合效果不佳时,改为逐步爬峰或混合方案
**FV 验证**
拟合结果不可盲信(实际 FV 曲线不是标准抛物线,存在不对称、噪声、平顶等情况)。
```
moveTo(peakPos) → 读 fv_peak
if (fv_peak >= fv_max_of_3points) → 拟合有效,完成
if (fv_peak < fv_max_of_3points) → 拟合偏了,回到三点中 FV 最大的位置
```
### Phase 3 备选方案 — 多点扫描取最大值
抛物线拟合依赖"FV 曲线近似抛物线"假设,实际可能不成立。备选方案:
```
在粗跳位置附近,固定步长采样 5~7 个点
直接取 FV 最大的那个位置
```
- 不依赖曲线形状假设,结果可靠
- 多花 2~4 帧(约 70~130ms)
- 适合 FV 曲线不规则的场景
**两种方案待实测对比,择优选用。**
### 对焦过程数据记录
......
# 输入
- AI-PD unit @江文杰 重要
1.各个场景准确度(暗光/竖条纹/小物体..)
2.不同机器鲁棒性 / 泛化性
3.置信度
4.前景ROI- 小对焦窗口/每个小窗口做前景ROI
5.性能优化加速
6.ROI可配置/分辨率可变
7.滤波@跟踪 抗抖/抗噪声/预测。详细设计方案
- 传统PD算子融合?
1.优化策略
重要:
- FV unit
1.接口模块 / hisi /软实现?
- SAD unit
1.目标?场景检测
2.hisi SAD 具体怎么算
3.时间延迟
- TOF unit
1.目标
2.8828:5*5传感器数据,稀疏数据如何结合
3.标定?映射RGB数据计算
子模块架构详细设计 - 补充
- 帧数据对齐,时间戳对齐
- 各个unit分离
- 插拔式
# 窗口管理
- 具体几个模式
- 如何送给后面的决定
# 决策
重要:
- 融合策略 多unit多角度出发融合决策
- 融合决策策略文档
- 归一化问题 多尺度评分/占比?业界主流方案?
- 子代码模块架构实现
# 执行 (待议)
- 粗对+精对
- 纯CAF
# 整体架构
子模块架构
# PD 拍照功能接入考虑详细 (待议)
讨论点:
1.ROI/对焦焦点?
2.触发策略
3.PD算子优化/传统结合
\ No newline at end of file
# S3/S5 新对焦架构 — 会议简版
## 一、目标
- 对焦速度:200-300ms(当前 400-700ms)
- 稳定收敛,无来回震荡
- S3/S5 统一一套 pdaf lib,降低维护成本
- 可调试:运行时调参,不依赖重编译
---
## 二、pdaf lib 定义
> **接受 PD 和 FV 数据流,根据对焦模式和对焦框配置,决策并执行推镜头操作。**
核心三段式:**输入 → 决策 → 执行**
```
┌─────────────────────────────────────────────────────────────────┐
│ pdaf lib │
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌─────────────────┐ │
│ │ 输入 │ │ 决策 │ │ 执行 │ │
│ │ │ │ │ │ │ │
│ │ ProcessModule│──→│ PolicyModule │──→│ ActuateModule │ │
│ │ ├ PdProcessor│ │ (触发判定) │ │ (镜头控制) │ │
│ │ ├ FvProcessor│ │ │ │ │ │
│ │ └ TofProc...│──→│ WindowManager│ │ PdafActuator │ │
│ │ (预留) │ │ (目标选择) │ │ CdafActuator │ │
│ └─────────────┘ └──────────────┘ └────────┬────────┘ │
│ │ │
│ 配置输入: StateMachine ──┘ │
│ 对焦模式 / 对焦框 / 平台参数 │
└───────────────────────────────────────────────────┬─────────────┘
电机控制指令输出
```
| 阶段 | 模块 | 职责 |
|------|------|------|
| **输入** | ProcessModule(PdProcessor + FvProcessor + TofProcessor预留) | 接收 PD/FV 数据流,统一输出 12×6 zone 数据 |
| **决策** | PolicyModule + WindowManager | 选择对焦目标,判定是否触发对焦、用哪种策略 |
| **执行** | ActuateModule + StateMachine | PD 粗跳 + FV 精调,驱动镜头到位 |
### PDAF 决策链路
```
PD measure — PD 采集
temporal filter — 时域滤波(多帧平滑去噪)
confidence check — 置信度评估(方差、方向一致性、多 zone 投票)
dead zone check — 动态合焦容忍区(依赖 confidence + texture)
trigger decision — 触发决策(四层门控)
lens move — 推镜头(粗跳 + 精调)
```
---
## 三、输入层设计
### PD/FV 统一 12×6 zone,零坐标映射
PD 和 FV 共用 12×6 网格,独立存储、独立更新,用 zone index 关联。
```
PdZoneMap (12×6) FvZoneMap (12×6)
zone[i].pd zone[i].fv
zone[i].conf zone[i].timestamp
zone[i].timestamp
各自按自己帧率更新(PD ~25fps, FV ~30/60fps)
同一 zone index 直接取 PD 和 FV,零坐标映射
```
- PD 算法双轨:ZnccProcessor(传统)+ AipdProcessor(AI),统一输出 PdZoneMap
- zone 行列数配置化,不硬编码分辨率和 block 数量
### 坐标系与 zoom 处理
三个坐标系:
```
┌─────────────────────────────────┐
│ Sensor 全图坐标系 │ ← PD raw 始终基于此(不随 zoom 变化)
│ 3840 × 2160 │
│ │
│ ┌───────────────────┐ │
│ │ 可视区域坐标系 │ │ ← zoom 裁剪后的区域
│ │ (VPSS 输出) │ │ 人脸框、用户触摸点等基于此坐标系
│ │ │ │
│ │ AF stats 12×6 │ │ ← ISP 对可视区域重新配置 zone(暂定)
│ │ zone 覆盖此区域 │ │
│ └───────────────────┘ │
│ │
└─────────────────────────────────┘
```
**坐标转换链路**
```
VPSS 坐标(用户看到的画面)
↕ 偏移 + 缩放(zoom crop 参数)
Sensor 全图坐标
↕ zone 网格映射
Zone index (row, col)
→ 取 PD(需从全图 PD 中定位对应区域)
→ 取 FV(直接按 zone index,AF stats 已对齐可视区域)
```
**zoom 时的处理**
| 数据 | zoom 影响 | 处理方式 |
|------|----------|---------|
| AF stats (FV) | 重新配置到可视区域,zone 数量不变(12×6),单 zone 覆盖面积变小 | ISP 重配 w/h,保持 col=12, row=6 |
| PD raw | 始终全图,不随 zoom 变化 | 需要将可视区域映射到全图,裁剪出对应 PD 区域计算(备选:直接裁剪 PD raw) |
| VPSS 坐标(人脸框等) | 基于可视区域 | WindowManager 负责转换到 zone index |
> **注意**:zoom 后单 zone 内容变少,PD 计算精度可能受影响,需实测验证。
---
## 四、决策层设计
### 目标选择(WindowManager)
| 模式 | 选择策略 |
|------|---------|
| 人脸模式 | AI 人脸框 → 映射到 zone |
| 跟踪模式 | 跟踪目标框 → 映射到 zone |
| 手动选区 | 用户指定区域 → 映射到 zone |
| 中心点对焦 | 直接取中心 zone |
| 大区域自动 | 加权选择最优 zone |
### 触发决策(PolicyModule)— 四层门控
```
第一层:场景变化检测(FV 下降?PD 偏移?)→ 粗筛,大部分帧在此过滤
第二层:稳定性确认(连续 N 帧)→ 防误触发
第三层:PD 分析 → 触发 PDAF 或 FvScan
第四层:合焦门控 → 动态 dead zone,防重复触发
高置信+强纹理 → dead zone 小(精度高)
低置信+弱纹理 → dead zone 大(容忍偏差)
```
对焦抑制信号:AE/AWB/SAD 剧烈变化时暂停触发判定
---
## 五、执行层设计
### 为什么选「粗跳 + 精调」而不是「每步微调」
每步微调(每帧读 PD → 小步推镜头 → 等信号更新 → 再推)的问题:
- 每次推镜头后需等 2-4 帧 PD 信号才稳定
- DCC 精度不够时需多次迭代才能收敛
- 3-5 次迭代 × 每次 2-3 帧延迟 = 9-15 帧(300-500ms)
粗跳 + 精调的思路:
- **一次算好目标位置,直接大步跳过去**,只吃一次延迟
- 到位后用 FV 精调确认峰值,不依赖 PD 收敛
- 总共 1-2 次跳转 + 1 次精调,耗时大幅缩短
这也是业界通用方案(Sony Hybrid AF、libcamera PDAF+CDAF)。
### PD 稳定性 → 步长调节
粗跳前评估连续 N 帧 PD 稳定性:
- **stable**(+3, +3, +3):幅度方差小 → 正常步长
- **noisy**(+3, +1, +4):方向一致但幅度波动 → 降低步长,避免过冲
### 对焦执行流程
```
Phase 1 (PD 粗跳) → Phase 2 (PD 修正, 可选) → Phase 3 (FV 三点抛物线精调)
```
- Phase 1:`deltaPulse = pd × dcc + 重力补偿 + 温度补偿`,大步跳到目标附近
- Phase 2:粗跳后 PD 偏差仍大时修正一次(最多 1 次,不无限迭代)
- Phase 3:三点采样 + 抛物线拟合求 FV 精确峰值(参考 libcamera findPeak)
**预期耗时:200-300ms(典型),最长 400ms**
### 对焦过程数据记录
每次对焦执行过程中,记录完整的 PD/FV 变化序列(独立于历史数据)。
- 粗跳分步过程中虽不等信号同步,但**被动记录**每帧的 PD/FV
- 推镜头过程中数据不稳(运动模糊、PD 延迟),**记录但不依赖**
- 价值:
- DCC 校准:对比"PD 预测位置" vs "FV 实际峰值位置",累积修正 DCC
- 方向验证:分步中 FV 趋势至少可判断方向对不对
- 调试诊断:dump 完整对焦曲线,排查问题
- 异常检测:PD 突然反向或 FV 骤降时可提前中止
### DCC 补偿:温度 & 重力
VCM 电机受重力和温度影响,同样 pulse 对应不同实际位置:
| 因素 | 影响 | 补偿方式 |
|------|------|---------|
| **重力**(影响较大) | 镜头朝上/朝下/水平,磁力抵抗重力不同 | `sin(angle) × K_gravity`,K 需标定 |
| **温度** | VCM 磁力随温度变化 | `(T - T_ref) × K_temp`,K 需标定 |
补偿加入 DCC 计算:`deltaPulse = pd × dcc + gravityOffset + tempOffset`
### 镜头到位等待
VCM 马达无位置反馈,发 pulse 后不知道何时真正到位。
方案:实测不同移动量下的到位耗时,按移动量分档固定等待。VCM 响应特性稳定,同样移动量到位时间基本一致。
| 移动量 | 等待时间 | 备注 |
|--------|---------|------|
| 小步(<30 pulse) | 待测 | 精调阶段 |
| 中步(30~100) | 待测 | 修正阶段 |
| 大步(>100) | 待测 | 粗跳阶段 |
### 状态机:新增 TRACKING 状态
```
IDLE → FOCUSING → TRACKING → IDLE
↑ │
└─────────┘ (PD 大变 → 重新对焦)
```
- FOCUSING:完整 Phase 1/2/3
- TRACKING:对焦完成后持续监测,小步跟随移动目标
- 解决移动目标场景反复全流程对焦的问题
---
## 六、S3/S5 统一设计
### 一套 lib,两个产品
pdaf lib 是纯算法层,不直接操作硬件。S3/S5 差异通过配置解决。
```
pdaf lib(统一算法)
├── ProcessModule / PolicyModule / ActuateModule / WindowManager / ...
└── 平台配置:
├── S3: pulse 0~1024, DCC 表, 12×6 zone, AIPD ~25fps
└── S5: pulse 范围, DCC 表, zone 配置, ...
```
### lib 职责边界
> 接受 PD 和 FV 数据流,根据对焦模式和对焦框设置等配置,输出镜头控制指令。
| 归 pdaf lib | 不归 pdaf lib |
|-------------|--------------|
| PD/FV 数据处理 | PD raw 采集 |
| 触发判定 + 执行算法 | ISP 配置 / 电机驱动 |
| 模式/对焦框管理 | 人脸/目标检测 AI |
### 调试模式
S5 硬件未就绪前,在 S3 上通过 FIFO 命令通道模拟 S5 操作:
```bash
echo "mode afs" > /tmp/pdaf_cmd # 切换模式
echo "key half_press" > /tmp/pdaf_cmd # 模拟快门半按
echo "motor goto 500" > /tmp/pdaf_cmd # 控制镜头
echo "dump pd" > /tmp/pdaf_cmd # 查看数据
```
量产后同样可用于现场诊断。
### 日志与数据上报
**问题**:之前排查对焦问题只能远程看用户电脑屏幕,耗时耗人力,无法定位根因。
**方案**
- **调试日志分级开关**:可运行时开关,不同级别(关键事件 / 详细数据 / 全量 dump)
- **debug 绘制开关**:OSD 叠加 zone 网格、PD 方向箭头、FV 热力图等,开发调试用
- **对焦流程记录**:每次对焦完整记录一条结构化数据,包含:
- 触发原因、触发时的 PD/FV 快照
- 各 Phase 耗时、步数、PD/FV 变化序列
- 最终结果(成功/失败)、最终 pulse 位置
- **数据上报**:对焦流程记录用于远程数据分析,测试和用户反馈问题时直接拉数据定位,不再依赖远程桌面
---
## 七、开发计划
### 原则:模块独立验证,再组合集成
每个模块先单独测试确认可靠,再组合。避免混到一起后定位不了问题出在哪。
| 模块 | 独立验证内容 |
|------|-------------|
| PD 计算 | 固定镜头位置,采集各 zone 的 PD 值,验证准度和一致性 |
| FV 计算 | 固定镜头位置,验证各 zone 的 FV 值是否反映真实清晰度 |
| DCC | 已知 PD → `deltaPulse = pd × dcc` → 推镜头 → 验证到位精度 |
| 触发模块 | 制造场景变化(遮挡/移物),验证触发是否及时、是否误触发 |
| 执行模块 | 手动触发对焦,验证 Phase 1/2/3 各阶段行为和耗时 |
| 坐标映射 | 不同 zoom 倍数下验证 zone 对齐、VPSS→zone 转换正确性 |
### 开发步骤
| 步骤 | 模块 | 说明 |
|------|------|------|
| 1 | DCC 简化 | 移除物距概念,`deltaPulse = pd × dcc常量`,最独立 |
| 2 | FV 优化 | 统一 12×6 zone,理清坐标映射 |
| 3 | AIPD 测试 | 测试工具采集 PD-pulse 曲线,摸清精度 |
| 4 | 触发重写 | 四层门控,信号逐个验证后组合 |
| 5 | 执行重写 | PD 粗跳 + FV 抛物线精调 |
| 6 | 集成测试 | 全链路调优 |
---
## 八、预期收益
| 指标 | 目标 |
|------|------|
| 对焦速度 | 200-300ms |
| 代码维护 | S3/S5 统一 lib |
| 数据可靠性 | PD/FV 独立更新、零坐标映射 |
| 可调试性 | 命令通道实时调参 |
| 移动目标 | TRACKING 小步跟随 |
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment