前面一篇博客记录了硬件清单和组装,这里接着做软件配置让系统能运行起来。
Donkey Car的GitHub仓库地址为:
https://github.com/autorope/donkeycar
我还是先用这个让小车跑起来,它提供了基本的功能,包括通过摄像头采集数据,训练,利用训练结果进行自动驾驶,用网页界面控制小车等。
首先是树莓派的安装配置,这里不展开,不过我之前做过,也记录了详细文档,贴这里仅供参考:
http://www.beavermagic.com/doc/%E6%A0%91%E8%8E%93%E6%B4%BE3B+%E6%90%AD%E5%BB%BA%E7%82%B9%E6%92%AD%E7%B3%BB%E7%BB%9F%E5%8F%8A%E6%97%A5%E5%B8%B8%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3.pdf
因为我已经有个树莓派了,这个小车的就需要修改下主机名称,将/etc/hostname中的名称改为donkey,/etc/hosts中127的本地ip也对应改为donkey即可。
接着,树莓派能够运行了,开启了ssh和vnc,处于局域网下,我可以从同局域网的电脑上连接访问它:
不得不说VNC确实舒服。
那么,需要先测试下摄像头能否正常工作,摄像头需要通过树莓派自带的管理器开启,注意摄像头插紧,电源要够标准。我原来遇到过摄像头无法初始化的问题,重启没用,又插拔了摄像头,换了电源就好了。效果如下:
用该命令成功得到一个3280*2464的大图,还是很清晰的,这里就不放图了。
树莓派和摄像头都没问题了,接着就可以进行Donkey Car的配置了。先说明一下,我安装的树莓派系统都是官方的,官方用的是32位系统,所以你看到cpu信息可能是armv7l,那是因为它跑的是32位系统。但是它的cpu是a53,支持64位,所以如果你跑64位系统,看到的应该是armv8(64)吧。其实有人在搞树莓派64位,这里就还继续用官方带桌面的32位系统。
(树莓派用conda还是有较多问题的,而且donkey car自身用的virtualenv,我这里的记录有的是弯路,后面换成virtualenv了)先准备环境,既然是32位系统,那么下载一个miniconda 32位的Linux安装包,而且全面转向python3,选择对应python3的miniconda。但是如果你直接在minicnonda官网页面下载就出问题了,因为这个32位是x86的,而我们树莓派的32位是arm,所以会报错:
无法执行二进制文件: 可执行文件格式错误
所以树莓派安装miniconda需要:
wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-armv7l.sh
bash Miniconda3-latest-Linux-armv7l.sh
创建一个名为py3-env的环境:
conda create -n py3-env python=3.4
这里写python版本3.4,因为arm对应的还没到3.7,只有一个最高的3.4。接着就可以:
git clone https://github.com/autorope/donkeycar.git
这里为了测试donkey car,单独建立一个donkey虚拟环境,上面的py3-env留作以后正式使用。激活该虚拟环境后,安装donkeycar:
pip install donkeycar
官方文档后面好像还有括号和pi,不用带也一样的。等它把各个依赖都安装好:
这里完成后就可以:
python -c "import donkeycar as dk; print(dk.__version__)"
文档后面还有要:
pip install -e ./donkeycar
等操作,主要是为了进行训练的,而训练时放在别的服务器或者笔记本上,不在树莓派上做。这里也就可以说软件配置完成了。
接着创建模板:
donkey createcar ~/mycar --template donkey2
就报错了:
undefined symbol: PyFPE_jbuf not built
查了下好像pip安装的numpy和conda本身环境有冲突。所以我就继续用virtualenv创建一个donkey环境吧,把原来的清理掉。期间pip安装的numpy会花很长时间(还有个pandas),因为numpy是c实现的,需要编译后安装,一定要耐心等。完成后运行上面的createcar命令,得到:
已经有manage.py了,接着运行:
python manage.py drive
提示要tensorflow,然后提示picamera,都用pip安装好后,提示要Adafruit_PCA9685。这个也可以用pip直接安装:
pip install adafruit-pca9685
然后还要i2c开启,如果权限不够,需要将自己的用户添加进i2c组中。如果临时添加,记得要退出当前终端,重新开,不然还是没权限。
一直到这里,我都还没将9685连接到树莓派呢,现在连接上。可是怎么连接呢?之前想买整装的就是担心连接不会,但是无奈买不到整装的,只能DIY了。这里主要参考官方视频:
https://www.youtube.com/watch?v=byRLYkZkJZE&t=3720s
视频还算清楚:
然后结合官网文档和树莓派引脚定义,先将树莓派和这个PCA9685连接起来。这里放一个树莓派引脚图:
结合视频和引脚定义,将树莓派内侧第一个引脚,也就是1号引脚,连接到9685的第二个引脚,也就是它的VCC引脚,这样树莓派的3.3V供电给到9685。树莓派的内侧第二个引脚,也就是3号引脚SDA连接9685的第三个引脚,也就是它的SDA。树莓派的5号引脚SCL连接9685的SCL,树莓派的9号引脚也就是GND连接9685的最后一个引脚也就是他的GND。如下:
接着就是电机部分了,要将控制电机的功能从原来的2.4G接收器上拿掉,放在舵机上让树莓派控制。原来的连接是这样的:
我的这个控制器有四排线,从下面开始数,第一和第二是插着的,第三和第四是空着的只有排针。这上面有防呆接口,第一排线是有小缺口的:
第二排则没有。继续观察,第一排线是接Servo上的,也就是控制转向的,也就是Steering信号。第二排是接到那个小的BEC上的。BEC就是Battery Eliminator Circuit,也就是免电池电路,这些说法都常见于Radio-controlled(RC)模型(车)。BEC能让遥控模型只搭载一组电池,而不需要两组(一组马达电池,一组遥控电路电池)。最终BEC输出的红黑两条线缆给到电机,也就是说第二排是控制速度的,也就是Throttle信号了。
那么这俩如何连接到9685上呢?9685是16路的,这里只需要两路信号。这两路信号线都是一样的颜色,黑色代表的是GND,也就是地,对应到9685上也要是黑色孔。这里想要连接就要看代码了:
#STEERING
STEERING_CHANNEL = 1
STEERING_LEFT_PWM = 420
STEERING_RIGHT_PWM = 360
#THROTTLE
THROTTLE_CHANNEL = 0
THROTTLE_FORWARD_PWM = 400
THROTTLE_STOPPED_PWM = 360
THROTTLE_REVERSE_PWM = 310
所以这里将9685的信号0对应Throttle,也就是第二排线,信号1对应第一排线也就是Steering。另外说一下,如果遇到ESC这个词,说的是Electronic Speed Control,就是电子转速控制。这个小车上用的是7.2V的电源,是6个小电池串联的,每个小电池1.2V。
最后,还需要加一个移动电源,因为车子本身的电池没有树莓派需要的那种标准。我这里用了魅族移动电源,5V/2A输出刚好够树莓派用。
最后组装好了如下:
这就真的运行起来了,就能到浏览器中访问控制页面,输入的网址就是小车的ip加上8887端口号:
为什么小车没动呢,好像昨天晚上车子电池接着车身,不过也没怎么用不会就耗完了吧。充电完成继续测试,总算可以了。用网页控制小车移动还是很不错的,连接收器的电池钱都省了。