前言
没想到今年年初的斯坦福mobile aloha的热度刚过,而到今年2月的下旬,斯坦福另一个团队又推出了UMI刷盘机器人,且这两个团队还互相认识、还在一块共同切磋(顺带小小感叹一下,斯坦福的氛围是真好而且真高产)
斯坦福UMI刷盘机器人
- 其与mobile aloha(以及AirExo: Low-Cost Exoskeletons for Learning Whole-Arm Manipulation in the Wild)最大的不同在于其收集数据处理的非真实的机器人,而是一个手持夹持器(从而大幅降低成本)
- 而其与此文《模仿学习的集中爆发:从Dobb·E、Gello到斯坦福Mobile ALOHA/UMI、FMB、DexCap》中第一部分的纽约大学Dobb·E最大的不同,则在于Dobb·E需要针对特定环境进行动作策略上的微调,而UMI面对陌生环境有比较好的泛化能力
后来,我们总算和合作伙伴共同把斯坦福的UMI、DexCap成功复现了(应该是国内最早复现这两模型的团队或之一了),然后接下来会把这两者的所有硬件全部换成国产平替
- 至于复现过程中所遇到的问题或困难,如群内的姚博士所说,“说实话github上逻辑很顺的,如果只是复现原视频难度不大,主要还是要想训练自己的功能,所有的算法逻辑都要很熟悉才可以
UMI的环境直接用了docker,预训练数据都有的
其实主要问题他们在论文中也说了,就是视觉SLAM,其实这种方法信息量还是不够的,成功率没那么高,最终还是要增加数据源 ” - 为不断扩大整个大模型机器人的开发队伍,需要从课程中选拔更多人才
故推出:大模型机器人(具身智能)线下营 [实操20万的实体机器人],欢迎加入
第一部分 比Mobile Aloha成本更低的UMI刷盘机器人
1.1 斯坦福UMI的主要特点和手持夹持器的设置
24年2.19,斯坦福和哥伦比亚大学、丰田研究所的研究者(Cheng Chi、Zhenjia Xu等8人)发布了一个通用操控界面UMI,借助这个UMI,可以自由的完成刷盘等各种任务
其主要特点有:
- UMI本质是一个用于数据收集和策略学习的框架,其使用手持夹持器可以简单快速且低成本的收集一系列训练机器人的数据
- 且其更考虑了三方面的延迟:机器人观察环境存在延迟(传感器导致)、拿到环境数据后做推理有延迟、推理完成到做出动作亦有延迟
- 使用鱼眼镜头感知环境,且通过改造SLAM与GoPro内置的IMU传感器结合使用,并在夹持器上的两端各自添加一面镜子,以提供立体观察
如下图所示,从左到右分别表示人类做示范的手持夹持器、观测空间、机器人设置,其中
①是一个相机,④是“相机① ”中自带的IMU感知姿态跟踪器
②是带有广角视野的鱼眼镜头,③是两个侧面镜用于提供立体视觉,⑤是对夹持器的跟踪
⑥是基于运动学的数据过滤
这六个部分的细节很快将在下文逐一阐述 - 使用扩散策略进行动作预测,当然,也可以换成mobile aloha所用的ACT算法
扩散策略的更多细节在本文第三部分进行阐述
1.1.1 GoPro摄像头、鱼眼镜头、侧面镜、IMU感知跟踪
首先,在手腕上安装一个GoPro摄像头作为输入观察,此外,无需任何外部摄像头设置。之后在机器人上部署UMI时,将GoPro摄像头放置在与手持夹持器上的相同位置相对应的同一3D打印手指处
其次,如下图所示,如果将一个大的155°视场图像矫正为针孔模型会严重拉伸外围视野(蓝线外),同时将中心最重要的信息压缩到一个小区域(红线内),故UMI策略使用原始鱼眼图像作为观测
接着,为看弥补单目相机视野中缺乏深度感知的问题,在相机的左右两端分别放置了一块镜子,如下图所示,UMI侧面镜。超广角相机与位置合理的镜子相结合,实现了隐式立体深度估计
- (a):每个镜子的视角有效地创建了两个虚拟相机,其姿态相对于主相机沿镜子平面反射
- (b):盘子上的番茄酱在主相机视野中被遮挡,但在右侧镜子内可见,证明镜子模拟具有不同光学中心的相机
- (c):对镜子内的内容进行数字反射以进行策略观察。 请注意,在反射后,杯子把手的方向在所有3个视图中保持一致
最后,UMI通过利用GoPro内置的能力来记录IMU数据(加速度计和陀螺仪)到标准的mp4视频文件中(UMI captures rapid move-ments with absolute scale by leveraging GoPro’s built-incapability to record IMU data (accelerometer and gyroscope) into standard mp4 video files)
通过联合优化视觉跟踪和惯性姿态约束,基于OBR-SLAM3的惯性单目SLAM系统(By jointly optimizing visual tracking and inertial pose constraints, our Inertial-monocular SLAM system based on OBR-SLAM3 [7]),即使在视觉跟踪失败(如运动模糊或缺乏视觉特征,例如俯视桌子)的情况下,仍能维持一段时间的跟踪
1.1.2 连续夹持器控制与基于运动学的数据过滤
与之前的机器人一般使用的二进制开合动作(要么抓住、要么放开),但如果连续指定夹持器的夹持宽度则可以执行更多任务,比如投掷一个球时,需要在一个准确的时刻来扔掉物体
由于物体具有不同的宽度,二进制的抓放动作很难满足精度要求。 在UMI夹爪上,通过基准标记连续跟踪指宽,从而通过使用系列-弹性末端执行器原理,UMI可以通过调节软手指的变形来隐式记录和控制抓握力,最终连续控制抓手宽度(finger width is continuously tracked via fiducial markers [16] (Fig. 2 left). Using series-elastic end effectors principle [42], UMI can implicitly record and control grasp forces by regulating the deformation of soft fingers through continuous gripper width control)
此外,虽然数据收集过程是机器人不可知的,我们应用简单的基于运动学的数据过滤来选择不同机器人实体的有效轨迹
具体而言,当知道机器人底座的位置和它的运动学特性时,使用SLAM技术得到终端执行器(如机器人手臂的末端)的精确位置信息,可以帮助我们对演示数据进行运动学和动力学的可行性分析。通过在这些经过筛选的数据集上进行训练,可以确保机器人的行为策略不仅是可行的,而且符合其结构的特定运动限制(when the robot’s base location and kinematics are known, the absolute end-effector pose recovered by SLAM allows kinematics and dynamics feasibility filtering on the demonstration data. Training on the filtered dataset ensures policies comply with embodiment-specific kinematic constraint)
最终,UMI夹持器重量为780g,外部尺寸为 L310mm × W 175mm ×H210mm,手指行程为80mm
3D打印的夹持器的BoM成本为 $73,而GoPro相机及配件的总成本为 $298
说白了,不含「计算电脑和那两UR5机械臂」的仅用于数据收集的硬件成本为400刀,当然 好的机械臂才贵
1.2 UMI的策略接口设计
正如人在路上开车一样
- 从开始观察到真正感知到环境时 有观测反应时间,即观测延迟
而感知到环境做决策时,则有决策时的反应时间,即推理延迟
最后,决策好之后 做出行动 也会有一个执行时间,即执行延迟 - 机器人在实际操控当中,也是类似的,也会一一存在
观察延迟(observation latency):
策略推断延迟(policy inference latency):
执行延迟(execution latency):
,且简单地丢弃过时的动作,只执行每个硬件在
之后具有所需时间戳的动作
下图表示的是UMI 策略接口设计
- (b) UMI 策略接收一系列同步观察结果(RGB 图像、6自由度末端执行器姿态、和夹持器宽度),并输出一系列期望的末端执行器姿态和夹持器宽度作为动作
相当于先感知环境,然后做出动作预测 - (a) 同步不同的观察流,以弥补物理测量的延迟
- (c) 提前发送动作命令以补偿机器人的执行延迟
为方便大家理解,把上图中的英文描述翻译如下
1.3 完成刷盘的任务
1.3.1 刷盘任务的拆解
任务机器人需要执行7个步骤顺序地独立动作(打开水龙头、抓住盘子、拿起海绵、洗涤并擦拭盘子直到番茄酱被清除、放置盘子、放置海绵并关闭水龙头),如下图所示
能力这项任务从几个方面推动了机器人操纵能力的边界:
- 这是一个超长视野任务,每个步骤的成功都依赖于前一个步骤
- 机器人需要感知和操纵复杂的流体,包括牛顿流体(即,水)和非牛顿流体(即,番茄酱)
- 擦拭动-作需要使用一个可变形工具(即,海绵)同时协调双臂相对于水流
- 操纵受限关节物体(即,打开和关闭水龙头)需要由软指提供的机械顺应性
- 策略也需要对“清洁度”的概念语义上的鲁棒性。当在洗涤过程中或即使洗涤阶段完成后添加了额外的番茄酱时,机器人需要继续洗涤和擦拭
1.3.2 微调一个CLIP预训练的ViT-B/16视觉编码器来训练扩散策略
对于这项任务,UMI通过微调一个CLIP 预训练的ViT-B/16视觉编码器来训练扩散策略
看到这句话时,我的第一反应是这个视觉编码器和DALLE 2在CLIP阶段所用的视觉编码器是一个意思,即下图右上角的img encoder(来自此文:从CLIP到DALLE1/2、DALLE 3、Stable Diffusion、SDXL Turbo、LCM )
总的来说,UMI达到了14/20 =70%的成功率。 此外,他们还展示了他们的策略对各种干扰物、酱料类型(芥末、巧克力糖浆、焦糖糖浆)以及对扰动的鲁棒性
而没有CLIP预训练的ViT视觉编码器「比如从头训练ResNet-34 [17]则任务完成度不行」,比如带有ResNet-34的基线策略学会了一种非反应性行为,并忽略了任何盘子或海绵位置的变化。 因此,它不能执行任务,0/10 = 0%
第二部分 UMI的硬件安装指南
2.1 详细的3D打印/组装教程(引用来源)
- 3D打印教程: https://youtu.be/EJmAg1Bnp-k
- 夹持器组装教程:https://youtu.be/x3ko0v_xwpg
2.2 材料清单
Part | Quantity | Link | Price (per unit) |
夹持器Gripper Body | ~$62 | ||
eSUN PLA PRO Warm White 1kg | 0.5 | $24.99 | |
MGN9C 150mm Linear Rail | 2 | $17.89 | |
M3 Screws and Nuts 14x M3x8mm 2x M3x12mm 4x M3x25mm 6x M3x35mm | 0.5 | $22.99 | |
Compression Spring 10mm OD 0.7mm Wire size 50mm Free length | 0.2 | $5.49 | |
M5 Nut | 1 | ||
Plastic Stick-on Mirror | $9.99 | ||
Super Lube-21030 | $10.00 | ||
Double-sided Tape | $9.99 | ||
Printed ArUcO tags (US letter) | |||
Gripper Finger | ~$11 | ||
Polymaker TPU 95A Orange 750g | 0.25 | $29.99 | |
3M TB641/GM641 Grip Tape 1 inch wide 1ft | 0.07 | $54.14 | |
GoPro Camera | ~$298 | ||
GoPro Hero9 | 1 | $209.99 | |
GoPro Max Lens Mod 1.0 | 1 | $69.29 | |
Micro SD Card V30 Rated | 1 | $17.99 |
For all-day operations, consider purchasing 2x more batteries per gripper and one battery charger per gripper.
以上总费用(美元):$399.41,相当于400刀
总费用(人民币):¥2875.72
2.3 CAD Models
2.4 3D printing instructions
Checkout our CURA 3mf examples for more detailed parameters:
https://drive.google.com/drive/folders/15vFeCd-fEt-NOYkRXebhpDGm5D2zX3MM?usp=sharing
Common Print Parameters (PLA+):
Nozzle diameter: 0.6mm
Layer height: 0.3mm
Wall thickness: 1.2mm
Top-bottom thickness: 1.2mm
Infill: 20% Gyroid
Temperature: 190C for eSun PLA+
Finger Print Parameters (TPU):
Nozzle diameter: 0.6mm
Layer height: 0.3mm
Infill: 100% lines
Temperature: 255C for polymaker TPU 95A
Part specific print parameters:
Part | Infill % | Support? | Wall mm | Top-bottom mm |
Print 1: gripper_covers | ||||
bottom_plate | ||||
top_plate | ||||
Print 2: gripper_internals | ||||
grip | 100 | 1.8 | ||
handle | ||||
Cube | ||||
finger_holder_left/right | Yes | |||
gear_left/right | ||||
linkage_left/right | 2.4 | 1.8 | ||
Print 3: gripper_fingers | ||||
finger | 100 |
2.5 Photos
Reference for the position and orientation of ArUcO tags. Please note that left and right grippers have different tags! The ArUcO tags on the large cube are currently unused by the algorithm therefore completely optional.
Tag PDF for printing:
https://drive.google.com/drive/folders/1pCiuABTyev7k4EWJ3LQ-zKz3ZHjzeIDF?usp=sharing
2.6 Deployment Hardware Building Guide
Bill of Materials (per-arm)
Part | Quantity | Link | Price (per unit) |
Robot | |||
UR5e or UR5-CB3 robot (with power and ethernet cable) | 1 | By Quote | |
Weiss WSG-50 gripper (with power and ethernet cable, no fingers) | 1 | € 3875 | |
Camera System | ~$546.58 | ||
GoPro Hero9 | 1 | $209.99 | |
GoPro Max Lens Mod 1.0 | 1 | $69.29 | |
GoPro Media Mod | 1 | $79.99 | |
Elgato HD60 X Capture Card | 1 | $147.34 | |
Micro HDMI to HDMI cable 15 ft | 1 | $12.99 | |
USB-C to USB-A cable 10ft | 2 | $13.49 |
以上的总费用为:$546.58(¥3935) + 两个Weiss WSG-50€ 3875 x 2(差不多¥6万) + UR5e机器人(2台大概¥30万-50万之间) = 差不多36-56万
第三部分 Diffusion Policy:基于CNN或Transformer
如我组建的mobile aloha复现团队里的邓老师所说,mobile aloha也用了 diffusion,不过是作为对比实验的打击对象来用的
下面,我们便根据Columbia University、Toyota Research Institute、MIT的研究者(Cheng Chi, Siyuan Feng, Yilun Du, Zhenjia Xu, Eric Cousineau, Benjamin Burchfiel, Shuran Song等人,标粗的表示同时也是UMI的作者)联合发布的《Diffusion Policy:Visuomotor Policy Learning via Action Diffusion》这篇论文详细解读下Diffusion Policy
3.1 什么是Diffusion Policy
所谓扩散策略,是指将机器人的视觉运动策略表示为条件去噪扩散过程来生成机器人行为的新方法,如下图所示
- a)具有不同类型动作表示的显式策略(Explicit policy with different types of action representations)
- b)隐式策略学习以动作和观察为条件的能量函数,并对最小化能量景观的动作进行优化(Implicit policy learns an energy functionconditioned on both action and observation and optimizes for actions that minimize the energy landscape)
- c)通过“条件去噪扩散过程在机器人行动空间上生成行为”,即该扩散策略策略不直接输出一个动作,而是推断出基于视觉观察的动作-分数梯度,进行K次去噪迭代(instead of directly outputting an action, the policy infers the action-score gradient, conditioned on visual observations, for K denoising iterations)
进一步,为了充分释放扩散模型在物理机器人上进行视觉运动策略学习的潜力,作者团队提出了一套关键的技术贡献,包括将后退视界控制、视觉调节和时间序列扩散transformer结合起来
3.2 Diffusion for Visuomotor Policy Learning
虽然DDPM通常用于图像生成,但该团队使用DDPM来学习机器人的视觉运动策略。这需要针对DPPM的公式进行两大修改
- 之前输出的是图像,现在需要输出:为机器人的动作(changing the output x to represent robot actions)
- 去噪时所依据的去噪条件为观测Ot (making the denoising processes conditioned on input observation Ot)
具体来说,在时间步骤,策略将最新的
个观察数据
作为输入,并预测
个动作,其中
个动作在不重新规划的情况下在机器人上执行(在此定义中,
表示观测视野,
表示动作预测视野,而
则代表了动作执行视野)。这样做既促进了时间动作的一致性,又保持了响应速度
如下图所示
- a)一般情况下,该策略在时间步长
时将最新的
步观测数据
作为输入,并输出
步动作
General formulation. At time step t, the policy takes the latest To steps of observation data Ot as input and outputs Ta steps of actions At- b)在基于CNN的扩散策略中,对观测特征
应用FiLM(Feature-wise Linear Modulation)来调节每个卷积层通道
从高斯噪声中提取的减去噪声估计网络
的输出,并重复
次,得到去噪动作序列
「(这个过程是扩散模型去噪的本质,如不了解DDPM,请详看此文:《图像生成发展起源:从VAE、扩散模型DDPM、DETR到ViT、Swin transformer》」
In the CNN-based Diffusion Policy, FiLM (Feature-wise Linear Modulation) [Film: Visual reasoning with a general conditioning layer] conditioning of the observation feature Ot is applied to every convolution layer, channel-wise.
Starting from AtK drawn from Gaussian noise, the outputof noise-prediction network εθ is subtracted, repeating K times to get At0, the denoised action sequence.- c)在基于Transformer的扩散策略中,观测
的嵌入被传递到每个Transformer解码器块的多头交叉注意力层
每个动作嵌入使用所示注意力掩码进行约束,仅关注自身和之前的动作嵌入(因果注意)
In the Transformer-based [52]Diffusion Policy, the embedding of observation Ot is passed into a multi-head cross-attention layer of each transformer decoder block.
Each action embedding is constrained to only attend to itself and previous action embeddings (causal attention) using the attention mask illustrated.
总之,我们使用DDPM来近似条件分布,而不是Janner等人[20]用于规划的联合分布
。这种方式允许模型在观察为条件下预测动作,而无需推断未来状态(This formulation allows the model to predict actionsconditioned on observations without the cost of inferringfuture states),加快了扩散过程并提高生成动作的准确性
- 众所周知,从从高斯噪声中采样的
开始,DDPM执行
次去噪迭代,以产生一系列降低噪声水平的中间动作,
,直到形成所需的无噪声输出
(说白了,就是去噪)
该过程遵循下述所示的公式1
其中为通过学习优化参数的噪声估计网络,
为每次迭代时加入的高斯噪声
且上面的公式1也可以理解为一个单一的噪声梯度下降步长,定义为如下公式2
其中噪声估计网络有效地预测了梯度场
,
为学习速率
此外,公式1中的、
和
作为与迭代步长
相关的函数选择被称为噪声调度,可以理解为梯度下降过程中学习速率的调整策略。经证明,将
设定略小于1能够改善稳定性
再之后,训练过程首先从数据集中随机抽取未修改的样本。对于每个样本,我们随机选择一个去噪迭代
,然后为迭代
采样一个具有适当方差的随机噪声
然后要求噪声估计网络从添加噪声的数据样本中预测噪声,如下公式3
最小化公式3所示的损失函数也同时最小化了数据分布p(x0)和从DDPM q(x0)中提取的样本分布之间KL-散度的变分下界 - 为了获取条件分布
,将公式1修改为如下公式4
将训练损失由公式3修改为如下的公式5
3.2.1 网络架构的选型:CNN PK transformer
基于CNN的扩散策略中,采用Janner等人[21]的1D temporal CNN,并做了一些修改,如下图所示
- 首先,我们仅通过特征线性调制(FiLM),和对观测特征
的动作生成过程进行调节,并进行去噪迭代
,以建模条件分布
- 其次,我们仅预测动作轨迹,而非连接观测动作轨迹(we only predict the action trajectory instead of the concatenated observation action trajectory)
- 第三,利用receding prediction horizon,删除了基于修复的目标状态条件反射。然而,目标条件反射仍然是可能的,与观测所用的FiLM条件反射方法相同
we removed inpainting-based goal state conditioning due to incompatibility with our framework utilizing a receding prediction horizon.However, goal conditioning is still possible with the same FiLM conditioning method used for observations
在实践中发现,基于CNN的骨干网络在大多数任务上表现良好且无需过多超参数调优。然而,当期望的动作序列随着时间快速而急剧变化时(如velocity命令动作空间),它的表现很差,可能是由于时间卷积的归纳偏差[temporal convolutions to prefer lowfrequency signals],以偏好低频信号所致
为减少CNN模型中过度平滑效应[49],我们提出了一种基于Transformer架构、借鉴minGPT[42]思想的DDPM来进行动作预测,如下图所示
- 行动和噪声
作为transformer解码器块的输入tokens传入,扩散迭代
的正弦嵌入作为第一个token(Actions with noise At k are passed in as input tokens for the transformer decoder blocks, with the sinusoidal embedding for diffusion iteration k prepended as the first token)
观测通过共享的MLP转换为观测嵌入序列,然后作为输入特征传递到transformer解码器堆栈中(The observation Ot is transformed into observation embedding sequence by a shared MLP, which is then passed into the transformer decoder stack as input features)
“梯度”由解码器堆栈的每个对应输出token进行预测(The "gradient" εθ (Ot ,At k , k) is predicted by each corresponding output token of the decoder stack)
- 在我们的基于状态的实验中,大多数性能最佳的策略都是通过Transformer骨干实现的,特别是当任务复杂度和动作变化率较高时。然而,我们发现Transformer对超参数更敏感
当然了,Transformer训练的困难[25]并不是Diffusion Policy所独有的,未来可以通过改进Transformer训练技术或增加数据规模来解决(However, we found the transformer to be more sensitive to hyperparameters. The difficulty of transformer training [25] is not unique to Diffusion Policy and could potentially be resolved in the future with improved transformer training techniques or increased data scale)
故,一般来说,我们建议从基于CNN的扩散策略实施开始,作为新任务的第一次尝试。但如果由于任务复杂性或高速率动作变化导致性能低下,那么可以使用时间序列扩散Transformer来潜在地提高性能,但代价是额外的调优(In general, we recommend starting with the CNN-based diffusion policy implementation as the first attempt at a new task. If performance is low due to task complexity or high-rate action changes, then the Time-series Diffusion Transformer formulation can be used to potentially improve performance at the cost of additional tuning)
3.2.2 视觉编码器:把图像潜在嵌入化并通过扩散策略做端到端的训练
视觉编码器将原始图像序列映射为潜在嵌入,并使用扩散策略进行端到端的训练(The visual encoder maps the raw image sequence intoa latent embedding Ot and is trained end-to-end with thediffusion policy)
不同的相机视图使用不同的编码器,以对每个时间步内的图像独立编码,然后连接形成,且使用标准的ResNet-18(未进行预训练)作为编码器,并进行以下修改:
- 使用空间softmax池化替代掉全局平均池化,以维护空间信息
1) Replace the global average pooling with a spatial softmax pooling to maintain spatial information[29] - 采用GroupNorm代替BatchNorm来实现稳定训练,这个修改对于把归一化层与指数移动平均一起使用时(通常应用于DDPM)很有必要
2) Replace BatchNorm with GroupNorm [57] for stabletraining. This is important when the normalization layer isused in conjunction with Exponential Moving Average [17](commonly used in DDPMs)
3.3 扩散策略的稳定性与好处
3.3.1 动作序列预测的好处
由于高维输出空间采样困难,在大多数策略学习方法中一般不做序列预测。例如,IBC将难以有效地采样具有非光滑能量景观的高维动作空间。类似地,BC-RNN和BET难以确定动作分布中存在的模式数量(需要GMM或k-means步骤)
相比之下,DDPM在不降低模型表现力的前提下,在输出维度增加时仍然保持良好扩展性,在许多图像生成应用中已得到证明。利用这种能力,扩散策略以高维动作序列的形式表示动作,它自然地解决了以下问题:
- 时间动作一致性,如下图所示,为了将T块从底部推入目标,策略可以从左或右绕T块走
然而,如果序列中的每个动作被预测为独立的多模态分布(如在BC-RNN和BET中所做的那样)。连续动作可能会从不同模式中提取出来,并导致两个有效轨迹之间交替出现抖动动作
However, suppose each action in the sequence is predicted as independent multimodal distributions (as done in BCRNN and BET). In that case, consecutive actions could be drawn from different modes, resulting in jittery actions that alternate between the two valid trajectories. - 对于空闲动作的鲁棒性:当演示暂停并导致相同位置或接近零速度的连续动作序列时,则会发生空闲行为。这在远程操作等任务中很常见
然而,单步策略容易过度适应这种暂停行为。例如,在实际世界实验中使用BC-RNN和IBC时经常会卡住,未删除训练数据集中包含的空闲行为(BC-RNN andIBC often get stuck in real-world experiments when the idleactions are not explicitly removed from training)
// 待更
3.3.2 扩散模型在训练中的稳定
隐式策略使用基于能量的模型(EBM)表示动作分布(An implicit policy represents the action distribution using an Energy-Based Model (EBM)),如下公式6所示:
其中是一个难以计算的归一化常数(相对于a)
为了训练用于隐式策略的EBM,使用了infonce风格的损失函数,它相当于公式6的负对数似然
在实践中,负采样的不准确性会导致EBMs的训练不稳定[11,48]
而扩散策略和DDPM通过建模公式6中相同动作分布的得分函数[46],回避了的估计问题:
因此,扩散策略的推理过程(公式4)和训练过程(公式5)都不涉及对的评估,从而使扩散策略的训练更加稳定
// 待更
第四部分 UMI代码的整体解读
注意,以下解读基本来自我司大模型项目组的远根同学,之所以分享其中的部分出来,是想招纳可以针对UMI共同做二次开发的朋友,如有意敬请私我
4.1 Download example data 下载示例数据
数据集包含以下三个部分
4.3.1 一个夹爪校准视频
GX010214.mp4
4.3.2 几个收集的任务演示数据视频
GX010215.mp4
GX010232.mp4
GX010234.mp4
GX010236.mp4
GX010238.mp4
4.3.3 一个SLAM地图视频
mapping.mp4
4.2 Run SLAM pipeline 运行 SLAM 管道
整个pipeline用于提取收集到的gopro数据,进行数据处理。
最终目的:使用GoPro数据恢复机器人动作。
具体分为以下步骤:
4.2.0 00_process_videos.py
上一个下载的所有示例数据,把目录结构进行整理。
每个视频都要单独处理,用ExifTool 工具包,提取每个视频的相机序列号+拍摄时间,作为文件夹的名称,每个视频放入各自的文件夹内
4.2.1 01_extract_gopro_imu.py:提取gopro惯性测量单元数据(imu)
这步用于提取gopro惯性测量单元数据(imu),提取方式是拉的docker镜像,直接使用的外部仓库:GitHub - urbste/OpenImuCameraCalibrator: Camera calibration tool
且是C++写的,直接看提取结果,保存在imu_data.json文件中,总共提取了6种数据:GoPro Tags,这六种数据分别如下所示
4.2.1.1 ACCL (Accelerometer)加速度计
加速度计测量物体在三个方向上的加速度,通常分别是 X 轴、Y 轴和 Z 轴。这些数据用于检测物体的运动和方向变化,共有四个值
- value:代表了三个轴的加速度值:x 轴、y 轴和 z 轴。单位:m/s2
- cts: 采样的时间戳,可能表示这个数据点是在第x个采样时钟周期中采集的
- data: 采样的日期和时间
- temperature: 采样的温度
{
"value":[8.37410071942446,0.5875299760191847,4.9352517985611515],
"cts":78.018,
"date":"2024-01-10T18:54:47.109Z",
"temperature [°C]":51.544921875
}
4.2.1.2 GYRO (Gyroscope)陀螺仪
陀螺仪测量物体在三个方向上的角速度,即物体围绕每个轴旋转的速度。陀螺仪用于确定物体的姿态和运动状态,对于检测旋转和倾斜非常有效。
- value:代表了三个轴的角速度:x 轴、y 轴和 z 轴,单位:rad/s
- cts: 采样的时间戳
- data: 采样的日期和时间
- temperature: 采样的温度
{
"value":[0.06496272630457935,0.0724174653887114,-0.027689030883919063],
"cts":78.018,
"date":"2024-01-10T18:54:47.109Z",
"temperature [°C]":51.544921875
}
4.2.1.3 GPS5 (Global Positioning System)全球定位系统
GPS 传感器提供位置数据,包括经度、纬度、高度以及速度。GPS 数据用于定位和导航
// 待更
4.2.1.4 CORI( Camera Orientation)相机姿态
通常用于图像处理和计算机视觉领域,用于描述图像在三维空间中的方向和位置。
- value:代表了三个轴的加速度值:x 轴、y 轴和 z 轴。
- cts: 采样的时间戳
- data: 采样的日期和时间
- temperature: 采样的温度
{
"value":[0.999969481490524,0.002044740134891812,0.0016174810022278512,-0.0003662221137119663],
"cts":80.255,
"date":"2024-01-10T18:54:47.109Z"
}
4.2.1.5 IORI(Image Orientation)图像姿态
// 待更
4.2.1.6 GRAV (Gravity Vector)重力向量
// 待更
4.2.2 02_create_map.py
处理mapping地图视频数据,并生成地图。主要是用Docker来运行外部库ORB_SLAM3(Simultaneous Localization and Mapping,即同时定位与地图构建)系统
输入:上文《4.2.1 01_extract_gopro_imu.py:提取gopro惯性测量单元数据(imu)》中的的imu_data.json 和 原MP4视频
输出:
- mapping_camera_trajectory.csv
这是SLAM系统生成的相机轨迹文件,通常包含了相机在空间中的位置和方向信息
1) frame_idx:帧索引,表示该帧在视频中的顺序编号
2) timestamp: 时间戳,表示该帧的拍摄时间,通常是以秒或毫秒为单位
3) state:状态字段,通常用于表示SLAM系统的当前状态,例如是否初始化、是否丢失、是否关键帧等
4) is_lost:是否丢失标志,表示该帧是否丢失或无法追踪
5) is_keyframe:是否关键帧标志,表示该帧是否被选为关键帧,关键帧是SLAM中用于地图构建的重要帧
6) x、y、z:相机在三维空间中的平移坐标
7) q_x、q_y、q_z、q_w:相机姿态的四元数表示,用于描述相机的旋转。其中, q_x、q_y、q_z 分别表示轴向量的xyz分量,q_w 是四元数的第一个元素,表示旋转的轴向量 - map_atlas.osa
这个文检是个二进制文件,无法打开,一般是map_atlas.osa 文件是一个专用的 ORB_SLAM3 地图文件格式,它不是公开的标准格式,所以没有具体的公开文档说明其内部结构。
ORB_SLAM3 是用c++写的,所以,要看懂,需要掌握slam和c++编程。
不过,通常这类 SLAM系统的地图文件会包含以下类型的数据:
a) 关键帧数据:关键帧是 SLAM 系统中用于定位和地图构建的参考框架。它们通常包含了位置、姿态信息以及与之相关的地图点的标识符。
b) 地图点数据:地图点是 SLAM 系统中在环境中固定的特征点,如角点或边缘。它们在多个关键帧中被观测和记录,以帮助建立一个连续的位置估计。
c) 连接关系:关键帧之间的连接关系表示了时间上的连续性,这对于递归定位和构建地图至关重要。
d) 其他参数和信息:这可能包括与特定地图创建过程相关的参数,如滤波器的配置、重定位参数等
4.2.3 03_batch_slam.py
这个和上一步一样,上一步是mapping地图视频生成的轨迹信息,这步是批量生成任务演示数据的轨迹信息,
- 输入:原始mp4视频、上一步生成的map_atlas.osa、imu_data.json
- 输出:相机轨迹信息camera_trajectory.csv
和mapping_camera_trajectory.csv一样的内容
注意:生成轨迹不包括夹爪校准视频,也不生成map_atlas.osa
4.2.4 04_detect_aruco.py
4.2.5 05_run_calibrations.py
4.2.5.1 SLAM标签校准
4.2.5.2 夹爪范围的校准
4.2.6 06_generate_dataset_plan.py
4.2.6.1 相机坐标系到夹爪尖坐标系的转换
4.2.6.2 加载机器人夹爪的校准数据
4.2.6.3 提取每个视频的元数据
4.2.6.4 视频文件进行分组
4.2.6.5 识别每个视频中的夹爪硬件ID
4.2.6.6 确定每个摄像头在演示中的左右位置
4.2.6.7 准备模型训练的数据集
4.3 数据集转成模型训练的格式
4.3.1 数据存储在ReplayBuffer对象中
4.3.2 视频帧处理
4.3.2.1 转为RGB
4.3.2.2 标记检测
4.3.2.3 遮罩
4.3.2.4 鱼眼镜头
4.3.2.5 镜像处理
4.3.2.6 压缩图像
4.3.3 最终数据结构
4.4 Training Diffusion Policy 训练模型
4.4.1 入口 train.py
import sys
# use line-buffering for both stdout and stderr
sys.stdout = open(sys.stdout.fileno(), mode='w', buffering=1)
sys.stderr = open(sys.stderr.fileno(), mode='w', buffering=1)
import hydra
from omegaconf import OmegaConf
import pathlib
from diffusion_policy.workspace.base_workspace import BaseWorkspace
# allows arbitrary python code execution in configs using the ${eval:''} resolver
# 注册一个自定义解析器 “eval”,该解析器允许在配置文件中使用 Python 表达式,可以查看yaml文件
OmegaConf.register_new_resolver("eval", eval, replace=True)
#使用 Hydra 的 @hydra.main 装饰器定义主函数 main,函数接受一个 OmegaConf 配置对象作为参数。
@hydra.main(
version_base=None, # 表示不使用版本控制。
config_path=str(pathlib.Path(__file__).parent.joinpath(
'diffusion_policy','config')) # 指定了配置文件所在的路径。
)
def main(cfg: OmegaConf):
# resolve immediately so all the ${now:} resolvers
# will use the same time.
OmegaConf.resolve(cfg) # 解析配置文件中的所有变量
cls = hydra.utils.get_class(cfg._target_)
workspace: BaseWorkspace = cls(cfg)
workspace.run()
if __name__ == "__main__":
main()
--config-name是 Hydra 模块专用的,用于指定要使用的配置文件的基本名称。
task.dataset_path 是配置文件中的一个键,配置文件位于diffusion_policy/config/task/umi.yml中
这个配置文件通过--config-name=train_diffusion_unet_timm_umi_workspace.yaml 中继承:
# defaults 部分指定了嵌套的配置文件
defaults:
- _self_ # 表示当前文件
- task: umi # 表示另一个名为 umi 的配置文件
4.4.2 Model模型架构
作者做了很多实验,配置文件可以配置不同的模型,当前使用CLIP预训练的ViT-B/16视觉编码器来训练扩散策略
使用:vit_base_patch16_clip_224.openai(视觉编码器) + ConditionalUnet1D(扩散策略)
先用vit_base_patch16_clip_224.openai(视觉编码器)编码特征,在用这些特征给到ConditionalUnet1D(扩散策略)模型生成预测的动作
4.4.3 Dataset 训练集格式
4.4.3.1 先采样动作数据
4.4.3.2 再转换为适合神经网络输入的格式
4.4.4 Batch数据格式
4.4.5 输出
4.5 真实机械臂上部署
4.5.1 UR5机械臂和电脑的通讯方式
4.5.2 WSG50 夹具和电脑的通讯方式
4.5.3 ABB机械臂和电脑的通讯方式
4.5.4 其他国产替代夹具的通讯方式
4.5.5 改造代码
// 待更,当然如果着急的话,欢迎加入本文开头所说的「大模型机器人二次开发线下营」