Unitree Qmini Robot
Author
Tony Wang
Date Published




Official GitHub Repository
https://github.com/unitreerobotics/Qmini
Software
Home Page: https://vsislab.github.io/RoboTamer
Training Code: https://github.com/vsislab/RoboTamer4Qmini
Development Code: https://github.com/vsislab/RoboTamerSdk4Qmini
RoboTamerSdk4Qmini 是一个用于双足机器人(Unitree Qmini)运动控制的 C++ 部署代码库,主要利用 ONNX Runtime 进行高性能模型推理,实现机器人的实时控制。该项目允许将预训练的强化学习策略(从 *.pt 或 *.pth 模型导出为 ONNX 模型)部署到基于 Linux 的边缘设备或机器人硬件上,确保低延迟、实时控制。
它是一个完整的双足机器人控制系统,集成了强化学习、实时控制、传感器处理和电机驱动等功能。系统通过多线程架构和高效的模型推理实现了低延迟的实时控制,支持多种控制模式,适用于 Unitree Qmini 等双足机器人平台。该项目展示了如何将强化学习模型从训练环境部署到实际机器人硬件上,实现高性能的机器人运动控制。
配置系统
系统使用 YAML 配置文件( config.yaml )设置关键参数:
- 观测和动作空间维度
- 控制周期
- 关节位置限制
- 电机刚度和阻尼参数
- 命令范围(速度、转向等)
- 参考关节位置
技术特点
1. 多线程架构 :使用多个线程并行处理不同任务,提高系统响应性
2. ONNX 模型推理 :使用 ONNX Runtime 高效执行预训练的强化学习模型
3. 模块化设计 :各个功能模块清晰分离,便于维护和扩展
4. 实时控制 :精确的时间控制和高频率的控制循环,确保实时性能
5. 安全机制 :包含模式切换、关节限位等安全机制
主要组件
1. 核心类和模块
- G1 类 :主控制类,负责初始化和协调各个子系统
- RLController :强化学习控制器,负责处理机器人的运动控制逻辑
- MotorController :电机控制器,负责与硬件电机通信和控制
- IMUReader :IMU 传感器数据读取器,通过 Python 接口获取 IMU 数据
- ModeSwitcher :模式切换器,处理不同控制模式之间的切换
- DataReporter :数据报告器,记录和输出系统运行数据
- OnnxInference :ONNX 模型推理接口,用于执行预训练的强化学习模型
2. 通信和数据流
- ChannelLabor :通道劳工类,处理消息的发送和接收
- DataBuffer :数据缓冲区,用于在不同线程间共享数据
- XRockerGamepad :游戏手柄接口,用于接收用户输入
工作流程
1. 系统初始化
1. 在 run_interface.cpp 中创建 G1 实例,指定网络接口
2. G1 构造函数初始化各个子系统:
- 初始化通道工厂(ChannelFactory)
- 初始化游戏手柄(XRockerGamepad)
- 创建并初始化强化学习控制器(RLController)
- 创建多个线程处理不同任务(控制、命令写入、IMU读取、手柄输入等)
2. 多线程控制系统
系统使用多个并行线程处理不同任务:
- 控制线程 (0.01-0.015s 周期):执行主要的控制逻辑
- 命令写入线程 (0.002s 周期):将控制命令发送到电机
- IMU 读取线程 (0.003s 周期):读取 IMU 传感器数据
- 手柄线程 (0.004s 周期):处理游戏手柄输入
- 数据报告线程 (与控制线程同周期):记录系统数据
- 模式处理线程 (0.02s 周期):处理模式切换
3. 控制模式
系统支持多种控制模式,通过手柄或键盘切换:
- 模式 1 :折叠姿态(folding)
- 模式 2 :站立姿态(standing)
- 模式 3 :强化学习行走(RL walking)
- 模式 4/5 :正弦波测试(sin waving/step in place)
- 模式 q :退出程序
4. 强化学习控制
1. 从 ONNX 模型加载预训练的策略( policy.onnx )
2. 收集观测数据(关节位置、速度、IMU数据等)
3. 通过模型推理生成动作增量
4. 将动作增量应用到关节控制命令
5. 发送控制命令到电机
5. 电机控制
1. MotorController 通过串行端口与电机通信
2. 系统支持多个串行组,每组控制不同的电机
3. 使用多线程并行处理不同串行组的电机命令
4. 将高级控制命令转换为低级电机命令(位置、速度、力矩等)
6. 传感器数据处理
1. IMU 数据通过 Python 接口获取( imu_interface.py )
2. 电机反馈数据从电机控制器获取
3. 所有传感器数据经过滤波处理后用于控制和记录
Click here to learn how to build the reinforcement learning environment
