赞
踩
没想到今年年初的斯坦福mobile aloha的热度刚过,而到今年2月的下旬,斯坦福另一个团队又推出了UMI刷盘机器人,且这两个团队还互相认识、还在一块共同切磋(顺带小小感叹一下,斯坦福的氛围是真好而且真高产)
斯坦福UMI刷盘机器人
24年2.19,斯坦福和哥伦比亚大学、丰田研究所的研究者(Cheng Chi、Zhenjia Xu等8人)发布了一个通用操控界面UMI,借助这个UMI,可以自由的完成刷盘等各种任务
其主要特点有:
首先,在手腕上安装一个GoPro摄像头作为输入观察,此外,无需任何外部摄像头设置。之后在机器人上部署UMI时,将GoPro摄像头放置在与手持夹持器上的相同位置相对应的同一3D打印手指处
其次,如下图所示,如果将一个大的155°视场图像矫正为针孔模型会严重拉伸外围视野(蓝线外),同时将中心最重要的信息压缩到一个小区域(红线内),故UMI策略使用原始鱼眼图像作为观测
接着,为看弥补单目相机视野中缺乏深度感知的问题,在相机的左右两端分别放置了一块镜子,如下图所示,UMI侧面镜。超广角相机与位置合理的镜子相结合,实现了隐式立体深度估计
最后,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]),即使在视觉跟踪失败(如运动模糊或缺乏视觉特征,例如俯视桌子)的情况下,仍能维持一段时间的跟踪
与之前的机器人一般使用的二进制开合动作(要么抓住、要么放开),但如果连续指定夹持器的夹持宽度则可以执行更多任务,比如投掷一个球时,需要在一个准确的时刻来扔掉物体
由于物体具有不同的宽度,二进制的抓放动作很难满足精度要求。 在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恢复的绝对末端执行器姿态允许在演示数据上进行运动学和动力学的可行性过滤。 在过滤后的数据集上训练确保策略符合特定于实体的运动学约束
最终,UMI夹持器重量为780g,外部尺寸为 L310mm × W 175mm ×H210mm,手指行程为80mm
3D打印的夹持器的BoM成本为 $73,而GoPro相机及配件的总成本为 $298
说白了,不含「计算电脑和那两UR5机械臂」的仅用于数据收集的硬件成本为400刀,当然 好的机械臂才贵
正如人在路上开车一样
下图表示的是UMI 策略接口设计
任务机器人需要执行7个步骤顺序地独立动作(打开水龙头、抓住盘子、拿起海绵、洗涤并擦拭盘子直到番茄酱被清除、放置盘子、放置海绵并关闭水龙头),如下图所示
能力这项任务从几个方面推动了机器人操纵能力的边界:
对于这项任务,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%
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.
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 |
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
如我组建的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
所谓扩散策略,是指将机器人的视觉运动策略表示为条件去噪扩散过程来生成机器人行为的新方法,如下图所示
进一步,为了充分释放扩散模型在物理机器人上进行视觉运动策略学习的潜力,作者团队提出了一套关键的技术贡献,包括将后退视界控制、视觉调节和时间序列扩散transformer结合起来
虽然DDPM通常用于图像生成,但该团队使用DDPM来学习机器人的视觉运动策略。这需要针对DPPM的公式进行两大修改
具体来说,在时间步骤,策略将最新的个观察数据作为输入,并预测个动作,其中个动作在不重新规划的情况下在机器人上执行(在此定义中,表示观测视野,表示动作预测视野,而则代表了动作执行视野)。这样做既促进了时间动作的一致性,又保持了响应速度
如下图所示
- 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),加快了扩散过程并提高生成动作的准确性
基于CNN的扩散策略中,采用Janner等人[21]的1D temporal CNN,并做了一些修改,如下图所示
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来进行动作预测,如下图所示
故,一般来说,我们建议从基于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)
视觉编码器将原始图像序列映射为潜在嵌入,并使用扩散策略进行端到端的训练(The visual encoder maps the raw image sequence intoa latent embedding Ot and is trained end-to-end with thediffusion policy)
不同的相机视图使用不同的编码器,以对每个时间步内的图像独立编码,然后连接形成,且使用标准的ResNet-18(未进行预训练)作为编码器,并进行以下修改:
由于高维输出空间采样困难,在大多数策略学习方法中一般不做序列预测。例如,IBC将难以有效地采样具有非光滑能量景观的高维动作空间。类似地,BC-RNN和BET难以确定动作分布中存在的模式数量(需要GMM或k-means步骤)
相比之下,DDPM在不降低模型表现力的前提下,在输出维度增加时仍然保持良好扩展性,在许多图像生成应用中已得到证明。利用这种能力,扩散策略以高维动作序列的形式表示动作,它自然地解决了以下问题:
// 待更
隐式策略使用基于能量的模型(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共同做二次开发的朋友,如有意敬请私我
数据集包含以下三个部分
GX010214.mp4
GX010215.mp4
GX010232.mp4
GX010234.mp4
GX010236.mp4
GX010238.mp4
mapping.mp4
整个pipeline用于提取收集到的gopro数据,进行数据处理。
最终目的:使用GoPro数据恢复机器人动作。
具体分为以下步骤:
上一个下载的所有示例数据,把目录结构进行整理。
每个视频都要单独处理,用ExifTool 工具包,提取每个视频的相机序列号+拍摄时间,作为文件夹的名称,每个视频放入各自的文件夹内
这步用于提取gopro惯性测量单元数据(imu),提取方式是拉的docker镜像,直接使用的外部仓库:GitHub - urbste/OpenImuCameraCalibrator: Camera calibration tool
且是C++写的,直接看提取结果,保存在imu_data.json文件中,总共提取了6种数据:GoPro Tags,这六种数据分别如下所示
加速度计测量物体在三个方向上的加速度,通常分别是 X 轴、Y 轴和 Z 轴。这些数据用于检测物体的运动和方向变化,共有四个值
- {
- "value":[8.37410071942446,0.5875299760191847,4.9352517985611515],
- "cts":78.018,
- "date":"2024-01-10T18:54:47.109Z",
- "temperature [°C]":51.544921875
- }
陀螺仪测量物体在三个方向上的角速度,即物体围绕每个轴旋转的速度。陀螺仪用于确定物体的姿态和运动状态,对于检测旋转和倾斜非常有效。
- {
- "value":[0.06496272630457935,0.0724174653887114,-0.027689030883919063],
- "cts":78.018,
- "date":"2024-01-10T18:54:47.109Z",
- "temperature [°C]":51.544921875
- }
GPS 传感器提供位置数据,包括经度、纬度、高度以及速度。GPS 数据用于定位和导航
// 待更
通常用于图像处理和计算机视觉领域,用于描述图像在三维空间中的方向和位置。
- {
- "value":[0.999969481490524,0.002044740134891812,0.0016174810022278512,-0.0003662221137119663],
- "cts":80.255,
- "date":"2024-01-10T18:54:47.109Z"
- }
// 待更
// 待更
处理mapping地图视频数据,并生成地图。主要是用Docker来运行外部库ORB_SLAM3(Simultaneous Localization and Mapping,即同时定位与地图构建)系统
输入:上文《4.2.1 01_extract_gopro_imu.py:提取gopro惯性测量单元数据(imu)》中的的imu_data.json 和 原MP4视频
输出:
这个和上一步一样,上一步是mapping地图视频生成的轨迹信息,这步是批量生成任务演示数据的轨迹信息,
输入:原始mp4视频、上一步生成的map_atlas.osa、imu_data.json
输出:相机轨迹信息camera_trajectory.csv
和mapping_camera_trajectory.csv一样的内容
注意:生成轨迹不包括夹爪校准视频,也不生成map_atlas.osa
- 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 的配置文件
作者做了很多实验,配置文件可以配置不同的模型,当前使用CLIP预训练的ViT-B/16视觉编码器来训练扩散策略
使用:vit_base_patch16_clip_224.openai(视觉编码器) + ConditionalUnet1D(扩散策略)
先用vit_base_patch16_clip_224.openai(视觉编码器)编码特征,在用这些特征给到ConditionalUnet1D(扩散策略)模型生成预测的动作
// 待更
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。