HSB 多相機
Thor 的 Holoscan Sensor Bridge 支援「感測器走乙太網路」——多顆感測器資料匯流進 GPU,適合機器人多感測器融合。
⚠️ Thor 具體 SDK/工具以 NVIDIA 最新文件為準。
□ 硬體:CSI lane / I2C / reset / clock □ DT overlay:compatible / reg / clocks / reset-gpios □ 驅動:現成 or 改 init table □ dmesg:probe 成功?讀到 ID? □ 出圖:能取到幀? □ RAW:Bayer order / 黑位 / 缺陷像素 □ 調校:黑位 → LSC → AWB/CCM → NR/Sharpen
多感測器走 HSB(25GbE)時,兩個必修課:頻寬規劃與時間同步。
| 面向 | 計算/方式 | 檢查 |
|---|---|---|
| 頻寬 | Σ (W×H×bit × fps) | 務必 < 25GbE 可用頻寬(留 headroom) |
| 同步 | PTP/IEEE 1588 或感測器 frame sync | 多相機時間戳對齊 |
| 封包 | 每顆感測器獨立 channel | host 端一一對應 |
每顆:1280×800 RAW10 @ 120 fps = 1280×800×10 × 120 = 1,228,800,000 bit/s ≈ 1.23 Gbps 兩顆:≈ 2.46 Gbps 25GbE headroom:25 × 0.7(保守)≈ 17.5 Gbps 可用 → 2.46 Gbps 完全沒問題,還能再加十顆 (若用 12MP RAW12 @ 30fps = 4.5 Gbps/顆,25GbE 約可載 3–4 顆)
1. 硬體:接 frame sync(FSIN)pin,由 host 給同步脈衝
2. 確認兩顆都設「external sync」模式
(依感測器 register,unit-03 的方法回讀驗證)
3. 驗證同步:
- 取兩顆同場景的幀,比較時間戳
- 或用「同一轉動物體」確認無相位差
4. (HSB) 若走網路:用 PTP 對齊時間基準
# 時間戳差 < 1 幀週期 → 同步可接受1. 個別單顆都正常? ├─ 否 → 回到單顆 bring-up(unit-06) └─ 是 ─┐ 2. 總頻寬超過安全上限? ├─ 是 → 降 fps/解析度,或拆通道 └─ 否 ─┐ 3. 時間戳/同步基準一致? ├─ 否 → 設 frame sync 或 PTP └─ 是 ─┐ 4. host 端 channel 一一對應? └─ 否 → 對應錯誤,修 Holoscan 設定
多感測器融合至少要區分三種時間:曝光時間(物理世界被取樣的時刻)、sensor frame counter(感測器產生第幾幀)、host arrival time(封包到達 GPU 的時刻)。HSB 的網路延遲可能讓 arrival time 不等於曝光先後,因此融合要依硬體 frame sync、PTP timestamp 或 metadata 對齊,不能只依封包抵達順序。
| 證據 | 能證明什麼 | 不能單獨證明 |
|---|---|---|
| link up | 實體/網路層可通 | 感測器資料正確 |
| 相同 FPS | 平均速率接近 | 每幀時間對齊 |
| 相同 arrival time | host 收到接近 | 曝光同時發生 |
Gate A:各自 bring-up cam0/cam1 都能讀 ID、取 RAW、固定曝光、無 CSI/HSB error Gate B:各自畫質 黑位、Bayer、LSC、AWB、SNR 通過同一套門檻 Gate C:同步 frame counter 無跳號;曝光 timestamp 差 ≤ 0.5 ms Gate D:頻寬與長跑 Σ raw bitrate + overhead < 25GbE 安全上限 30 分鐘無 drop、queue 不持續成長、GPU latency 穩定 Gate E:融合輸出 用移動標記物量測視差/相位,保存原始 metadata 與結果
只通過 Gate A 不能宣稱多鏡頭系統完成。把每個 gate 的輸入、命令、門檻與 artifact 存進 repo,日後換線材、韌體或 sensor 才能重跑。
1. 單獨跑每顆 30 分鐘都穩定? ├─ 否 → 回單顆 power/I2C/CSI/HSB bring-up └─ 是 ─┐ 2. 總 bitrate 加 overhead 是否超安全上限? ├─ 是 → 降解析度/fps、分流、提高 buffer/網路預算 └─ 否 ─┐ 3. frame counter 是否連續且 channel 對應正確? ├─ 否 → 查封包丟失、queue、Holoscan channel mapping └─ 是 ─┐ 4. exposure timestamp 是否對齊? ├─ 否 → 查 FSIN/PTP/clock domain └─ 是 → 查 calibration、鏡頭幾何與融合演算法
場景:Thor T5000 用於自動物流分揀線。6 顆 OV5640(5 MP、RAW12、30 fps)分別拍攝包裹的頂面與四個側面,Holoscan 管線即時做 3D 重建與條碼讀取。
# 頻寬計算: # 每顆 OV5640:2592×1944×12×30 = 1.80 Gbps # 6 顆 = 10.8 Gbps # 25GbE 可用(70%)= 17.5 Gbps → 可行 # Gate A:各自 bring-up # 6 顆逐一驗證:I2C 通、ID 正確、取 RAW 正常、無 CSI/HSB error # Gate B:各自畫質 # 黑位、Bayer、LSC、AWB、SNR 通過門檻 # 每顆的 LSC 獨立校正(不同角度、不同 shading) # Gate C:同步 # 6 路 frame counter 無跳號 # 曝光 timestamp 差 ≤ 0.5 ms(用 PTP 同步) # Gate D:頻寬與長跑 # Σ raw bitrate + overhead < 17.5 Gbps # 2 小時無 drop、queue 不持續成長 # Gate E:融合輸出 # 3D 重建精度 < 1 mm(用標準尺寸方塊驗證) # 條碼讀取率 > 99.5%(用 100 個不同角度包裹測試)
IEEE 1588 PTP(Precision Time Protocol)可把多台設備的時鐘同步到 < 1 µs 精度。但 HSB 橋接器的 PTP 實作可能有數百 µs 的 jitter(取決於橋接器品質)。在「同一台 Thor 內」的多感測器,用 FSIN(Frame Sync)硬體 pin 同步更精準(< 1 line time ≈ 17 µs)。
| 症狀 | 可能原因 | 解決方案 |
|---|---|---|
| 6 路取流中有一路偶發掉幀但其他路正常 | 該路的 HSB channel 有網路 drop 或 buffer 不足 | 用 ethtool 檢查該路 drop 計數;增加 buffer deep queue |
| 3D 重建精度 < 2 mm(目標 < 1 mm) | 感測器同步精度不足 / 鏡頭校正有誤 | 驗證 PTP/FSIN 同步精度;重新做攝影機標定 |
| 條碼讀取率在某些角度降到 90% | 該角度的感測器曝光或對焦不理想 | 獨立調整該路感測器的 AE ROI 與對焦 |
| 2 小時長跑後 queue 持續成長 | 某路的 GPU 處理延遲增加(thermal throttling) | 監控 GPU 溫度;加入散熱措施或降低處理複雜度 |
| 6 路同時 init 時有 1-2 顆失敗 | I2C 橋接佇列滿 / 位址衝突 | 逐顆初始化避免佇列競爭;確認各感測器 I2C 位址無衝突 |
場景:物流分揀系統,6 顆 OV5640(5MP RAW12 30fps)經 HSB 接入 Thor,Holoscan 即時 3D 重建與條碼讀取。這是全站課程的「畢業專案」。
Gate A 各自 bring-up 6 顆逐一:I2C、ID、取 RAW、無 CSI/HSB error ✅ 通過:6 顆全獨立出圖 Gate B 各自畫質 黑位/Bayer/LSC/AWB/SNR 各過門檻 每顆 LSC 獨立校正(不同鏡頭角度) ✅ 通過:6 顆全達標 Gate C 同步 frame counter 無跳號、曝光 timestamp 差 ≤ 0.5ms FSIN 或 PTP 硬體同步 ✅ 通過:同步精度達標 Gate D 頻寬 + 長跑 Σ bitrate + overhead < 17.5 Gbps 2 小時無 drop、queue 穩定、GPU 溫度正常 ✅ 通過:長跑穩定 Gate E 融合輸出 3D 重建精度 < 1mm(標準方塊) 條碼讀取率 > 99.5%(100 包裹測試) ✅ 通過:業務指標達標 輸出:6 顆的 Gate A–E 表格 + 原始資料 + SOP 進 repo
Step 1 逐顆 bring-up(unit-06 SOP × N) 每顆:I2C/ID/取流/RAW Step 2 逐顆畫質(unit-14 SOP × N) 黑位/LSC/AWB/SNR Step 3 同步驗證 frame counter 連續性 + timestamp 對齊 FSIN 或 PTP(unit-16.7) Step 4 頻寬驗算 Σ (W×H×bit×fps) + overhead < 安全上限(70%) Step 5 長跑測試 2 小時:掉幀數、queue 深度、GPU/溫度 Step 6 融合輸出驗收 業務指標(重建精度、讀取率、偵測率) 判讀指標: 單顆偶發掉幀 → 該路 buffer/網路 同步誤差大 → FSIN/PTP/clock domain queue 成長 → GPU thermal / 處理過重
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| 多感測器上限 | 6+(16 lanes / HSB) | 2(雙 CSI) | 1–2 | 4–6 |
| HSB 網路感測器 | ✅ 25GbE 遠距 | ❌ | ❌ | ❌ |
| 同步機制 | FSIN + PTP + Holoscan sync | 無(單一相機) | 無 | FSIN |
| 融合框架 | ✅ Holoscan(GPU 管線) | ⚠️ CPU 腳本 | ⚠️ | ⚠️ CUDA(自建) |
| 多路 buffer 管理 | ✅ 每路獨立設定 | ⚠️ | ⚠️ | ✅ |
本單元涉及的關鍵 register,以及「讀→改→寫→驗證」的完整位元級操作序列:
| Register | 位址 | 功能 | Bit Field 說明 |
|---|---|---|---|
MULTI_SENSOR_SYNC | 0x0c800100 | 多感測器同步控制 | bit[0]=master sync enable, bit[3:1]=sync source |
HSB_CHANNEL_MAP | 0x0c0b0000 | HSB 通道映射 | bit[7:0]=channel_id, bit[15:8]=sensor_port |
# Step 1: 讀取目前值 $ devmem2 0x0c800100 w # 記錄 current_value # Step 2: 計算新值(設定 bit[0]=1) $ new_value=$((current_value | 0x0001)) # Step 3: 寫入 $ devmem2 0x0c800100 w $new_value # Step 4: 驗證 $ devmem2 0x0c800100 w # 確認 bit[0] = 1,其餘 bit 不變 # Step 5: 進階 — bitmask 操作 $ read_val=$(devmem2 0x0c800100 w | grep "Read" | awk '{print $NF}') $ mask=0x0001 $ expected=0x0001 $ [ $(($read_val & $mask)) -eq $expected ] && echo "PASS" || echo "FAIL: bit[0] not set"
1. Frame timestamp 不對齊? ├─ Sync source 設錯 → 檢查 MULTI_SENSOR_SYNC bit[3:1] └─ 感測器端不支持 hardware sync → 用 software timestamp 對齊 2. 有些感測器快有些慢? └─ Frame rate 不一致 → 確認所有感測器的 PLL 設定相同
1. 25GbE saturation? ├─ 單顆相機頻寬已超 25GbE → 降 resolution 或 fps └─ 多顆總和超限 → 減少同時 streaming 的感測器數 2. Frame drop 在特定相機? └─ 該 camera 的 HSB channel buffer 不足 → 增加 buffer
多感測器 Bring-up 完整 SOP:
| 步驟 | 動作 | 指令/方法 | 預期輸出 |
|---|---|---|---|
| Step 1 | 單顆先確認 | 每顆感測器逐個單獨測試 | 每顆都能 stream |
| Step 2 | I2C 位址分配 | 確認每顆有唯一 I2C 地址 | `i2cdetect` 看到所有地址 |
| Step 3 | DT 設定多 sensor | 修改 device tree 新增 sensor node | dmesg 出現多個 sensor |
| Step 4 | 同步測試 | 啟用 hardware sync,比較 timestamp | Δt < 1ms |
| Step 5 | HSB 通道設定 | 設定 HSB channel map,每颗 sensor 對應一通道 | `ping` 各 sensor IP |
| Step 6 | Bandwidth 驗證 | 全 sensor 同時 stream,監控 drop rate | 0 frame drop |
| Step 7 | 延遲一致性 | 測量各 sensor 的 sensor→display 延遲 | 各通道延遲差 < 5ms |
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| 最大感測器數 | 6+(16 lanes) | 2(2 CSI port) | 1(1 CSI port) | 4–6(GMSL) |
| 硬體 sync 支援 | ✅ | ⚠️ | ❌ | ✅ |
| HSB 乙太網路 | ✅ | N/A | N/A | N/A |
| 多 sensor bandwidth | ~20 Gbps total | ~4 Gbps total | ~1 Gbps | ~10 Gbps |
| sensor fusion pipeline | Holoscan graph | OpenCV 多 stream | N/A | CUDA 多 stream |
| 典型 multi-sensor 應用 | AV/robotics 360° | stereo vision | Single cam only | ADAS multi-cam |
針對「多感測器與實作案例」主題的完整 bring-up 步驟清單: