【深度解析】智元机器人 AgiBot X1 强化学习控制系统
是智元机器人推出并开源的高自由度模块化人形机器人。与传统基于规则或模型预测控制(MPC)的方案不同,AgiBot X1 在本项目并不包含训练流程,而是一个,核心目标是:在真实硬件 / 仿真中支持手柄指令驱动(/cmd_vel)支持仿真与真机统一控制接口。
一、项目背景与整体定位
AgiBot X1 是智元机器人推出并开源的高自由度模块化人形机器人。与传统基于规则或模型预测控制(MPC)的方案不同,AgiBot X1 在行走与运动控制层采用了当前人形 / 四足机器人领域的主流路线:
强化学习策略 + 经典控制器(PD)混合架构
本项目并不包含训练流程,而是一个完整的端侧推理与控制系统,核心目标是:
-
在真实硬件 / 仿真中稳定执行 RL 步态策略
-
支持手柄指令驱动(/cmd_vel)
-
支持仿真与真机统一控制接口
二、系统软件架构总览
2.1 技术栈
-
中间件:AimRT(类 ROS2 通信模型) + ROS2 Humble
-
控制算法:强化学习(Actor 网络推理) + PD Controller
-
模型推理:ONNX Runtime(CPU)
-
仿真引擎:MuJoCo(MJCF)
-
构建系统:CMake ≥ 3.24,GCC-13
2.2 模块划分
系统采用高度模块化设计,核心模块包括:
-
DCU Driver Module
-
EtherCAT 通信
-
关节状态回读 / 关节命令下发
-
-
Joystick Module
-
手柄输入解析
-
映射为
/cmd_vel
-
-
Control Module(核心)
-
RLController
-
状态估计、观测构建、模型推理
-
输出关节目标
-
-
Sim Module
-
MuJoCo 仿真
-
MJCF 人形模型
-
2.3 数据流向
Joystick → /cmd_vel
↓
RLController
(obs → policy → action)
↓
/joint_cmd
↙ ↘
DCU Driver Sim
这是一条典型的“指令条件化 RL locomotion”链路。
三、强化学习算法解析
AgiBot X1采用的是基于深度强化学习的机器人步态控制算法。该算法是基于Isaac Gym/OMNiMAN开发的四足动物或人形机器人locomotion算法的改进版,使用了连续控制算法PPO。
3.1 状态空间 (Observation Space)
根据配置文件,状态空间包含47维或53维的观测值(取决于控制器类型),具体包括:
-
时间特征 (2维):
- sin(2π × phase) - 时间相位的正弦值
- cos(2π × phase) - 时间相位的余弦值
-
命令输入 (3维):
- 期望的x轴线速度(乘以缩放系数obs_scales.lin_vel)
- 期望的y轴线速度(乘以缩放系数obs_scales.lin_vel)
- 期望的角速度z轴分量
-
关节状态 (2×动作数量维):
- 当前关节位置与初始状态的偏差(乘以obs_scales.dof_pos)
- 当前关节速度(乘以obs_scales.dof_vel)
-
历史动作 (动作数量维):
- 上一时刻的输出动作
-
IMU数据 (6维):
- 基座角速度(乘以obs_scales.ang_vel)
- 基座欧拉角xyz(乘以obs_scales.quat)
3.2 动作空间 (Action Space)
根据配置,动作空间包括:
- rl_walk_leg: 12维动作空间,对应双足的髋关节、膝关节和踝关节
- rl_walk_leg_shoulder: 14维动作空间,除了双腿还包含肩部关节
每个动作值代表相对于初始姿态的关节角度变化,经过以下处理:
- 乘以action_scale(0.5)进行缩放
- 加上对应的初始状态值(joint_conf.init_state)
- 通过低通滤波器平滑
算法特色
- 历史信息利用: 通过num_hist=66的历史观测,算法能处理部分可观测性问题
- 频率控制: decimation=10意味着每10个控制周期(即10ms,假设控制频率为1000Hz)执行一次推理
- 步态周期性: cycle_time=0.7s或1s表示步态的周期性
- 命令阈值: cmd_threshold=0.05过滤小幅度指令,避免不必要的动作
四、推理过程
1. 初始化阶段
在[RLController](file:///d:/06 公共文档/01-开源代码/agibot_x1_infer/src/module/control_module/include/control_module/rl_controller.h#L11-L86)初始化过程中,系统会:
- 加载ONNX模型文件
- 初始化各种参数配置(如步态参数、观测缩放因子等)
- 分配内存空间给观测值和动作数组
- 设置历史观测缓冲区
2. 推理过程的主要步骤
a) 状态估计更新 ([UpdateStateEstimation](file:///d:/06 公共文档/01-开源代码/agibot_x1_infer/src/module/control_module/src/rl_controller.cc#L152-L177))
系统获取当前机器人的状态信息:
- 从关节状态数据中提取关节位置和速度
- 从IMU数据中获取角速度、姿态四元数和重力投影信息
b) 观测值计算 ([ComputeObservation](file:///d:/06 公共文档/01-开源代码/agibot_x1_infer/src/module/control_module/src/rl_controller.cc#L179-L240))
系统构建强化学习模型的输入(观测值),包括:
- 时间相位信息(正弦和余弦值)
- 用户输入的速度指令(经缩放处理)
- 关节位置偏差(当前位置与初始状态的差值)
- 关节速度信息
- 上一步的动作输出
- IMU数据(角速度和姿态信息)
这些观测值会被标准化处理并加入到历史缓冲区中。
c) 模型推理 ([ComputeActions](file:///d:/06 公共文档/01-开源代码/agibot_x1_infer/src/module/control_module/src/rl_controller.cc#L242-L264))
这是核心推理步骤:
- 将构建好的观测值打包成ONNX Runtime所需的张量格式
- 调用
session_ptr_->Run()执行模型推理 - 获取模型输出的动作值
- 对输出进行裁剪以限制在合理范围内
3. 推理频率控制
- 推理不是每一帧都执行,而是根据
walk_step_conf_.decimation参数决定执行频率 - 如果
decimation=4,则每4次循环执行一次推理,这样可以在保证控制效果的同时降低计算负担
4. 动作应用
推理得到的动作值会:
- 乘以缩放因子
- 加上初始状态偏移
- 通过低通滤波器平滑
- 最终转换为关节命令发送给底层控制器
五、ONNX Runtime 工程集成
系统使用ONNX Runtime C++ API实现高效的模型推理:
- 模型加载后保存在[session_ptr_](file:///d:/06 公共文档/01-开源代码/agibot_x1_infer/src/module/control_module/src/rl_controller.cc#L209-L211)中
- 输入输出张量信息预先获取并缓存
- 使用CPU执行器进行推理
六、运行环境配置
6.1 开发环境要求
# 必需工具
sudo apt update
sudo apt install -y build-essential cmake git libprotobuf-dev protobuf-compiler
sudo apt install jstest-gtk libglfw3-dev libdart-external-lodepng-dev
# 安装ONNX Runtime
git clone --recursive https://github.com/microsoft/onnxruntime
cd onnxruntime
./build.sh --config Release --build_shared_lib --parallel
cd build/Linux/Release/
sudo make install
6.2 构建与运行
# 构建
source /opt/ros/humble/setup.bash
source url_gitee.bashrc
./build.sh $DOWNLOAD_FLAGS
# 仿真模式
cd build/
./run_sim.sh
# 真机模式
cd build/
./run.sh
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)