# 🦿 使用 RL 训练运动策略
Genesis 支持并行模拟,非常适合高效地训练强化学习(RL)运动策略。在本教程中,我们将通过一个完整的训练示例,介绍如何获得一个基本的运动策略,使 Unitree Go2 机器人能够行走。
这是一个简单且最小的示例,演示了 Genesis 中非常基础的 RL 训练流程,通过以下示例,您将能够快速获得一个可部署到真实机器人的四足运动策略。
**注意**:这*不是*一个全面的运动策略训练流程。它使用简化的奖励项来让您轻松入门,并且没有利用 Genesis 在大批量上的速度优势,因此它仅用于基本演示目的。
**致谢**:本教程的灵感来源于 [Legged Gym](https://github.com/leggedrobotics/legged_gym) 并借鉴了其几个核心概念。
## 环境概述
我们首先创建一个 gym 风格的环境(go2-env)。
#### 初始化
`__init__` 函数通过以下步骤设置模拟环境:
1. **控制频率**。
模拟以 50 Hz 运行,与真实机器人的控制频率相匹配。为了进一步缩小 sim2real 差距,我们还手动模拟了真实机器人上显示的动作延迟(约 20ms,一个 dt)。
2. **场景创建**。
创建模拟场景,包括机器人和一个静态平面。
3. **PD 控制器设置**。
首先根据名称识别电机。然后为每个电机设置刚度和阻尼。
4. **奖励注册**。
奖励函数在配置中定义并注册以指导策略。这些函数将在"奖励"部分中解释。
5. **缓冲区初始化**。
初始化缓冲区以存储环境状态、观测值和奖励
#### 重置
`reset_idx` 函数重置指定环境的初始姿态和状态缓冲区。这确保机器人从预定义配置开始,这对于一致的训练至关重要。
#### 步骤
`step` 函数执行动作并返回新的观测值和奖励。其工作原理如下:
1. **动作执行**。
输入动作将被裁剪、重新缩放,并叠加在默认电机位置之上。转换后的动作代表目标关节位置,然后将发送到机器人控制器进行单步执行。
2. **状态更新**。
检索机器人状态(如关节位置和速度)并存储在缓冲区中。
3. **终止检查**。
如果 (1) 回合长度超过允许的最大值 (2) 机器人身体方向显著偏离,则环境终止。终止的环境会自动重置。
4. **奖励计算**。
5. **观测计算**。
用于训练的观测值包括基座角速度、投影重力、命令、自由度位置、自由度速度和先前的动作。
#### 奖励
奖励函数对于策略指导至关重要。在此示例中,我们使用:
- **tracking_lin_vel**: 跟踪线速度命令(xy 轴)
- **tracking_ang_vel**: 跟踪角速度命令(偏航)
- **lin_vel_z**: 惩罚 z 轴基座线速度
- **action_rate**: 惩罚动作的变化
- **base_height**: 惩罚基座高度偏离目标值
- **similar_to_default**: 鼓励机器人姿态与默认姿态相似
## 训练
在这个阶段,我们已经定义了环境。现在,我们使用 rsl-rl 的 PPO 实现来训练策略。首先,通过 `pip` 安装所有 Python 依赖项:
```
pip install tensorboard rsl-rl-lib==2.2.4
```
安装后,通过运行以下命令开始训练:
```
python examples/locomotion/go2_train.py
```
要监控训练过程,启动 TensorBoard:
```
tensorboard --logdir logs
```
您应该看到类似这样的训练曲线:
```{figure} ../../_static/images/locomotio_curve.png
```
## 评估
最后,让我们推出训练好的策略。运行以下命令:
```
python examples/locomotion/go2_eval.py
```
您应该看到类似这样的 GUI:
如果您身边恰好有一台真实的 Unitree Go2 机器人,您可以尝试部署该策略。玩得开心!