DonkeyCar 实践:从遥控小车到训练驾驶模型

DonkeyCar 把摄像头、小车控制和模型训练放进一个可以动手实验的项目里。这篇记录了我从系统安装、网络连接,到校准、采集数据和训练模型的过程。
它最有意思的地方,是把“模型能预测什么”变成了车轮真的会怎样转动。软件、数据与硬件中的任何一环有问题,都能在实际运行时看见。

先理解整条流程

先用人工操作收集摄像头画面与驾驶指令,再训练模型,最后把模型放回车端,根据新的画面输出转向或油门。这是一条基于驾驶示例学习的流程。DonkeyCar 官方文档
先完成遥控和数据采集,再做训练,最后测试模型输出。把阶段分开,可以避免一开始就把所有问题归到模型上。
下面的安装材料来自 2023 年的实验环境,包含指定系统镜像、旧版 TensorFlow 与 Colab 配置。它们用于保留当时的实验过程,重新搭建时需要对照当前文档确认版本兼容性。

系统安装

下载烧录工具(RaspberryPi)
请选择电脑相对应的版本进行下载
notion imagenotion image
从服务器中选择donkeycar-pi-buster-2023-08-01.zip这个文件进行下载
notion imagenotion image
点击最后一项选择自己的系统,选择刚刚下载的系统进行烧录
notion imagenotion image

Wi-Fi连接

没有连接显示器时,可以通过配置文件让小车接入 Wi-Fi。电脑和小车处于同一网络后,就能通过 IP 地址访问车端服务。下面的方法针对当时使用的系统镜像。
下载这个文件
在电脑上打开装有DonkeyCar的sd卡,将wpa_supplicant.conf文件复制到SD卡的根目录中即可
使用vscode文本编辑器,打开wpa_supplicant.conf文件
在ssid中输入Wi-Fi名称(第5行)
在psk中输入Wi-Fi密码(第6行)
notion imagenotion image
修改完成后点击保存,将系统sd卡放入小车即可,等待系统启动OLED屏幕就会显示IP地址。

OLED驱动

OLED 屏幕用来显示 IP,方便启动后直接连接。原实验中,运行环境变化后驱动路径也发生了变化,屏幕出现异常;这一节记录当时的处理过程。
notion imagenotion image
首先使用cd命令,回到主页
cd
使用git命令GitHub上下载需要的屏幕驱动
git clone https://github.com/Nabaixin/TFOLED.git
下载完成后我们使用ls查看当前目录下的所有文件
此时我们会看到多出一个TFOLED的文件夹,这就是我们需要的驱动
ls
替换驱动之前,先在实际运行环境中定位原文件并备份。原笔记中的 Docker overlay 路径属于当时的容器实例,不能直接用于另一台设备。下面只展示复制方式,目标路径需要自行确认:
sudo cp -P TFOLED/NBX_OLED/OLED.py /实际确认并备份后的驱动路径/目标文件.py
完整命令如下图所示
notion imagenotion image
稍等30秒,驱动配置正常,OLED屏幕不再是花屏了,已正常显示
notion imagenotion image

启动小车

登陆小车后台
首先我们打开浏览器,根据小车的IP在浏览器的地址栏输入相对应的IP,记得在IP地址后面加8888端口
例:我的IP登陆地址为192.168.0.242:8888
根据自己小车IP地址改为相对应的IP地址
notion imagenotion image
当时镜像中的默认登录密码是下面这个值,具体应以所用镜像说明为准:
jupyter
成功登陆后会看到仪表板,我们需要使用到文件管理及终端
notion imagenotion image
创建mycar
打开终端进行以下步骤
notion imagenotion image
复制下方命令来创建mycar
ls
donkey createcar
cd mycar/
校准小车
因为校准小车的时候会跑起来,因此在操作时务必将其抬起
notion image
校准用于确定实际硬件的中位、转向端点和油门范围。PWM 数值与舵机、电调和连接方式有关,不能把一辆车的数值直接套到另一辆车上。
校准油门值
原实验中使用过 373 这个数值。实际操作应先确认电调的中位与校准步骤,再开启马达。
donkey calibrate --channel 0 --bus 1
notion imagenotion image
校准完之后按q退出
校准方向值
donkey calibrate --channel 1 --bus 1
notion imagenotion image
校准完之后按q退出
修改配置文件
我们点击仪表板左侧的mycar文件夹下的myconfig.py文件,我们需要修改一些配置
notion imagenotion image
在 myconfig.py 中修改与硬件对应的配置。原实验涉及第 53、54、55、63、64、65、66、143、146、291 行,但行号只适用于当时的文件版本。
重新配置时应根据参数名称与含义修改,对照下面的原始截图检查。
notion imagenotion image
notion imagenotion image
notion imagenotion image
所有修改完成后按command+s进行保存
启动小车
让我们回到终端输入下面这段代码,启动小车程序
python manage.py drive
notion imagenotion image
如果想要收集小车数据进行自动行驶的话需要执行这一条命令
python manage.py drive --js
在浏览器中输入小车的IP+8887端口即可访问
例如:我的访问地址是192.168.0.242:8887
notion imagenotion image
后台摄像头画面的右边是触摸板可以操作小车,可以愉快的跑小车了!
采集数据时,要覆盖实际希望小车处理的路段和转向情况。样本数量只是一个方面,连续错误驾驶或大量重复画面也可能影响训练,不能用“达到一万条”代替效果检查。

