robot-notes — 機器人知識筆記 GitHub ↗
本章與本頁目次

模擬

robot-notes /模擬/Sim-to-real

Sim-to-Real:把模擬訓練的策略搬上實車

在模擬裡訓練的導航策略,搬到真實機器人上常常「在模擬好好的、上車就壞」。這篇整理為什麼會這樣(reality gap,現實落差)、有哪些技術可以把落差縮小,以及對室內送餐機器人(AMR)來說,務實的上車步驟、常見地雷與驗收方式。

整理自 2025 年回顧論文《The Reality Gap in Robotics》、NVIDIA Isaac Lab/Sim 官方文件,與多篇 sim-to-real 研究(來源見文末)。 延伸閱讀:Physical AI 總覽SLAM 建圖定位


核心概念

Sim-to-real = 在電腦模擬裡訓練一個會開車的「腦」(策略 / policy),再把這個腦原封不動或微調後,放到真實機器人上跑。

為什麼要這樣做:真實世界收資料慢、貴、又危險(撞到人、撞壞車)。模擬裡可以一秒跑幾千次、隨便撞、24 小時不停練。

問題出在哪:模擬永遠是真實的「近似」。模擬裡的摩擦力、馬達反應、感測器都太乾淨、太理想;真實世界有雜訊、延遲、滑動、磨損。這個差距就叫 reality gap(現實落差)。策略在乾淨的模擬裡學到的習慣,一碰到髒髒的真實世界就可能失靈。

整篇要回答的就是:這個落差從哪來、怎麼縮小、怎麼安全上車、怎麼知道成功了。

一句話
policy(策略) 機器人的「腦」:吃感測器輸入、吐動作指令(如轉速、(v, ω))的函式,常用神經網路
reality gap(現實落差) 模擬與真實世界的差異總和;落差越大,模擬學到的策略越容易在實車失靈
domain randomization(領域隨機化) 訓練時把模擬參數隨機抖動,逼策略學到「對變化不敏感」的穩健行為
zero-shot transfer(零樣本遷移) 模擬訓練完直接上車、不用真實資料微調

1. Reality gap 從哪來

模擬之所以對不上真實,是因為它由「抽象與近似」組成,這些近似不可避免地引入差異(《The Reality Gap in Robotics》)。NVIDIA Isaac Lab 文件把根源歸成三類:近似誤差(物理/渲染只是自然律的近似,離散化會造成穿模等不真實行為)、模型誤差(連桿長度、質量、摩擦係數「在模擬裡永遠不可能 100% 準確」,加上製造公差與設備老化)、未建模動態(彈性致動器、彈簧等常被簡化)。

回顧論文把落差來源拆成四大類,對 AMR 來說最該在意的是前兩類:

把上面兩套分類揉在一起重切,收斂成「軟體背景該記住的五個來源」:物理參數(質量/慣量/摩擦)、感測噪聲(非高斯、有時間相關)、延遲(感測、通訊、致動)、摩擦/打滑(接觸動態)、外觀(貼圖、光照、感測器光學特性)。

這五格是本篇為了好記而重新拆合的,不是任何一篇論文的原始分類——回顧論文分四類(動力學/感知/致動/系統設計)、Isaac Lab 分三類(近似誤差/模型誤差/未建模動態)。這裡把「摩擦/打滑」從動力學落差裡拆出來、把「外觀」從感知落差裡拆出來,是因為對 AMR 來說這兩項各自有獨立的對策。回頭讀原文時對不上五格是正常的。

模擬世界與真實世界兩側特性對照,中間列出物理參數、感測噪聲、延遲、摩擦打滑、外觀五個現實落差來源

左右兩欄擺的是同一件事的兩個版本:左邊是模擬給你的、右邊是實車會遇到的。中間五格就是兩者對不上的地方——這五格也正好對應第 4 節的失敗模式清單,查故障時可以反著用。


2. 縮小 gap 的主要技術

回顧論文把策略分兩大方向:先把模擬做準一點(reduce the gap),再訓練出對殘餘落差免疫的策略(overcome the gap)。下面逐項說明。

三種主要手段最容易被混為一談,但它們的施力方向其實剛好不同——一個往外撐、一個往回校、一個往中間對齊:

Domain Randomization 往外撐開訓練分佈、System Identification 往回校準模擬中心、Domain Adaptation 把兩邊特徵往中間對齊

圖上三格是並排的,但實務上不是三選一。看懂方向就知道它們互補,而且有先後:先用 system identification 把模擬中心校準(②),再用 domain randomization 在這個中心周圍撒範圍(①),視覺類最後再加 domain adaptation 把外觀對上(③)。順序反過來做會白費力氣——中心還沒對準就急著撒範圍,等於在錯的地方撒。

