UMI流程
2024-08-19 16:13:52 0 举报
AI智能生成
umi流程导图
作者其他创作
大纲/内容
umi接口设计
人类演示物理接口
HD1: Wrist-mounted Cameras as Input Observation(腕带式摄像头作为输入观察设备)
腕带摄像头作为输入观测。只依赖手腕上的摄像头,不需要任何外部摄像头设置。当在机器人上部署UMI时,
将GoPro相机放置在与手持抓手相同的3d打印手指相同的位置
将GoPro相机放置在与手持抓手相同的3d打印手指相同的位置
HD2: Fisheye Lens for Visual Context(鱼眼镜头用于提供视觉上下文)
在腕式GoPro相机上使用了155度鱼眼镜头附件,提供了足够的视觉环境
HD3: Side Mirrors for Implicit Stereo(侧面镜子用于提供隐式立体视觉)
为了缓解单目相机视角缺乏直接深度感知的问题,在相机的周边视图中放置了一对物理镜,从而在同一图像中创建了所有隐式立体视图
HD4: IMU-aware Tracking(IMU感知跟踪)
UMI通过利用GoPro内置的,将IMU数据(加速度计和陀螺仪)记录到标准mp4视频文件中的能力,来捕捉运动。通过视觉跟踪和惯性姿态约束,
基于ORB-SLAM3的惯性-单目SLAM系统,即使由于运动模糊或缺乏视觉特征(例如低头看桌子)而导致视觉跟踪失败,也能保持短时间的跟踪。
基于ORB-SLAM3的惯性-单目SLAM系统,即使由于运动模糊或缺乏视觉特征(例如低头看桌子)而导致视觉跟踪失败,也能保持短时间的跟踪。
HD5: Continuous Gripper Control(连续夹具控制)
抛物任务需要精确的时机来释放物体。由于物体有不同的宽度,二进制的夹持动作将不太可能满足精度要求。在UMI夹持器上,通过基准标记连续跟踪手指宽度。UMI利用串联弹性末端执行器原理,通过连续的爪宽度控制来调节柔软手指的变形,从而隐式记录和控制抓握力。
HD6: Kinematic-based Data Filtering(基于运动学的数据过滤)
虽然数据收集过程与机器人无关,应用简单的基于运动学的数据过滤来为不同的机器人选择有效的轨迹。具体而言,当机器人的基本位置和运动学已知时,通过SLAM恢复的末端执行器绝对姿态允许对演示数据进行运动学和动力学可行性滤波。在过滤后的数据集上进行训练,确保策略符合具体实施例的运动学约束。
策略接口
PD1: Inference-time Latency Matching(推理时的延迟匹配)关于如何处理不同硬件设备之间的延迟差异,以确保输入数据的同步性。
PD1.1: Observation Latency Matching(观察延迟匹配)
PD1.2: Action Latency Matching(动作延迟匹配)
PD2: Relative End-Effector Pose(相对末端执行器位置)关于如何表示和处理末端执行器(EE)的位置和动作,提高策略的鲁棒性和跨硬件平台的通用性。UMI框架中使用的不同动作表示方法的对比,包括相对轨迹(Relative trajectory)、增量动作(Delta action)、以及绝对动作(Absolute action)。
PD2.1 Relative EE Trajectory as Action Representation(相对末端执行器轨迹作为动作表示)
PD2.2 Relative EE Trajectory as Proprioception(相对末端执行器轨迹作为本体感知)
PD2.3 Relative Inter-gripper Proprioception(相对夹具间的本体感知)
数据集制作
数据采集流程
手持夹爪采集视频步骤
GoPro参数设置:扫描参数配置的QR code
Gopro时间校准:扫描时间校准的QR code
环境地图构建:
将地图的标签放在环境的中心位置
缓慢的左右移动夹爪,让相机能把地图标签看全(20秒左右)
缓慢旋转夹爪,让相机360度扫描整个环境(10秒左右)
按照做任务的轨迹去移动夹爪,速度适中(30秒左右)
夹爪校准:
记录夹爪打开和关闭5次的视频
数据集视频录制:
移开地图标签
同一任务下设置不同初始状态,并执行任务(任务数量200次左右)
实际测试过程中的细节
尽量在一个小桌子上采集任务视频
采集视频过程中尽量不要有人员走到
采集视频顺序:地图、夹爪校准、任务(夹爪校准必须在任务前面执行)
数据集处理
数据集处理流程:
00_process_videos.py:视频文件分类,以每个视频的相机序列号+拍摄时间,作为文件夹的名称
01_extract_gopro_imu.py:通过拉取docker镜像,提取gopro惯性测量单元数据(imu),数据为(x,y,z,q_x,q_y,q_z,q_w)
02_create_map.py:通过拉取Docker镜像,处理mapping地图视频数据,并生成地图.csv文件
03_batch_slam.py:批量生成任务演示视频的轨迹信息(.csv)
04_detect_aruco.py:检测夹爪上的Aruco 标签
05_run_calibrations.py:SLAM 标签标定和夹爪范围标定
06_generate_dataset_plan.py:生成数据集计划
IMU提取
镜像名称:chicheng/openicc,地址:https://hub.docker.com/r/chicheng/openicc
镜像大小:5.03GB
举例:GoPro 9 摄像机的视觉惯性校准,地址:https://hub.docker.com/r/chicheng/openicc
orb_slam3
镜像名称:chicheng/orb_slam3,地址:https://hub.docker.com/r/chicheng/orb_slam3/tags
镜像大小:3.68GB
举例:在Ubuntu22.04中运行orb-slam3(具体步骤参考培训ppt)
ORB-SLAM3需安装的依赖项包括:Eigen3、Pangolin、Boost、OpenCV
ORB-SLAM3通用数据集:EuRoC,地址:https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
ORB-SLAM3通用数据集:TUM-VI,地址:https://cvg.cit.tum.de/data/datasets/visual-inertial-dataset
数据训练
视觉编码器
模型名称:timm/vit_base_patch16_clip_224.openai
模型大小:599MB
原理:该模型使用 ViT-B/16 Transformer 架构作为图像编码器,并使用 Transformer 作为文本编码器。这些编码器经过训练,可以通过对比损失来最大化(图像、文本)对的相似性。
学习资料:
参考培训ppt:6 大模型基础课:AIGC与扩散学习
视觉编码器的相关资料:网址:https://blog.csdn.net/v_JULY_v/article/details/131205615
扩散模型
模型名称:去噪扩散概率模型(DDPM)
DDPM原理:先前向加噪后反向去噪从而建立噪声估计模型
前向加噪:把低级噪声被添加到每个输入图像,其中噪声的规模在每个步骤都不同。训练数据逐渐被破坏,直到产生纯高斯噪声
反向去噪:通过逆转正向扩散过程来表示。采用相同的迭代过程,但噪声被顺序去除,最终重新创建得到原始图像
UMI中的DDPM
与传统DDPM相比,模型变化之处:
之前输出的是图像,现在需要输出:机器人的动作At
去噪时所依据的去噪条件为观测Ot
UMI中的扩散原理:在时间步骤 t,策略将最新的To个时间步观察数据Ot作为输入,并预测Tp个时间步动作At1,其中Ta个时间步动作At2在不重新规划的情况下在机器人上执行
噪声估计网络
基于CNN的扩散策略:采用1D时间卷积网络,进行一些修改以适应Diffusion Policy
模型架构:
通过特征线性调制(Feature-wise Linear Modulation, FiLM)将观测特征条件化到每个卷积层,模拟条件分布并去除不兼容的目标状态条件;
只预测动作轨迹,而不是观测动作轨迹的串联;c.采用滚动预测时域(receding prediction horizon,RPH)进行动作的连续规划
利用receding prediction horizon,删除了基于修复的目标状态条件反射
模型优劣:在大多数任务中表现良好,无需大量超参数调优,但在动作序列变化较快的任务中表现不佳
CNN架构:
时序扩散transformer:一种新型transformer架构,采用minGPT架构进行动作预测
模型架构:
动作序列和观测特征通过嵌入层处理,输入transformer解码器
模型优劣:在任务复杂度和动作变化率高的任务中表现更佳,但对超参数敏感,训练难度较高。
Transformer架构
模型推理
模型的输入和输出:
输入(同步观测)
Gopro:RGB 图像(10Hz)
机械臂:6自由度末端执行器姿态(125Hz)
夹爪:夹爪宽度(30Hz)
输出(np.ndarray数组)
机械臂:末端执行器姿态(数组中的前6个值)
夹爪:夹爪宽度(数组中的最后一个值)
推理参数:
推理步数:steps_per_inference=6
扩散策略将最新的6个时间步中的观察数据Ot作为输入,并预测16个时间步的动作At1
执行步数:根据当前时间戳和预测的16步中的每一步时间戳进行比较,选择当前时间戳后面的时间戳对应的预测动作作为执行动作,比如预测16步,由于推理延迟导致预测的前3步被舍弃,最后执行动作只有13步
动作执行:
动作推理的流程:
预测的原始动作:raw_action
原始动作转换为实际环境中的动作:action
获取当前推理得到的目标位置姿态:this_target_poses = action
计算每个动作的时间戳:action_timestamps
设置动作执行延迟:action_exec_latency = 0.01
获取当前时间:curr_time = time.time()
判断哪些动作是新的:is_new = action_timestamps > (curr_time + action_exec_latency)
如果没有新的动作:
使用最后一个动作:this_target_poses = this_target_poses[[-1]]
计算下一个可用步骤的索引和时间戳:next_step_idx、action_timestamp
更新动作时间戳:action_timestamps = np.array([action_timestamp])
有新的动作:
更新动作:this_target_poses = this_target_poses[is_new]
更新动作时间戳:action_timestamps = action_timestamps[is_new]
将传入的动作数据action转换为姿势数据pose,并安排到各个机械臂和夹爪的路径点中去执行:actions=this_target_poses、timestamps=action_timestamps
动作数组转换为姿势:
获取当前时间:receive_time = time.time()
找出时间戳中晚于当前时间的部分:is_new = timestamps > receive_time
选择出新的动作:new_actions = actions[is_new]
选择出新的时间戳:new_timestamps = timestamps[is_new]
确保每个机器人的动作数据段长度为7:assert new_actions.shape[1] // len(self.robots) == 7
使用嵌套循环遍历每个新动作和每个机器人:
机械臂动作的延迟时间: r_latency=0.1
夹爪动作的延迟时间: g_latency=0.1
提取当前机械臂的位置动作数据段:r_actions = new_actions[i, 7 * robot_idx + 0: 7 * robot_idx + 6]
提取当前夹爪动作数据段:g_actions = new_actions[i, 7 * robot_idx + 6]
安排路径点:
调度机械臂路径点:robot.schedule_waypoint(
pose=r_actions,# 安排机械臂的位置动作
target_time=new_timestamps[i] - r_latency # 调度到目标时间,考虑机械臂动作延迟)
pose=r_actions,# 安排机械臂的位置动作
target_time=new_timestamps[i] - r_latency # 调度到目标时间,考虑机械臂动作延迟)
调度夹爪路径点:gripper.schedule_waypoint(
pos=g_actions, # 安排夹爪的位置动作
target_time=new_timestamps[i] - g_latency # 调度到目标时间,考虑夹爪动作延迟)
pos=g_actions, # 安排夹爪的位置动作
target_time=new_timestamps[i] - g_latency # 调度到目标时间,考虑夹爪动作延迟)
参数优化
输入观测延迟:
Gopro:相机观测延迟:camera_obs_latency
机械臂:末端执行器位姿反馈延迟:robot_obs_latency
夹爪:夹爪宽度反馈延迟:gripper_obs_latency
动作执行延迟:
机械臂:末端执行器位姿执行延迟:robot_action_latency
夹爪:夹爪宽度执行延迟:gripper_action_latency
0 条评论
下一页