任务
我需要用MPC完成gym环境下的car racing任务,记得之前看到B站一位UP在github上有开源他的实现,但那个原链接现在好像找不到了,好在github上最终找到了这个RaceCarControl项目,尝试复现他的效果,然后学习MPC,最后在他的代码基础上进行修改。
参考视频
参考代码
踩坑回顾
BOX2D问题
症状描述
我先创建了一个python3.10的conda环境,然后按照项目readme指示,安装了numpy、opencv-python、gym、box2d。因为我python就没有按照要求用3.7的,其他的包我也干脆直接pip3安装最新版的。
然后当我
python main.py
就出现了报错:
AttributeError: module '_Box2D' has no attribute 'RAND_LIMIT_swigconstant'
解决方案
这个问题我上次刚碰到过。但上次用了两个方法,之后才进行的测试。不知道是哪个方法解决了。这次我打算采用:
pip3 uninstall box2d
pip3 install gym[box2d]
因为之前的方法是pip3 install gym[all],官网说要安装gym[box2d]:
执行之后果然没有这个问题了,只是报错:
ModuleNotFoundError: No module named 'moviepy'
这很简单,安装就行:
pip3 install moviepy
env.step返回参数问题
症状描述
运行
python main.py
虽然画面出来了,但是闪退,并且报错:
Traceback (most recent call last):
File "/home/lcy-magic/RaceCar_TEST/RaceCarControl/main.py", line 29, in <module>
observation, reward, done, info = env.step(action)
ValueError: too many values to unpack (expected 4)
这是gym常见问题了,因为gym改过版,改下代码就行。
解决方案
可以看到现在的gym里,是这样实现的:
def step(self, action):
"""Steps through the environment using action, recording observations if :attr:`self.recording`."""
(
observations,
rewards,
terminateds,
truncateds,
infos,
) = self.env.step(action)
也就是返回值分别为observation, reward, terminated, truncated, info
所以直接把原代码改为(添加一个truncated):
observation, reward, done, truncated, info = env.step(action)
就行。
CV2问题
问题描述
又报错了:
File "/home/lcy-magic/RaceCar_TEST/RaceCarControl/vision.py", line 79, in reference_line_extractor
thin = cv2.ximgproc.thinning(self.lane_mask)
AttributeError: module 'cv2' has no attribute 'ximgproc'
解决方案
根据参考回答,要先看下是不是opencv-contrib-python、opencv-python、opencv-python-headless这三个包都安装了:
pip3 list | grep opencv
结果我只有
opencv-python 4.9.0.80
然后我问GPTximgproc是哪个包的,GPT告诉我是opencv-contrib-python,于是:
pip3 install opencv-contrib-python
这次问题解决!!!成功运行并见证翻车现场(转了好几圈又回到赛道上了,还是很可以的)
注意
我问了opencv那3个包的区别是什么,这是GPT的回答:
opencv-contrib-python:这个包包含了OpenCV的所有模块,包括核心模块、图像处理模块、计算机视觉模块、机器学习模块等。它包含了一些额外的模块和功能,因此文件较大。如果你需要使用OpenCV的所有功能,可以选择安装这个包。
opencv-python:这个包包含了OpenCV的核心模块和基本功能,但不包含一些额外的模块和功能。它比opencv-contrib-python包小,适合于一些基本的图像处理和计算机视觉任务。
opencv-python-headless:这个包是opencv-python的一个变种,它不包含图形用户界面(GUI)相关的功能。这意味着它不包含显示图像、窗口管理等功能,适合于在服务器等没有图形界面的环境下进行图像处理和计算机视觉任务。
总的来说,这三个包都是OpenCV的Python绑定,它们在功能和包含的模块上有所不同,可以根据你的需求选择合适的包进行安装和使用。
所以,以后安装opencv,如果空间足够,直接一步到位:
pip3 install opencv-python opencv-contrib-python opencv-python-headless