强化学习与模仿学习Buglist(不定时更新)
1 环境搭建问题
1.1 mujoco 相关
(1) mujoco-py 安装后编译错误 Error compiling Cython file
问题详情:
1 | performance hint: /home/mahaofei/anaconda3/envs/reskill_new/lib/python3.7/site-packages/mujoco_py/cymj.pyx:67:5: Exception check on 'c_warning_callback' will always require the GIL to be acquired. |
解决方法:
1 | pip install "cython<3" |
(2) ERROR: GLEW initalization error: Missing GL version
问题详情:
1 | /home/mahaofei/anaconda3/envs/reskill_new/lib/python3.7/site-packages/gym/envs/registration.py:64: UserWarning: register(timestep_limit=100) is deprecated. Use register(max_episode_steps=100) instead. |
解决方法:
1 | export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libGLEW.so |
[!question] 配置好 gym 环境后再使用 opencv 出现 RuntimeError: Failed to initialize OpenGL
目前来看 gym 渲染和 opencv 显示不能同时使用。
- 想要使用 opencv 则需要执行
unset LD_PRELOAD
;- 想要使用 gym 渲染需要执行
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libGLEW.so
。
(3) MujocoException: Got MuJoCo Warning: Nan, Inf or huge value in QACC at DOF X. The simulation is unstable.
问题原因:
在使用mujoco
进行强化学习训练的过程中,有可能会出先上面这种报错,从而导致训练提前终止。
这是因为在执行env.step
过程中,环境中的模型(机器人自身或者机器人和其它物体)发生了模型穿透或者约束冲突,导致mujoco无法进行仿真。
解决方法1:添加关节属性damping和armature(有效!)
参考链接:https://github.com/google-deepmind/mujoco/issues/989
在限制关节转角后,法线算法能训练的epoch数变多了,但是到后面还是会报错。
经过检查法线我的夹爪上的关节都没有设置阻尼,添加damping
和armature
,注意需要给所有的joint
都添加这两个属性,包括机器人和各种物体。
1 | <joint name="robotiq_2f_85_right_driver_joint" range="0 0.834" damping="0.1" armature='0.01'/> |
之后再进行训练,再也没有出现过错误。
注意:damping
和armature
这两个参数可能需要调节,尤其是夹爪等比较小的部件,如果这里的阻尼设置的太大,会出现关节无法运动的情况。
其它方法2:限制关节范围(有一定效果)
对于我的机械臂模型而言,由于我的目标任务是抓取,机械臂原本的活动范围设置的很大,在调试过程中也能够发现在很多情况下机械臂会与自身碰撞、或与桌面碰撞。
我的方法是:手动控制机械臂在mujoco
环境中运动,使其到达任务空间的极限位置,使用下面的命令,打印出各joint
在极限位置的值。
1 | print(sim.data.qpos[model.jnt_qposadr]) |
根据所有极限位置,确定各个关节的取值范围。
然后在模型的.xml
文件中,修改<wholebody>
中各个<joint>
的range
,例如:
1 | <!-- 初始 --> |
经过测试,只改变joint
的range
后,能迭代的次数变多了,但是还是没有解决问题。
其它方法3:修改奖励函数(有一定效果)
因为报错的原因是机器人的动作超出了工作空间或者发生了碰撞,那么说明学习算法没有学习到合适的动作,让机器人产生了错误的运动。
因此考虑修改奖励函数,加入超出工作空间的惩罚,例如对于抓取,如果夹爪末端位置xyz超出一定坐标,则给予惩罚,以及夹爪距离物体过远,也给予惩罚。
这种方式有一定效果。
其它方法4:减小solrel(未尝试)
参考链接:https://github.com/google-deepmind/mujoco/discussions/63
其它方法5:改用RK4积分器(无效)
参考链接:https://github.com/google-deepmind/mujoco/issues/168
其它方法6:检查环境设置(有效)
检查环境的reset
函数是否设置正确,经过检查,我发现我的代码问题在于重置了环境和机械臂的各个关节,但是没有重置mocap
,导致如果上一次仿真最后机械臂末端漂了,这一次一开始机械臂就会漂的很远,随着仿真的进行就容易出现上面的错误。