2.1 Domain Randomization(領域隨機化)— 把模擬「弄亂」逼出穩健性

訓練時,不要只在「一個」固定模擬環境練,而是用「一大堆隨機變化的模擬環境」練——隨機抖動光照、材質、貼圖、背景、物件擺位(視覺類);以及質量、摩擦、感測雜訊、延遲(物理類)。OpenAI 對 DR 的經典說法是:只要模擬裡的變化夠多,真實世界對策略來說就只是「又一種變化」而已,因此能泛化過去。NVIDIA 在 Isaac Sim 用 Replicator 工具做 DR,隨機化物件 pose、scale、貼圖、光照來生成合成資料。DR 是目前最常用、最通用的手段,優點是不需要真實資料就能拉高穩健度;缺點是隨機範圍太寬會讓策略變保守、學不好(過度泛化),範圍太窄又蓋不到真實。

2.2 System Identification / 參數校準 — 量真實參數回填模擬

System identification(系統辨識)= 在真實機器上「量」出物理參數(質量、慣量、摩擦係數、馬達時間常數、延遲),再回填進模擬,讓模擬一開始就更接近真實。回顧論文指出,系統辨識「在導航、移動、操作各領域中,一再被證明是 sim-to-real 成功的關鍵環節」。延伸做法是 learned residual model(學習殘差模型):訓練一個模型去「修正」不完美模擬器的輸出,補上沒建模的柔順性與摩擦。對 AMR 很實際的一步:把車實測的最大加速度、轉向延遲、實際輪距(可能因胎壓/磨損偏離標稱值)回填到模擬。DR 和 system ID 常搭配——先用 system ID 把模擬中心對準真實,再用 DR 在這個中心周圍撒範圍。

「實測」具體是什麼——這一步反覆被說成關鍵,但「量出來」三個字容易變成空話。實際上它就是幾個各跑一次、拿捲尺與 rosbag 就能做完的測試:

要量的參數 怎麼量 注意
輪徑 / 輪距 地上量出固定距離(如 10 m)讓車走完,比對 odom 積出來的距離,按比例修輪徑 輪距用「原地轉 N 圈」量更準:轉 10 圈後看 odom 的 yaw 差多少,誤差被放大 10 倍比較好讀
最大加減速 從靜止下全速命令,錄 /odom 的速度曲線取上升段斜率;煞停同理 載重會變,至少量空車與滿載兩點
馬達時間常數 給一個階躍速度命令,看實際速度爬到目標值 63% 要多久 這個時間就是一階模型的 τ,直接填進模擬的致動器模型
端到端延遲 記下發命令的時間戳,與 odom 上開始出現反應的時間戳相減 這是通訊 + 控制器 + 機構的總和,不要只算通訊那段
感測器更新率與抖動 ros2 topic hz 看平均值,但更該看時間戳的間隔分布 平均 10 Hz 但偶爾掉到 3 Hz,對估計器的傷害比穩定 8 Hz 大得多
地面摩擦 給固定扭矩看實際加速度反推;或直接量「開始打滑的最小指令」 不同地板各量一次——這正是後面 DR 該撒的範圍

判斷做完了沒有,標準很簡單:在模擬裡下同一組命令,錄出來的速度曲線與位置軌跡要跟真車錄的疊得上。疊不上就是還沒對準,這時候去做 domain randomization,只是在錯的中心周圍撒範圍。

2.3 Domain Adaptation(領域適應)— 對齊兩邊的特徵分佈

跟 DR「把模擬撒得夠寬」不同,domain adaptation 是主動把模擬與真實的特徵分佈對齊,通常聚焦在「觀測 / 感知」這一側。常見做法是用影像轉譯把模擬影像變得像真實影像——這類方法多半建在 GAN(Generative Adversarial Network,生成對抗網路:讓一個「生成器」和一個「鑑別器」互相對抗,生成器學著產出鑑別器分不出真假的影像) 之上:CycleGAN 做不成對(unpaired)的影像翻譯;RL-CycleGAN、RetinaGAN 進一步在翻譯時保住任務相關物件(RetinaGAN 用物件偵測器約束翻譯前後預測一致,原論文宣稱真實抓取成功率較先前方法提升、且在少量真實資料下仍有效,實際數字見原文)。純像素級 GAN 的風險是會任意改掉或刪掉任務需要的細節,因此也有「特徵級對齊」的做法:把模擬與翻譯後影像各自編碼,只對齊抽象、任務相關、domain-invariant 的特徵。Domain adaptation 通常需要一些真實資料,適合視覺導航(吃 RGB)的場景。

2.4 加真實感測噪聲 / 延遲模型 — 把「髒」也模擬進去

