部署除錯指南P1 常青技術頁NVIDIA Jetson Linux r36.4.3/r36.4.4、ROS 2 與 rosbag2 官方文件;GitHub issue 與 NVIDIA 論壇只作問題訊號

Jetson 多相機掉幀怎麼查?GMSL、ROS 2 與 rosbag2 驗收流程

Jetson 多相機掉幀、延遲或 rosbag2 漏資料時,依序隔離感測器、CSI/GMSL、Argus/V4L2、ROS 2 QoS 與儲存層,附可下載驗收表。

直接答案

Jetson 多相機掉幀要從最短資料路徑開始:先證明每支相機單獨穩定,再驗證 CSI/GMSL 路由與版本,接著測 Argus 或 V4L2 擷取、ROS 2 topic/QoS,最後才加入 rosbag2 與 SSD。不要只看模組可接幾支相機或 SSD 跑分;要用固定場景、訊息計數、遺失事件與長時間測試找出第一個開始掉資料的層。

本文重點

  • 先把每支相機單獨跑穩,再一次只增加一支;全接上才開始除錯,很難分辨是感測器、SerDes、API 還是 ROS 2。
  • NVIDIA 文件列出的最大連接數是拓撲上限,不是你指定解析度、FPS、pixel format、載板與 JetPack 組合的吞吐保證。
  • 使用 Jetson ISP 的 CSI Bayer 路徑通常走 libargus/nvarguscamerasrc;不使用 ISP 的 CSI 或 USB UVC 路徑則以 V4L2 為主,兩條路不能混成同一個測試結論。
  • ROS 2 的 publisher、recorder 與其他 subscriber 必須記錄實際 QoS;QoS 不相容可能完全收不到,可靠傳輸也可能把壓力改成排隊或阻塞。
  • rosbag2 的遺失事件要和發布數、錄入數、實際 topic rate、寫入量及系統 telemetry 一起看;沒有遺失事件不等於感測器端沒有掉幀。
  • 通過標準要寫成可重現的版本化驗收,不要用『畫面看起來順』或短時間 Demo 代替。

直接答案:先找出第一個開始掉資料的層

Jetson 多相機出現掉幀、延遲、畫面卡住或 rosbag2 漏資料時,先不要同時調時脈、QoS、cache 和 SSD。比較有效的順序是:

  1. 每支相機單獨、用原生擷取路徑跑穩。
  2. 固定解析度、FPS、pixel format、JetPack/L4T、驅動、載板與 SerDes 版本。
  3. 一次增加一支相機,確認 CSI lane、GMSL virtual channel、frame counter 與錯誤日誌。
  4. 原生擷取穩定後才加入 ROS 2 publisher、subscriber、RMW 與 QoS。
  5. ROS 2 topic 穩定後才加入 rosbag2、cache、storage plugin、bag split 與目標 SSD。
  6. 最後跑熱穩態、長時間、重啟、斷線和磁碟壓力測試。

核心判斷只有一個:上一層的輸入計數正常,哪一層的輸出第一次開始變少或延遲失控? 找到這個邊界,才有資格調那一層的參數。

先下載驗收表,不要靠口頭記版本

本站整理兩個可重複使用的版本化資產:

表中的範例列只是欄位示意,不是本站實測。請換成自己的模組、載板、相機、JetPack/L4T、ROS 2 distro、RMW、QoS、storage plugin、時長與計數。

第 1 層:感測器、SerDes、載板與供電

先證明單支相機能在目標硬體長時間輸出,再逐支增加。至少記錄:

  • Jetson 模組、載板、相機型號與 sensor mode。
  • CSI、GMSL 或 USB;serializer、deserializer、aggregator 與線材版本。
  • 解析度、FPS、RAW10/RAW12/YUV/RGB/壓縮格式與實際封裝。
  • CSI lane、virtual channel、I2C/proxy address 與 device tree 版本。
  • 電源、相機啟動順序、溫度、錯誤計數與斷線回復。

NVIDIA 的 GMSL 文件以特定 AGX Orin 參考模組說明 virtual channel、SerDes 與 CSI 拓撲,也列出在 aggregator/ISP 組合下的最大連接數。這些數字只描述文件中的拓撲能力;不代表任意載板、任意相機與任意解析度/FPS 都能同時穩定串流

同一件事也可能受版本影響。例如 Jetson Linux r36.4.4 release notes 對 Orin NX/Nano 的 CAM0 與特定 IMX219/IMX477 組合記錄了 sensor-id 條件。正式除錯前要先查你正在使用的 L4T release notes,不能只看最新論壇回覆。

這一層的通過條件

  • 每支相機單獨通過固定時長與重啟次數。
  • 逐支增加後,frame counter、CRC/CSI/SerDes 錯誤與時間戳沒有越過預先設定門檻。
  • 拔線、重接或相機失效時,系統行為符合你的安全與回復設計。
  • 完整保存 device tree、driver、韌體、載板與線材版本。

第 2 層:Argus、V4L2 與原生擷取