数据训练

遥控能够正常运行后,再把采集到的图像与操作记录用于训练。训练输出是一个模型文件,后续需要回到车端测试它能否处理新的画面。
ZIP学习数据压缩
首先我们进入mycar文件夹
cd ~/mycar/
学习数据保存在 mycar/data 目录。整理时可以排除明显失误的数据,但先保留原始备份;同时留下没有参与训练的记录用于检查效果。仅保留一段满意的驾驶,并不能保证模型在其他情况下同样准确。
如果存在过去的data.zip文件使用rm命令删除
rm data.zip
使用zip命令将data文件夹进行压缩
zip -r data.zip data/
等待压缩完成后mycar文件夹下会有一个data.zip的压缩包

当时的 Colab 训练环境

以下保留旧实验使用的配置,包含 TensorFlow 1.13.1 与相关依赖。云端运行环境会变化,复现时需要先确认 Python、CUDA 和车端推理版本能否配合,不能把旧安装单元格当成当前通用方案。
确认Colab OS
!cat /etc/os-release
卸载现有的 CUDA
由于我们不知道colab实例上安装了什么,所以这里出现错误也没关系。
!apt --purge remove "cublas*" "cuda*"
添加 CUDA-10.1 存储库
!apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub !wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-keyring_1.1-1_all.deb !dpkg -i cuda-keyring_1.1-1_all.deb
CUDA-10.1安装,大约需要10分钟
!apt-get update !apt-get install -y cuda-10.0
CuDNN-7.6.5安装
!wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/libcudnn7_7.6.5.32-1+cuda10.0_amd64.deb !wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/libcudnn7-dev_7.6.5.32-1+cuda10.0_amd64.deb !wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/libnccl2_2.6.4-1+cuda10.0_amd64.deb !wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/libnccl-dev_2.6.4-1+cuda10.0_amd64.deb !dpkg -i \ libcudnn7_7.6.5.32-1+cuda10.0_amd64.deb \ libcudnn7-dev_7.6.5.32-1+cuda10.0_amd64.deb \ libnccl2_2.6.4-1+cuda10.0_amd64.deb \ libnccl-dev_2.6.4-1+cuda10.0_amd64.deb
安装TensorFlow
安装与 DonkeyCar的RaspberryPi3 上安装的 TensorFlow 版本相同的版本。 Google Colab 的默认tensorflow/cuda/pip 包版本将会更新。 由于Tensorflow不保持向后兼容性,Colab使用与Raspberry Pi版本DonkeyCar标准TensorFlow 1.13.1相同版本的Tensorflow。 Google Colab 不再支持 Tensorflow 1.x,因此无法再使用 pip 找到它。 因此,我们将使用 Miniconda 安装 Tensorflow 1.13.1。
%%bash MINICONDA_INSTALLER_SCRIPT=Miniconda3-4.5.4-Linux-x86_64.sh MINICONDA_PREFIX=/usr/local wget https://repo.continuum.io/miniconda/$MINICONDA_INSTALLER_SCRIPT chmod +x $MINICONDA_INSTALLER_SCRIPT ./$MINICONDA_INSTALLER_SCRIPT -b -f -p $MINICONDA_PREFIX
import sys _ = (sys.path.append("/usr/local/lib/python3.6/site-packages")) !pip install -U pip !pip uninstall -y tensorflow !pip install tensorflow-gpu==1.13.1 h5py==2.10.0 protobuf==3.19.6 numpy==1.19.5 pillow==8.4.0 cycler==0.11.0 decorator==4.4.2 python-dateutil==2.8.2 wcwidth==0.2.6
请执行一次RESTART RUNTIME。 即使重新启动后,已安装的 Tensorflow 1.13.1 也会保留。 重新启动后,您可以从下一步开始。
重启后重新添加Python PATH
import sys _ = (sys.path.append("/usr/local/lib/python3.6/site-packages"))
检查 TensorFlow 版本
!pip freeze | grep -i -e tensorflow
!python -c "import warnings;warnings.simplefilter(action='ignore', category=FutureWarning);import tensorflow as tf; print(tf.__version__)"
安装DonkeyCar
与 Raspberry Pi 上安装的 DonkeyCar 版本相匹配。
# 如果找不到 imageio,DonkeyCar 自动安装的 imageio 版本为 2.16.0,最新截至 2023/03/02。 这需要 numpy1.20.0 或更高版本。 # 截至2023/03/02,可与google colab一起使用的numpy最高为1.19.5,因此请指定imageio版本并安装。 !pip install imageio==2.15.0
!git clone https://github.com/autorope/donkeycar.git %cd donkeycar !git checkout be45ae038cb00d81c5450b9a481dbf5aaa03e688 !pip install -e .[pc]
创建 DonkeyCar 项目
!donkey createcar --path /content/mycar
编辑 myconfig.py 文件。
将 CACHE_IMAGES 设置为 False。 这是为了减少学习过程中的内存消耗而设置的。 注释掉 GYM_CONF["guid"]。 截至20200825,这似乎已启用,因为开发主要在虚拟比赛中进行,但在学习时则没有必要。
!sed -i 's/# CACHE_IMAGES = True/CACHE_IMAGES = False/g' /content/mycar/myconfig.py !sed -i 's/use_multiprocessing = False/use_multiprocessing = True/g' /content/mycar/train.py !sed -i 's/^GYM_CONF/# GYM_CONF/g' /content/mycar/myconfig.py
上传data.zip并解压数据
上传data.zip(用DonkeyCar收集的学习数据)。 如何通过浏览器将data.zip上传到colab并 通过 Google Drive 将 data.zip 上传到 colab 有两种方法。 如果使用浏览器方式通信速度太慢,请尝试使用 Google Drive 方式。
通过浏览器上传data.zip时
上传data.zip(用DonkeyCar收集的学习数据)。 当您运行下面的代码时,将出现一个文件上传表单。 文件被发送到 /content/mycar/ 并且 data.zip 正在解压缩。 数据集的目录结构为/content/mycar/data/tub_1_xxxx。
%cd /content/mycar/ import os import shutil from google.colab import files if(os.path.exists("/content/mycar/data.zip")): os.remove("/content/mycar/data.zip") if(os.path.exists("/content/mycar/data")): shutil.rmtree("/content/mycar/data") uploaded = files.upload() file_name = list(uploaded.keys())[0] file_path = "/content/mycar/" + file_name print("-----------------------------------------------------") print("【処理結果】%sにデータをアップロードしました。" % file_path) print("-----------------------------------------------------") !unzip -o data.zip
通过 Google 云端硬盘上传 data.zip 时
通过浏览器上传数据非常慢,因此如果您想通过Google Drive快速完成上传,请使用它。 通过执行下面的代码并进行身份验证,您将能够使用通过 Google Colab 上传到 Google Drive 的 data.zip 文件。
from google.colab import drive drive.mount('/content/drive') !ls '/content/drive/My Drive' | grep data
Google Drive 安装在 /content/drive/MyDrive。 将 data.zip 文件复制到 /content/mycar/ 并解压缩。 如果您上传到 Google 云端硬盘中的任何文件夹,请将其替换为“/content/drive/MyDrive/任意文件夹名称/data.zip”。
%cd /content/mycar/ import os import shutil if(os.path.exists("/content/mycar/data.zip")): os.remove("/content/mycar/data.zip") if(os.path.exists("/content/mycar/data")): shutil.rmtree("/content/mycar/data") !ls -l '/content/drive/MyDrive/data.zip' !cp '/content/drive/MyDrive/data.zip' /content/mycar/data.zip !unzip data.zip
双击或按 Enter 进行编辑
开始学习
现在我们已经创建了Colab环境,我们将学习DonkeyCar。
学习目标将是 /content/mycar/data/ 中存在的所有文件夹。
type = "linear" trained_mode = "/content/mycar/models/mypilot.h5" %cd /content/mycar !python manage.py train --model={trained_mode} --type={type}
确认学习成果
原实验使用 linear 模型生成分析视频,对照人工操作与模型输出。模型可视化能帮助发现差异,但仍不能替代实际运行测试。下面保留当时的命令。
安装模型可视化包
!pip uninstall -y keras-vis !pip install git+https://github.com/sctse999/keras-vis !apt install -y ffmpeg !pip install opencv-python==4.1.2.30
创建视频文件
不支持多个tub,因此您必须使用--tub=tub_xxxx 选项指定一个数据目录。
!ls /content/mycar/data
选择显示的数据目录之一并将其重写为tub_xxxx。 您可以轻松检查目录是否没有大量数据项。
%cd /content/mycar mp4_path = 'tub_movie.mp4' !donkey makemovie --tub=data/tub_xxxx --model models/mypilot.h5 --type linear --salient --out=$mp4_path
视频下载
将创建的分析视频下载到您的 PC。 通过在电脑上播放下载的视频,您可以检查模型的响应情况。 绿线:人为操作。 蓝线:AI判断。
from google.colab import files files.download('/content/mycar/'+mp4_path)
迁移学习成果
学习结果保存在 /content/mycar/models/mypilot.h5。下载后复制到车端对应目录,再配置程序加载它。模型文件存在,还需要确认车端能正常读取,以及输出与实际控制范围匹配。
from google.colab import files files.download('/content/mycar/models/mypilot.h5')
这时模型文件和分析视频已经下载到本地。
notion imagenotion image

训练之后,还要回到小车上验证

可以先对照分析视频检查转向与油门,再在可控条件下低速测试,并保留人工停止方式。模型在已有记录上表现正常,并不能保证遇到新光照、偏离路线或陌生场景后仍然可靠。
这个项目把数据质量、环境兼容和硬件校准放到了同一条链路上。想让小车稳定运行,就需要逐项知道:哪一步已经检查过,哪一步还需要继续试。
我的模型分析视频
对于本文内容有任何疑问, 可与我联系.