前言:
已入强化学习一个学期了,发现自己急需一个物理环境来进行训练机器人,前前后后参考过过许多环境,但是最后选择了Unity3D,这是因为其足够简单,不用费很大的功夫就可以建立一个简易的机器人,只需要编写C#脚本和tensoflow进行通讯,立马就可以生成一个模型。对于这点,之前我找过资料看是否unity 支持python脚本,国外一老哥介绍了方法,但是我的电脑在安装一些内容时就出错,当我确定通讯方案已经开干时,后面忽然发现,unity 官方也在支持机器学习,也就是2018年的事情,本质上也是通讯,但是他有许多内容都已经打包,所以需要原生态的还是需要自己建立。我采用TCP的方式,建立通讯机制,采用PPO的学习算法来进行了一些简单的测试,效果还行,仍有许多问题需要解决。
一,建立自己的方块机器人(Box Robot)
建立robot是一个很有意思的过程,如下就是在多次尝试之后的柯基犬:
1.添加受物理环境影响的属性
添加该属性,所建立的模型就会受到物理环境的影响,这里至关重要,里面可以设置运动的自由度,运动粘滞。
2.物理的关节建立
在尝试unity时,一穷二白,在多次尝试之后发现,可以使用 这个就是旋转Joint,里面可以设置旋转的上下限,可以使用马达并设置旋转速度,单位(deg/s),可以是用弹簧等。我建立的BoxRobot 利用了他的关节角度限制,马达旋转速度等参数。里面比较重要的就是Connected Anchor这个属性的设置,他的坐标不是依据该物体的坐标!(肢体关节不可过长,否则会在一个自由度方向发生振动,这个吃了大亏)
3.添加摩擦
在unity中,我所知道的是利用添加物理材质Physic Material ,里面可以进行设置滑动摩擦和静态摩擦,我只在地面和脚的的地 方添加了摩擦。
4.编写脚本
对每个肢体都编写了脚本,有信息反馈函数和参数设置函数。最后这些脚本在总的执行脚本里面调用,执行。通讯脚本的编写参考:unity 与 python 通讯(demo) 对于观测状态,有X轴角度,Y轴角度,每条腿的角度值。激励策略:X轴方向位移差*50 。行为:每条腿下次要转动的角度,速度依据角度差! (我这里的策略可能有问题,在完善中) Z轴位移为固定,只训练前进速度。
二,python端
在python 端我利用了PyQt的信号机制,当然也是用了他的TCP接口,这样做的目的使得效率较高。而且我训练的过程也是放在了槽函数里面! PPO(Proximal Policy Optimization近端策略优化)是OpenAI提出的一种DRL算法,其对于连续控制问题具有比较好的效果,已经是OpenAI在强化学习上的默认算法了。还是基于基于 Actor-Critic 算法,这点我比较喜欢。通俗的来讲利用综合价值优势来进行梯度下降的,而且下降依据综合价值*clip(0.8,1.2) (举例),在policy上采用比例的方式,比较好的解决了步长问题。总的来说比较简单,而且paper里面公式都很简单,相比DDPG来说,省了很多功夫。而且大佬们说好或许就真的好。由于可怜的硬件和时间问题,我只尝试了PPO算法。
三,实际结果
早期的dog: 现在的: 可以看出柯基的步态很有意思,在其他次的训练中,他总是到一种局部最优的情况,就不思进取了,这里需要改善和一些经验指导,有可能问题就出现在机器人的模型上。具体视频:这里 依据tensorboard显示的Loss我的后面波动比较大,这里就不展示了。 接下来,准备尝试自由度更高的模型,在激励策略上进行优化。 ——————————————————————- 新的训练模型