简体中文 | Engligh (Powered by ChatGPT)
这个项目使用强化学习 (PPO) 训练宇树 H1 机器人实现在不同姿态作为初始状态下完成竖直站立任务.
- [2024/07/21] 完成初步的建模、代码编写。
- [2024/07/22] 调整
v1
版本奖励函数。 - [2024/07/23] 发现使用的是带灵巧手版本的
.urdf
文件,复杂的零件会导致 Unitree H1 机器人在仿真器中出现无法预料的错误。因此增加了不带灵巧手版本的.urdf
文件,并配置了对应的.proto
节点以及.wbt
世界文件,并为新的版本设计了UnitreeH1StandingV1
接口。 - [2024/07/24] 使用
UnitreeH1StandingV1
和v1
训练机器人,发现并不理想,浏览了相关论文,认为需要扩充状态空间 + 并行轨迹采样,这是接下来的目标。 - [2024/07/31] 发现仅仅基于关节角和头部三维位置的状态空间并非 "完整的" 状态空间,而适合作为部分可观的观测空间;因此接下来的改进正在尝试使用部分可观马尔科夫假设下的算法进行实现。
- [2024/08/01] 增加了使用循环神经网络结构 LSTM 为核心的 Actor 和 Critic ,目前正在跑实验。
在建模马尔科夫决策过程中, 使用宇树 H1 机器人的 21 (无手版本是 19 ) 个电机关节, 如下表所示.
躯体部分 | 关节名 | ||||
---|---|---|---|---|---|
左下肢部分 | left_hip_yaw_joint | left_hip_roll_joint | left_hip_pitch_joint | left_knee_joint | left_ankle_joint |
右下肢部分 | right_hip_yaw_joint | right_hip_roll_joint | right_hip_pitch_joint | right_knee_joint | right_ankle_joint |
中间部分 | torso_joint | ||||
左上肢部分 | left_shoulder_pitch_joint | left_shoulder_roll_joint | left_shoulder_yaw_joint | left_elbow_joint | left_hand_joint (在无手版本中不存在此关节) |
右上肢部分 | right_shoulder_pitch_joint | right_shoulder_roll_joint | right_shoulder_yaw_joint | right_elbow_joint | right_hand_joint (在无手版本中不存在此关节) |
在建模马尔科夫决策过程中, 使用宇树 H1 机器人 1 个部位实体, 如下表所示.
躯体部位 | 名称 | 备注 |
---|---|---|
头部 | head (在 .proto 文件中显示) |
距离 pelvis_visual 的高度是 0.7 米 |
状态空间包括两部分: 上述表格中各个关节的当前时刻角度信息, 各 1 维; 头部传感器的当前时刻 3 维位置信息; 总共 24 维度 (无手版本是 22 维度) .
动作空间是上述表格中各个关节的角度增量, 采用弧度制, 范围是
在设计的神经网络中, 最后层的激活函数是 softmax
激活函数, 将网络输出的均值 mean
和方差 std
数值限制在
下面三张图片使用的奖励函数是 v0
版本: 希望宇树 H1 的头部机器人施加动作后头部高度会上升且接近于自身高度值 ( 1.75 米) , 因此头部距离 1.75 米越远, 获得的奖励就越小. 由此得到奖励函数
v0
版本存在的问题是, 越接近于 1.75 米的奖励越小, 而 PPO 算法是跟奖励函数强相关, 因此奖励值过小会导致策略产生的梯度越小, 表现出在后期并没有学习到新的内容: 前面的 episode 波动很大, 而后期 "忽然" 接近于 0 .
注意到强化学习的目标是获得最大的累计奖励, 考虑到本任务的是从地面上站立, 那么头部高度应该会距离地面越来越远, 因此可以直接以头部距离和地面的差值作为奖励函数的自变量, 同时还需要考虑到机器人可能会因为力矩不当而弹飞.
因此设计奖励函数
获取一个 episode 是否结束的标志, 用于强化学习自动结束一个 episode 数据收集. 自动结束的标志有两个: 1. 当前的时间步骤大于既定的 episode 长度; 2. 宇树 H1 机器人飞离地面 3 米, 这是因为关节角的变化和力矩的施加导致机器人会 "弹" 出去.
代码来源: 我自己 2023 年写的 .
注意: 接下来的效果展示可能有误!目前正在调整。
注意: 接下来的效果展示可能有误!目前正在调整。
注意: 接下来的效果展示可能有误!目前正在调整。
效果表现和损失函数展示 ( UnitreeH1StandingV0
和 v0
奖励函数) :
效果表现和损失函数展示 ( UnitreeH1StandingV1
和 v1
奖励函数) :
待开发
待开发
待开发
.
├── basic
│ └── h1_with_hand.urdf
├── controllers
│ ├── base_declaration.py
│ ├── base_network.py
│ ├── buffer.py
│ ├── ckpts
│ ├── continuous_critic.py
│ ├── continuous_policy.py
│ ├── evaluation.py
│ ├── PPO_algo.py
│ ├── PPO_config.py
│ ├── PPO_run.py
│ ├── __pycache__
│ ├── results
│ ├── tools.py
│ └── UnitreeH1StandingEnv.py
├── libraries
├── plugins
│ ├── physics
│ ├── remote_controls
│ └── robot_windows
├── protos
│ └── H1.proto
├── README.md
└── worlds
└── UnitreeH1_Standing_RLTraining.wbt
12 directories, 15 files
Webots 默认项目模板是: controllers
(环境接口、算法实现和指标与模型的保存) , libraries
, plugins
, protos
(用于描述 Webots 中的机器人节点) 和 worlds
(描述 Webots 中世界) 文件; basic
(存放宇树原本的 .urdf
文件) 和 README(_en).md
是我额外加的.