Argus 曝光控制
| 要素 | 控制 | 注意 |
|---|---|---|
| 快門時間 | 感測器曝光 register(tegracam) | 太長模糊/banding |
| 類比增益 | 感測器 AGC | 太高雜訊 |
| 數位增益 | NVIDIA ISP | 最後手段 |
SensorMode ... exp_time = 20000 # 微秒
SensorMode ... gain = 2.0也可用 v4l2-ctl -d /dev/v4l-subdev0 -C exposure。
v4l2-ctl -d /dev/v4l-subdev0 -C exposure
曝光值依感測器位元布局組合(單元 3 的 16-bit 位址規則)。正式流程用驅動/平台控制,這裡只是理解。
argus_camera SensorMode exp_time=20000
OV 系感測器的曝光時間是 20-bit,拆在多個 register(如 0x3500/0x3501/0x3502/0x3503),組合方式依 datasheet 而定。這代表「讀回的值」要自己組合,不是單一 register 就能看。
# 讀三個位元組 hi = i2cget(0x3500); mid = i2cget(0x3501); lo = i2cget(0x3502) exp = (hi << 12) | (mid << 4) | (lo >> 4) # 依 datasheet 的位元布局
# 固定增益,逐級拉曝光,看 RAW 亮度是否線性
for e in 1000 2000 4000 8000 16000 32000; do
v4l2-ctl -d /dev/v4l-subdev0 -c exposure=$e
argus_camera --mode 0 --capture-auto 1 --raw-file e$e.raw --duration 1
done
python3 - <<'EOF'
import numpy as np, glob
for f in sorted(glob.glob('e*.raw')):
raw = np.fromfile(f, dtype=np.uint16)
print(f, '亮度:', raw.mean().round(1)) # 應隨曝光倍增
EOF1. AE 是否開啟? ├─ 關 ─→ 曝光/增益是否太小? └─ 開 ┐ 2. AE 是否卡在邊界? ├─ 快門卡上限 → 場景太暗:補光 / 放寬 max_exp ├─ 增益卡上限 → 補光(優先)或放寬 max_gain └─ 沒卡 ┐ 3. 統計被騙? ├─ 場景大片黑/白 → 換場景或設 ROI └─ 正常 ┐ 4. 檢查黑位設定 → 若黑位太高,暗部被扣光 → ✅ 修正
室內日光燈以 50Hz/60Hz 閃爍。曝光時間若不是光源週期的整數倍,畫面會出現明暗條紋(banding)——這是「曝光與光源頻率不匹配」,不是感測器壞。
| 光源頻率 | 安全曝光 | 對策 |
|---|---|---|
| 50Hz(台灣/歐陸) | 10ms 的整數倍 | 曝光設 10ms/20ms… |
| 60Hz(美國/日本) | 8.33ms 的整數倍 | 曝光設 8.33/16.67ms… |
| 症狀 | 方向 |
|---|---|
| 太暗且 AE 卡上限 | 補光 / 放寬範圍 |
| 太亮且 AE 卡下限 | 減光 / 縮範圍 |
| 忽亮忽暗 | 統計被騙 / 震盪:調 ROI |
| 橫向條紋 | banding:光源頻率對齊 |
| 高增益爆雜訊 | 優先曝光與光源 |
# 1. 量場景亮度:全遮 vs 全開的 RAW 均值 dark = mean(全遮) # ~黑位 bright = mean(全開) # 目標近半飽和 # 2. 決定目標亮度與曝光/增益範圍 # - 長曝光上限:依 motion blur 需求 # - 增益上限:依 SNR 預算(單元 13) # 3. 在 DTB mode 或 runtime 設 max_exp / max_gain # 4. 回歸:白天/夜晚/室內 都要在範圍內收斂
場景:OV9281 裝在傳送帶上方做缺陷檢測,光源固定但產品表面反射率差異大(亮白色金屬 vs 暗色橡膠)。AE 需要在不同產品間快速收斂。
# 1. 設定 AE 為手動模式(固定曝光) argus_camera --mode 0 --ae-manual --exposure-time 10000 --gain 1.0 # 2. 觀察不同產品的亮度 # 亮色金屬:histogram 偏右 → 可能過曝 # 暗色橡膠:histogram 偏左 → 可能欠曝 # 3. 改用 auto exposure,設定收斂範圍 argus_camera --mode 0 --ae-auto \ --ae-convergence-speed fast \ --ae-target-brightness 128 \ --ae-min-exposure 1000 \ --ae-max-exposure 33000 # target-brightness=128:AE 試圖讓平均亮度到 128/255 # convergence-speed=fast:快速跟上產品變化
設計決策:工業場景的 AE 與一般監控不同——產品每幾秒換一種,AE 需要「快速收斂但不震盪」。Argus 的 convergence-speed 控制 PID 控制器的 response time。
Argus AE 的核心是一個 PID(比例-積分-微分)控制器,它根據 histogram 的亮度分佈調整曝光時間和 gain。
| PID 參數 | 功能 | 過大的效果 |
|---|---|---|
| P(比例) | 亮度偏離目標時的反應速度 | 曝光值震盪(over/under shoot) |
| I(積分) | 消除長期偏差 | 收斂變慢(因為「等待」積分累積) |
| D(微分) | 抑制震盪 | 反應遲鈍(過度抑制變化) |
| 症狀 | 可能原因 | 解決方案 |
|---|---|---|
| AE 開啟後畫面忽明忽暗(震盪) | convergence-speed 太快 或 target-brightness 不合理 | 降低 convergence-speed;確認 target-brightness 在 100-150 範圍 |
| AE 在低光下無法收斂(永遠拉長曝光) | max-exposure-time 設太低 或 sensor 幀率限制 | 提高 max-exposure-time;降低 fps 以允許更長曝光 |
| AE 在高光下過曝(histogram 爆掉) | min-exposure-time 設太高 或 gain 未降 | 降低 min-exposure-time 到 sensor 支援下限 |
| 手動設定曝光後畫面比 auto 更暗 | 手動曝光值低於 auto 的收斂目標 | 用手動模式測出「正確曝光」的參數,再切回 auto 作為參考 |
| AE 在室內/室外切換時需要很長時間收斂 | I 參數過大(積分太慢消除偏差) | 在已知場景切換點,用 event trigger 強制 reset AE |
場景:傳送帶缺陷檢測(回顧 10.10 場景)產品每幾秒更換,AE 要不斷重收斂,且要同時避免 banding 與震盪。專案目標:系統化調出「收斂快、不震盪、無 banding」的 AE 參數組。
# Step 1 · 鎖定光源與曝光基準(排除 AE 干擾) # 量光源頻率(50Hz / 60Hz)→ 決定安全曝光(回顧 10.13) # Step 2 · 測曝光階梯 + SNR 預算 → 定 max_gain(回顧 13.6) # Step 3 · 設定 AE 範圍:min/max exp、max gain、target brightness argus_camera --mode 0 --ae-auto \ --ae-target-brightness 128 \ --ae-convergence-speed medium \ --ae-min-exposure 1000 --ae-max-exposure 33000 # Step 4 · 收斂測試:LED 開/關計時收斂秒數(回顧 10.12-2) # Step 5 · 長跑回歸:不同產品連續跑 30 分鐘,檢查 # 有無震盪(忽亮忽暗)、有無 banding、有無卡邊界 # Step 6 · 把參數組寫進 DTB mode 或 runtime 設定,固化版本
專案輸出:AE 參數表(含範圍 / 目標 / 收斂速度)+ 收斂測試數據 + 30 分鐘長跑報告。
v4l2-ctl -d /dev/v4l-subdev0 -C exposure / -C analogue_gain。| 面向 | Orin Nano | RPi5 | Orange Pi | Thor |
|---|---|---|---|---|
| 曝光介面 | SensorMode exp_time | libcamera ExposureTime | V4L2 exposure | SensorMode |
| 增益介面 | SensorMode gain | AnalogueGain | analogue_gain | SensorMode |
| AE 演算法 | NVIDIA 閉迴路(PID) | libcamera AGC 可改 | 感測器內建 | NVIDIA 閉迴路 |
| 收斂控制 | convergence-speed | 調 AGC 參數 | 有限 | convergence-speed |
| 曝光單位 | 微秒(µs)— 跨平台一致 | |||
| 步驟 | Command | 預期(手動) | 預期(自動) |
|---|---|---|---|
| 1. 手動曝光出圖 | argus --exposure-value 0.016 --gain-value 4.0 --capture-auto 0 | 亮度固定 | N/A |
| 2. 自動曝光出圖 | argus --capture-auto 1 | N/A | 亮度自適應 |
| 3. 直方圖比較 | Python hist() | 直方圖固定 | 直方圖隨場景移動 |
| 4. 亮度穩定性 | 30 幀 mean ± std | std < 2 | std < 5(容許微調) |
#!/usr/bin/env python3 # ae_verify.py — 驗證 AE 功能 import numpy as np, subprocess, time def capture(label, auto, exp=0.016, gain=4.0): cmd = [ "argus_camera", "--camera-id", "0", "--mode", "0", "--capture-auto", "1" if auto else "0", "--duration", "1", "--output-dir", f"/tmp/ae_{label}" ] if not auto: cmd += ["--exposure-value", str(exp), "--gain-value", str(gain)] subprocess.run(cmd, capture_output=True) import glob raw = glob.glob(f"/tmp/ae_{label}/*.raw") return np.fromfile(raw[0], dtype=np.uint16) if raw else None # Test 1: Fixed exposure fixed = capture("fixed", auto=False) print(f"Fixed exposure: mean={fixed.mean():.1f}") # Test 2: Auto exposure auto = capture("auto", auto=True) print(f"Auto exposure: mean={auto.mean():.1f}") # Test 3: Stability (30 frames auto) means = [] for i in range(30): d = capture(f"stab_{i}", auto=True) means.append(d.mean()) time.sleep(0.1) means = np.array(means) print(f"Stability: mean={means.mean():.1f} ± std={means.std():.2f}") # Verdict if means.std() < 5: print("AE VERDICT: PASS (stable)") elif means.std() < 10: print("AE VERDICT: MARGINAL") else: print("AE VERDICT: FAIL (unstable)")
1. 曝光值在 ~0.016s 快速震盪? ├─ 是 → AE 目標值(target)過高 → 調低 target │ 或 integration time 過短 → 加長最短曝光 └─ 否 ┐ 2. 偶爾一幀突然改變? ├─ 是 → 異常 frame 觸發重計算 │ → 加 hysteresis(遲滯) └─ 否 ┐ 3. 環境光源本身在閃爍? ├─ 是 → 加 flicker rejection(50/60Hz) └─ 否 → 降 convergence speed
1. 自動曝光後整體過亮? ├─ 是 → target luminance 太高 → 降低 target └─ 否 ┐ 2. 自動曝光後整體過暗? ├─ 是 → target luminance 太低 → 提高 target └─ 否 ┐ 3. 高光 blown(白色剪裁)? ├─ 是 → highlight 預算不足 → 用局部 AE / 包圍曝光 └─ 否 → 整體亮度正確
argus_camera --capture-auto 1 --duration 1。| 面向 | Orin Nano | RPi5 | Orange Pi | Thor | 推薦 |
|---|---|---|---|---|---|
| AE 實作 | 3A library (NVIDIA) | libcamera 3A | 感測器 AEC 硬體 | 3A + Holoscan | 各有實現 |
| AE 控制粒度 | 極細(ROI / 區域) | 中 | 低(全局) | 極細 + AI | 量產 → Orin/Thor |
| Target 可調 | ✅ 參數化 | ✅ JSON tuning | ❌ 硬體固定 | ✅ 參數化 | 自訂 → Orin |
| 收斂速度 | ~0.5s | ~0.3s | ~0.2s | ~0.3s | 感測器 ISP 最快 |
| Highlight 處理 | 局部 AE / HDR | HDR 模式 | 有限 | 局部 AE + AI | 高動態 → Orin/Thor |
| Flicker Rejection | ✅ 50/60Hz | ✅ | 部分支援 | ✅ | 室內照明必開 |
| ROI AE | ✅ 可程式化 | 有限 | ❌ | ✅ | 人臉追蹤 → Orin |