RL 控制示例
本示例演示如何通过 SDK 内置状态机运行强化学习(RL)策略,控制 Lite3 四足机器人。支持仿真和真机两种方式。
代码资源:RL 策略训练 · ROS 2 策略部署
官方视频教程涵盖训练入门、UDP 部署和 ROS 2 迁移;请区分所选 SDK 流程。
# 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推理 / 回放
Section titled “推理 / 回放”python scripts/reinforcement_learning/rsl_rl/play.py \ --task Rough-Deeprobotics-Lite3-v0 \ --num_envs 50支持键盘控制回放:
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_vel | 3 | 0.25 | ±0.2 | 角速度 |
| projected_gravity | 3 | 1.0 | ±0.05 | 重力投影 |
| velocity_commands | 3 | 1.0 | — | 速度指令 (vx, vy, ωz) |
| joint_pos | 12 | 1.0 | ±0.01 | 关节相对位置 |
| joint_vel | 12 | 0.05 | ±1.5 | 关节相对速度 |
| last_action | 12 | 1.0 | — | 上一步动作 |
| height_scan | — | — | — | 已禁用(设为 None) |
总观测维度:48(实际组装 45 维有效观测 + 3 维零填充)
| 参数 | 值 |
|---|---|
| 动作维度 | 12 |
| 动作类型 | 关节目标位置(JointPositionAction) |
| HipX 动作缩放 | 0.125 |
| HipY / Knee 动作缩放 | 0.25 |
| 动作裁剪范围 | (-100.0, 100.0) |
速度指令范围
Section titled “速度指令范围”| 指令 | 范围 |
|---|---|
| 线速度 X(前后) | -1.5 ~ 1.5 m/s |
| 线速度 Y(左右) | -0.8 ~ 0.8 m/s |
| 角速度 Z(旋转) | -0.8 ~ 0.8 rad/s |
跟踪奖励(正值)
Section titled “跟踪奖励(正值)”| 奖励项 | 权重 | 说明 |
|---|---|---|
| track_lin_vel_xy_exp | 4.0 | 线速度 XY 跟踪 |
| track_ang_vel_z_exp | 1.5 | 角速度 Z 跟踪 |
| feet_air_time_lin_xy | 5.0 | 线速度指令下的空中时间(阈值 0.5s) |
| feet_air_time_ang_z | 5.0 | 角速度指令下的空中时间(阈值 0.5s) |
| feet_gait | 0.5 | 步态对称奖励(对角腿同步:FL-HR, FR-HL) |
| phase_foot_trajectory_exp | 2.0 | 相位足端轨迹跟踪 |
| feet_contact_without_cmd | 0.1 | 无指令时足端触地奖励 |
惩罚项(负值)
Section titled “惩罚项(负值)”| 奖励项 | 权重 | 说明 |
|---|---|---|
| action_rate_l2 | -0.1 | 动作变化率 |
| base_height_l2 | -50.0 | 基座高度偏离(目标 0.55m) |
| lin_vel_z_l2 | -20.0 | Z 方向线速度 |
| flat_orientation_l2 | -20.0 | 机身倾斜 |
| ang_vel_xy_l2 | -0.25 | XY 平面角速度 |
| 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.4 | HipX 关节偏差惩罚 |
| knee_joint_pos_penalty | -2.0 | Knee 关节偏差惩罚 |
| joint_mirror | -0.05 | 对角腿关节镜像对称 |
| 随机化项 | 模式 | 参数 |
|---|---|---|
| 刚体材质 | startup | 静摩擦 0.3 |
| 刚体质量 | startup | 缩放 0.85~1.15(所有连杆) |
| 刚体惯量 | startup | 缩放 0.85~1.15 |
| 质心偏移 | startup | x/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 |
地形配置(Rough)
Section titled “地形配置(Rough)”| 地形类型 | 比例 |
|---|---|
| random_rough | 0.4 |
| hf_pyramid_slope | 0.3 |
| hf_pyramid_slope_inv | 0.3 |
| boxes | 0.0(已禁用) |
| pyramid_stairs | 0.0(已禁用) |
| pyramid_stairs_inv | 0.0(已禁用) |
粗糙地形的噪声范围:0.01 ~ 0.06m,步长 0.01m。
高度扫描分辨率:0.07m,网格尺寸 [1.6, 1.0]。
通过 play.py 自动导出
Section titled “通过 play.py 自动导出”运行 play.py 时会自动导出 JIT 和 ONNX 模型至 exported/ 目录:
python scripts/reinforcement_learning/rsl_rl/play.py \ --task Rough-Deeprobotics-Lite3-v0导出文件:
exported/policy.pt(JIT)exported/policy.onnx(ONNX)
快速导出(无需 Isaac Sim)
Section titled “快速导出(无需 Isaac Sim)”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);Lite3PolicyRunner
Section titled “Lite3PolicyRunner”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 编译。
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/srccd Lite3_sdk_deploysource /opt/ros/foxy/setup.bashcolcon build --packages-select lite3_sdk_deploy --cmake-args -DBUILD_PLATFORM=armsource install/setup.bashros2 run lite3_sdk_deploy rl_deploymain.cpp 中通过 RemoteCommandType 枚举选择输入方式。
std::shared_ptr<StateMachineBase> fsm = std::make_shared<qw::QwStateMachine>( RobotName::Lite3, RemoteCommandType::kKeyBoard);| 按键 | 功能 |
|---|---|
| z | 站立(Default Position) |
| c | RL 控制 |
| 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) |
| L2 | RL 控制 |
| R1 | 趴下(Lie Down) |
| R2 | 关节阻尼(Joint Damping) |
| 左摇杆 | 前进 / 左移 / 后退 / 右移 |
| 右摇杆 | 顺时针 / 逆时针旋转 |