简介:面向机器人学习、强化学习与仿真方向的工程师和研究者,这份三十二篇合集把散落在多篇技术推送中的知识点系统归拢,覆盖MuJoCo机器人建模全流程:从ROS的URDF文件准备、DAE与STL网格转换、XML编译标签选项,到平衡惯量参数排错、碰撞与视觉网格切换,并延伸至Sim2Real迁移、深度强化学习自动驾驶综述、水下软体机器人PPO训练等实践案例,适合希望快速建立机器人学习整体认知的入门与进阶读者。整个压缩包仅含一个PDF文件,大小约6.92MB,可离线阅读;目录按三十二篇专题组织,结构清晰,便于按需检索,已有二百三十四人浏览学习。对想深入定制机器人模型、或了解主流仿真工具链的人来说,这一册既是一份建模排错参考,也是一份仿真到现实与强化学习应用专题索引,值得反复查阅。
1. Robot Learning 知识库到底在解决什么
同样是训一个机械臂抓取,有人三天跑通,有人卡在数据格式上两周。差距不在模型,而在对 Robot Learning 链路里几十个不起眼却致命的细节。所谓 32 实用知识库,就是把感知、数据、策略、仿真、部署这条长链路的经验压成 32 个可检索条目,当排错手册和参数速查用。
它不是论文摘要,也不是课程笔记,而是照着做就能少踩坑的实验路径规划。每条知识对应一个真实翻车点或必调参数,比如观测空间定义、数据采集时间戳对齐、验证集切分方式。
适合手里已有机器人硬件或仿真环境、准备动手做策略学习但不想把时间耗在弯路上的从业者,也适合从 CV 或 NLP 转过来、需要快速补齐机器人常识的工程师。
2. 拆解 32 条知识条目:从状态表示到部署评估
2.1 感知与状态表示:前 10 条为什么是整条链路的地基
在 Robot Learning 里,模型通常不背锅,背锅的往往是观测定义。前 10 条知识几乎全在回答一个问题:怎么把真实世界变成模型能稳定吃的张量。
最典型的一个坑:训练时 obs 是 dict,包含 image、joint_pos、gripper_state 三个键,部署脚本却只喂了 image。模型从没见过缺关节角度的输入,上线自然乱动。所以知识库的第一梯队一定是"固定观测空间",包括键名、维度、数值范围、归一化方式。观测定义一旦改动,之前采的数据基本作废,这是很多人一开始不愿接受的事实。
这一组里还有几条容易被当玄学跳过的条目。相机标定和手眼标定的执行顺序决定了坐标变换对不对,先采数据再标定,回头发现要全部重采。深度图在透明和反光物体上一定会出现空洞,知识库一般给出的解法是换点云输入或加语义掩膜,而不是调深度相机的参数硬刚。关节角度用弧度还是度,直接决定网络里数值的尺度,同一条 1e-4 的学习率在度制下可能直接发散。
还有两条和时序相关。历史帧堆叠解决的是"单帧观测没有速度信息"的问题,抓取这种快动作任务堆 4 帧起步,慢速插拔类任务 2 帧就够。帧率同步则是另一个隐蔽杀手:观测 30Hz、控制 10Hz,采集时不打统一时间戳,训练数据里 obs 和 action 天生错位,模型学到的映射关系是错的,后面怎么调都救不回来。
这一组内部有强依赖关系,我一般按顺序过一遍:先统一坐标系,再标定,再定观测空间,最后才对帧率。顺序反了,返工成本翻倍。前 10 条全部落实之后,才有资格进入数据和策略阶段。把它们整理成速查表:
| 条目 | 核心问题 | 一句话结论 |
|---|---|---|
| 观测空间 | dict 还是 vector | 全链路统一,键名和维度不许偷改 |
| 归一化 | 各模态量纲差异 | 弧度、力、图像 0-1 分开处理 |
| 手眼标定 | camera 到 base 的变换 | 先标定再采数据,别指望事后补 |
| 深度 vs 点云 | 透明/反光物体 | 深度不可靠时换点云或加掩膜 |
| 历史帧堆叠 | 单帧缺速度信息 | 堆 2-4 帧起步,动作快就多堆 |
| 坐标系 | base/tool/camera | 统一到 base 系,记录变换矩阵 |
| 帧率同步 | obs 与 action 错位 | 用同一时钟打时间戳,对不齐就重采 |
提示:观测空间是整份知识库里"牵一发动全身"的部分。后面 22 条全建立在它之上,改一条等于重来。
2.2 数据采集与策略学习:中间 12 条决定训练能否收敛
中间 12 条是知识库的"主食",覆盖数据来源、动作空间、算法选择和 reward 设计,也是争议最大的部分,因为每一条都依赖你的具体任务。
数据来源上,遥操作和脚本策略各有适用边界。遥操作数据质量高但量少,一条抓取任务最少也要 200 条有效演示才够行为克隆起步,少于这个数模型基本是在背题。脚本策略能批量生成但分布单一,策略很容易学到"只会从正中间往下抓"这种脆弱动作。知识库通常给的解法是混合采集:70% 脚本数据打底,30% 遥操作数据负责把分布边缘补齐,这个比例在接触类任务上表现最稳。
动作空间的选择常常被新手忽略。关节位置增量比绝对位置更容易学,因为增量动作的数值范围小且平稳;绝对位置动作要求模型直接输出目标构型,对观测误差更敏感。末端位姿作为动作空间的坑在于需要额外解逆运动学,奇异位形附近动作会突变。我的习惯是优先关节增量,遇到多解任务再换末端空间。
算法选型上,diffusion policy 这类生成式策略是当前主流。它比直接回归动作更稳,因为动作分布是多峰的:同一个观测下"从左边抓"和"从右边抓"都合理,回归模型只能取平均,取出来的动作往往是两个方案的中间值,直接导致抖动。diffusion policy 用去噪过程建模整个分布,天然避开这个问题。代价是推理要多步采样,实时性要单独评估,不能只看训练指标。
reward 设计是 RL 路线最容易翻车的地方。稀疏 reward 难收敛,密集 reward 又容易让策略钻空子,比如"惩罚末端远离目标"会被策略学成"手臂一直往回缩"。知识库一般建议先试稀疏 reward 加 shaped 辅助项,辅助项只给阶段性信号,比如"到达抓取点 +1 分",不给连续距离惩罚。数据增强也要区分场景:视觉扰动在真实感强的仿真里收益明显,在抽象仿真里反而会让策略忽略视觉特征。
2.3 仿真、部署与评估:最后 10 条决定模型能否出实验室
最后的 10 条讲的是"出了训练环境怎么办",这是知识库里最功利也最容易被略读的部分。
仿真器选型上,MuJoCo 适合接触丰富的操作任务,接触求解精度高但单环境速度一般;Isaac Gym 系列适合大规模并行强化学习,一张卡能同时跑几千个环境,缺点是物理引擎偏硬,接触参数要额外调。知识库的建议是:策略学习用并行仿真快速筛方案,最终验证回到 MuJoCo 这种接触更准的环境。两条路都走,而不是二选一。
domain randomization 是 sim2real 的后悔药,设不好就是毒药。把它当成两个旋钮:视觉随机(纹理、亮度、相机噪声)可以大胆拉;动力学随机(摩擦、质量、关节阻尼)要贴着真机标定值小范围调。拉过头,策略在仿真里学会了"无视视觉、瞎碰",到真机一样废。判断标准是看策略是否开始依赖非视觉线索,比如物体初始位置这种仿真里才能精确读取的信息。
评估部分是大多数人最不爱读但最值钱的一批条目。固定评估 seed 和初始位姿分布,否则你分不清版本提升是模型的功劳还是运气。success rate 至少跑 50 次尝试再下结论,单次演示成功没有统计意义。还有一条经验规则:仿真评估过了 95% 才值得动真机,90% 到 95% 之间上真机大概率血亏,因为 sim2real 的下降幅度通常有 10-20 个点,你要给这个落差留出余量。最后两条一般是模型导出格式和推理框架选型,结论很简单:先验证推理延迟满足控制周期,再谈精度。
3. 把知识库跑成可复现流程:目录、脚本与参数
3.1 按 32 条知识组织实验目录,让每条知识对应一个可执行入口
知识库不是拿来读的,是拿来对答案的。我一般会把 32 条映射到一个固定目录结构上,每条知识对应一个可执行入口,实验记录、脚本、演示数据各归其位。这个习惯是从连续两次"找不着之前跑通的配置"里学出来的,配置文件一旦散落在桌面和临时目录里,等于没有配置。
# 初始化 Robot Learning 知识库目录结构 # 05_deploy 是最后一个常被人漏建的目录,后补成本很高 mkdir -p rl_kb/{00_notes/{01_obs,02_data,03_policy,04_sim,05_deploy}, \ 01_scripts/{collect,train,eval,deploy}, \ 02_demos/{task_a,task_b}, \ 03_checkpoints/{task_a,task_b}}这段脚本做的事很简单:把知识库的五个主题域(观测、数据、策略、仿真、部署)和四类操作脚本(采集、训练、评估、部署)建成分层目录。00_notes 下放每条知识的结论和踩坑记录,01_scripts 下放对应脚本,02_demos 和 03_checkpoints 按任务分子目录。不同任务的 checkpoint 混放会导致"用任务 A 的权重跑任务 B 的评估"这种低级事故,我在两个项目里都见过,所以强烈建议目录从第一天就带任务维度。
注意:03_checkpoints 下按任务分子目录是必须的。我见过不止一次因为 checkpoint 混放,评估脚本加载了上一个任务的模型,白跑一上午,最后发现是权重加载路径写错了。
目录建好后还有一个习惯:每条知识在 00_notes 里对应一个 md 文件,文件名带结论前缀,比如 01_obs/normalize_range.md 的内容是"图像归一到 0-1、关节角弧度转 [-1,1]"。这样不打开文件就知道这条知识说了什么,检索成本几乎为零。这套结构我沿用了三年,最大的收益不是整齐,而是任何一次实验都能五分钟内定位到对应的脚本和数据。
3.2 最小复现脚本:从采集到训练的一次性管线
目录建好后,先写一个"检查观测一致性"的最小脚本。这是 32 条里最容易被忽略、代价却最高的一条,我每次开新任务都会先跑一遍,比直接改模型参数划算得多。
# verify_obs.py:检查演示数据与训练配置的观测空间是否一致 import numpy as np def load_demo(path): # 演示数据常见格式:npz 存 dict,键是 obs/action/done data = np.load(path, allow_pickle=True) return data def verify(demo_path, cfg): demo = load_demo(demo_path) obs = demo["obs"].item() # 采集时存的是 dict expected = set(cfg["obs_keys"]) actual = set(obs.keys()) missing = expected - actual if missing: raise RuntimeError(f"观测缺键 {missing},采集脚本和训练配置对不齐") # 数值范围检查:图像 0-1 还是 0-255,会导致慢收敛或直接发散 img = obs[cfg["image_key"]] print(f"图像范围 [{img.min():.2f}, {img.max():.2f}]") # 关节角度检查:弧度还是度,差 57 倍,肉眼看不出来 q = obs[cfg["joint_key"]] print(f"关节角度范围 [{q.min():.2f}, {q.max():.2f}],弧度制应在 ±3.15 附近") if __name__ == "__main__": cfg = {"obs_keys": ["image", "joint_pos", "gripper_state"], "image_key": "image", "joint_key": "joint_pos"} verify("02_demos/task_a/ep_0001.npz", cfg)脚本逻辑很简单:加载一条演示数据,核对训练配置里要求的观测键是否存在,再打印图像和关节角度的数值范围。两条范围检查能提前暴露最常见的两类错误:图像归一化不一致,以及关节角单位不一致。单位错误最坑,loss 也能降,就是策略行为扭曲,肉眼很难看出来。
参数说明:obs_keys 必须和训练脚本里的观测定义一字不差;image_key 和 joint_key 是抽出来单独做范围检查的键名,如果观测里没有关节角,把 joint_key 换成末端位姿键即可。脚本跑完如果输出范围和预设不符,直接回头看采集端,不要继续往下训练。把这个脚本接进训练脚本的入口,训练前强制跑一遍,通不过直接抛异常退出,不要打印个警告继续跑。警告在实验里等于不存在,因为人会无视它,而异常会逼你停下来处理。
3.3 知识库里最容易调错的三个参数
第一是学习率。Robot Learning 模型通常包含视觉骨干和策略头两部分,两部分的学习率要分开设:视觉部分 1e-4 起步,策略头可以到 1e-3。共用学习率的结果往往是视觉学太慢、策略学太快,整体表现不上不下。判断办法是看训练曲线:如果 loss 掉得很快但 rollout 成功率不上涨,多半是策略头在"背"训练集,视觉根本没学会。
第二是 batch size 和数据量的匹配。数据量在 500 条以内时,batch size 超过 128 会让行为克隆过早拟合演示分布,建议取 32-64;数据量到几千条,再把 batch 拉上去,训练速度收益才明显。知识库里的 batch size 建议是绑数据量给出的,单独抄一个数字没有意义。
第三是动作平滑正则的权重。很多实现会在动作损失上加平滑项,权重太大会让策略"不敢动",末端轨迹像钝角在画线;太小又会高频抖动。经验值是先给 1e-4,然后看 rollout 轨迹的加速度曲线,出现抖动就往上加一个数量级。注意平滑正则只该加在相邻动作步的差值上,加在绝对动作上会把策略整体拉偏。
4. Robot Learning 复现避坑手册:五个典型翻车点
这一章是血泪经验的浓缩。32 条知识里有一半是别人踩过的坑,另一半是我自己踩出来的。下面五条按出现频率排序,每一条都是"现象 → 原因 → 解决"的标准结构,可以直接对号入座。
4.1 数据采集与时间同步的坑
现象:训练 loss 正常下降,验证 loss 也很低,但一到真机 rollout,机械臂像"反应慢半拍",动作总是滞后,抓取老是差一帧。
原因:采集数据时 obs 和 action 用了两条线程的时间戳,或者干脆没打时间戳,训练时模型学到的是"用第 t 帧的观测去预测第 t-k 帧的动作"。仿真里没有控制延迟,所以验证时不暴露,真机一上就露馅。
解决:采集脚本里给每条 obs-action 对打同一个时钟的时间戳,训练前做对齐检查,统计 action 和下一帧 obs 的时间差,超过一个控制周期直接报警。检查方法也简单:对同一段演示,把图像帧和关节角曲线画在一起,看动作开始变化的那一帧和图像里物体被碰到的帧是否对齐,差几帧一目了然。我的习惯是采集端每 100 条打印一次时间戳偏差的中位数,稳定在 5ms 以内才继续。
4.2 训练与评估切分的坑
现象:训练集 success rate 冲到 95% 以上,validation 却只有 20%,反复调参都拉不起来。
原因:按帧切分 train/val 了。行为克隆的数据是时间序列,同一段演示的前半段进了训练集、后半段进了验证集,模型相当于"看到了答案的开头"。验证集泄漏让评估失去意义,还给人一种"训练不正常"的错觉,浪费大量调参时间。
解决:按 episode 切分,演示文件以整个 npz 为单位划入一边,绝不在文件内部按帧切。切完后用文件名哈希检查验证集与训练集是否完全无重叠。还有一个配套细节:如果做了数据增强,增强变换的随机 seed 也要按 episode 固定,否则同一段演示的不同增强版本会出现在两边,造成另一种泄漏。评估脚本不要复用训练脚本的数据加载器,训练加载器里通常带增强和打乱,评估时用它会引入随机性。
4.3 训练超参与收敛的坑
现象:照抄知识库推荐的学习率和 reward 权重,训练直接发散,loss 冲到 NaN 或者震荡下不来。
原因:知识库里的参数是"绑定观测尺度"的。原任务把关节角归一化到了 [-1,1],你直接喂弧度制,同样学习率下梯度尺度差了 57 倍,发散是必然的。这个问题在照抄任何开源配置时都会出现,不只在 Robot Learning 里。
解决:所有数值型观测先归一化再接网络。图像归一化到 0-1,关节角用均值方差归一化,末端位置按工作空间范围缩放。归一化做完,再把学习率调回推荐值,一般就能恢复收敛。排查顺序我固定为:先查观测尺度,再查学习率,最后查梯度裁剪。因为尺度错误是根因,后两个只是放大器。如果还发散,检查是否用了混合精度,float16 下 loss 出现 NaN,先降梯度裁剪阈值,再关掉 AMP 对比一轮。
4.4 仿真参数与 sim2real 的坑
现象:仿真里 success rate 95%,真机 30%,失败样式高度统一——都是"碰了一下就滑走"。
原因:domain randomization 只随机了视觉(光照、纹理、相机噪声),没随机动力学。仿真里的摩擦系数和真机不一致,模型学到了"按仿真摩擦系数规划接触",真机摩擦小,手一碰物体就滑。这是最典型的"仿真评估虚高"来源。
解决:把摩擦系数、物体质量、关节阻尼加进随机范围。摩擦系数按真机标定值 ±30% 均匀采样,物体质量 ±50% 采样。每加一个动力学参数单独跑一轮评估,不要一把全加上,否则结果变好了也说不清是哪个参数起的作用。还有一个检查项:仿真里物体的初始位姿是否精确可读。如果策略学会了偷看初始位姿,真机上这个信息带噪声,表现必然崩。判断方法是评估时给初始位姿人为加噪声,成功率掉得越多,说明模型越依赖这个泄漏特征。
4.5 评估与方法论的坑
现象:模型 A 比 B 的 success rate 高 10 个点,换一个初始位姿分布之后结论反过来了。
原因:评估时初始位姿分布和 seed 没固定。机器人任务对初始状态极度敏感,物体位置偏 2cm,成功率能差 20 个点。不固定评估条件,所有对比都是玄学,调参调了个寂寞。
解决:评估脚本里固定 seed,物体初始位姿从预生成的候选列表里采样,候选列表在实验开始前用固定 seed 生成一次并保存。每次跑评估用同一个列表、同一个 seed,只允许训练权重不同,这样出来的差异才有资格叫"提升"。我还会把评估日志和候选列表文件一起归档,事后排查"上次结果怎么来的"时不需要靠记忆。
5. 从知识库到 scalable robot learning:把 general flow 接进工作流
这一章把 32 条知识往上再走一步,回答一个很多人问过我的问题:知识库能帮我上新范式吗?能,但路径比想象中窄。
5.1 general flow as foundation:为什么 flow 类方法适合当底座
最近这个方向的核心主张是 "general flow as foundation affordance for scalable robot learning"。翻译成落地语言:与其为每个任务训练一个专用策略,不如先学一个通用的动作流模型,再让模型输出可供下游使用的 affordance——也就是在当前状态下,哪些动作是可行的、哪些动作是能成的。
flow matching 类方法在机器人领域的价值在于把"策略"和"动作分布"解耦。行为克隆直接回归动作,本质是拟合条件均值;diffusion policy 用去噪步进逼近分布;再做一步,就是用 flow matching 在观测条件下学一个从噪声到动作的连续变换场。这个场的意义是天然支持多峰动作,而且可以在任务之间共享。抓杯子的 flow 和放杯子的 flow 有共同结构,能互相初始化,这正是"scalable"的来源——新任务不用从零训起。这也是为什么 flow 类方法更适合做 foundation:它输出的不是孤立的动作,而是带方向性的转移场,下游策略和上层规划都能消费这个场。
知识库在这里的角色是"地基层"。32 条里关于观测空间、数据量、动作空间、仿真选型的结论,在 flow 类方法上一视同仁地适用,甚至更关键。flow 模型对观测噪声比回归模型更敏感,因为它是逐点拟合矢量场,观测一旦塌掉,整个场的梯度方向就乱了。换句话说,前 10 条观测知识是 general flow 能成立的前提条件,省不掉。
很多人把 flow 模型当黑匣子,觉得采样出来的动作不可解释。实际上 flow 场本身是可可视化的:把同一观测下的多条采样轨迹画出来,你会看到轨迹簇集中在物体可抓取的几个方位,这些簇就是 affordance 的实体形态。知识库里的评估条目正好用来量化这些簇的成功率,而不是靠肉眼判断。
5.2 落地路径:用知识库的仿真栈验证 affordance 假设
想从单任务行为克隆升级到 general flow 工作流,我不会直接上真机,而是先在知识库对应的仿真栈里做三步验证。这三步每一步都对应知识库里的若干条目,如果某一步失败,先回头查对应条目,而不是换模型。
第一步,选一个接触类任务,比如推箱子或抓取,采集多初始位姿的演示数据。数据量按知识库的"数据量下限"翻三倍,因为 flow 模型要覆盖更宽的分布,数据太少学出来的流场是"一条线",不是"一个场"。数据采集策略直接复用 2.2 里的混合比例,不需要另起炉灶。
第二步,训练一个 flow matching 策略。训练时重点看两个指标:生成的 action 轨迹是否平滑,同一观测下多次采样的动作多样性是否足够。多样性太低说明 flow 塌缩回了均值回归,优先检查去噪步数和学习率;轨迹不平滑则加平滑正则,正好用得上 3.3 里那条参数经验。如果这一步失败,先别怀疑模型容量,回知识库查观测归一化和数据量这两条,十次有八次是这两处的低级问题。
第三步,做 affordance 评估。固定当前观测,采样 N 条动作轨迹分别 rollout,统计成功率,把成功率高的轨迹区域标记为当前状态的 affordance 分布。这一步把"模型会做什么"升级成了"模型能做成什么",是 scalable robot learning 最实用的评估思路,也直接回答"这个知识库值不值得投入"。
# affordance_score.py:固定观测,采样多条 flow 动作轨迹并统计成功率 def sample_and_score(policy, obs, env, N=20): """从流场采样 N 条轨迹,逐条 rollout,返回成功率与轨迹分布""" scores = [] for _ in range(N): action_seq = policy.sample_flow(obs, steps=8) # 8 步去噪,先稳后快 success = env.rollout(obs, action_seq) # 逐条跑完才算数 scores.append(success) # affordance 藏在这批采样里:成功率高的轨迹方向是可复用的动作基元 print(f"采样 {N} 条,成功 {sum(scores)} 条") return scores逻辑说明:sample_flow 每次从噪声出发走 8 步去噪,得到一条完整动作序列;env.rollout 把序列逐条执行到底,返回是否成功。统计的是"成功率高的轨迹区域"而不是单条最优轨迹,这正是 affordance 和普通策略评估的区别。
参数说明:N 的起始值是 20,任务分布复杂就加到 50,N 太小统计不可靠,N 太大 rollout 时间翻倍;steps=8 是推理步数,步数越多动作越精细但推理延迟线性上涨。真机场景先压到 4 步看成功率损失,控制在控制周期内优先。配套一个参数速查表:
| 阶段 | 关键参数 | 建议起始值 | 调整方向 |
|---|---|---|---|
| 数据量 | 单任务演示数 | 知识库下限 ×3 | 多样性不足就加 |
| flow 训练 | 去噪步数 | 8-16 | 步数多则动作更细但推理变慢 |
| flow 训练 | 学习率 | 1e-4 | 轨迹抖动就降 |
| affordance 评估 | 采样数 N | 20 | 分布复杂就加到 50 |
提示:flow 推理步数是最容易忽略的瓶颈。8 步和 16 步在成功率上可能只差 2 个点,推理延迟却翻倍,真机上可能直接错过控制周期。先定延迟上限,再谈步数。
6. 留一法验证:找出 32 条里最值钱的一条
把 32 条全照做,不代表你有判断力;能指出哪一条不做会死,才算真懂。我现在的习惯是每换一个任务领域,先做一轮留一法验证。
做法很短:固定一个任务,把 32 条全部落实,跑出基线 success rate;然后每次刻意违反其中一条,比如故意把观测归一化去掉、故意按帧切验证集、故意不固定评估 seed,重新训练并记录成功率变化。每轮只违反一条,改动像独立变量,排出来就得到这份知识库在当前任务上的敏感度排序。
这条敏感度排序比知识库本身更有价值。我做过两轮之后发现,抓取任务里观测时间戳对齐和评估 seed 固定贡献了 70% 以上的成功率差异,而历史帧堆叠的敏感度很低,因为任务本身慢,单帧信息足够。每个团队的任务不一样,固定的条目权重只能当参考,留一法才是你自己的结论。
这个习惯救过我一次:之前一个项目在仿真里反复调了很久都没突破 90%,留一法一跑,发现是按帧切分验证集这条被违反了,评估一直在泄漏,改掉直接越过 95% 门槛。所以我现在开任何新任务,前三天不调模型,只做两件事:跑一遍 verify_obs.py,再跑一遍留一法验证。希望帮到你。
本文还有配套的精品资源,点击获取