庫(kù)實(shí)戰(zhàn):從仿真選型到數(shù)據(jù)閉環(huán))
簡(jiǎn)介Robot Learning_32是一份面向機(jī)器人學(xué)習(xí)領(lǐng)域的實(shí)用知識(shí)庫(kù)內(nèi)容橫跨機(jī)器人學(xué)、強(qiáng)化學(xué)習(xí)、計(jì)算機(jī)圖形學(xué)與仿真建模。PDF內(nèi)按32篇主題組織重點(diǎn)圍繞MuJoCo仿真器展開從URDF模型轉(zhuǎn)換、DAE/STL網(wǎng)格處理、XML編譯參數(shù)配置到Sim2Real遷移、深度強(qiáng)化學(xué)習(xí)控制器訓(xùn)練等完整實(shí)操鏈條同時(shí)整理了MATLAB強(qiáng)化學(xué)習(xí)工具箱、dm_control、Isaac Gym、SoftCon等開源項(xiàng)目與工具對(duì)比并穿插Science Robotics征稿、ICRA挑戰(zhàn)賽等前沿動(dòng)態(tài)。具體篇目還覆蓋水下軟體仿生機(jī)器人PPO訓(xùn)練、波士頓動(dòng)力Spot落地應(yīng)用、谷歌機(jī)器人及Pieter Abbeel創(chuàng)業(yè)公司等案例并包含多篇Sim2Real問(wèn)題探討與機(jī)械臂操作綜述。資源為單文件PDF大小6.92MB目前已有234人學(xué)習(xí)。無(wú)論剛開始搭建機(jī)器人仿真環(huán)境的研究生還是希望系統(tǒng)梳理Robot Learning工具鏈的工程師都能從中獲得可參考的建模排錯(cuò)思路、項(xiàng)目清單與文獻(xiàn)線索是一份兼具手冊(cè)與綜述價(jià)值的合集。1. Robot Learning 知識(shí)庫(kù)到底在解決誰(shuí)的什么問(wèn)題Robot Learning 這個(gè)方向最勸退人的不是算法而是“不知道從哪一行代碼開始”。面試造過(guò)輪子、倉(cāng)庫(kù)存了幾十個(gè) star 項(xiàng)目的人真到把機(jī)械臂放到桌上時(shí)往往連一個(gè)能跑通的視覺抓取閉環(huán)都拿不出來(lái)。一個(gè)實(shí)用的 Robot Learning 知識(shí)庫(kù)要解決的正是這個(gè)問(wèn)題把分散在論文、代碼倉(cāng)庫(kù)、數(shù)據(jù)集和仿真文檔里的經(jīng)驗(yàn)整理成按任務(wù)類型索引的“可復(fù)現(xiàn)起點(diǎn)”——你接到一個(gè)操作任務(wù)先查知識(shí)庫(kù)里對(duì)應(yīng)任務(wù)族的實(shí)現(xiàn)路徑而不是重新逛一周 GitHub。它適合兩類人剛轉(zhuǎn)進(jìn)來(lái)、想用最短路徑打通一個(gè)端到端機(jī)器人學(xué)習(xí) demo 的工程師以及已經(jīng)在跑數(shù)據(jù)、但被數(shù)據(jù)集格式和評(píng)測(cè)口徑反復(fù)折磨的實(shí)戰(zhàn)團(tuán)隊(duì)。下面按一個(gè)常見的 32 條目實(shí)用知識(shí)庫(kù)為例把地圖怎么建、閉環(huán)怎么跑通、坑位在哪里講清楚。2. 32 個(gè)條目按什么地圖組織仿真、數(shù)據(jù)集、模型與評(píng)測(cè)怎么選型拿到一個(gè) 32 條目的 Robot Learning 知識(shí)庫(kù)第一件事不是從上往下一條條讀而是先給它們分類。我一般按五類歸檔仿真環(huán)境、離線數(shù)據(jù)集、策略模型、訓(xùn)練框架、評(píng)測(cè)腳本。這個(gè)分類不是按文件類型分的而是按“你做一次閉環(huán)實(shí)驗(yàn)時(shí)需要碰哪幾樣?xùn)|西”分的數(shù)據(jù)來(lái)自哪里模型跑在什么環(huán)境里用什么框架訓(xùn)練用什么指標(biāo)判斷成功。2.1 仿真環(huán)境選型MuJoCo、Isaac Lab 與 Sapien 怎么選知識(shí)庫(kù)里通常同時(shí)收錄不止一個(gè)仿真器因?yàn)樗鼈兎?wù)的任務(wù)階段不一樣。MuJoCo 輕、快、沒(méi)有顯卡也能跑適合做強(qiáng)化學(xué)習(xí)算法的快速迭代Isaac Lab 基于物理引擎和渲染管線支持相機(jī)仿真、域隨機(jī)化和大批量并行訓(xùn)練適合做帶視覺輸入的機(jī)械臂操作任務(wù)Sapien 在接觸密集操作上更穩(wěn)比如插拔、擰螺絲這類對(duì)接觸力敏感的活兒。我的經(jīng)驗(yàn)是知識(shí)庫(kù)里如果只保留一個(gè)仿真器選 Isaac Lab但如果你的算法原型還沒(méi)定先用 MuJoCo 把掉頭發(fā)的事做完再遷到 Isaac Lab 做視覺版本。下表是我給仿真器選型時(shí)反復(fù)用的判斷矩陣每個(gè)項(xiàng)目按 1 到 5 打分不是按“哪個(gè)更流行”而是按“當(dāng)前任務(wù)的約束”。判斷維度MuJoCoIsaac LabSapien物理接觸穩(wěn)定性345相機(jī)傳感器模擬153批量并行訓(xùn)練吞吐253上手成本532社區(qū)示例數(shù)量442選完仿真器后要做一次“冒煙驗(yàn)證”這一步很便宜但能省掉后面一周的排查時(shí)間。常見做法是寫一個(gè)隨機(jī)策略在環(huán)境里跑 1000 步看三件事動(dòng)作是否發(fā)散到 NaN、物體是否穿透地面、傳感器讀數(shù)是否出現(xiàn)零值。任何一項(xiàng)異常都說(shuō)明安裝或配置有問(wèn)題不要直接開始訓(xùn)練。2.2 數(shù)據(jù)集不是收藏夾把離線數(shù)據(jù)按任務(wù)族歸檔很多知識(shí)庫(kù)里的數(shù)據(jù)集條目就是一堆下載鏈接真正會(huì)用的人會(huì)把它們重新歸檔成“任務(wù)族 傳感器類型 成敗標(biāo)簽”的結(jié)構(gòu)。比如抓取類、推動(dòng)類、插孔類每個(gè)任務(wù)族下面再按是否有深度圖、是否含語(yǔ)言指令切分。這樣做的原因是Robot Learning 的訓(xùn)練腳本里數(shù)據(jù)加載器只認(rèn)固定的目錄結(jié)構(gòu)。你從不同來(lái)源下載的數(shù)據(jù)格式不一樣如果不先統(tǒng)一歸檔后面每次實(shí)驗(yàn)都要改數(shù)據(jù)讀取代碼這是最隱蔽的時(shí)間黑洞。我在歸檔時(shí)常用的目錄結(jié)構(gòu)長(zhǎng)這樣datasets/ ├── task_family_lift/ │ ├── demos_success_hdf5/ │ ├── demos_failed_hdf5/ │ └── scripts/ │ └── stats.py ├── task_family_push/ │ ├── demos_success_hdf5/ │ └── demos_failed_hdf5/ └── README.md歸檔的核心是把成功和失敗軌跡分開存。很多初學(xué)玩法把全部軌跡混在一起訓(xùn)練時(shí) reward 信號(hào)本來(lái)就稀疏失敗軌跡占比一高模型直接就學(xué)會(huì)了“不動(dòng)”。我在 README 里會(huì)寫清楚每個(gè)子集是從哪個(gè)原始來(lái)源轉(zhuǎn)過(guò)來(lái)的、轉(zhuǎn)換腳本在哪、用什么格式。這個(gè)習(xí)慣能省掉大量“這個(gè)數(shù)據(jù)從哪來(lái)的”式的追問(wèn)。2.3 評(píng)測(cè)基線每個(gè)條目都必須掛一個(gè)成功率數(shù)字知識(shí)庫(kù)里最容易被忽略的是評(píng)測(cè)口徑。同一個(gè)策略有人報(bào) 87% 成功率有人報(bào) 41%差別往往不在訓(xùn)練而在評(píng)測(cè)隨機(jī)種子取幾個(gè)、初始物體位置是否固定、每次 rollout 的回合長(zhǎng)度上限是多少。我一般固定一套評(píng)測(cè)協(xié)議取 20 個(gè)種子固定初始狀態(tài)集合每個(gè)種子跑 10 個(gè) episode成功率按滑動(dòng)窗口平均。評(píng)測(cè)腳本必須和訓(xùn)練腳本分開獨(dú)立執(zhí)行不能用訓(xùn)練日志里的最后幾條 reward 來(lái)替代。評(píng)測(cè)基線的作用是給知識(shí)庫(kù)里的每個(gè)策略條目一個(gè)“錨點(diǎn)”。你在調(diào)參時(shí)只要看成功率相對(duì)于基線是漲是跌不用重新讀一遍論文。這也是知識(shí)庫(kù)從“收藏夾”變成“工具”的關(guān)鍵一步——不是攢文件而是攢可對(duì)比的結(jié)論。3. 用 Isaac Lab 復(fù)現(xiàn)第一個(gè)機(jī)械臂操作閉環(huán)從安裝到看清訓(xùn)練曲線上一章的知識(shí)庫(kù)地圖解決了“有什么”這一章解決“怎么跑起來(lái)”。我以 Isaac Lab 環(huán)境為例講一個(gè)最小閉環(huán)因?yàn)樗钱?dāng)前做視覺操作任務(wù)時(shí)最容易從零跑通、又最接近真機(jī)部署路徑的選項(xiàng)。你在實(shí)際操作時(shí)可能會(huì)遇到版本入口不一致的問(wèn)題這很正常先看本地目錄結(jié)構(gòu)再執(zhí)行。3.1 最小訓(xùn)練閉環(huán)安裝、啟動(dòng)與第一個(gè) lift 任務(wù)假設(shè)你已經(jīng)按官方文檔把 Isaac Lab 裝進(jìn)一個(gè)干凈的 conda 環(huán)境并且預(yù)下載了資產(chǎn)。訓(xùn)練一個(gè)機(jī)械臂抓取立方體的經(jīng)典任務(wù)常見命令是# 在 Isaac Lab 根目錄下執(zhí)行注意不同版本命令入口可能略有差異 ./isaaclab.sh -p scripts/islab/train.py \ --task Isaac-Lift-Cube-Franka-v0 \ --num_envs 32 \ --headless \ --max_iterations 3000逐項(xiàng)說(shuō)明參數(shù)--task指定任務(wù) IDIsaac-Lift-Cube-Franka-v0是 Franka 機(jī)械臂抬升立方體的標(biāo)準(zhǔn)任務(wù)適合作為第一個(gè)跑通的實(shí)驗(yàn)--num_envs 32是并行環(huán)境數(shù)32 是入門值顯存足夠時(shí)可以加到 128 或 256并行數(shù)越大訓(xùn)練步數(shù)吞吐越高但對(duì)顯存和 CPU 物理計(jì)算都有壓力--headless關(guān)掉渲染窗口適合在服務(wù)器上跑--max_iterations 3000是最大迭代輪數(shù)常見范圍在 1000 到 5000 之間3000 是一個(gè)能看出收斂趨勢(shì)又不至于等太久的折中值。訓(xùn)練過(guò)程中要同時(shí)開日志觀察而不是等它跑完。常見做法是在另一個(gè)終端里查看訓(xùn)練目錄下的 tensorboard 日志tensorboard --logdir logs/ # 然后瀏覽器打開 localhost:6006看訓(xùn)練曲線的重點(diǎn)順序先看 Episode Reward 的滑動(dòng)均值是否有持續(xù)上升趨勢(shì)再看 Success Rate 是否出現(xiàn)非零抬升最后看 Average Episode Length 是否縮短。如果前三萬(wàn)步內(nèi) reward 不動(dòng)、成功率一直為零不用等到 3000 輪結(jié)束直接 Ctrl-C 回去檢查配置。3.2 把 state-based 任務(wù)改成視覺輸入相機(jī)傳感器與歸一化很多知識(shí)庫(kù)條目給的是 state-based 版本的訓(xùn)練配置但實(shí)際項(xiàng)目需要相機(jī)輸入。把 lift 任務(wù)改成視覺輸入核心不是改網(wǎng)絡(luò)而是給環(huán)境掛相機(jī)傳感器并把圖像歸一化。以 Isaac Lab 常見的配置片段為例# 給機(jī)械臂末端掛一個(gè) RGB 相機(jī)用于視覺策略輸入 camera_cfg CameraCfg( prim_path/World/envs/env_.*/Robot/ee_link, # 掛在末端執(zhí)行器上 update_per_frame1, # 每個(gè)仿真幀都更新圖像 height84, # 圖像高84 或 64 常見 width84, # 圖像寬 data_types[rgb], # 只取 RGB不做深度減小帶寬 color_formatrgb, # 通道順序必須選 rgb不要選 bgr enable_lens_distortionFalse, # 仿真里默認(rèn)關(guān)掉鏡頭畸變 )參數(shù)說(shuō)明分辨率取 84×84 是為了平衡訓(xùn)練速度和空間分辨率。如果任務(wù)依賴精細(xì)物體姿態(tài)比如插銷對(duì)孔建議提到 128 或 160但網(wǎng)絡(luò)參數(shù)和訓(xùn)練時(shí)間都會(huì)上漲。enable_lens_distortion默認(rèn)要關(guān)掉因?yàn)檎鏅C(jī)的鏡頭畸變通??繕?biāo)定補(bǔ)償不需要在仿真里額外模擬。圖像進(jìn)入網(wǎng)絡(luò)前必須除以 255 歸一化到 0 到 1 區(qū)間否則第一層卷積的梯度很容易在初期就崩掉。注意改完相機(jī)配置后要同時(shí)檢查觀測(cè)空間的維度變化。很多翻車案例是改了傳感器但忘記改策略網(wǎng)絡(luò)的輸入維度訓(xùn)練腳本直接報(bào)錯(cuò)或者靜默訓(xùn)練一個(gè)全零輸入的網(wǎng)絡(luò)。3.3 看懂訓(xùn)練曲線什么時(shí)候該停什么時(shí)候是過(guò)擬合Robot Learning 訓(xùn)練里最“玄學(xué)”的部分是判斷訓(xùn)練狀態(tài)。獎(jiǎng)勵(lì)曲線平滑上升、成功率也上升說(shuō)明策略在穩(wěn)定進(jìn)步獎(jiǎng)勵(lì)上升但成功率沒(méi)動(dòng)通常意味著模型在刷獎(jiǎng)勵(lì)密度高的區(qū)域但沒(méi)有形成真正可行的運(yùn)動(dòng)軌跡。這時(shí)候要看 Episode Length如果長(zhǎng)度明顯縮短但成功率不高說(shuō)明策略學(xué)會(huì)了“快速把物體搞到一個(gè)非預(yù)期狀態(tài)”比如把方塊推出工作區(qū)。我一般設(shè)三個(gè)停訓(xùn)檢查點(diǎn)。第一次在第 500 輪確認(rèn)損失數(shù)值不是 NaN第二次在成功率第一次超過(guò)基線時(shí)記錄對(duì)應(yīng)的 checkpoint 路徑第三次在成功率連續(xù) 200 輪不再上升且超過(guò)以往峰值時(shí)立刻停訓(xùn)。不要盲目追求 3000 輪跑滿很多場(chǎng)景下 1500 輪就過(guò)擬合了繼續(xù)訓(xùn)練只會(huì)讓模型在訓(xùn)練分布里越陷越深真機(jī)表現(xiàn)反而更差。4. 數(shù)據(jù)才是 Robot Learning 的命門離線軌跡與 affordance 的組織和清洗模型結(jié)構(gòu)可以換訓(xùn)練框架可以抄但數(shù)據(jù)質(zhì)量決定了策略的上限。知識(shí)庫(kù)里的數(shù)據(jù)條目再多如果不做組織和清洗喂給模型的只是一堆互相矛盾的軌跡。這一章講數(shù)據(jù)從哪來(lái)、用什么格式存、怎么清洗以及如何把 affordance 信息寫進(jìn)數(shù)據(jù)管道。4.1 數(shù)據(jù)來(lái)源配比遙操作、腳本策略與仿真合成怎么混常見的數(shù)據(jù)來(lái)源有三種人工遙操作、腳本化專家策略、仿真自動(dòng)采樣。人工遙操作質(zhì)量高但成本也最高一條優(yōu)秀軌跡可能要好幾分鐘腳本策略能快速生成大量軌跡但覆蓋度往往不足比如抓取任務(wù)里腳本策略永遠(yuǎn)不會(huì)嘗試從側(cè)面接近物體仿真采樣覆蓋度高且便宜但和真機(jī)的物理差距需要靠域隨機(jī)化彌補(bǔ)。我一般遵循“7:2:1”配比70% 仿真腳本數(shù)據(jù)20% 仿真域隨機(jī)化采樣數(shù)據(jù)10% 真機(jī)遙操作數(shù)據(jù)。如果目標(biāo)是通用預(yù)訓(xùn)練模型而不是單一任務(wù)會(huì)把真機(jī)遙操作比例提高到 30%因?yàn)檎鏅C(jī)數(shù)據(jù)里的噪聲模式是仿真很難模擬的。反過(guò)來(lái)如果只是跑通一個(gè) demo甚至可以全用仿真數(shù)據(jù)。4.2 HDF5 與 zarr兩種離線數(shù)據(jù)格式的取舍知識(shí)庫(kù)里的數(shù)據(jù)條目格式五花八門但壓縮后常見的就是 HDF5 和 zarr 兩種。很多新人對(duì)格式不敏感覺得能讀就行真到訓(xùn)練階段才發(fā)現(xiàn)讀寫速度、并發(fā)能力、斷點(diǎn)續(xù)存全是坑。對(duì)比維度HDF5zarr隨機(jī)讀取單條軌跡快快多進(jìn)程并發(fā)寫較弱需加鎖原生支持?jǐn)?shù)據(jù)壓縮支持但壓縮時(shí) CPU 占用高支持分塊壓縮生態(tài)老牌大部分?jǐn)?shù)據(jù)集默認(rèn)格式LeRobot 等新框架常用斷點(diǎn)續(xù)存寫壞文件風(fēng)險(xiǎn)較高分塊存儲(chǔ)容錯(cuò)好選擇依據(jù)很簡(jiǎn)單如果數(shù)據(jù)量小于幾十 GB、一次性寫入后只讀選 HDF5如果數(shù)據(jù)要持續(xù)追加、多進(jìn)程采集選 zarr。兩種格式轉(zhuǎn)換都有現(xiàn)成腳本不需要自己造輪子。4.3 清洗腳本統(tǒng)計(jì)軌跡長(zhǎng)度、成功率與狀態(tài)覆蓋度拿到一批離線軌跡后我做的第一件事不是訓(xùn)練而是寫一個(gè)統(tǒng)計(jì)腳本把每條軌跡的長(zhǎng)度、終止?fàn)顟B(tài)、動(dòng)作范圍打出來(lái)。import h5py import numpy as np with h5py.File(demo_data.h5, r) as f: # 假設(shè)數(shù)據(jù)結(jié)構(gòu)為 episode 為第一層分組 ep_names list(f.keys()) lengths, succ_flags, action_ranges [], [], [] for ep in ep_names: grp f[ep] # 常見內(nèi)部字段是 actions 和 rewards act grp[actions][:] rew grp[rewards][:] lengths.append(len(act)) succ_flags.append(1 if rew[-1] 0 else 0) action_ranges.append([float(act.min()), float(act.max())]) lengths np.array(lengths) succ_rate np.mean(succ_flags) print(fepisode 數(shù): {len(ep_names)}) print(f軌跡長(zhǎng)度: 均值 {lengths.mean():.1f}, 最大 {lengths.max()}, 最小 {lengths.min()}) print(f成功軌跡占比: {succ_rate:.2%}) print(f動(dòng)作范圍: 全局 min {min(r[0] for r in action_ranges):.3f}, f全局 max {max(r[1] for r in action_ranges):.3f})邏輯說(shuō)明這段腳本逐個(gè)讀取 episode 組統(tǒng)計(jì)軌跡長(zhǎng)度、成功率和動(dòng)作幅值邊界。succ_flags是判斷軌跡是否成功的粗糙方法假設(shè) rewards 的最后一個(gè)值非零即成功更準(zhǔn)確的判斷要看知識(shí)庫(kù)條目里是否帶顯式的 success 字段有的話直接讀那個(gè)字段。參數(shù)說(shuō)明軌跡長(zhǎng)度均值如果和任務(wù)時(shí)長(zhǎng)預(yù)期差太多說(shuō)明數(shù)據(jù)采集時(shí)提前終止了動(dòng)作范圍如果某些維度固定不變說(shuō)明該自由度在采集過(guò)程中被鎖住這類數(shù)據(jù)會(huì)削弱策略的泛化能力。清洗時(shí)發(fā)現(xiàn)異常軌跡我一般先看長(zhǎng)度分布。如果絕大多數(shù)軌跡都集中在很短的長(zhǎng)度優(yōu)先級(jí)最高的不是訓(xùn)練而是回采集端檢查是否有機(jī)械臂卡死、傳感器斷流這類系統(tǒng)性問(wèn)題。4.4 affordance 標(biāo)注把可交互點(diǎn)寫進(jìn)數(shù)據(jù)管道最近大家討論的 affordance for scalable robot learning核心思想是給軌跡數(shù)據(jù)補(bǔ)上“物體哪里可以交互、以什么方式交互”的標(biāo)注讓模型在預(yù)訓(xùn)練階段就學(xué)會(huì)理解可操作區(qū)域而不是只學(xué)動(dòng)作本身。這不再只是論文方向在實(shí)操里已經(jīng)能落地到數(shù)據(jù)管道。具體到數(shù)據(jù)組織上我一般給每條軌跡追加兩個(gè)字段語(yǔ)義掩碼和接觸點(diǎn)偏置。語(yǔ)義掩碼標(biāo)記圖像中屬于目標(biāo)物體的像素區(qū)域接觸點(diǎn)偏置描述末端執(zhí)行器相對(duì)于物體中心的期望接觸位置。標(biāo)注量不需要很大12 條軌跡起步就能讓模型在簡(jiǎn)單抓取任務(wù)里明顯更快收斂。這個(gè)思路的落腳點(diǎn)是知識(shí)庫(kù)里的離線和在線數(shù)據(jù)都應(yīng)該預(yù)留 affordance 字段的擴(kuò)展位不要在采集時(shí)只存動(dòng)作和圖像后面想補(bǔ)標(biāo)注還要回頭重新生成數(shù)據(jù)。5. 避坑清單Robot Learning 從仿真到真機(jī)路上的 5 個(gè)常見翻車點(diǎn)這章是踩坑集中區(qū)。下面五條都是我反復(fù)見過(guò)、自己也犯過(guò)的錯(cuò)誤按“現(xiàn)象 → 原因 → 解決”展開。每一條都值得在你準(zhǔn)備大規(guī)模訓(xùn)練前先對(duì)一遍清單。5.1 仿真里跑得很好真機(jī)上檢測(cè)頭直接“瞎掉”沒(méi)做域隨機(jī)化現(xiàn)象策略在仿真里成功率 90% 以上部署到真機(jī)后同一物體、差不多的光照下成功率直接掉到兩成以下末端執(zhí)行器經(jīng)常對(duì)著空氣抓。原因仿真渲染和真實(shí)相機(jī)圖像之間存在外觀差異模型在訓(xùn)練時(shí)把仿真材質(zhì)、光照、紋理當(dāng)成了特征的一部分而不是提取真正的物體幾何信息。解決在訓(xùn)練時(shí)開啟域隨機(jī)化。常見做法是隨機(jī)化光照強(qiáng)度、物體紋理貼圖、相機(jī)噪聲水平和背景顏色。對(duì)視覺策略來(lái)說(shuō)紋理和光照隨機(jī)化比物理參數(shù)隨機(jī)化更關(guān)鍵。建議先做一組消融實(shí)驗(yàn)關(guān)閉域隨機(jī)化訓(xùn)一個(gè)版本開啟訓(xùn)一個(gè)版本對(duì)比兩者在仿真評(píng)測(cè)下的成功率差。如果差異不大說(shuō)明任務(wù)對(duì)視覺不敏感如果差異明顯真機(jī)差距基本也在這個(gè)量級(jí)。5.2 Reward 一直不掉但成功率是零模型學(xué)會(huì)了躺平現(xiàn)象訓(xùn)練到中后期Episode Reward 保持在一個(gè)穩(wěn)定平臺(tái)不再上漲但 Success Rate 始終為零或者在一個(gè)很低的值附近波動(dòng)。原因稀疏獎(jiǎng)勵(lì)任務(wù)里模型發(fā)現(xiàn)“保持初始狀態(tài)”能獲得比亂動(dòng)更高的期望獎(jiǎng)勵(lì)。尤其是動(dòng)作有懲罰項(xiàng)時(shí)不動(dòng)是最優(yōu)解。這是稀疏獎(jiǎng)勵(lì)結(jié)合動(dòng)作正則項(xiàng)的常見副作用。解決先確認(rèn)動(dòng)作懲罰項(xiàng)系數(shù)。常見做法是把動(dòng)作懲罰減小一個(gè)數(shù)量級(jí)或者改成只在任務(wù)失敗時(shí)施加懲罰。另一個(gè)更有效的手段是增加 reward shaping比如給“物體接近目標(biāo)位置”的過(guò)程賦予一個(gè)連續(xù)增量。注意 shaping 權(quán)重不要太大否則模型會(huì)學(xué)會(huì)在原地抖動(dòng)物體來(lái)刷 shaping成功率照樣不漲。5.3 動(dòng)作空間選錯(cuò)位置增量還是關(guān)節(jié)力矩模型完全學(xué)不會(huì)現(xiàn)象同樣的網(wǎng)絡(luò)結(jié)構(gòu)換成關(guān)節(jié)力矩作為動(dòng)作輸出后訓(xùn)練極不穩(wěn)定動(dòng)作幅度劇烈且在早期頻繁觸發(fā)安全保護(hù)訓(xùn)練直接中斷。原因不同動(dòng)作空間的探索難度差別巨大。位置增量控制在笛卡爾空間動(dòng)作維度低、幅度容易約束適合端到端學(xué)習(xí)關(guān)節(jié)力矩控制維度高且對(duì)動(dòng)力學(xué)參數(shù)敏感策略在未收斂初期很容易產(chǎn)生危險(xiǎn)動(dòng)作。很多初學(xué)玩法直接照搬論文里的動(dòng)作空間但沒(méi)考慮自己的任務(wù)是否具備相同條件。解決對(duì)于大部分桌面操作任務(wù)優(yōu)先使用末端執(zhí)行器的位置增量加旋轉(zhuǎn)增量動(dòng)作空間維度通常是 6 或 7。等策略在位置增量空間里收斂到一個(gè)可接受基線后想挑戰(zhàn)高動(dòng)態(tài)任務(wù)再換到阻抗控制或關(guān)節(jié)力矩控制。換動(dòng)作空間時(shí)必須重新做一次數(shù)據(jù)歸一化因?yàn)槲恢迷隽亢完P(guān)節(jié)力矩的數(shù)值范圍完全不同。5.4 相機(jī)參數(shù)照抄默認(rèn)值焦距和視野與任務(wù)不匹配現(xiàn)象訓(xùn)練時(shí)圖像看起來(lái)正常真機(jī)部署后策略總是差一點(diǎn)抓不準(zhǔn)反復(fù)調(diào)整策略也沒(méi)有改善最后發(fā)現(xiàn)是訓(xùn)練時(shí)仿真相機(jī)的視場(chǎng)角和真機(jī)鏡頭不一致。原因仿真相機(jī)的默認(rèn)內(nèi)參是模板值不針對(duì)具體真機(jī)鏡頭。模型對(duì)焦距和畸變模式非常敏感它學(xué)的不是“物體的絕對(duì)位置”而是“在圖像坐標(biāo)系下物體的像素位置和動(dòng)作的關(guān)系”。如果相機(jī)內(nèi)參不一致從像素到運(yùn)動(dòng)方向的映射整體偏掉。解決在訓(xùn)練前用一張棋盤格標(biāo)定真機(jī)相機(jī)把焦距、主點(diǎn)、畸變系數(shù)寫進(jìn)仿真相機(jī)配置。這是一個(gè)三十分鐘就能完成的工作卻直接影響模型能否遷到真機(jī)。如果只是做仿真內(nèi)實(shí)驗(yàn)也要檢查一下默認(rèn)分辨率的長(zhǎng)寬比是否匹配任務(wù)區(qū)域避免物體出現(xiàn)在圖像的邊緣被網(wǎng)絡(luò)直接忽略。5.5 一訓(xùn)練就 NaN 或 loss 發(fā)散先查歸一化再查網(wǎng)絡(luò)結(jié)構(gòu)現(xiàn)象訓(xùn)練開始幾百步后 loss 數(shù)值變成 NaN或者 reward 劇烈振蕩然后突然歸零。新手第一反應(yīng)是調(diào)學(xué)習(xí)率換了三個(gè)學(xué)習(xí)率依舊翻車。原因觀察量或動(dòng)作量沒(méi)有歸一化。圖像像素值直接進(jìn)網(wǎng)絡(luò)、關(guān)節(jié)角度在正負(fù) 180 度之間擺動(dòng)、動(dòng)作增量的數(shù)值范圍跨兩個(gè)數(shù)量級(jí)這些都會(huì)讓網(wǎng)絡(luò)初期的梯度爆炸。歸一化問(wèn)題比網(wǎng)絡(luò)結(jié)構(gòu)問(wèn)題更容易被忽視排錯(cuò)順序應(yīng)該先數(shù)據(jù)后模型。解決所有連續(xù)觀測(cè)維度做均值和方差歸一化圖像除以 255動(dòng)作增量縮放到 -1 到 1 區(qū)間。做完這一步再看是否還需要調(diào)學(xué)習(xí)率常見初始學(xué)習(xí)率在 3e-4 到 1e-4 之間AdamW 搭配線性 warmup 是穩(wěn)妥組合。如果歸一化后仍發(fā)散再檢查是否有 NaN 通過(guò)傳感器讀入觀測(cè)空間常見來(lái)源是物理引擎在極端接觸狀態(tài)下返回?zé)o窮值。6. 把 general flow 嵌進(jìn)策略輸出層affordance 條件下的 scalable robot learning 實(shí)踐知識(shí)庫(kù)跑通、數(shù)據(jù)管道建好、避坑清單對(duì)過(guò)一遍之后值得做的一個(gè)進(jìn)階改造是把策略輸出頭從高斯混合模型換成 flow matching。最近被反復(fù)討論的 general flow as foundation affordance for scalable robot learning核心是把動(dòng)作生成看成從噪聲到動(dòng)作的逐步流動(dòng)過(guò)程再用 affordance 特征作為條件引導(dǎo)這個(gè)流動(dòng)。落地到代碼上它替換的只是策略的最后一層。對(duì)比高斯混合模型直接輸出動(dòng)作分布參數(shù)flow matching 輸出的是一個(gè)馬爾可夫鏈?zhǔn)降闹鸩饺ピ脒^(guò)程訓(xùn)練更穩(wěn)定表達(dá)的動(dòng)作分布更復(fù)雜。它就相當(dāng)于給策略輸出加了一個(gè)“后悔藥”動(dòng)作采樣知道逐步修正自己。驗(yàn)證這個(gè)改造是否值得最直接的方法是在仿真任務(wù)上做同條件對(duì)比。固定數(shù)據(jù)集、固定評(píng)測(cè)協(xié)議分別用 GMM 輸出頭和 flow matching 輸出頭訓(xùn)練對(duì)比 20 個(gè)種子下的平均成功率。我的個(gè)人習(xí)慣是先只換輸出頭其他超參完全不動(dòng)跑一版看趨勢(shì)如果成功率沒(méi)有明顯提升先不折騰網(wǎng)絡(luò)架構(gòu)回頭檢查數(shù)據(jù)質(zhì)量——因?yàn)?flow matching 對(duì)數(shù)據(jù)多樣性的利用能力更強(qiáng)數(shù)據(jù)本身太單一時(shí)它也發(fā)揮不出來(lái)。這個(gè)方向能不能規(guī)模化關(guān)鍵看你的數(shù)據(jù)管道是否預(yù)置了 affordance 字段。如果第 4 章的字段預(yù)留做到位了接入 flow 條件只是加一個(gè)特征拼接的事如果沒(méi)預(yù)留要回頭補(bǔ)標(biāo)注成本翻倍。這算是我在這類改造上踩過(guò)最深的一坑希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取