跳转到内容

RL 控制示例

本示例演示如何通过 SDK 内置状态机运行强化学习(RL)策略,控制 Lite3 四足机器人。支持仿真和真机两种方式。

代码资源:RL 策略训练 · ROS 2 策略部署

官方视频教程涵盖训练入门、UDP 部署和 ROS 2 迁移;请区分所选 SDK 流程。

Terminal window
# Rough terrain 训练
python scripts/reinforcement_learning/rsl_rl/train.py \
--task Rough-Deeprobotics-Lite3-v0 \
--headless
# Flat terrain 训练
python scripts/reinforcement_learning/rsl_rl/train.py \
--task Flat-Deeprobotics-Lite3-v0 \
--headless
Terminal window
python scripts/reinforcement_learning/rsl_rl/play.py \
--task Rough-Deeprobotics-Lite3-v0 \
--num_envs 50

支持键盘控制回放:

Terminal window
python scripts/reinforcement_learning/rsl_rl/play.py \
--task Rough-Deeprobotics-Lite3-v0 \
--num_envs 1 \
--keyboard
环境 ID地形配置入口
Flat-Deeprobotics-Lite3-v0平面DeeproboticsLite3FlatEnvCfg
Rough-Deeprobotics-Lite3-v0复杂地形DeeproboticsLite3RoughEnvCfg
观测项维度缩放噪声备注
base_lin_vel———已禁用(设为 None)
base_ang_vel30.25±0.2角速度
projected_gravity31.0±0.05重力投影
velocity_commands31.0—速度指令 (vx, vy, ωz)
joint_pos121.0±0.01关节相对位置
joint_vel120.05±1.5关节相对速度
last_action121.0—上一步动作
height_scan———已禁用(设为 None)

总观测维度:48(实际组装 45 维有效观测 + 3 维零填充)

参数值
动作维度12
动作类型关节目标位置(JointPositionAction)
HipX 动作缩放0.125
HipY / Knee 动作缩放0.25
动作裁剪范围(-100.0, 100.0)
指令范围
线速度 X(前后)-1.5 ~ 1.5 m/s
线速度 Y(左右)-0.8 ~ 0.8 m/s
角速度 Z(旋转)-0.8 ~ 0.8 rad/s
奖励项权重说明
track_lin_vel_xy_exp4.0线速度 XY 跟踪
track_ang_vel_z_exp1.5角速度 Z 跟踪
feet_air_time_lin_xy5.0线速度指令下的空中时间(阈值 0.5s)
feet_air_time_ang_z5.0角速度指令下的空中时间(阈值 0.5s)
feet_gait0.5步态对称奖励(对角腿同步:FL-HR, FR-HL)
phase_foot_trajectory_exp2.0相位足端轨迹跟踪
feet_contact_without_cmd0.1无指令时足端触地奖励
奖励项权重说明
action_rate_l2-0.1动作变化率
base_height_l2-50.0基座高度偏离(目标 0.55m)
lin_vel_z_l2-20.0Z 方向线速度
flat_orientation_l2-20.0机身倾斜
ang_vel_xy_l2-0.25XY 平面角速度
foot_impact_velocity-2.0足端触地冲击速度
joint_torques_l2-2.5e-4关节力矩
joint_acc_l2-1e-8关节加速度
joint_power-8e-4关节功率
joint_pos_limits-5.0关节超限
contact_forces-0.1足端接触力
feet_slide-0.05足端滑动
stand_still-0.5无指令时关节偏差
undesired_contacts-0.5非足端碰撞
hipx_joint_pos_penalty-0.4HipX 关节偏差惩罚
knee_joint_pos_penalty-2.0Knee 关节偏差惩罚
joint_mirror-0.05对角腿关节镜像对称
随机化项模式参数
刚体材质startup静摩擦 0.31.0,动摩擦 0.30.8
刚体质量startup缩放 0.85~1.15(所有连杆)
刚体惯量startup缩放 0.85~1.15
质心偏移startupx/y ±0.03m, z ±0.02m
关节重置reset位置缩放 1.0~1.0
执行器增益reset刚度/阻尼缩放 0.85~1.15
基座重置reset位置 x/y ±1.0m, roll/pitch ±0.3rad, yaw ±π;速度 ±0.2m/s
地形类型比例
random_rough0.4
hf_pyramid_slope0.3
hf_pyramid_slope_inv0.3
boxes0.0(已禁用)
pyramid_stairs0.0(已禁用)
pyramid_stairs_inv0.0(已禁用)

粗糙地形的噪声范围:0.01 ~ 0.06m,步长 0.01m。

