Open-TeleVision源码解析——宇树摇操方案的重要参考:VR控制人形机器人采集数据
前言
本来针对Open-TeleVision的源码解析,是打算放在此文《从宇树摇操avp_teleoperate到unitree_IL_lerobot:如何基于宇树人形进行二次开发》中的,但考虑到为避免篇幅过长,故独立成此文
第一部分 Open-TeleVision的源码解析
如本文开头所提到的, 此文《UC San Diego的三大机器人:AnyTeleop、Open-TeleVision、Bunny-VisionPro——从RGB相机到VR远程控制机器人》第二部分介绍了Open-television,其GitHub地址为:github.com/OpenTeleVision/TeleVision
接下来,我们来整体了解下该television库的整体结构——不过 不逐行分析了
该项目主要分为以下几个核心部分:
- 远程操作系统(teleop/)
- 模仿学习模块(act/)
- 机器人资源文件** (assets/)
- 辅助脚本(scripts/)
- 图像资源** (img/)
2.1 远程操作系统 (teleop/)
这是项目的核心部分,负责实现远程操作功能
2.1.1 TeleVision.py
核心类 `OpenTeleVision`,负责初始化远程操作系统,处理视觉反馈和用户交互。它通过 `vuer` 库创建用户界面,并处理手部移动和相机移动事件
2.1.2 teleop_hand.py
处理手部跟踪和控制,将用户手部动作转换为机器人手部控制命令
2.1.3 teleop_active_cam.py
实现主动摄像机控制逻辑,根据用户头部动作调整摄像机视角
2.1.4 Preprocessor.py
处理输入数据预处理,如手部姿态和头部位置的标准化
2.1.5 motion_utils.py
提供运动相关的实用函数,如姿态变换和平滑处理
2.1.6 constants_vuer.py
定义系统中使用的常量
2.1.7 dynamixel/ 子目录
- dynamixel_robot.py:实现 Dynamixel 电机控制的机器人类,继承自基本的 `Robot` 类
- active_cam.py:控制主动摄像机,通过 Dynamixel 电机调整摄像机朝向
- robot.py:定义基本机器人接口,提供关节控制等基础功能
- driver.py:Dynamixel 电机驱动程序,负责底层电机通信和控制
- agent.py**:实现代理类,用于机器人行为策略的执行
2.1.8 webrtc/ 子目录
- zed_server.py:ZED 立体摄像头的 WebRTC 流媒体服务器,用于捕获和传输高质量视频流
- webcam_server.py**:普通网络摄像头的 WebRTC 服务器实现
- webcam.py:网络摄像头处理逻辑,用于捕获图像
- client.js和 **index.html:前端界面代码,用于显示视频流和交互
2.2 模仿学习模块 (act/)
这部分实现了基于视觉的模仿学习功能
2.2.1 imitate_episodes.py:处理训练数据和学习过程
模仿学习的主要脚本,处理训练数据和学习过程
2.2.2 policy.py:策略网络,将视觉输入映射到机器人动作
定义机器人策略网络,将视觉输入映射到机器人动作
2.2.3 utils.py
提供模仿学习相关的实用函数
2.2.4 detr/ 子目录
这是基于 DETR(DEtection TRansformer)的视觉模型实现
- models/:
- detr_vae.py:结合 DETR 和变分自编码器的视觉模型。
- transformer.py:Transformer 架构实现。
- backbone.py:视觉骨干网络,如 ResNet
- position_encoding.py:位置编码实现
- util/:
- box_ops.py:处理边界框操作的函数
- misc.py:实用函数集合
- plot_utils.py:可视化工具
2.3 机器人资源文件 (assets/)
包含机器人的 3D 模型和配置文件
2.3.1 h1_inspire/
包含 Inspire 机器人的 URDF 模型、网格文件和启动脚本
2.3.2 inspire_hand/
Inspire 机器人手部的 URDF 模型和网格文件
2.4 辅助脚本 (scripts/)
包含用于部署、评估和数据处理的脚本
2.4.1 deploy_sim.py:部署仿真环境的脚本
2.4.2 replay_demo.py「回放演示数据的脚本
2.4.3 plot_action.py:绘制机器人动作的脚本
2.4.4 post_process.py:后处理数据的脚本
2.5 核心调用关系
2.5.1 远程操作系统的调用流程
- TeleVision.py 作为入口点,初始化 `OpenTeleVision` 类
- 它使用 `webrtc/zed_server.py` 或直接共享内存图像来提供视觉反馈
- 当收到用户交互事件时(如手部移动或相机移动),调用相应的处理函数
- 手部控制通过 `teleop_hand.py` 实现,将用户手势转换为机器人控制命令
- 摄像机控制通过 `teleop_active_cam.py` 和 `dynamixel/active_cam.py` 实现
2.5.2 机器人控制链
- `teleop_hand.py` → `dynamixel/agent.py` → dynamixel_robot.py → `dynamixel/driver.py`
- 从高级手势识别到低级电机指令的转换过程。
2.5.3 视觉反馈路径
- `webrtc/zed_server.py` 捕获 ZED 摄像头数据
- 通过 WebRTC 协议将视频流传输到客户端
- 客户端通过 `webrtc/client.js` 和 `webrtc/index.html` 显示视频流
2.5.4 模仿学习流程:收集和处理数据,之后DETR提取特征、策略训练、控制
- imitate_episodes.py 收集和处理用户演示数据
- 使用 detr 中的视觉模型提取特征
- policy.py 学习将视觉状态映射到机器人动作
- 学习后的策略可用于自动化控制
2.5.5 数据共享机制
- 系统使用进程间通信机制,如共享内存、队列和事件
- 手部姿态数据通过 `left_hand_shared` 和 `right_hand_shared` 共享数组传递
- 头部位置数据通过 `head_matrix_shared` 共享
- 这些共享数据结构允许实时、低延迟的数据传输
// 待更