NVIDIA Jetson Linux r36.4.4 的相機架構文件把路徑分得很清楚:

相機路徑官方文件列出的主要 API驗收重點
CSI,使用 Jetson ISPlibargus/GStreamer nvarguscamerasrcsensor mode、ISP tuning、Argus daemon、CaptureSession 與 buffer 生命週期
CSI,不使用 Jetson ISPV4L2driver、pixel format、stride/packing、memory map 與 frame counter
USB UVCV4L2USB root hub、協商格式、封包錯誤、同 hub 競爭與供電

先用和量產程式相同的 API 路徑做最小擷取測試,輸出到 fakesink 或記憶體,不要一開始就加入推論、ROS 2、編碼和寫檔。若最小路徑已失敗,往上加節點只會掩蓋根因。

NVIDIA 論壇有多相機 Argus timeout、daemon 卡住與無法回復的案例;案例能證明這類問題值得做長時間 create/destroy 與斷線測試,但不能證明所有版本或硬體都有同一缺陷。用你的 L4T、相機 partner driver 與可重現 log 向供應商確認。

這一層要留什麼證據

  • 啟動命令、pipeline、API 與每支相機的 sensor mode。
  • 每路預期 frame 數、實收 frame 數、時間戳間隔與最長停頓。
  • dmesg、camera daemon/driver log、CPU/GPU/EMC、記憶體與溫度。
  • 冷開機、服務重啟、session 重建與長時間循環結果。

第 3 層:ROS 2 publisher、DDS 與 QoS

原生擷取穩定後,才把影像送進 ROS 2。此時至少分開量:

  1. 相機端產生多少 frame。
  2. publisher 實際 publish 多少 message。
  3. 測試 subscriber 收到多少、頻率與 message age 如何。
  4. 是否有序列化、memory copy、executor、callback 或下游 subscriber 造成背壓。

ROS 2 官方文件指出,sensor data profile 傾向 best effort 與較小 queue,目的是優先拿到最新資料;publisher 與 subscriber 的 QoS 若不相容,甚至可能完全無法傳遞。把 QoS 改成 reliable 也不是萬靈丹:它可能增加重傳、排隊與等待。每次測試要記 reliabilitydurabilityhistorydepth、RMW 與是否使用 intra-process/composition。

可以先用下列工具建立觀測,但命令輸出本身不是最終驗收:

ros2 topic info --verbose /camera/front/image_raw
ros2 topic hz /camera/front/image_raw
ros2 topic bw /camera/front/image_raw

ros2 topic hz 會增加一個 subscriber,也可能受主機與 QoS 影響。正式結果應由測試程式的 sequence/timestamp 計數與系統 trace 共同確認。

第 4 層:rosbag2、cache、切檔與儲存

只有 ROS 2 topic 已通過,才把 recorder 加進來。rosbag2 rolling 文件提供 events/rosbag2_messages_lost,能分開回報 transport 與 recorder 層的遺失;先用你的版本檢查是否支援:

ros2 bag record --help
ros2 bag record -a --stats_max_publishing_rate 1.0
ros2 topic echo /events/rosbag2_messages_lost

不同 ROS 2 distro/rosbag2 套件可能沒有相同選項,因此驗收表一定要保留版本。官方說明也指出,遺失事件是增量計數,而且沒有遺失的 topic 不會出現在事件裡;測試端要自行累加並和 publisher/bag 計數交叉比對。

GitHub issue #2108 描述一個 Jazzy 0.26.6、外接硬碟與較大 bag split 下漏資料的案例。它不是通用上限,但提醒我們:SSD 或介面的單次循序跑分,不能取代 rosbag2 在實際 cache、切檔、檔案系統與同時工作負載下的長時間測試。

這一層至少要測

  • 目標 storage plugin、cache、compression 與 bag split 設定。
  • 目標 SSD/外接儲存、檔案系統、剩餘容量與同時讀寫負載。
  • 每個 topic 的發布數、錄入數、transport loss、recorder loss 與 bag metadata。
  • 切檔瞬間、磁碟接近目標使用率、資料 offload 與服務重啟。
  • 實際 replay 後的 topic 數、時間戳連續性與下游可用性。

第 5 層:整機熱穩態、故障與回復

前四層都過了,最後才測接近量產條件的整機:推論、編碼、網路、錄包、UI 與其他服務同時運作。驗收不能只跑一分鐘,至少覆蓋:

  • 從冷機到熱穩態,包含可能的降頻。
  • 最長預期連續班次或由風險分析設定的 soak test。
  • 相機啟動順序改變、單路斷線、服務 crash、bag split 與磁碟壓力。
  • 正常停止、強制重啟、電源中斷與版本回復。
  • 發生異常時的降級、告警、人工接管與安全停止。

不要先訂一個跨專案通用的「0 掉幀」口號。先區分感知可容忍的 frame skip、訓練資料必須完整的 topic、控制 deadline 與安全訊號,再為每一類資料寫明允許值、量測方法與失敗後處置。安全相關訊號不應只依賴一般相機、ROS 2 topic 或 AI 模型承擔。

