
简介Robot Learning_32是一份面向机器人学习领域的实用知识库内容横跨机器人学、强化学习、计算机图形学与仿真建模。PDF内按32篇主题组织重点围绕MuJoCo仿真器展开从URDF模型转换、DAE/STL网格处理、XML编译参数配置到Sim2Real迁移、深度强化学习控制器训练等完整实操链条同时整理了MATLAB强化学习工具箱、dm_control、Isaac Gym、SoftCon等开源项目与工具对比并穿插Science Robotics征稿、ICRA挑战赛等前沿动态。具体篇目还覆盖水下软体仿生机器人PPO训练、波士顿动力Spot落地应用、谷歌机器人及Pieter Abbeel创业公司等案例并包含多篇Sim2Real问题探讨与机械臂操作综述。资源为单文件PDF大小6.92MB目前已有234人学习。无论刚开始搭建机器人仿真环境的研究生还是希望系统梳理Robot Learning工具链的工程师都能从中获得可参考的建模排错思路、项目清单与文献线索是一份兼具手册与综述价值的合集。1. Robot Learning 知识库到底在解决谁的什么问题Robot Learning 这个方向最劝退人的不是算法而是“不知道从哪一行代码开始”。面试造过轮子、仓库存了几十个 star 项目的人真到把机械臂放到桌上时往往连一个能跑通的视觉抓取闭环都拿不出来。一个实用的 Robot Learning 知识库要解决的正是这个问题把分散在论文、代码仓库、数据集和仿真文档里的经验整理成按任务类型索引的“可复现起点”——你接到一个操作任务先查知识库里对应任务族的实现路径而不是重新逛一周 GitHub。它适合两类人刚转进来、想用最短路径打通一个端到端机器人学习 demo 的工程师以及已经在跑数据、但被数据集格式和评测口径反复折磨的实战团队。下面按一个常见的 32 条目实用知识库为例把地图怎么建、闭环怎么跑通、坑位在哪里讲清楚。2. 32 个条目按什么地图组织仿真、数据集、模型与评测怎么选型拿到一个 32 条目的 Robot Learning 知识库第一件事不是从上往下一条条读而是先给它们分类。我一般按五类归档仿真环境、离线数据集、策略模型、训练框架、评测脚本。这个分类不是按文件类型分的而是按“你做一次闭环实验时需要碰哪几样东西”分的数据来自哪里模型跑在什么环境里用什么框架训练用什么指标判断成功。2.1 仿真环境选型MuJoCo、Isaac Lab 与 Sapien 怎么选知识库里通常同时收录不止一个仿真器因为它们服务的任务阶段不一样。MuJoCo 轻、快、没有显卡也能跑适合做强化学习算法的快速迭代Isaac Lab 基于物理引擎和渲染管线支持相机仿真、域随机化和大批量并行训练适合做带视觉输入的机械臂操作任务Sapien 在接触密集操作上更稳比如插拔、拧螺丝这类对接触力敏感的活儿。我的经验是知识库里如果只保留一个仿真器选 Isaac Lab但如果你的算法原型还没定先用 MuJoCo 把掉头发的事做完再迁到 Isaac Lab 做视觉版本。下表是我给仿真器选型时反复用的判断矩阵每个项目按 1 到 5 打分不是按“哪个更流行”而是按“当前任务的约束”。判断维度MuJoCoIsaac LabSapien物理接触稳定性345相机传感器模拟153批量并行训练吞吐253上手成本532社区示例数量442选完仿真器后要做一次“冒烟验证”这一步很便宜但能省掉后面一周的排查时间。常见做法是写一个随机策略在环境里跑 1000 步看三件事动作是否发散到 NaN、物体是否穿透地面、传感器读数是否出现零值。任何一项异常都说明安装或配置有问题不要直接开始训练。2.2 数据集不是收藏夹把离线数据按任务族归档很多知识库里的数据集条目就是一堆下载链接真正会用的人会把它们重新归档成“任务族 传感器类型 成败标签”的结构。比如抓取类、推动类、插孔类每个任务族下面再按是否有深度图、是否含语言指令切分。这样做的原因是Robot Learning 的训练脚本里数据加载器只认固定的目录结构。你从不同来源下载的数据格式不一样如果不先统一归档后面每次实验都要改数据读取代码这是最隐蔽的时间黑洞。我在归档时常用的目录结构长这样datasets/ ├── task_family_lift/ │ ├── demos_success_hdf5/ │ ├── demos_failed_hdf5/ │ └── scripts/ │ └── stats.py ├── task_family_push/ │ ├── demos_success_hdf5/ │ └── demos_failed_hdf5/ └── README.md归档的核心是把成功和失败轨迹分开存。很多初学玩法把全部轨迹混在一起训练时 reward 信号本来就稀疏失败轨迹占比一高模型直接就学会了“不动”。我在 README 里会写清楚每个子集是从哪个原始来源转过来的、转换脚本在哪、用什么格式。这个习惯能省掉大量“这个数据从哪来的”式的追问。2.3 评测基线每个条目都必须挂一个成功率数字知识库里最容易被忽略的是评测口径。同一个策略有人报 87% 成功率有人报 41%差别往往不在训练而在评测随机种子取几个、初始物体位置是否固定、每次 rollout 的回合长度上限是多少。我一般固定一套评测协议取 20 个种子固定初始状态集合每个种子跑 10 个 episode成功率按滑动窗口平均。评测脚本必须和训练脚本分开独立执行不能用训练日志里的最后几条 reward 来替代。评测基线的作用是给知识库里的每个策略条目一个“锚点”。你在调参时只要看成功率相对于基线是涨是跌不用重新读一遍论文。这也是知识库从“收藏夹”变成“工具”的关键一步——不是攒文件而是攒可对比的结论。3. 用 Isaac Lab 复现第一个机械臂操作闭环从安装到看清训练曲线上一章的知识库地图解决了“有什么”这一章解决“怎么跑起来”。我以 Isaac Lab 环境为例讲一个最小闭环因为它是当前做视觉操作任务时最容易从零跑通、又最接近真机部署路径的选项。你在实际操作时可能会遇到版本入口不一致的问题这很正常先看本地目录结构再执行。3.1 最小训练闭环安装、启动与第一个 lift 任务假设你已经按官方文档把 Isaac Lab 装进一个干净的 conda 环境并且预下载了资产。训练一个机械臂抓取立方体的经典任务常见命令是# 在 Isaac Lab 根目录下执行注意不同版本命令入口可能略有差异 ./isaaclab.sh -p scripts/islab/train.py \ --task Isaac-Lift-Cube-Franka-v0 \ --num_envs 32 \ --headless \ --max_iterations 3000逐项说明参数--task指定任务 IDIsaac-Lift-Cube-Franka-v0是 Franka 机械臂抬升立方体的标准任务适合作为第一个跑通的实验--num_envs 32是并行环境数32 是入门值显存足够时可以加到 128 或 256并行数越大训练步数吞吐越高但对显存和 CPU 物理计算都有压力--headless关掉渲染窗口适合在服务器上跑--max_iterations 3000是最大迭代轮数常见范围在 1000 到 5000 之间3000 是一个能看出收敛趋势又不至于等太久的折中值。训练过程中要同时开日志观察而不是等它跑完。常见做法是在另一个终端里查看训练目录下的 tensorboard 日志tensorboard --logdir logs/ # 然后浏览器打开 localhost:6006看训练曲线的重点顺序先看 Episode Reward 的滑动均值是否有持续上升趋势再看 Success Rate 是否出现非零抬升最后看 Average Episode Length 是否缩短。如果前三万步内 reward 不动、成功率一直为零不用等到 3000 轮结束直接 Ctrl-C 回去检查配置。3.2 把 state-based 任务改成视觉输入相机传感器与归一化很多知识库条目给的是 state-based 版本的训练配置但实际项目需要相机输入。把 lift 任务改成视觉输入核心不是改网络而是给环境挂相机传感器并把图像归一化。以 Isaac Lab 常见的配置片段为例# 给机械臂末端挂一个 RGB 相机用于视觉策略输入 camera_cfg CameraCfg( prim_path/World/envs/env_.*/Robot/ee_link, # 挂在末端执行器上 update_per_frame1, # 每个仿真帧都更新图像 height84, # 图像高84 或 64 常见 width84, # 图像宽 data_types[rgb], # 只取 RGB不做深度减小带宽 color_formatrgb, # 通道顺序必须选 rgb不要选 bgr enable_lens_distortionFalse, # 仿真里默认关掉镜头畸变 )参数说明分辨率取 84×84 是为了平衡训练速度和空间分辨率。如果任务依赖精细物体姿态比如插销对孔建议提到 128 或 160但网络参数和训练时间都会上涨。enable_lens_distortion默认要关掉因为真机的镜头畸变通常靠标定补偿不需要在仿真里额外模拟。图像进入网络前必须除以 255 归一化到 0 到 1 区间否则第一层卷积的梯度很容易在初期就崩掉。注意改完相机配置后要同时检查观测空间的维度变化。很多翻车案例是改了传感器但忘记改策略网络的输入维度训练脚本直接报错或者静默训练一个全零输入的网络。3.3 看懂训练曲线什么时候该停什么时候是过拟合Robot Learning 训练里最“玄学”的部分是判断训练状态。奖励曲线平滑上升、成功率也上升说明策略在稳定进步奖励上升但成功率没动通常意味着模型在刷奖励密度高的区域但没有形成真正可行的运动轨迹。这时候要看 Episode Length如果长度明显缩短但成功率不高说明策略学会了“快速把物体搞到一个非预期状态”比如把方块推出工作区。我一般设三个停训检查点。第一次在第 500 轮确认损失数值不是 NaN第二次在成功率第一次超过基线时记录对应的 checkpoint 路径第三次在成功率连续 200 轮不再上升且超过以往峰值时立刻停训。不要盲目追求 3000 轮跑满很多场景下 1500 轮就过拟合了继续训练只会让模型在训练分布里越陷越深真机表现反而更差。4. 数据才是 Robot Learning 的命门离线轨迹与 affordance 的组织和清洗模型结构可以换训练框架可以抄但数据质量决定了策略的上限。知识库里的数据条目再多如果不做组织和清洗喂给模型的只是一堆互相矛盾的轨迹。这一章讲数据从哪来、用什么格式存、怎么清洗以及如何把 affordance 信息写进数据管道。4.1 数据来源配比遥操作、脚本策略与仿真合成怎么混常见的数据来源有三种人工遥操作、脚本化专家策略、仿真自动采样。人工遥操作质量高但成本也最高一条优秀轨迹可能要好几分钟脚本策略能快速生成大量轨迹但覆盖度往往不足比如抓取任务里脚本策略永远不会尝试从侧面接近物体仿真采样覆盖度高且便宜但和真机的物理差距需要靠域随机化弥补。我一般遵循“7:2:1”配比70% 仿真脚本数据20% 仿真域随机化采样数据10% 真机遥操作数据。如果目标是通用预训练模型而不是单一任务会把真机遥操作比例提高到 30%因为真机数据里的噪声模式是仿真很难模拟的。反过来如果只是跑通一个 demo甚至可以全用仿真数据。4.2 HDF5 与 zarr两种离线数据格式的取舍知识库里的数据条目格式五花八门但压缩后常见的就是 HDF5 和 zarr 两种。很多新人对格式不敏感觉得能读就行真到训练阶段才发现读写速度、并发能力、断点续存全是坑。对比维度HDF5zarr随机读取单条轨迹快快多进程并发写较弱需加锁原生支持数据压缩支持但压缩时 CPU 占用高支持分块压缩生态老牌大部分数据集默认格式LeRobot 等新框架常用断点续存写坏文件风险较高分块存储容错好选择依据很简单如果数据量小于几十 GB、一次性写入后只读选 HDF5如果数据要持续追加、多进程采集选 zarr。两种格式转换都有现成脚本不需要自己造轮子。4.3 清洗脚本统计轨迹长度、成功率与状态覆盖度拿到一批离线轨迹后我做的第一件事不是训练而是写一个统计脚本把每条轨迹的长度、终止状态、动作范围打出来。import h5py import numpy as np with h5py.File(demo_data.h5, r) as f: # 假设数据结构为 episode 为第一层分组 ep_names list(f.keys()) lengths, succ_flags, action_ranges [], [], [] for ep in ep_names: grp f[ep] # 常见内部字段是 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 数: {len(ep_names)}) print(f轨迹长度: 均值 {lengths.mean():.1f}, 最大 {lengths.max()}, 最小 {lengths.min()}) print(f成功轨迹占比: {succ_rate:.2%}) print(f动作范围: 全局 min {min(r[0] for r in action_ranges):.3f}, f全局 max {max(r[1] for r in action_ranges):.3f})逻辑说明这段脚本逐个读取 episode 组统计轨迹长度、成功率和动作幅值边界。succ_flags是判断轨迹是否成功的粗糙方法假设 rewards 的最后一个值非零即成功更准确的判断要看知识库条目里是否带显式的 success 字段有的话直接读那个字段。参数说明轨迹长度均值如果和任务时长预期差太多说明数据采集时提前终止了动作范围如果某些维度固定不变说明该自由度在采集过程中被锁住这类数据会削弱策略的泛化能力。清洗时发现异常轨迹我一般先看长度分布。如果绝大多数轨迹都集中在很短的长度优先级最高的不是训练而是回采集端检查是否有机械臂卡死、传感器断流这类系统性问题。4.4 affordance 标注把可交互点写进数据管道最近大家讨论的 affordance for scalable robot learning核心思想是给轨迹数据补上“物体哪里可以交互、以什么方式交互”的标注让模型在预训练阶段就学会理解可操作区域而不是只学动作本身。这不再只是论文方向在实操里已经能落地到数据管道。具体到数据组织上我一般给每条轨迹追加两个字段语义掩码和接触点偏置。语义掩码标记图像中属于目标物体的像素区域接触点偏置描述末端执行器相对于物体中心的期望接触位置。标注量不需要很大12 条轨迹起步就能让模型在简单抓取任务里明显更快收敛。这个思路的落脚点是知识库里的离线和在线数据都应该预留 affordance 字段的扩展位不要在采集时只存动作和图像后面想补标注还要回头重新生成数据。5. 避坑清单Robot Learning 从仿真到真机路上的 5 个常见翻车点这章是踩坑集中区。下面五条都是我反复见过、自己也犯过的错误按“现象 → 原因 → 解决”展开。每一条都值得在你准备大规模训练前先对一遍清单。5.1 仿真里跑得很好真机上检测头直接“瞎掉”没做域随机化现象策略在仿真里成功率 90% 以上部署到真机后同一物体、差不多的光照下成功率直接掉到两成以下末端执行器经常对着空气抓。原因仿真渲染和真实相机图像之间存在外观差异模型在训练时把仿真材质、光照、纹理当成了特征的一部分而不是提取真正的物体几何信息。解决在训练时开启域随机化。常见做法是随机化光照强度、物体纹理贴图、相机噪声水平和背景颜色。对视觉策略来说纹理和光照随机化比物理参数随机化更关键。建议先做一组消融实验关闭域随机化训一个版本开启训一个版本对比两者在仿真评测下的成功率差。如果差异不大说明任务对视觉不敏感如果差异明显真机差距基本也在这个量级。5.2 Reward 一直不掉但成功率是零模型学会了躺平现象训练到中后期Episode Reward 保持在一个稳定平台不再上涨但 Success Rate 始终为零或者在一个很低的值附近波动。原因稀疏奖励任务里模型发现“保持初始状态”能获得比乱动更高的期望奖励。尤其是动作有惩罚项时不动是最优解。这是稀疏奖励结合动作正则项的常见副作用。解决先确认动作惩罚项系数。常见做法是把动作惩罚减小一个数量级或者改成只在任务失败时施加惩罚。另一个更有效的手段是增加 reward shaping比如给“物体接近目标位置”的过程赋予一个连续增量。注意 shaping 权重不要太大否则模型会学会在原地抖动物体来刷 shaping成功率照样不涨。5.3 动作空间选错位置增量还是关节力矩模型完全学不会现象同样的网络结构换成关节力矩作为动作输出后训练极不稳定动作幅度剧烈且在早期频繁触发安全保护训练直接中断。原因不同动作空间的探索难度差别巨大。位置增量控制在笛卡尔空间动作维度低、幅度容易约束适合端到端学习关节力矩控制维度高且对动力学参数敏感策略在未收敛初期很容易产生危险动作。很多初学玩法直接照搬论文里的动作空间但没考虑自己的任务是否具备相同条件。解决对于大部分桌面操作任务优先使用末端执行器的位置增量加旋转增量动作空间维度通常是 6 或 7。等策略在位置增量空间里收敛到一个可接受基线后想挑战高动态任务再换到阻抗控制或关节力矩控制。换动作空间时必须重新做一次数据归一化因为位置增量和关节力矩的数值范围完全不同。5.4 相机参数照抄默认值焦距和视野与任务不匹配现象训练时图像看起来正常真机部署后策略总是差一点抓不准反复调整策略也没有改善最后发现是训练时仿真相机的视场角和真机镜头不一致。原因仿真相机的默认内参是模板值不针对具体真机镜头。模型对焦距和畸变模式非常敏感它学的不是“物体的绝对位置”而是“在图像坐标系下物体的像素位置和动作的关系”。如果相机内参不一致从像素到运动方向的映射整体偏掉。解决在训练前用一张棋盘格标定真机相机把焦距、主点、畸变系数写进仿真相机配置。这是一个三十分钟就能完成的工作却直接影响模型能否迁到真机。如果只是做仿真内实验也要检查一下默认分辨率的长宽比是否匹配任务区域避免物体出现在图像的边缘被网络直接忽略。5.5 一训练就 NaN 或 loss 发散先查归一化再查网络结构现象训练开始几百步后 loss 数值变成 NaN或者 reward 剧烈振荡然后突然归零。新手第一反应是调学习率换了三个学习率依旧翻车。原因观察量或动作量没有归一化。图像像素值直接进网络、关节角度在正负 180 度之间摆动、动作增量的数值范围跨两个数量级这些都会让网络初期的梯度爆炸。归一化问题比网络结构问题更容易被忽视排错顺序应该先数据后模型。解决所有连续观测维度做均值和方差归一化图像除以 255动作增量缩放到 -1 到 1 区间。做完这一步再看是否还需要调学习率常见初始学习率在 3e-4 到 1e-4 之间AdamW 搭配线性 warmup 是稳妥组合。如果归一化后仍发散再检查是否有 NaN 通过传感器读入观测空间常见来源是物理引擎在极端接触状态下返回无穷值。6. 把 general flow 嵌进策略输出层affordance 条件下的 scalable robot learning 实践知识库跑通、数据管道建好、避坑清单对过一遍之后值得做的一个进阶改造是把策略输出头从高斯混合模型换成 flow matching。最近被反复讨论的 general flow as foundation affordance for scalable robot learning核心是把动作生成看成从噪声到动作的逐步流动过程再用 affordance 特征作为条件引导这个流动。落地到代码上它替换的只是策略的最后一层。对比高斯混合模型直接输出动作分布参数flow matching 输出的是一个马尔可夫链式的逐步去噪过程训练更稳定表达的动作分布更复杂。它就相当于给策略输出加了一个“后悔药”动作采样知道逐步修正自己。验证这个改造是否值得最直接的方法是在仿真任务上做同条件对比。固定数据集、固定评测协议分别用 GMM 输出头和 flow matching 输出头训练对比 20 个种子下的平均成功率。我的个人习惯是先只换输出头其他超参完全不动跑一版看趋势如果成功率没有明显提升先不折腾网络架构回头检查数据质量——因为 flow matching 对数据多样性的利用能力更强数据本身太单一时它也发挥不出来。这个方向能不能规模化关键看你的数据管道是否预置了 affordance 字段。如果第 4 章的字段预留做到位了接入 flow 条件只是加一个特征拼接的事如果没预留要回头补标注成本翻倍。这算是我在这类改造上踩过最深的一坑希望帮到你。本文还有配套的精品资源点击获取