一、项目背景与整体定位

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 模块划分

系统采用高度模块化设计,核心模块包括:

  1. DCU Driver Module

    • EtherCAT 通信

    • 关节状态回读 / 关节命令下发

  2. Joystick Module

    • 手柄输入解析

    • 映射为 /cmd_vel

  3. Control Module(核心)

    • RLController

    • 状态估计、观测构建、模型推理

    • 输出关节目标

  4. 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维的观测值(取决于控制器类型),具体包括:

  1. 时间特征 (2维):

    • sin(2π × phase) - 时间相位的正弦值
    • cos(2π × phase) - 时间相位的余弦值
  2. 命令输入 (3维):

    • 期望的x轴线速度(乘以缩放系数obs_scales.lin_vel)
    • 期望的y轴线速度(乘以缩放系数obs_scales.lin_vel)
    • 期望的角速度z轴分量
  3. 关节状态 (2×动作数量维):

    • 当前关节位置与初始状态的偏差(乘以obs_scales.dof_pos)
    • 当前关节速度(乘以obs_scales.dof_vel)
  4. 历史动作 (动作数量维):

    • 上一时刻的输出动作
  5. IMU数据 (6维):

    • 基座角速度(乘以obs_scales.ang_vel)
    • 基座欧拉角xyz(乘以obs_scales.quat)

3.2 动作空间 (Action Space)

根据配置,动作空间包括:

  • rl_walk_leg: 12维动作空间,对应双足的髋关节、膝关节和踝关节
  • rl_walk_leg_shoulder: 14维动作空间,除了双腿还包含肩部关节

每个动作值代表相对于初始姿态的关节角度变化,经过以下处理:

  1. 乘以action_scale(0.5)进行缩放
  2. 加上对应的初始状态值(joint_conf.init_state)
  3. 通过低通滤波器平滑

算法特色

  1. 历史信息利用: 通过num_hist=66的历史观测,算法能处理部分可观测性问题
  2. 频率控制: decimation=10意味着每10个控制周期(即10ms,假设控制频率为1000Hz)执行一次推理
  3. 步态周期性: cycle_time=0.7s或1s表示步态的周期性
  4. 命令阈值: 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
    Logo

    DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

    更多推荐