乐聚社区
标题:
Pybulet Gym 源码解析:双足机器人模型 HumanoidPyBulletEnv-v0
[打印本页]
作者:
shyao
时间:
2020-4-25 09:46
标题:
Pybulet Gym 源码解析:双足机器人模型 HumanoidPyBulletEnv-v0
本帖最后由 shyao 于 2020-4-26 14:18 编辑
(, 下载次数: 485)
上传
点击文件名下载附件
OpenAI gym 是当前使用最为广泛的用于研究强化学习的工具箱,但 Gym 的物理仿真环境使用的是 Mujoco,不开源且收费,这一点一直被人诟病。而 Pybullet-gym 是对 Openai Gym Mujoco 环境的开源实现,用于替代 Mujoco 做为强化学习的仿真环境。封装了 Pybullet 的接口,无缝的接入了 Gym 环境。关于如何创建 Gym 自定义环境可以参考上一期极客专栏
《OpenAI Gym 源码阅读:创建自定义强化学习环境》
一、示例代码
完整使用
HumanoidPyBulletEnv-v0
模型的示例代码,在
pybulletgym/examples/
(
https://github.com/benelot/pybul ... ybulletgym/examples
)路径下可以找到。
<font size="3"> 1 import gym
2 import pybulletgym.envs</font>
复制代码
当示例代码引入 Pybullet-gym 库时,就完成了对 Pybullet 自定义 Gym 环境的注册。
根据 OpenAI Gym 的文档,下面是使用随机策略,调用
HumanoidPyBulletEnv-v0
的测试代码。
1 import gym
2 import time
3 import numpy as np
4 import pybullet as p
5 import pybulletgym.envs
6
7 def main():
8 env = gym.make("HumanoidPyBulletEnv-v0")
9 env.render(mode="human")
10
11 for i_episode in range(20):
12 observation = env.reset()
13 for t in range(100):
14 env.render()
15 print(observation)
16 action = env.action_space.sample()
17 observation, reward, done, info = env.step(action)
18 if done:
19 print("Episode finished after {} timesteps".format(t + 1))
20 break
21 env.close()
22
23 if __name__ == '__main__':
24 main()
复制代码
二、动作与观测
首先查看
HumanoidPyBulletEnv-v0
运动空间和观测空间的维度大小
<font size="3">1 print(f'env.action_space.shape = {env.action_space.shape}')
2 print(f'env.observation_space.shape = {env.observation_space.shape}')
3
4 >> env.action_space.shape = (17,)
5 >> env.observation_space.shape = (44,)</font>
复制代码
可知
HumanoidPyBulletEnv-v0
运动空间维度为
17
,动作空间维度为
44
查看注册环境源码,可知
HumanoidPyBulletEnv-v0
入口类为
HumanoidBulletEnv
<font size="3">1 register(
2 id='HumanoidPyBulletEnv-v0',
3 entry_point='pybulletgym.envs.roboschool.envs.locomotion.humanoid_env:HumanoidBulletEnv',
4 max_episode_steps=1000
5 )<font face="微软雅黑">
</font></font>
复制代码
根据
HumanoidBulletEnv
初始化
__init__
的参数,可知机器人实例由
Humanoid()
构建,顺藤摸瓜,获得
HumanoidBulletEnv
运动空间维度的详细定义。
<p><div align="left"><blockquote><font size="3">1 self.motor_names = ["abdomen_z", "abdomen_y", "abdomen_x"]
2 self.motor_power = [100, 100, 100]
3 self.motor_names += ["right_hip_x", "right_hip_z", "right_hip_y", "right_knee"]
4 self.motor_power += [100, 100, 300, 200]
5 self.motor_names += ["left_hip_x", "left_hip_z", "left_hip_y", "left_knee"]
6 self.motor_power += [100, 100, 300, 200]
7 self.motor_names += ["right_shoulder1", "right_shoulder2", "right_elbow"]
8 self.motor_power += [75, 75, 75]
9 self.motor_names += ["left_shoulder1", "left_shoulder2", "left_elbow"]
10 self.motor_power += [75, 75, 75]</font>
复制代码
执行
step
时,pybullet-gym 中使用力矩对机器人电机进行控制
<font size="3">1 def set_torque(self, torque):
2 self._p.setJointMotorControl2(bodyIndex=self.bodies[self.bodyIndex], jointIndex=self.jointIndex,controlMode=pybullet.TORQUE_CONTROL, force=torque) # positionGain=0.1, velocityGain=0.1)</font>
复制代码
接下来查看观测空间定义,状态观测是由
observation, reward, done, info = env.step(action)
获得,因此查看源码
walker_base_env.py
可知状态计算方式
<font size="3">1 np.clip(np.concatenate([more] + [j] + [self.feet_contact]), -5, +5)</font>
复制代码
大致包含机器人的离地面高度、机器人欧拉角、各个关节相对位置、足底是否触地等状态。状态维度为一共为 46,详细的定义,以及为什么这么定义的原因未知,参见这条 issue 的讨论 openai/gym/issues/585(
https://github.com/openai/gym/issues/585
),看来 OpenAI 被戏称为 CloseAI 是有原因的。
done
根据机器人的高度和偏航角来判断机器人是否摔倒,回合是否结束
alive = float(self.robot.alive_bonus(state[0] + self.robot.initial_z, self.robot.body_rpy[1])) # state[0] is body height above ground, body_rpy[1] is pitch
复制代码
三、奖励函数
对于强化学习问题,最为重要的就是奖励函数的设计,直接关乎训练后 Agent 的行为是否符合预期。
HumanoidPyBulletEnv-v0
的奖励由下面几部分构成
<font size="3">1 self.rewards = [
2 alive,
3 progress,
4 electricity_cost,
5 joints_at_limit_cost,
6 feet_collision_cost
7 ]</font>
复制代码
alive
: 判断机器人是否摔倒
progress
: 速度的差值
electricity_cost
: 控制的能量损耗,由扭矩和电机速度计算
joints_at_limit_cost
: 关节是否卡住
feet_collision_cost
:足底碰撞检测
Pybullet-Gym 代码逻辑是很清晰,但是由于是移植的 roboschool 的
Humanoid
环境,很多 Agent 代码细节没有文档可以参考,官方的态度是我们只需要关心采用哪些强化学习算法去训练 Agent 就可以了,不需要关注 Agent 的实现细节。但是如果要训练自定义的 Biped Robot Walk 的话就必须深入看 Gym 的底层代码实现,研究状态、运动、以及奖励函数的具体细节。
四、补充
Humanoid V1 Wiki 介绍
(
https://github.com/openai/gym/wiki/Humanoid-V1#observation
)
五、参考链接
https://github.com/openai/gym
https://github.com/benelot/pybullet-gym
OpenAI Gym 源码阅读:创建自定义强化学习环境
欧拉中的俯仰、横滚、偏航角
(
https://blog.csdn.net/guyubit/article/details/52995676
)
作者:乐聚机器人 王松
作者:
lejuxhj@qq.com
时间:
2020-6-4 11:20
完全看不懂也不影响我点赞。
作者:
陈小生
时间:
2020-6-15 11:32
原来点赞才能看懂!
作者:
乐聚の男青年
时间:
2020-6-19 19:08
技术硬核,课程完善,赛事支持
作者:
LL97uziiiii
时间:
2020-6-30 15:02
欢迎光临 乐聚社区 (https://bbs.lejurobot.com/)
Powered by Discuz! X3.4