策略若只在乾淨資料上訓練,容易過度擬合,一遇到真實的感測雜訊或致動延遲就出現不穩路徑、甚至導航崩潰。所以一個直接而有效的做法:在模擬裡主動注入真實感測器的雜訊與系統延遲。關鍵在於雜訊模型要貼近真實——真實雜訊往往非高斯、隨狀態變化、且時間上相關,只加「簡單高斯雜訊」可能還是會在實車失靈。對 AMR 具體要注入:LiDAR 測距雜訊與掉點、odometry 的打滑誤差、IMU 漂移、相機曝光/動態模糊,以及感測到動作之間的端到端延遲。有研究團隊把這條路徑總結為「Noise is all you need」——足夠真實的雜訊本身就能跨過移動類的 sim-to-real 落差(待查證其適用範圍,此處只引述其主張)。

2.5 高擬真感測模擬 — 用 3D 重建把真實場景搬進模擬

與其讓模擬外觀「將就」,不如把真實場景重建成高擬真的模擬(real-to-sim),再在裡面訓練。近年主流是 3D Gaussian Splatting(3DGS,高斯潑濺):用一堆帶顏色的 3D 高斯點重建真實場景,能在高畫格率下做出照片級渲染與新視角合成,渲染出來的影像與真實的外觀落差很小。代表性工作:VR-Robo 用平面化 3DGS 建出照片級、可物理互動的環境做 real-to-sim-to-real;GaussGym 把 3DGS 當渲染器塞進向量化物理模擬器,論文宣稱在消費級 GPU 上達到每秒超過 10 萬步(依硬體/場景而定);NavGSim / ReaDy-Go 則把 3DGS 用到大尺度導航與含移動障礙的視覺導航。這條路特別適合吃相機的視覺導航——外觀落差是它最大的痛點,3DGS 直接把外觀對準真實。NVIDIA 對應的元件是 Omniverse NuRec(神經重建,從真實感測資料重建 3D 場景)。

2.6 其他輔助手段


3. 移動機器人 sim-to-real 的務實順序

對 AMR,業界主流不是「端到端 RL 取代一切」,而是先在模擬把現成導航棧(如 ROS 2 的 Nav2)與參數調好,再小心上實車。一個可落地的順序:

  1. 先在模擬把 Nav2 / 策略調到能跑:用 Gazebo 或 Isaac Sim 建出餐廳/倉儲場景,接上 Nav2(ROS 2 的導航棧:負責路徑規劃、避障、移動),把全域/區域規劃器、代價地圖(costmap)、控制器參數調到模擬裡穩定。模擬階段同時驗證多機協調與隊列管理。
  2. 做 system identification,把模擬對準這台車:實測本車的輪距、最大加減速、轉向延遲、感測器更新率,回填模擬,別只用標稱值。「實測」具體是什麼,見下面 §5.1。
  3. 注入雜訊與延遲、開啟 domain randomization:在對準後的模擬中心周圍,隨機化摩擦、載重、感測雜訊、延遲;視覺導航再加外觀隨機化或 3DGS 重建。
  4. 盡量讓模擬與實車跑「同一套軟體棧」:論文明列「複製模擬與真實之間的軟體棧」為降低落差的設計選擇——同一份 Nav2 設定、同樣的座標轉換、同樣的控制頻率,能少掉一整類落差。
  5. 先 zero-shot 上車量基線,再決定要不要微調:直接把模擬策略放上實車,在受控、有人盯、低速、可急停的環境量第一版成功率;表現不足再用真實資料做 domain adaptation 或共訓。
  6. 量測 → 找失敗模式 → 針對性回頭加隨機化,反覆迭代。一個被反覆強調的實務心法:在真實硬體上跑、找出失敗模式,然後把隨機化精準對準「最可能造成這些失敗的模擬參數」,而不是盲目把所有東西都隨機化。

安全是硬規則:首次上車一律低速、保留實體急停、有人在場、選空曠或封閉測試區,先確認不會傷人傷物再逐步放開。


4. 常見失敗模式與檢查清單

「模擬裡好、上車就壞」的典型原因:

上車前檢查清單:


5. 評估:怎麼量「遷移成不成功」

要分兩件事量:落差有多大、以及策略遷移成不成功

量落差大小(模擬有多準):

量遷移成不成功(策略表現):

A/B 對比模擬 vs 真實:核心方法是「同一套策略、同一批任務,分別在模擬與真實各跑一輪,比成功率與上述指標」。理想情況兩邊接近(SRCC 高);若模擬遠高於真實,差距就指向 reality gap 的某個來源,回頭對照第 4 節的失敗模式定位。論文也提醒:重點不是把 reality gap 歸零,而是讓「效能落差」夠小——策略只要對差異夠穩健,即使模擬與真實在參數上仍有差,遷移仍可成功。


來源