1 环境搭建问题

1.1 mujoco 相关

(1) mujoco-py 安装后编译错误 Error compiling Cython file

问题详情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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.
Possible solutions:
1. Declare the function as 'noexcept' if you control the definition and you're sure you don't want the function to raise exceptions.
2. Use an 'int' return type on the function to allow an error code to be returned.
performance hint: /home/mahaofei/anaconda3/envs/reskill_new/lib/python3.7/site-packages/mujoco_py/cymj.pyx:104:5: Exception check on 'c_error_callback' will always require the GIL to be acquired.
Possible solutions:
1. Declare the function as 'noexcept' if you control the definition and you're sure you don't want the function to raise exceptions.
2. Use an 'int' return type on the function to allow an error code to be returned.

Error compiling Cython file:
------------------------------------------------------------
...
See c_warning_callback, which is the C wrapper to the user defined function
'''
global py_warning_callback
global mju_user_warning
py_warning_callback = warn
mju_user_warning = c_warning_callback
^
------------------------------------------------------------

/home/mahaofei/anaconda3/envs/reskill_new/lib/python3.7/site-packages/mujoco_py/cymj.pyx:92:23: Cannot assign type 'void (const char *) except * nogil' to 'void (*)(const char *) noexcept nogil'. Exception values are incompatible. Suggest adding 'noexcept' to type 'void (const char *) except * nogil'.

Error compiling Cython file:
------------------------------------------------------------
...
See c_warning_callback, which is the C wrapper to the user defined function
'''
global py_error_callback
global mju_user_error
py_error_callback = err_callback
mju_user_error = c_error_callback
^
------------------------------------------------------------

解决方法:

参考:stackoverflowgithub issue

1
pip install "cython<3"

(2) ERROR: GLEW initalization error: Missing GL version

问题详情:

1
2
3
4
5
6
/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.
warnings.warn("register(timestep_limit={}) is deprecated. Use register(max_episode_steps={}) instead.".format(timestep_limit, timestep_limit))
Creating window glfw
ERROR: GLEW initalization error: Missing GL version

Press Enter to exit ...Killed

解决方法:

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数变多了,但是到后面还是会报错。

经过检查法线我的夹爪上的关节都没有设置阻尼,添加dampingarmature,注意需要给所有的joint都添加这两个属性,包括机器人和各种物体。

1
<joint name="robotiq_2f_85_right_driver_joint" range="0 0.834" damping="0.1" armature='0.01'/>

之后再进行训练,再也没有出现过错误。

注意:dampingarmature这两个参数可能需要调节,尤其是夹爪等比较小的部件,如果这里的阻尼设置的太大,会出现关节无法运动的情况。

其它方法2:限制关节范围(有一定效果)

对于我的机械臂模型而言,由于我的目标任务是抓取,机械臂原本的活动范围设置的很大,在调试过程中也能够发现在很多情况下机械臂会与自身碰撞、或与桌面碰撞。

我的方法是:手动控制机械臂在mujoco环境中运动,使其到达任务空间的极限位置,使用下面的命令,打印出各joint在极限位置的值。

1
print(sim.data.qpos[model.jnt_qposadr])

根据所有极限位置,确定各个关节的取值范围。

然后在模型的.xml文件中,修改<wholebody>中各个<joint>range,例如:

1
2
3
4
<!-- 初始 -->
<!-- <joint name="joint1" pos="0 0 0" axis="0 0 1" armature="1.5708" limited="true" range="-3.14159 3.14159" damping='200' /> -->
<!-- 测试关节范围(抓取) -->
<joint name="joint1" pos="0 0 0" axis="0 0 1" armature="1.5708" limited="true" range="-1.57079 1.57079" damping='200' />

经过测试,只改变jointrange后,能迭代的次数变多了,但是还是没有解决问题。

其它方法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,导致如果上一次仿真最后机械臂末端漂了,这一次一开始机械臂就会漂的很远,随着仿真的进行就容易出现上面的错误。