从头开始做一个机器手臂3 写动态环境
学习资料:
上次我们搭建好了一个静态的环境, 整个环境还没有动起来. 这次我们结合手臂的运动部分和手臂的成像部分来写全整个手臂的摆动规则. 并且通过不断地可视化来测试是否写错.
下面可以看到我们使用随机动作来测试手臂的运行情况.
建立手臂信息¶
要定义手臂, 我们就需要用一个表来存储手臂的所有信息. 这个表的信息是流通的, 我们也能将这个信息传送到 Viewer
来进行可视化处理. 所以这个表是非常重要的. 在 ArmEnv
中, 除了一些提前定义的环境属性, 就是在 __init__
中定义手臂的表格了.
self.arm_info
是一个 2x2 的表, self.arm_info['l']
有两个信息, 都是两段手臂的长度, self.arm_info['r']
记录的则是当前两段手臂的旋转角度. 之后手臂做动作时, 都只是这个旋转角度的变化.
接着我们在 Viewer
中将 arm_info
和 goal
传入, 并确定手臂的初始中心点. 手臂将围绕这个中心点旋转. 这里我们按在上面定义的 goal
的坐标重新画了 goal
位置信息. 这样 goal 就会出现在左下角.
矩形手臂的点坐标¶
看下面不要被吓到了, 下面一大堆, 但是说的就一件事, 给我了 self.arm_info
的手臂角度信息, 我怎么样在屏幕上显示手臂的移动信息. 下面都是一些三角函数的计算, 找出每段手臂4个端点的坐标, 然后将坐标赋值给 self.arm1.vertices
和 self.arm2.vertices
. 这样手臂就能自由摆动了, 无论摆动到哪个角度, 我们都能找到对应的点坐标. 我觉得我这应该都不是最优的换算方法, 三角函数学得好的朋友们应该能写出更好的方法.
手臂移动方式¶
定义好了手臂的 update 规则, 我们就继续定义 update 规则时, 需要用到的手臂角度信息更新原则. 这个更新原则体现在 ArmEnv
中. 如果你还记得, 我们把手臂的运动和手臂的画图分开了. 所以运动的部分写在 ArmEnv
里. 这里我们会要用到手臂的 self.arm_info
信息, 加上 step()
功能传入的一个 action
来更新手臂的在下一时刻的 info 信息.
添加随机动作¶
为了完成所有任务, 我们需要让环境产生一些随机动作, 用来测试现在的这个环境可行性. 还有每次开始回合的时候, 手臂的初始状态也可以在这里设置. 有了这些设置, 我们就能测试旋转的手臂啦.
最后测试的时候, 在 env.py 最下面写一个简单的循环, 直接在 env.py 里进行测试.
上面这个基础环境的全部代码在这. 这就是我们一个抛开 RL 的环境, 手臂经测试, 能够用, 而且每个关节都正常. 接着我们就套上一个 RL 的方法, 来测试一下整体效果.
实战:从头开始搭建训练机器人手臂