高度扫描分辨率:0.07m,网格尺寸 [1.6, 1.0]。

运行 play.py 时会自动导出 JIT 和 ONNX 模型至 exported/ 目录:

Terminal window
python scripts/reinforcement_learning/rsl_rl/play.py \
--task Rough-Deeprobotics-Lite3-v0

导出文件:

  • exported/policy.pt(JIT)
  • exported/policy.onnx(ONNX)
Terminal window
python scripts/tools/export_onnx_fast.py \
--checkpoint_path logs/rsl_rl/deeprobotics_lite3_rough/2025-01-01_12-00-00/model_5000.pt \
--robot lite3 \
--output_path exported/lite3_policy.onnx

导出的 ONNX 文件会自动附带以下机器人元数据:

  • 关节名称、连杆名称、基座连杆名
  • 关节刚度 / 阻尼
  • 默认关节位置
  • 动作缩放

PolicyRunnerBase 策略运行器基类定义了输入观测、输出动作和推理生命周期:

virtual RobotAction getRobotAction(const RobotBasicState&, const UserCommand&) = 0;
virtual void OnEnter() = 0;
virtual void SetDecimation(int d);

Lite3 的 ONNX 策略实现。

session_ = Ort::Session(env_, policy_path_.c_str(), session_options_);

设置观测维度以及动作维度:

const int observation_dim = 48;
const int action_dim = 12;

推理:

VecXf current_action_eigen = Onnx_infer(current_observation_);

观测组装:

// 观测维度: 48(实际组装 45 维有效观测,最后 3 维补零)
Eigen::VectorXf obs_b = Eigen::VectorXf::Zero(48);
obs_b.block(0, 0, 3, 1) = basic_state.imu.angular_velocity.cast<float>(); // base_ang_vel (3)
obs_b.block(3, 0, 3, 1) = basic_state.imu.projected_gravity.cast<float>(); // projected_gravity (3)
obs_b.block(6, 0, 3, 1) = basic_state.command.getCommand(); // velocity_commands (3)
obs_b.block(9, 0, 12, 1) = (basic_state.motor_state.position - dof_default_eigen_robot).cast<float>(); // joint_pos (12)
obs_b.block(21, 0, 12, 1) = basic_state.motor_state.velocity.cast<float>(); // joint_vel (12)
obs_b.block(33, 0, 12, 1) = last_action_output_.cast<float>(); // last_action (12)
// obs_b[45..47] 补零

动作输出:

robot_action.goal_joint_pos = default_joint_pos + action_scale * current_action_eigen;

策略模型文件:src/Lite3_sdk_deploy/policy/policy.onnx

默认姿态:

dof_default_eigen_robot <<
0.0, -0.8, 1.6, // 左前腿
0.0, -0.8, 1.6, // 右前腿
0.0, -0.8, 1.6, // 左后腿
0.0, -0.8, 1.6; // 右后腿

动作缩放:

action_scale <<
0.25, 0.25, 0.25, // 左前腿: HipX, HipY, Knee
0.25, 0.25, 0.25, // 右前腿
0.25, 0.25, 0.25, // 左后腿
0.25, 0.25, 0.25; // 右后腿

真机流程需要额外完成网络连接、文件同步和 ARM 编译。

Terminal window
ssh user@10.21.31.103 'mkdir -p ~/Lite3_sdk_deploy/src'
scp -r ~/sdk_deploy/src/Lite3_sdk_deploy user@10.21.31.103:~/Lite3_sdk_deploy/src
Terminal window
cd Lite3_sdk_deploy
source /opt/ros/foxy/setup.bash
colcon build --packages-select lite3_sdk_deploy --cmake-args -DBUILD_PLATFORM=arm
Terminal window
source install/setup.bash
ros2 run lite3_sdk_deploy rl_deploy

main.cpp 中通过 RemoteCommandType 枚举选择输入方式。

std::shared_ptr<StateMachineBase> fsm = std::make_shared<qw::QwStateMachine>(
RobotName::Lite3, RemoteCommandType::kKeyBoard);
按键功能
z站立(Default Position)
cRL 控制
x趴下(Lie Down)
w a s d前进 / 左移 / 后退 / 右移
q e顺时针 / 逆时针旋转
std::shared_ptr<StateMachineBase> fsm = std::make_shared<qw::QwStateMachine>(
RobotName::Lite3, RemoteCommandType::kGamepad);
按键功能
L1站立(Standing Up)
L2RL 控制
R1趴下(Lie Down)
R2关节阻尼(Joint Damping)
左摇杆前进 / 左移 / 后退 / 右移
右摇杆顺时针 / 逆时针旋转