一張表看五層故障隔離

先固定什麼核心證據常見誤判
感測器/SerDes相機、lane、VC、driver、供電、線材sensor/CSI/SerDes 計數與錯誤 log「官方最多可接 N 支」等於這組規格可用
Argus/V4L2API、sensor mode、pipeline、L4T原生擷取 frame 數、時間戳、daemon/kernel log畫面有出來就代表長期穩定
ROS 2/DDSdistro、RMW、QoS、executor、compositionpublish/receive 計數、rate、age、trace改 reliable 就一定完整
rosbag2/SSDstorage、cache、split、compression、檔案系統lost event、bag metadata、bytes、replaySSD 跑分高就一定錄得下
整機營運完整服務、功耗模式、散熱與回復流程熱穩態、長跑、故障注入與回復時間短 Demo 通過等於可量產

建議的最小驗收順序

  1. 單支相機、原生 API、無編碼、無 ROS 2、無寫檔。
  2. 相同設定逐支增加相機,保留每一步的已知正常版本。
  3. 加入 ROS 2 publisher,再加一個最小 subscriber。
  4. 固定 QoS 與 RMW,測 topic 計數、頻率、age 與系統負載。
  5. 加入 rosbag2,先寫本機目標磁碟,再測 cache、split、compression。
  6. 加入推論與完整整機服務,跑熱穩態與最長營運週期。
  7. 測相機斷線、服務重啟、磁碟壓力與版本回復。

在開始前,可先用機器人感測器資料量計算器把 raw、實測 topic、持續寫入與保存容量換成同一組單位。那是容量預算,不是上述五層的穩定性證明。

最後的通過紀錄應能回答:哪個硬體與軟體版本、在什麼相機組合與負載下、跑了多久、預期多少資料、每一層實際收到多少、發生什麼錯誤、系統能否受控回復。 能回答這些,才算從「相機有畫面」走到可交付的多相機資料路徑。

常見問題

Jetson 可以接幾支相機?

沒有一個只看模組名稱就成立的數字。NVIDIA 的 GMSL 文件會列特定 Jetson 與 aggregator/ISP 拓撲的最大連接數,但實際可用數量還受感測器、解析度、FPS、pixel format、CSI lane、virtual channel、SerDes、載板、驅動、ISP、記憶體、處理與散熱影響。最大連接數不能當成吞吐或相容性保證。

Jetson 多相機掉幀一定是頻寬不足嗎?

不一定。可能是感測器或 SerDes 錯誤、device tree/virtual channel 不符、Argus/V4L2 路徑、buffer 與拷貝、ROS 2 QoS/executor、rosbag2 cache、檔案切分、SSD 持續寫入、溫度或版本缺陷。要找出第一個輸入正常、輸出開始少掉的層。

CSI、GMSL 與 USB 相機可以用同一種方法驗證嗎?

驗收框架可以相同,但驅動與擷取路徑不同。NVIDIA 對使用 Jetson ISP 的 CSI 相機建議 libargus/nvarguscamerasrc;不使用 ISP 的 CSI 或 USB UVC 路徑主要使用 V4L2。測試紀錄必須分開寫清楚介面、API、pixel format 與驅動版本。

ROS 2 sensor data QoS 改成 reliable 就不會掉資料嗎?

不能這樣保證。ROS 2 的 sensor data profile 預設偏向 best effort 與較小 queue,以新資料優先;reliable 會重傳並可能增加等待或背壓。還要檢查 publisher 與 subscriber 的 QoS 是否相容、queue 深度、RMW、executor、網路與處理速度,並用目標工作負載實測。

rosbag2 沒有回報遺失訊息,就代表影像完整嗎?

不代表。rosbag2 的遺失統計只涵蓋它能觀察到的 transport 與 recorder 層;感測器、CSI、Argus、driver 或 publisher 之前已掉的 frame 不會自動變成 rosbag2 遺失事件。要同時比對相機 frame counter、publisher 計數、topic rate、bag metadata 與檔案內容。

要跑多久才算多相機穩定?

沒有跨專案通用時數。先依任務風險與最長營運週期設定門檻,至少涵蓋冷開機、正常溫度、熱穩態、bag split、磁碟接近目標用量、服務重啟與相機斷線回復;驗收前寫清楚時間、重複次數與允許遺失值。

來源與查證

  1. NVIDIA Jetson Linux r36.4.4:Camera Software Development Solution
  2. NVIDIA Jetson Linux r36.4.3:Jetson Virtual Channel with GMSL Camera Framework
  3. NVIDIA Jetson Linux r36.4.4 Release Notes
  4. ROS 2:Quality of Service settings
  5. ROS 2 rosbag2:README
  6. ROS 2:MessagesLostEventTopicStat
  7. rosbag2 issue #2108:bag split 與外接儲存問題案例
  8. NVIDIA Developer Forums:Argus 多相機 timeout 問題案例

下一步閱讀