Robocar控制器快速入门指南

图片发布

需求

在开始之前,您需要满足以下条件:

  • 具有iOS或Android的手机

安装移动应用

Robocar Controller在Apple的App Store和Google Play商店均可使用。只需在手机上安装此应用即可。

图片发布

用预先建立的映像刷新SD卡

  1. 下载Etcher
  2. 在此处下载我们的预制图像
  3. 将图像刷入SD卡
  4. 将卡插入Pi

将手机连接到热点

  1. 打开Raspberry Pi
  2. 等到绿灯停止闪烁。第一次可能最多需要2-3分钟。Pi会重新启动1-2次,直到准备就绪为止。
  3. 转到手机的Wifi设置屏幕。您将看到一个名为“ donkey-xxxxxx”的热点。在离开设置屏幕之前,请确保已连接到该热点。

首次设置

  1. 启动应用程序。首次使用时,请同意条款。
  2. 该应用程序将在网络中搜索汽车。您的汽车应显示IP 192.168.50.1。
  3. 点击显示的汽车。您将进入首次设置屏幕。
  4. 选择您正在使用的控制器类型。最有可能您将使用PCA9685。MM1用户请选择MM1。
  5. 选择您所在的国家。我们需要此信息,因为wpa请求者需要此信息以符合国家/地区特定的Wifi规则。如果选择了不正确的国家/地区,则可能会发生意外的wifi连接问题。
  6. 设置wifi连接。搜索附近的wifi网络,然后选择要让Pi连接的wifi网络。输入密码,然后点击完成。
  7. 查看设置。如果一切正常,请点按“完成”,然后Pi将禁用热点并连接到Wifi网络。此时,您会看到您的手机已从热点断开连接,因为Pi在成功连接到Wifi后会禁用它。您的手机很可能会回退并连接到原来用于连接的Wifi网络。确保您的手机与Pi连接到相同的网络。
  8. 您将被重定向回车辆搜索屏幕。您应该看到您的汽车随Wifi网络分配的IP一起出现。
  9. 点击汽车,然后转到汽车的控制面板。

图片发布

校准

完成首次设置后,您可能要做的第一件事就是校准汽车。点击进入校准屏幕。将显示两个选项卡以配置转向和油门:

图片发布

PCA9685的校准屏幕

驾驶

校准后,点击驾驶按钮以开始驾驶汽车。系统将询问您是否要使用虚拟游戏杆或物理游戏杆。现在选择虚拟游戏杆。此外,系统还会要求您分享您的当前位置。该应用程序将此位置(经度,纬度)添加到浴缸的meta.json文件中。

图片发布

图片发布

图片发布

数据

数据视图显示您在树莓派上收集的所有数据(数据桶)。

图片发布

图片发布

培养

截至今天,我们为移动应用程序用户提供免费的培训服务。

图片发布

图片发布

图片发布

自动驾驶仪

您可以通过两种方式启动自动驾驶仪。一种方法是在火车功能内启动自动驾驶仪。就像上面显示的屏幕截图一样,您可以直接从那里启动自动驾驶仪。另一种方法是使用控制面板上的“自动驾驶”功能。该应用程序将列出Pi内的所有型号。换句话说,您可以将模型复制到Pi中,但仍可以使用该应用程序启动自动驾驶仪。

图片发布

进阶设定

Doneky汽车软件带有多种配置,您可以进行试验。我们提供了一些您可能想要更改的常用选项。

  • 训练配置
  • 传动系设置

图片发布

结论

本文向您展示如何在不键入单个命令的情况下将Robocar控制器与Donkey汽车软件一起使用。我们希望这将简化并降低每个人尝试Donkey Car的技术障碍。感谢您阅读并访问Donkey Discord,以告诉我们您使用该应用程序的经验。

未来的增强功能和错误报告

如果您有任何建议或只是想报告错误,请随时在此处提交问题

商业用途

如果您打算使用此应用程序来赚钱,请遵循驴车指南,让我们知道

原文:https://medium.com/robocar-store/robocar-controller-quick-start-guide-bdf8cb16d7ce

DonkeySim挑战赛

如果不使用神经网络的参赛者仅需看第4与第5部分内容!
1.0 DonkeyCar的安装
1.1安装miniconda Python 3.7
安装miniconda Python 3.7 64位。
安装方法参见:Windows 10下安装Miniconda3

1.2安装git 64 bit
安装git 64 bit。
安装方法参见:GIT -2.18.0-64.bit 的安装与使用

1.3创建项目目录
从开始菜单启动Anaconda Prompt
创建并更改为您希望用作项目的目录
C:\Users\adminitrator>d:
D:\>mkdir projects
D:\>cd projects
1
2
3
1.4从Github获取最新的Donkeycar
git clone https://github.com/autorope/donkeycar
cd donkeycar
git checkout master
1
2
3
1.5更换国内源
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config –set show_channel_urls yes
1
2
3
1.6更新与删除
conda update -n base -c defaults conda
conda env remove -n donkey
1
2
1.7创建Python Anaconda环境
conda env create -f install\envs\windows.yml
conda activate donkey
pip install -e .[pc]
1
2
3
1.8安装Tensorflow GPU(可选)
如果你有NVidia卡,你应该更新到最新的驱动程序并安装Cuda SDK。

conda install tensorflow-gpu==1.13.1
1
1.9创建工作目录
donkey createcar –path D:/mycar
1
安装keras-vis

pip install keras-vis
1
2.0安装DonkeySim
d:
cd projects
git clone https://github.com/tawnkramer/gym-donkeycar
conda activate donkey
pip install -e gym-donkeycar
1
2
3
4
5
3.0修改相应文件
3.1修改dtypes.py
文件位置:D:\Miniconda3\envs\donkey\lib\site-packages\tensorflow\python\framework\dtypes.py。
修改dtpes.py文件的第526~530、535行。
原:

_np_qint8 = np.dtype([(“qint8”, np.int8, 1)])
_np_quint8 = np.dtype([(“quint8”, np.uint8, 1)])
_np_qint16 = np.dtype([(“qint16”, np.int16, 1)])
_np_quint16 = np.dtype([(“quint16”, np.uint16, 1)])
_np_qint32 = np.dtype([(“qint32”, np.int32, 1)])
np_resource = np.dtype([(“resource”, np.ubyte, 1)])
1
2
3
4
5
6
修改为:

_np_qint8 = np.dtype([(“qint8”, np.int8, (1,))])
_np_quint8 = np.dtype([(“quint8”, np.uint8, (1,))])
_np_qint16 = np.dtype([(“qint16”, np.int16, (1,))])
_np_quint16 = np.dtype([(“quint16”, np.uint16, (1,))])
_np_qint32 = np.dtype([(“qint32”, np.int32, (1,))])
np_resource = np.dtype([(“resource”, np.ubyte, (1,))])
1
2
3
4
5
6
3.2修改train.py文件
文件位置:D:\projects\gym-donkeycar\examples
\supervised_learning\train.py
修改train.py文件的第29行:
原:

matplotlib.use(‘Agg’)
1
修改为:

matplotlib.use(‘TkAgg’)
1
4.0 DonkeySim模拟器的使用
4.1下载DonkeySim模拟器
从Donkey Gym Release下载并解压主机PC平台上可运行的模拟器(DonkeySimWindows.zip)。
将模拟器放在合适的位置。如:~/projects/DonkeySimWindows。

可使用游戏杆/键盘手动驾驶、自动驾驶还可使用训练好的神经网络驾驶,运行界面如下:

选择窗口大小,点击“Play!”进入。

点击“Log dir”可设置记录数据目录。

在主界面点击“Generated Track”,进入我们挑战赛的赛道环境。

可以选择右侧的各种驾驶模式。

这是速度、转向和PD参数设置界面,在自动驾驶时,要设置这些参数,取得好成绩。

4.2设置验证
打开Anaconda Prompt。
使用示例模型来验证设置。

conda activate donkey
d:
cd projects\gym-donkeycar\examples\supervised_learning
python evaluate.py –model=models/example_model.h5
1
2
3
4
启动“DonkeySim”环境。单击“NN Control over Network”按钮。

4.3获取自己的训练数据
现在,你可以尝试根据自己的数据来训练自己的模型。
在模拟器中,按“Exit”进入主菜单。
单击“log dir”按钮并指定一个日志目录以保存数据。例如,你可以选择d:/projects/gym-donkeycar/examples/supervised_learning/log文件夹。
选择Generated Track环境。
单击“Auto Drive w Rec”或“Joystick/Keyboard w Rec”。记录约1万个样本(一圈以上)。查看左下角以查看日志计数。
完成后,单击“Stop”。

4.4训练模型
conda activate donkey
d:
cd projects\gym-donkeycar\examples\supervised_learning
python train.py –inputs=log/*.jpg –model=models/model.h5
1
2
3
4
模型结构可根据自己需要进行修改。
取消train.py文件的第208行注释,显示模型信息。
修改models.py文件(可设置学习率):
在第7行增加:

from tensorflow import keras
1
第57行修改为:

model.compile(optimizer=keras.optimizers.Adam(lr=0.0001), loss=’mse’, metrics=[‘acc’])
1
4.5评估模型
conda activate donkey
d:
cd projects\gym-donkeycar\examples\supervised_learning
python evaluate.py –model=models/model.h5
1
2
3
4
启动模拟器。选择Generated Track环境。单击“NN Control over Network”。

5.0 DonkeySim挑战赛
5.1 DonkeySim挑战赛类别
参加DonkeySim挑战赛的车必须连续不间断跑3圈以上,小车不能压到草坪,不能撞到障碍物,挑战赛共分为三大类:

游戏杆/键盘驾驶(Joystick/Keyboard)
自动驾驶(Auto Drive)
神经网络驾驶(NN Control over Network)
5.2 DonkeySim参赛者提交文件
参加DonkeySim挑战赛的选手,参赛作品必须提交以下文件、数据和视频。

5.2.1选手与作品简介
年龄和性别要真实(便于以后进一步的赛果分类),其他介绍可自由发挥;
参赛者首先应根据已公开(如该类别没有人提交或提交数少于10个)的其他参赛者提交的文件自行进行测试对比,成绩在前十名之内的即可提交,否则请不要提交。
5.2.2数据文件
自行测试成绩以文本文件方式提交;
数据要真实,不得人为编辑修改;
游戏杆/键盘驾驶参赛者提交压缩的原始数据记录(log)文件;
自动驾驶参赛者提交压缩的原始数据记录(log)文件和速度/转向/PD参数截图;
神经网络驾驶参赛者提交文件:
压缩的原始训练数据记录(log)文件
D:\projects\gym-donkeycar\examples\supervised_learning目录下的conf.py和models.py文件
D:\projects\gym-donkeycar\examples\supervised_learning\models目录下的model.h5和model.h5loss.png文件
5.2.3视频文件
游戏杆/键盘驾驶与自动驾驶参赛者提交原始数据记录(log)文件转成的.mp4格式文件,转换方法如下:
首先将DonkeySim内要转换为视频的记录数据(log),复制到D:\mycar\logs文件夹下,并运行下列命令:
conda activate donkey
d:
cd mycar
donkey makemovie –tub=D:\mycar\logs\log –out=log_movie.mp4
1
2
3
4
输出文件名为log_movie,mp4
神经网络驾驶参赛者视频文件的提交是可选的,也必须是.mp4格式的视频文件,请自行用合适的办法解决(参赛者如有好的方法,请共享出来,让大家享用)。
5.3 DonkeySim挑战赛评比方式
DonkeySim挑战赛公开参赛者提交的所有文件,采用自测与公示的方式进行评比,比赛成绩及时更新。比赛规则根据实施情况,听取大家的意见,不定时的更新,所有的原始数据尽量可靠的保存。
————————————————
版权声明:本文为CSDN博主「平衡-JL」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wujingyu67971348/java/article/details/101982829

DonkeySim自动驾驶

选择“Auto Drive No Rec”或“Auto Drive w Rec”即可进入DonkeySim的自动驾驶模式,开始测试时用“Auto Drive No Rec”方式,不记录数据,等调试稳定后再用“Auto Drive w Rec”方式运行,并记录数据,记录数据时如“DonkeySim游戏杆/键盘驾驶”一文选择记录数据文件夹。

在自动驾驶方式中需要调节如下图所描述的PID控制参数。

自动驾驶“Auto Drive w Rec”方式如下图所示。

————————————————
版权声明:本文为CSDN博主「平衡-JL」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wujingyu67971348/java/article/details/102326899

DonkeySim游戏杆/键盘驾驶

下载DonkeySim:从Donkey Gym Release下载并解压主机PC平台上可运行的模拟器(DonkeySimWindows.zip)。
解压并将模拟器放在合适的位置。如:D:/projects/DonkeySimWindows。

运行DonkeySim:双击可执行文件DonkeySim.exe即可进入DonkeySim启动界面。

如果取消“Windowed”前面的“勾选”,点击“Play!”进入的是“全屏”界面,否则可在“Screen resolution”下拉列表中选择你想要的分辨率后再点击“Play!”进入。

点击“Log dir”选择记录数据文件夹。

点击“Generated Track”进入赛道环境。

点击“Joystick/Keyboard No Rec”进入“游戏杆/键盘”驾驶操作状态。

按键盘上的“A,S,D,W”键或“上,下,左,右”箭头键即可操控小车的运动,按下“Stop”停止小车的运动,按下“Exit”退出比赛环境。按下“Quit”退出DonkeySim程序。

等熟练操作小车运动后,点击“Joystick/Keyboard w Rec”进入“游戏杆/键盘”驾驶操并记录驾驶数据,录下视频,提交文件,参加DonkeySim挑战赛了。

左下角的“Log”后面的数值为记录的帧数。
————————————————
版权声明:本文为CSDN博主「平衡-JL」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wujingyu67971348/java/article/details/102312971

Donkeycar教程

摘要:本教程是基于Donkeycar的智能小车教程。DonkeyCar小车是基于树莓派和Python,利用Keras深度学习框架实现的自动驾驶小车。

一、简介

本教程是基于Donkeycar的智能小车教程。DonkeyCar小车是基于树莓派和Python,利用Keras深度学习框架实现的自动驾驶小车。
本文档参考和整合Donkeycar文档创客智造的中英文教程,以及安装可能碰到的问题,以“HSP无限94186 ——1比16有刷无控车型”为模型作详细演示,从硬件,软件,系统整合,模型修改等方面介绍Donkeycar智能小车的实现。
整体框架:

1) Vehicle – a container class to hold and manage all aspects of the vehicle.
2) Parts – modular components of the vehicle that read/write to the memory. This includes sensors, actuators, remote controlers and a datastore.
3) Memory – holds the state of the vehicle and is used to pass variables between parts.
4) Drive loop – a function of the vehicle that runs ensures each part interacts with the memory.

二、硬件

硬件清单

配件明细

模型要求:

我们需要选择:
①独立ESC(电子调速器)和接收机的RC小车
②选择三线连接器,三线舵机
③选择速度更慢的有刷小车模型更容易实现。

推荐配置参考:

1:16模型配置

1:10模型配置

参数解释:
motor是电机的参数,2040就是表示定子外径是20mm,定子高度是40mm,定子的外径和高度越多,定子的铁芯越大,线圈绕的匝数也越多,表现出来就是电机的功率越大。
无刷电机KV值定义为转速/V,意思为输入电压增加1伏特(V),无刷电机空转转速(转/分钟)增加的转速值。
ESC的25A是指持续电流25A,这个峰值电流是85A,BEC输出5V,1A。
Tcaction:四驱,双差速器。
Groung Clearance:小车底部离地面的距离。

购买配置清单(价格仅供参考,更新于2018-7-3)
名称淘宝地址价格(税点费+邮费)/元备注
小车主体https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-10687857697.2.14566a1aBpsYGj&id=524795742343329.8(+20)无限94182——1比16有刷无控车架(有刷不要遥控)电调(已包含)舵机(已包含)
USB电池https://detail.tmall.com/item.htm?spm=a230r.1.14.9.2c9e646ctC49zM&id=564303977283&cm_id=140105335569ed55e27b&abbucket=13&skuId=356336270079149(0.2)2A 5V输出,小米充电宝
树莓派3B+https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-14802299686.14.485c40da2EhCk5&id=527630316715354(21.64)3B E14中国版 套餐16G,包括SD卡及配件
广角摄像头https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-14802299686.26.54ba6ae1HJKd7d&id=537191521576100(6.72)树莓派摄像头5MP
树莓派杜邦线https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-14802299686.23.2fd00909E38MRt&id=181897932692树莓派连接线
电机驱动芯片 PCA 9685https://detail.tmall.com/item.htm?spm=a230r.1.14.1.3bc5178b59bMmJ&id=538283746663&cm_id=140105335569ed55e27b&abbucket=115(+5.4)资料下载https://pan.baidu.com/s/1miRuKti
3D打印架CAD Files: a360.co/2pf3Dam STL Files: thingiverse.com/thing:2260575x需要3D打印机

配件介绍

HSP无限94182

模型参数:

模型结构:

电调(Electronic Speed Control,ESC)

电子调速器,主要有两个作用,一是将电池降压,适合接收机和其他舵机的工作电压;二是从接收机获得油门信号,控制马达的转速,从而改变飞机的速度。
❤连接方式为:
1、电调的输入线与电池连接;
2、电调的输出线(有刷两根、无刷三根)与电机连接;(在我们用到的有刷模型中,是红色和黑色的两根比较粗的线)
3、电调的信号线(三根红色,白色和黑色的较细的线)与接收机(PCA驱动芯片)连接。

舵机

舵机的工作原理:舵机常用的控制信号是一个周期为20毫秒左右,宽度为1毫秒到2毫秒的脉冲信号。当舵机收到该信号后,会马上激发出一个与之相同的,宽度为1.5毫秒的负向标准的中位脉冲。之后二个脉冲在一个加法器中进行相加得到了所谓的差值脉冲。输入信号脉冲如果宽于负向的标准脉冲,得到的就是正的差值脉冲。如果输入脉冲比标准脉冲窄,相加后得到的肯定是负的脉冲。此差值脉冲放大后就是驱动舵机正反转动的动力信号。舵机电机的转动,通过齿轮组减速后,同时驱动转盘和标准脉冲宽度调节电位器转动。直到标准脉冲与输入脉冲宽度完全相同时,差值脉冲消失时才会停止转动。
❤连接方式:将输出的三线与对应的PCA驱动板引脚连接。电调和舵机都是标准3线母插头连接只要按照对应的引脚插入驱动板就可以了。(地线一般为黑色或棕色、信号线一般为黄色或白色)。

树莓派+miscro SD存储卡:

Raspberry Pi(中文名为“树莓派”,简写为RPi,(或者RasPi / RPI) 1 是为学习计算机编程教育而设计,只有信用卡大小的微型电脑,其系统基于Linux。
关于树莓派的详细教程参考7
Raspberry Pi 3B+主板图解:

树莓派主板图解

树莓派引脚GPIO定义
❤连接方式:
1、USB电源接口接入充电宝电源
2、摄像头接口连接摄像头
3、树莓派和PCA9685连接:只连四根线,3.3v,两根 I2C 引脚 (SDA 和 SCL),地线 ground。

PCA电机驱动芯片9685(舵机驱动板)

资料下载:https://pan.baidu.com/s/1miRuKti
详细教程参考9

PCA9685是一款基于IIC总线通信的12位精度16通道PWM波输出的芯片, 可用于控制舵机、led、电机等设备,i2c通信,节省主机资源。
❤连接和使用方式:
1、 连接树莓派:
GND -> RPi GND(9脚)
SCL -> RPi SCL1(5脚)
SDA -> RPi SDA1(3脚)
VCC -> RPi 3.3V (1脚)
V+ -> RPi 5V(本实验中PCA上的V+接口不需要接入电源)

树莓派和PCA9685连接图

2、 连接舵机和电调:电调和舵机都是标准3线母插头连接只要按照对应的引脚插入驱动板就可以了。(地线一般为黑色或棕色、信号线一般为黄色或白色,所以对应黑色的线要插在GND对应的针头)。

PCA9685连接图
在上图中,两股标准3线母插头分别连接舵机与电调。

广角摄像头

WARNING:不要在树莓派开机时插拔摄像头!
摄像头需要满足的参数:

购买的Camera 5MP广角摄像头参数:

充电宝

提供5v2A的usb输出和12V输出,主要给树莓派供电
❤连接方式:将充电宝的输出microusb输出连接到树莓派的电源输入端。

3D打印架

❤用螺丝和销钉固定在小车车架上。

杜邦线

杜邦线可用于实验板的引脚扩展,增加实验项目等。可以非常牢靠地和插针连接,无需焊接,可以快速进行电路试验。
本实验中,用来连接树莓派与PCA驱动芯片的对应引脚。

硬件组装

组装流程

1),2)两步为3D打印步骤,如果不适用3D打印,可以用纸板和小刀手工完成顶部结构。
1) 打印部件(3D打印)
用黑色PLA打印零件,层高2毫米,没有支撑。顶部翻转杆设计成倒置打印。
用黑色PLA打印零件,0.3mm层高,一个0.5mm喷嘴,没有支撑。顶部翻转杆设计成倒置打印。
打印的结构图:

2) 清理零件(手工修正)
几乎所有3D打印部件都需要清理。重新钻孔,并清理多余的塑料。

3) 组装顶板结构,树莓派电源充电宝
顶部结构手工完成后的图片:

4) 将PCA驱动板连接到树莓派
利用杜邦线连接,对应的针脚如下:
GND -> RPi GND(9脚)
SCL -> RPi SCL1(5脚)
SDA -> RPi SDA1(3脚)
VCC -> RPi 3.3V (1脚)
V+ -> RPi 5V(本实验中PCA上的V+接口不需要接入电源)
本实验只需要连接四个针脚即可。

5) 将树莓派和PCA驱动板附加到3D打印的底板上。

6) 安装摄像头
使用摄像头前,取下相机镜头上的塑料薄膜。
安装方式:将树莓派上摄像头插销扒开,插入相机电缆,注意触点的位置,随后按入插销即可。

7) 硬件整合
舵机与电调已经在小车上固定好,所以接下来只需用三线母插头把PCA驱动板连接舵机与电调。因为电调和舵机都是标准3线母插头连接只要按照对应的引脚插入驱动板就好。(地线一般为黑色或棕色、信号线一般为黄色或白色,所以对应黑色的线要插在GND对应的针头)。

组装完成

几种不同形态智能小车的完成体:

三、软件

软件清单

❤系统:
树莓派系统
Ubuntu系统
❤在linux下安装donkeycar
安装依赖:virtualenv build-essential python3-dev gfortran libhdf5-dev
https://github.com/wroscoe/donkey
❤在Windows下安装donkeycar
https://conda.io/miniconda.html
https://git-scm.com/download/win
git库https://github.com/wroscoe/donkey
❤在MAC下安装donkeycar
https://conda.io/miniconda.html
https://www.atlassian.com/git/tutorials/install-git
xcode-select —install
pip install https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.3.0-py3-none-any.whl
开源机器学习框架:
❤pip install keras==2.0.6
❤pip install tensorflow==1.3.0

软件安装

安装树莓派系统

将SD卡用读卡器连接到本地PC。
首先为树莓派安装固件,下载地址:
https://www.dropbox.com/s/wiudnm2dcsvoquu/donkey_v22.img.zip?dl=0
安装步骤:
方法1:使用6中的推荐步骤

方法2:利用安装软件Etcher。
安装方法参考教程(For ubuntu),(For windows)

设置wifi连接

我们需要让树莓派连接wifi热点,从而可以无线操控小车。方法有两种:
方法1:SD卡插入树莓派,显示屏,键盘和鼠标连入树莓派,开机后通过界面链接wifi。
方法2:(没有显示屏和键鼠条件下)
首先,新建一个无线热点。可以使用本地PC新建wifi热点。记录ssid和password。
接下来修改树莓派的系统文件:
在boot部分的根目录下,新建文件名为wpa_supplicant.conf的文件,文件内容为

1
2
3
4
5
6
7
country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid=”<your network name>”
psk=”<your password>”
}

分别在ssidpsk设置自己的WiFi用户名和密码,注意不能有<>

设置主机名

如果网络中有多个树莓派,还需要修改本树莓派的用户名,以下命令需要将sd卡挂载到Linux上运行,由于创建本文档时只有一个树莓派,所以并没有修改用户名,本文档的所有用户名均为pi,若读者对树莓派的用户名有修改,登录时需要改成自己的用户名和密码。

1
2
sudo vi /media/userID/UUID/etc/hostname
sudo vi /media/userID/UUID/etc/hosts

注意用户名只能是小写。
然后把SD卡插进树莓派里,给树莓派上电。

设置SSH远程登录

首先查看网络环境,树莓派连接的网络是本地连接13创建的共享热点:

用抓包工具或者nmap扫描工具查找树莓派的ip地址:

或者可以用cmd自带的ARP命令查看相应地址的ARP缓存也可以找到小车地址,arp -a
从上图可以找到树莓派的ip地址是192.168.155.2,接着通过ssh登录树莓派,用户名pi,密码asdfasdf ,登录进去之后界面如图所示:

另外,可以通过win10自带的移动热点看到连接设备的IP地址:

推荐使用的ssh客户端登录软件比如Xshell。

在树莓派镜像安装,升级donkeycar

存储卡图像上的donkeycar Python代码可能比Github repo上的要早,所以一旦你运行了Pi,需要更新,在ssh客户端连接树莓派后,键入命令如下:

1
2
3
cd ~/donkeycar
git pull
pip install -e .

在本地PC安装donkeycar并创建本地工作目录

接下来是在本地笔记本电脑或服务器上设置相同的代码库,以便测试和训练智能小车。安装因平台而异。有如下三种方法,仅给出了windows上的安装结果。

Windows系统

❤安装miniconda Python 3.6 64 bit. https://conda.io/miniconda.html
❤确保选中该框以允许它修改您的系统路径变量以添加conda。
❤安装git 64 bit,https://git-scm.com/download/win
❤从开始菜单启动Anaconda
❤更改为您希望用作项目主管的目录

1
2
mkdir projects
cd projects

❤安装donkeycar

1
2
git clone https://github.com/wroscoe/donkey
cd donkey

❤创建Python Anaconda环境

1
2
conda env create -n donkeycar -f install\envs\windows.yml
activate donkey

❤安装代码源并创建您的本地工作目录:

1
2
pip install -e .
donkey createcar –path ~/d2 #本地工作目录名称设置为d2,可以自己定义

安装结果:

注意:在关闭Anaconda提示符后,当再次打开它时,您需要键入activate donkey以重新启用映射到特定于donkey的Python库。(关于anaconda的使用,可以参考10
项目主管目录示例:

创建的本地工作目录示例:

Linux系统

❤安装依赖和python环境

1
2
3
4
5
sudo apt-get install virtualenv build-essential python3-dev gfortran libhdf5-dev
virtualenv env -p python3
source env/bin/activate
pip install keras==2.0.6
pip install tensorflow==1.3.0

❤安装donkeycar

1
2
git clone https://github.com/wroscoe/donkey donkeycar
pip install -e donkeycar
Mac系统

❤安装miniconda Python 3.6 64 bit. https://conda.io/miniconda.html
❤安装git 64 bit,https://git-scm.com/download/win
❤启动终端
❤如果Xcode or gcc 没安装

1
xcode-select –install

❤创建项目根目录

1
2
mkdir projects
cd projects

❤下载donkeycar

1
2
git clone https://github.com/wroscoe/donkey
cd donkey

❤创建Python Anaconda环境

1
2
conda env create -f envs/mac.yml
source activate donkey

❤安装Tensorflow

1
pip install https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.3.0-py3-none-any.whl

❤安装donkey

1
2
pip install -e .
donkey createcar –path ~/d2

注意:关闭终端后,当您再次打开终端时,您需要键入

1
source activate donkey

来重新启用映射到特定于donkey的Python库。

四、运行智能小车

WARNING:先放置到安全地方并让轮子离地!

Windows系统

-打开Anaconda
-激活映射到donkey的Python设置:donkey

1
2
3
“`
-进入管理donkey的本地目录:
“`cd ~/d2

远程登录树莓派

-用Xshell登录,详细见3.2.4节。

启动和控制小车

-在Xshell连接成功后,打开你小车目录,并开启小车

1
2
cd ~/d2
python manage.py drive

-这个脚本将启动你的小车,其中包括一个作为Web服务器的部件,以便控制你的小车。
-现在可以通过以下网址从网络浏览器控制您的汽车:

1
<your car’s IP’s address>:8887

接下来在本地PC通过浏览器(推荐Chrome浏览器)登录上述网址,在web端控制智能小车:

校准小车

小车的配置信息是存在config.py脚本中的,这个脚本会在运行

1
donkey createcar –path ~/d2

这个命令之后出现在”./d2”这个目录下,如下所示:

其内容是各个部件的参数配置:

校准小车的目的就是将上述参数调整到合适的值,这样才能顺利的驾驶小车,以及共享同款小车的校准数据。

舵机校准(转向校准)

要填的数据有:

注意,此时应让小车离开地面,避免乱跑
1、打开小车,找到舵机伺服电缆插到了PCA的那个通道上了,应该是1或者0.
2、运行命令

1
donkey calibrate –channel <your_steering_channel>

3、输入 360’会看到小车的轮子轻微转动,如果没有的话就输入400或者300
4、左右调整 +/- 10,一直到轮子完全转向左边或者右边,记录此时的值,并填入config.py

马力校准(电机控制)

需要校准的参数:

1、找到ESC的电缆,看看它插到PCA的哪个位置,这就是马力通道。
2、运行命令

1
donkey calibrate –channel <your_throttle_channel>

当提示输入PWM值的时候输入370,此时应该能听到ESC发出哔哔声,表示已经经过校准。
3、输入400,这时小车应该就能往前走了,如果不能往前,则有可能是反向的,此时应该输入330
4、多尝试几次,直到找到你认为比较合适的最大速度,记下此时的PWM值。

校准微调

现在小车已经校准过了,可以开动小车查看是否按照预期运行:
1、运行

1
python manage.py drive

命令启动小车
2、在浏览器中访问

1
<your_cars_ip_address>:8887

3、按j,一直到小车的方向完全转向右边
4、按i,一直到小车的方向完全朝向前方
5、测量转弯直径,并将它记录在表格中
6、在不同的转向值下重复同样的测量
7、绘制表格看看小车在各个方向的转向是否相同(角度相同时)
如果你的转向在80%PWM和100%PWM相同时,将PWM值变为80%PWM,
如果你的车往一边偏,改变另一边的PWM值
经过微调之后你的表格大概会是这个样子

五、训练智能小车

赛道设置

可以用带颜色的胶带、丝带或者绳子,赛道最好宽4英尺,并且有2英寸的白色边框和黄色虚线中线。

数据收集

① 先不记录数据,在跑道上跑几圈,当熟练跑道之后(10圈以上不出错)点击按钮Start Recording

② 如果出错或者有意外发生时马上点击Stop Car停止记录
③ 至少收集10-20圈好的数据之后即可以停止收集,Ctrl-c即可,收集的数据在data文件夹里

需要注意的细节:

1.清除d2/data目录下的之前的数据
2.回到d2目录下python namage.py drive启动小车
3.到浏览器中model选择user,然后用电脑控制小车在场景下跑几圈
4.等到操作小车在场景下基本不出错之后点击start recording开始记录数据
5.记录大约半个小时的数据就可以了
注意在记录数据的过程中,可能会出现小车没电的情况,解决的办法就是,刚开始在config.py文件中把THROTTLE_FORWARD_PWM设置的小一点,本车是335或者330,过一会感觉小车跑的变慢了,停止记录,停下小车,关闭程序。调整THROTTLE_FORWARD_PWM变大一点到440,重启程序,记得保持小车的运行速度以及Throttle差不多一致。同理慢慢可以变为445和450
6.记录完数据,筛选数据。手动删除数据中撞墙等不好的数据
7.将数据考到电脑上装的donkey的d2/data目录下(小文件太多,速度会特别慢)
8.进入d2目录,运行命令 python manage.py train --model ~/d2/models/mypilot
9.等待训练结束,到到d2/models下将mypilot文件发送到小车的对应目录下
10.用命令python manage.py drive --model ~/d2/models/mypilot启动小车,然后到浏览器中选择local pilot模式启动自动驾驶

拷贝数据至本地PC

由于树莓派计算能力有限,需要将数据迁移到电脑上进行模型的训练,有两种方法:

方法1:新开一个SSH窗口用rsync命令从树莓派复制数据。命令如下:

1
rsync -r pi@<your_pi_ip_address>:~/d2/data/ ~/d2/data/

方法2:利用Xshell里面的新建文件传输直接复制粘贴。

利用keras训练模型

复制好数据之后就可以运行训练脚本:

1
python ~/d2/manage.py train –tub <tub folder names comma separated> –model ./models/mypilot

或者:

1
python ~/d2/manage.py train –model ~/d2/models/mypilot

拷贝模型至树莓派

训练好之后再讲pilot迁移回树莓派:

1
rsync -r ~/d2/models/ pi@<your_ip_address>:~/d2/models/

用自动驾驶模型启动小车

重新启动小车,将训练好的模型穿进去:

1
python manage.py drive –model ~/d2/models/mypilot

用模拟器训练小车*

用于生成训练用的图片,测试自动驾驶仪等。当然你也可以不用这种方法,根据网页【http://docs.donkeycar.com/guide/build_hardware/】的描述,你也可以先用手机控制小车在赛道上开10-20次来收集训练数据。
下载之后直接双击EXE文件运行,你可以在input里面看到控制按钮信息。

模拟器中共有三个场景,但是网站【http://docs.donkeycar.com/guide/simulator/】中只给了前两种的描述,第三种是sparkfun AVC机器人大赛的场景:
Generated Road Scene:通用场景
The purpose of this is to create a randomly generated road so that you can have miles of curves on different road surfaces. You can train on one road and test on something similar, or a totally different surface.
Warehouse Scene:专用场景
The purpose of this is to create a specific track that is somewhat similar to an actual course in use as the primary track for the Oakland DIYRobocars Meetup.

进入模拟器,右上角可以选择操作选项,根据网站【http://docs.donkeycar.com/guide/simulator/】的介绍,Joystick/Keyboard No Rec的意思就是摇杆或者键盘控制,但是数据不记录,其他选项意思类推。Next Track:在生成的道路场景中,这将改变路面和轨道宽度。Regen Track:使用当前的表面类型,但生成一个新的随机路径和路径。
下图为我用键盘控制时的截图,在网站【http://docs.donkeycar.com/guide/simulator/】的介绍中,有一个注意事项是这样描述的:Note: Keyboard data produces steering information that is stepped (ie. -1, 0, +1) and may be difficult to train with. See below for joystick setup.大意是说由于键盘控制并不像摇杆可以产生连续的转向信息,而只能是间断的,所以并不适合用来训练。

键盘控制页面
下图为自动驾驶页面,可以看到左下角一共有四个参数,目前并没有搞得很清楚这四个参数的具体含义,暂且先贴出网页【http://docs.donkeycar.com/guide/simulator/】上的解释:
Max Speed:这个应该就是决定了自动驾驶的最大速度
This setting determines the target speed during the PID auto drive. It will also affect the speed when driving by keyboard controls (not recommended).
Prop:转向角度
This is short for proportional. This is the P part of PID that attempts to adjust steering back to the path in proportion to the deviation.
Diff:为了防止角度调整过大
This is the D part of PID that attempts to limit steering back to the path as derivative to the trend of deviation, designed to limit overshoot.
Max Steering
Max steering can only be adjusted when using Auto Drive No Rec. It will also affect joystick and keyboard steering range, and should be saved and reloaded for you.
另外关于这个参数,原文中有一个注意事项: Max Steering is an important adjustment. This affects categorical training quite strongly. As the steering data is normalized when written, and multiplies after coming from Python, this angle should remain constant over training and simulation. Take care when changing this value. And separate data and models by max steering setting.

自动驾驶时的截图
训练结束后,在log目录中会有训练的图片,图片大小为160*120像素

贴一个网页【http://docs.donkeycar.com/guide/simulator/】上给出的典型用法,方便以后使用。

六、更新DonkeycarV2.5教程

  1. 用Etcher给SD卡写入树莓派系统镜像文件名为:donkey_2.5.0_pi3.img,新建并编辑boot目录下的wpa_supplicant.conf文件。
  2. SSH连接树莓派并登陆。1
    2
    用户名:pi
    密码:raspberry
  3. 在树莓派上安装Donkeycar V2.5.1环境1
    2
    pip install donkeycar[pi]
    donkey createcar ~/
  4. 在windows上安装DonkeycarV2.5.1
    (注意区分本地工作目录与本地代码目录)
    a)新建一个本地代码目录,存放代码库:1
    2
    mkdir projects
    cd projects

b)从github上clone最新的donkeycar代码库

1
2
git clone https://github.com/wroscoe/donkey
cd donkey

c)安装donkeycar资源环境,新建本地工作目录(mycar)

1
2
pip install -e .
donkey createcar C:\Users\WuFan\new_mycar(自己修改)
  1. 会遇到的问题:
    a)ModuleNotFoundError: No module named 'controller'
    解决办法:
    将文件
    (可直接复制粘贴word中的这个文件)
    拷贝至\donkey\donkeycar\parts对应的本地代码目录下。
    修改本地工作目录中文件manage.py中第24行,修改为:1
    from donkeycar.parts.controller import LocalWebController, JoystickController

b)训练后的数据存放在树莓派tub文件夹下,而不是data
训练的时候,把tub文件夹下所有数据复制到本地工作目录下的data文件夹下。再开始训练。
c)用训练的模型驾驶的时候,切换到local pilot时,可能会遇到类似摄像头框消失,树莓派报错的情况。
这是因为树莓派上有的python文件版本和本地电脑从github上面clone的文件不一致。如果有报这种错误,可以把本地代码库上面的对应文件覆盖到树莓派上解决。

七、参考创新方向

无人驾驶车障碍竞速

无人取件车/送餐车/领路车

无人捡球车


参考文献

————-本文结束感谢阅读————-

基于 ROS 的 Donkey Car 远程控制

引言

这次我们要实现的功能是用 g29 方向盘远程控制 Donkey Car 小车运动。

整个系统包括小车平台和 PC 端两部分:

  • 小车平台上的设置
    1. 安装 raspbian 操作系统
    2. 安装 ROS
    3. 安装 Donkey Car 相关的 ROS package
  • PC 端的设置
    1. 安装 ROS
    2. 编写程序提取 g29 方向盘控制命令并发布到 ROS topic 上

基于以上两个平台,设置它们之间的 ROS 通讯,就可以实现远程控制。

下边是具体操作步骤。

小车平台上的安装

虽然可以 ssh 到小车上进行远程设置,但是还是强烈推荐连接上显示器、鼠标、键盘,将 raspberry pi 板子当作一个普通的电脑主机使用,操作起来要方便很多。

以下的安装步骤都是假设已经给 raspberry pi 外接了显示器、鼠标和键盘。我们用的是 raspberry pi 3B+ 。

安装 raspbian 操作系统

第一步是将 sd 卡创建成一个系统启动盘。步骤如下:

  • 下载 raspbian 操作系统镜像
    目前 raspberry pi 官网提供了最新的 raspbian 版本 buster 。但是出于兼容性方面的考虑,我们选择用不那么新的 stretch 版本。
    下载地址 http://downloads.raspberrypi.org/raspbian_full/images/raspbian_full-2019-04-09/
    只需要下载那个 1.9 G 的压缩文件即可。
  • 创建启动盘
    官网提供了非常详细的安装说明。也可以参考这里,通过命令行的形式烧录和备份镜像文件。如果不习惯用命令行方式,推荐用 Etcher 。
  • 最后的安装
    有了 sd 卡启动盘,插到 raspberry pi 板子上。通电启动就会进入系统安装界面,跟普通的 ubuntu 系统安装流程类似,不再赘述。

从 sd 卡启动是树莓派的标配,不过也可以从 USB 盘启动。基本方法也是通过 Etcher 将系统镜像文件写入 USB 盘。具体操作可以参考这里。对于最新版的树莓派 3B+,启动的时候只需要 USB 盘,对于旧版的树莓派,还需要 sd 卡做一下引导。
用 USB 做系统盘的好处是存储容量可能比 sd 卡大一些,缺点是暴露在外边,不小心碰到了就可能直接关机了。

安装 ROS

在 raspbian 上安装 ROS 跟 ubuntu 有点区别。raspbian 系统中没有现成的已编译好的 ROS debian package,所以不能简单地用 apt install ros-kinetic-desktop-full 之类的命令安装。我们有两个选择:

  • 从源码编译
  • 直接用别人分享的 raspbian + ROS 镜像文件

这里我用了源码编译的方式。具体流程如官网所示. 这里不再赘述。

在安装过程中有几个问题需要注意

  1. 注意 raspbian 的版本,不同的版本安装命令有些区别。我们用的是 stretch 版本。
  2. 在最后进行如下编译时sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic 默认编译参数是 -j4 。我们在编译时系统完全卡死。尽管 raspberry pi 板子是 quad-core 的,但整体计算能力还是比较低。为了避免编译死机,可以添加参数 -j2,如果还死机,用 -j1,最终的编译命令为sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2 # 或 -j1
  3. 设置完这一步就可以结束了echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc 后边的步骤不需要。

根据我们的经验,整个源码安装过程至少 3 个小时 (用了参数 -j1)。

安装 Donkey Car 相关的 ROS package

本项目用到的 package 都在这里。实际上我们只需要其中两个 package: donkey_car 和 ros-i2cpwmboard

只要前一步的 ROS 编译过程没有问题,后边在使用 ROS 时跟普通 ubuntu 上是完全一样的。
基本步骤是创建一个 workspace,把上述两个 package 放进去, catkin_make 编译一下,就可以了。

在编译 ros-i2cpwmboard 时如果出现如下错误

‘i2c_smbus_write_byte_data’ was not declared in this scop

则需要额外安装一个 i2c 工具包

sudo apt-get install libi2c-dev

以上所有流程结束之后可以测试一下:

roslaunch donkey_car keyboard_demo.launch

通过 rqt_graph 可以看到一个 topic /cmd_vel ,此时只要向该 topic 发送控制命令,就可以驱动小车移动了。可以在命令行用rostopic pub 命令向 /cmd_vel 发送数据测试一下。

这里可能有个问题,运行上述 roslaunch 命令之后,在没有任何 topic 信息输入的情况下,车轮的角度可能会偏向一边,而不是朝向正前方。这是因为 donkey_car/src/low_level_control.py 这个文件中设置的参数跟实际小车不太匹配。这个文件中默认 center_value 的 pwm 值为 333,我们的小车设置为 300 时车轮才会朝前。具体搜索 pwm 值的过程可以参考这里

下一步我们就在 PC 端将 g29 方向盘的操作发布到该 topic 上。

PC 端安装

安装 ROS

PC 端的 ROS 安装比较中规中矩,按照官网步骤安装即可。对于我们这个项目,安装 desktop 就足够了,不需要 desktop-full。当然,安装 desktop-full 肯定也是没有问题的。

转换 g29 操作指令到 ros topic

我们这里用 Node.js 与 g29 通讯,Node.js 既可以提取 g29 的操作输入 (方向盘转角、踏板),也可以反向控制 g29 方向盘。关于反向控制的部分,可以参考我们之前的文章

下面我们要基于 Node.js 编写 ROS node 文件 g29_pub.js,实现 g29 控制命令的提取:

#!/usr/bin/env node

'use strict';

const rosnodejs = require('rosnodejs');
const g = require('logitech-g29');

const Twist = rosnodejs.require('geometry_msgs').msg.Twist;

const options = {
  autocenter: true, 
  debug: false,
  range: 900
}

const wheel = {
  currentPos: 0, 
  moveToPos: 0,  
  moved: true
}

var connected = false;
// once g29 is connected, run this function
    g.connect(options, function() {
    connected = true;
    g.forceFriction(0.4);
})

function g29_pub_node() {
    rosnodejs.initNode('/g29_pub')
    .then((rosNode) => {
        if (!connected)
        return; 
        var pub = rosNode.advertise('/cmd_vel', Twist);
        const msg = new Twist();
        g.on('wheel-turn', function(val){
            msg.angular.z = -(val-50.0)/50.0;    # 可以按照实际需要,将 g29 转角转换成小车的转角
            pub.publish(msg);
        })
        g.on('pedals-gas', function(val){
            msg.linear.x = val * 5;  # 可根据需要修改
            pub.publish(msg);
        })
        g.on('pedals-brake', function(val){
            msg.linear.x = val * - 5;   # 可根据需要修改
            pub.publish(msg);
        })
    })
}


if (require.main === module) {
    // Invoke Main Function
    g29_pub_node();
}

上述命令创建了名了 g29_pub_node 的 ROS node,可以将 g29 的操作转化成 /cmd_vel上的命令。

Donkey Car 与 PC 的连接

有了以上两个平台,现在需要配置 ROS 环境,实现两个平台之间的通讯。假设现在两个平台连接到同一局域网里,互相能 ping 通。

我们选择在 PC 端运行 ROS master, 小车远程连到 PC。

  • PC 平台:
    在 ~/.bashrc 文件末尾添加如下变量定义:export ROS_IP=<PC IP addrss> 然后重开 terminal ,启动 ROS,运行刚才编写的 g29_pub.js 文件。这样就设置好了 g29 方向盘到 /cmd_vel 这一部分的连接。可以通过 rostopic echo /cmd_vel 查看一下方向盘转动时是否有数据输出。
  • 小车平台
    类似地,要在 ~/.bashrc 文件末尾添加如下变量定义:export ROS_IP=<donkey car IP addrss> export ROS_MASTER_URI=http://<PC IP address>:11311 这里不仅要设置本地 IP,还要设置要远程连接的 ROS master 的 IP。设置好以上内容之后,运行如下命令: roslaunch donkey_car keyboard_demo.launch 这就设置好了从 /cmv_vel 到小车这一部分的连接。

如果一切顺利,应该可以通过 g29 方向盘远程控制 Donkey Car 运行了。

在Unity环境中用强化学习训练Donkey Car

作者:Felix Yu

编译:Bing

Donkey Car是一种为模型车开源的DIY自动驾驶平台,它利用一个带有相机的树莓派单片机,让模型车可在赛道上自动驾驶,Donkey Car会学习你的驾驶方法,在训练后懂得自动驾驶。对于那些没有背景知识的人来说,该平台能提供你所需要的必要细节,它既包含硬件也带有软件。阅读完这一教程,你也可以无需硬件背景知识组装一辆自己的自动驾驶汽车。

现在,训练汽车进行自动驾驶最常见的方法就是行为克隆和路线跟随。在高级层面,行为克隆是利用卷积神经网络学习汽车前方摄像机所拍摄的图像之间的映射,并通过监督学习控制角度和throttle values。而路线跟随是利用计算机视觉技术跟踪路线,并且利用一个PID控制器让小车跟着该路线。我尝试了两种方法,它们都很有用!

用行为克隆训练Donkey Car避开障碍物

用强化学习训练Donkey Car

重要的一点是,Donkey Car的目标是搭建一辆在比赛中跑的最快的车(能以最快速度跑完一圈)。我认为强化学习是训练的好方法,只需设计一种奖励,让汽车的速度达到最快,并且让它能一直保持在轨道内即可。听上去很简单对吧?但事实上,很多研究表示在实体目标上训练强化学习是很困难的。强化学习主要通过试错法训练,放在汽车身上,我们只能保佑车子不会在一次次的实验中撞碎。另外,训练时长也是一个问题,通常,强化学习智能体都要训练个几百回合才能掌握些许规律。所以,强化学习很少用在现实物体中。

模拟现实

最近有一些科学家们研究对现实进行模拟,即先用强化学习在虚拟模拟器上训练小车,然后将其迁移到现实世界里。例如,最近OpenAI就训练了一个灵活的机械手臂,可以做出多种动作,整个过程就是在虚拟中训练的。除此之外,谷歌大脑也曾训练过一个四足机器人,可以用模拟现实的技术学习灵活的动作。在虚拟器中学习控制策略,然后再将其部署到真正的机器人上。这样看来,若想用强化学习训练Donkey Car,一个可行方案就是先用模拟器训练,再把学到的策略用在真的小车上。

OpenAI训练的机械手

Donkey Car模拟器

第一步是先为Donkey Car建造一个高保真度的模拟器。幸运的是,Donkey Car社区里一位爱好者在Unity中创建好了一个模拟器。但是它设计的目的主要针对行为学习(即将相机中的图片保存在对应的控制角度和throttle values文件中以进行监督学习),但是和强化学习无关。我希望的是有一个类似OpenAI Gym那样的交互界面,可以用reset( )重置环境、对其进行操作。所以,我决定在现有的Unity模拟器基础上对其进行修改,让它更适合强化学习。

4.1 创建一种能用Python和Unity沟通的方法

因为我们要用Python书写强化学习代码,所以我们首先要找到一种方法能让Python在Unity环境中使用。结果我发现这现有的模拟器也是用Python代码进行沟通的,但它是通过Websocket协议进行的,Weosocket和HTTP不同,它支持服务器和客户端之间进行双向通信。在我们的案例中,我们的Python“服务器”可以直接向Unity推送信息(方向和油门),而我们的Unity“客户端”也可以反向对服务器推送信息(状态和反馈)。

除了Websocket,我还考虑使用gRPC,这是一种高性能服务器-客户端通信框架,用谷歌在2016年八月开源。Unity将其用于机器学习智能体接口通信的协议。但是它的设置有点麻烦,并不高效,所以我还是选择Websocket。

4.2 为Donkey Car创建一个定制化的环境

下一步是创建一个类似于OpenAI gym的交互界面,用于训练强化学习算法。之前训练过强化学习算法的人可能对各种API的使用很熟悉。常见的就是reset( )、step( )、is_game_over( )等。我们可以将OpenAI gym的种类进行扩展,然后用上面的方法创建自己的gym环境。

最终成果能和OpenAI gym相媲美,我们科用类似的指令与Donkey环境交互:

env = gym.make("donkey-v0")
state = env.reset()
action = get_action()
state, action, rewards, next_state = env.step(action)

环境同样可以让我们设置frame_skipping,并且用headless模式训练智能体(也就是无需Unity GUI)。

同时,Tawn Kramer还有3中Unity场景可用:生成道路、仓库和Sparkfun AVC,都可以用于训练。在我们开始运行自己的强化学习算法之前,我们要么自己搭建Donkey Car的Unity环境,要么下载预先搭建好的环境可执行程序。具体的环境设置和训练指导可以在我的GitHub中找到:github.com/flyyufelix/donkey_rl

4.3 用DDQN训练Donkey Car

准备好了对强化学习友好的环境,我们现在就可以搭建自己的强化学习算法啦!我采取的是用Keras书写的Double Deep Q学习算法,这是DeepMind开发的经典强化学习算法,易于测试,编写简单。我已经在OpenAI gym中的cartpole和VizDoom中测试了,所以如果有什么问题,应该是Unity环境的问题,算法没有问题。关于DQN的文章,大家可以参考我之前的博文。flyyufelix.github.io/2017/10/12/dqn-vs-pg.html

4.3.1 状态空间

我们用Donkey Car前方安装的摄像机所拍摄的像素照片,执行以下转换:

  1. 将尺寸从(120, 160)改为(80, 80)
  2. 变为灰度图像
  3. 框架堆叠:去前面几个步骤中的4个框架堆在一起

最后的状态维度应该是(1, 80, 80, 4)。

4.3.2 动作空间

现实和虚拟世界中的Donkey Car都是将持续的方向控制和油门数值作为输入。为了简介,我们将油门数值设为常量(例如0.7),仅仅改变控制方向。控制方向的值从-1到1,但是,DQN只能处理分离的动作,所以我将方向的值分为15个种类。

4.3.3 Q网络框架

我们的Q网络是一个3层卷积神经网络,以堆叠的框架状态为输入,输出表示方向值分类的15个值。

4.3.4 奖励

奖励是有关汽车偏离中线程度的函数,它由Unity环境所提供。奖励函数用以下公式表达:

其中max_cte是一个归一化常数,所以奖励的范围在0到1之间。如果abs(cte)大于max_cte,循环即终止。

4.3.5 其他重要变量

Frame skipping设置为2以稳定训练。Memory replay buffer的值为10000.Target Q网络在最终训练时会更新。CNN训练时的Batch size为64。贪婪函数用于探索。Epsilon初始值为1,逐渐在10000次训练后会成为0.02。

4.3.6 结果

经过上面的设置,在单个CPU和一个GTX 1080 GPU上,我训练了DDQN差不多100次。整个训练用了2到3个小时。可以从上面的视频中看到,小车跑得很好!

去除背景噪声

我们想让我们的强化学习智能体只根据路线的位置和方向进行决策输出(即方向控制),不要受环境中的其他因素影响。但是,由于我们的输入是全像素的图像,它可能对背景模式过度拟合,而无法认出行进路线。这在现实中尤其重要,因为旁边的车道可能会有障碍物(例如桌子、椅子、行人等)。如果我们想从虚拟世界将学习策略进行迁移,我们应该让智能体顾略背景中的噪音,只关注于车道。

为了解决这个问题,我创建了一个预处理通道,可以将行车路线从原始像素图像中分离出去,再输入到CNN中。分割过程受@ldesegur/a-lane-detection-approach-for-self-driving-vehicles-c5ae1679f7ee” title=”这篇博文”>这篇博文的启发。这一过程概括如下:

  1. 用Canny Edge检测器检测并提取所有边框
  2. 用Hough直线转换确定所有直线
  3. 将直线分成positive sloped和negative sloped两类
  4. 删除所有不属于车道的直线

最终转换出的图片应该有最多2条直线,具体情况如下:

接着我把分割后的图像重新调整到(80, 80)的,将4个连续的框架堆叠在一起,用它们作为新的输入状态。我使用新状态再次训练了DDQN,生成的强化学习智能体可以学习良好策略进行驾驶!

然而,我注意到不仅仅训练时间会变长,学习策略也会变得不稳定,车子会经常在转弯的时候摇晃。我想可能是因为在训练的时候丢掉了有用的背景信息。不然的话,智能体应该不会过度拟合。

下一步

在这篇文章中,我们介绍了一种能和OpenAI gym相比的环境,用来训练Unity模拟器中的Donkey Car。还用DDQN训练它自动成功地自动驾驶。接下来,我计划让小车通过训练加速到最大值,并且将这一策略迁移到现实中。

新手学堂之电池选购常识

任何模型车,都不可避免的需要使用电池,本文介绍一些常见模型车用的主流电池知识。
FunRC Studio原创资料,只发RCFANS,如需转载务必注明出处。

本文旨在为新手解决电池的常识问题。

电池的选购不外乎几个方面:
电池类型 / 电压 / 容量 / 放电C数 / 外形尺寸 / 插头类型

电池类型常见的有: NiCd / NIMh / LiPo / LiFe

    NiCd,镍镉电池,老掉牙的类型,造价低廉,容量低,污染大,带记忆效应,现在只能在一些廉价的套装车上找到,强烈不推荐
    NiMh,镍氢电池,在AA和AAA电池中,nimh绝对是主流,但是在遥控模型的电池中,绝对有廉颇老矣的感觉
    LiPo,锂聚合物电池,是现在模型中的主流类型,使用广泛,各种型号琳琅满目,是本文需要介绍的重点
    LiFe,锂铁电池,不算太主流,一般用在遥控器,或者油车接受电,很少用做电车的动力电

NiCd由于太老了,已经没有介绍的必要。不建议玩家选购。
NiMh则还有用武之地,例如油车接受电,很多都还是6V的电压,单节电压1.2V的镍氢电用5节串联起来,就组成了6V电池组刚好。
    而电车上,NiMh则是6节串联,成为7.2V电池组。也有一些大脚车是使用7节串联组成8.4V的。
LiFe使用场合目前不多,单节电压3.3V,多数为圆柱形,2S封装成6.6V的情形多见,主要用于遥控发射电,或者油车接受电。

本文重点介绍模型车上用的最广泛的LiPo 锂聚合物电池。

LiPo,全称Lithium-Polymer Battery,锂聚合物电池外壳为软包,由Li-ion锂离子电池进化而来。
    锂离子单节电压3.6V,由于活性太高,爆炸几率较大,目前已几乎让LiPo取代,现在我们手机使用的几乎都是LiPo。

电压:LiPo单节电芯标称电压为3.7V,充满电时,目前主流电芯均为4.2V单节,目前模型上高压电芯开始逐渐显现,高压电芯充满为4.35V单节。
    每节电芯的电压3.7V我们称之为1S,但是我们的车子往往3.7V是不够的,主流电池电压都是需要7.4V,于是把电芯串联起来,提高电压就行了。
    而多少S则是把多少个3.7V串联起来,电压就是3.7V乘以多少S,例如2S就是3.7*2=7.4V;3S就是3.7*3=11.1V,以此类推。

锂电池还涉及到封装的问题,买电池时会看到有些写着2S1P,有些写着2S2P,这又是什么意思呢?
    2S就是上面说过的了,2S=3.7*2=7.4V,那么2P又是什么呢?
    由于工艺/体积/成本等限制,每个电芯的容量有限,如何最简单地提升容量呢?就是把2个同型号的电芯并联起来,就是多少P的概念。
    例如2个电芯并联起来组成1个3.7V,就称之为2P;而假如用3个电芯并联起来组成一个3.7V,那么就是3P了。
    于是,2S2P,可以理解为有4个一样的电芯,先把其中2块并联起来,组成1S,然后把另外2块并联起来,组成另外1S,再把这2个1S串联起来,成为2S,这个电池就称为2S2P
    例如一个电芯只有3.7V,2000MAH,那么就可以通过2S2P的形式,组成7.4V 4000MAH的电池。
    至于购买时,我们是建议购买1P的产品,例如2S1P,3S1P之类的。这样的电池出现问题的几率相对低一些。但是对于一些极限顶级电池来说,可能没有1P的选择,因为1P受限于技术/工艺限制,未必做得出来。于是2P之类的就成为了不得已的选择。

容量:每个电池都有自己的额定容量,电池的容量就像汽车的油箱大小,容量越高,能使用的时间就越长,条件允许的情况下,当然是买容量大的。
    但是也不是必须都选择容量大的,因为有些时候我们会特意选择容量小的以对车架进行减重,提升车架性能。因为容量小意味着重量一般都会轻一些。

容量的鉴定:电池的容量,往往只是产品外壳的一个标签。实际里面有多少我们如何得知?
    有些玩家在使用电池后,拿电池进行充电,例如一个5000MAH的电池,玩完之后,一充,怎么只有3000MAH?
    这个未必是电池容量不足,这可能只是因为你只用掉了3000MAH而已。

    电池的容量,如上面所写,就像汽车的油缸,如果一个5000MAH的电池,你只用掉了3000MAH就拿去充电,那么你肯定只能充进去3000MAH。极端的例子就是假设你刚充满,用都没用,你又拿去充电,那么你可能只能充0MAH。

    容量的鉴定方法:需要一台带放电功能的充电器。先将电池充满电,然后使用充电器的放电功能,将放电截止电压设置为3.0V/cell(每节3.0V),然后开始放电。
        到放电完成,看充电器上显示放出了多少容量,基本就是电池容量的90~95%左右。很少可以达到100%,因为按照电池厂的正常标法,大部分都是指充满到2.75V/cell(单节2.75V)下测出的容量,加上电池用过之后都会有损耗。所以如果要测量电池容量,最好在新买的时候就测量。
        (充电器显示放出多少容量,最终也只能大概参考,因为充电器本身也未必100%准确,但是误差一般不会太大。如果经过这个方法测量的数值与你电池的标签相差太远,那么这个标签就是很有水份的了,一些杂牌常见。而好的品牌很少会这样砸自己招牌,所以好的品牌往往都会贵一些,因为不会怎么虚标)

放电C数:也就是放电能力。C数越大,表示电池能在越短的时间内放完自身的容量。
    1C,就是在1个小时内放完自身容量。多少C,就是在多少份之一的小时内放完自身容量。例如60C就是1/60小时,也就是1分钟内,放完自身容量。
    C数越大的电池,其性能越高,价格越贵。
    对于同一台车来说,C数大的电池,与C数小的电池使用上的区别是:C数越大,其起步越暴力,尾速高一些,电池玩完之后发热越小。

    如何鉴定电池C数:一般玩家没有办法鉴定,因此网上很多虚标的电池,就是冲着新手去的。那些便宜,容量大,C数高,却很便宜的电池,往往就是为新手准备。很简单:新手没用过好的电池,他们不知道有什么区别。
        以下是比较简单的(对比法)鉴定方法:使用大品牌的电池进行对比。同C数接近容量,操作的手法与动力相同的情况下,发热大的电池,C数低,发热小的电池C数高。如果某杂牌40C玩起来发热比一些大品牌的30C还要热,那么并不是这个大品牌故意标低C数,而是杂牌恶意标高C数而已。

    放电C数的小猫腻:正常品牌标C数,都是标电池能长期持续工作的C数。但是一些小品牌,可能会标瞬间电流(常见是持续3~5秒),瞬间电流往往能达到持续电流的1.5~2倍。玩家在选购时应该注意。

说完C数,说一下放电电流:C数可以理解为一个单位,并不是电流。电流还要跟容量搭配。C数乘以容量才是放电电流。
    例如5000MAH 30C的电池,其放电电流为5000*30=150000MA,也就是150A,同理,一个3000MAH 50C的电池,放电电流也是一样的,150A。区别是:3000MAH能用的时间会更短。

    有些玩家可能会问:我的电调只有120A,或者60A,我买个有150A电流的电池,我的电调会烧掉吗?答案当然不会了。你家外面的供电线动辄有几千千瓦,你的电脑可能只有300瓦,你把300瓦的电脑接到几千千瓦的线上,电脑有烧掉了吗?

    因此,电池的放电电流只是电池具备的能力,但是实际使用时,消耗的电流大小则是由电调和马达决定的。只要买比你电调和马达消耗的电流大的电池就可以了,大多少都可以,只要你资金足。

外形与尺寸:玩家只要按照自己的要求去购买对应尺寸和形状的就可以了。LiPo大部分都是长条形,但是有一些旧车型则是圆柱形的,那么只能选择镍氢电或者圆柱形容量较低的锂电型号。

插头类型:主流是T插头,田宫插,JST插头,XT60插头,JST插头,香蕉插头(99%的4MM香蕉插加1%的5MM香蕉插),其他如小田宫,XT90之类的也有,但相对很少
    插头的选择,就根据自己动力设备的插头去选择对应的就可以了,记住目前主流是T插,如买错插头,则会造成用电设备与电池无法连接。

关于LIPO电池的保养:
    为什么一些比赛玩家或者老手的电池怎么玩都不涨,新手的很容易就发涨了呢?
        可能的原因有:新手可能被误导或者被无良商家瞒骗买了虚标的产品,或者不懂搭配的商家给搭配了不符合使用条件的电池,甚至是玩家自己根本不懂然后乱买这几种情况,都可能造成电池发涨之类的问题。

    最大的原因在于:保养。

        主要有充电,使用,以及存放三种情况

        充电:锂电池,除1S外,2S及以上的电池,都一定要使用锂电平衡充电器,插上锂电上的白色平衡小插头,使用平衡充电模式。多个S的电池,多少都会因为生产时,造成每片电芯的容量会有少许误差,这些误差就会造成电池在用过之后,电压出现不平衡,少则0.01V,多则可能有1V之大,越好的电池,差别越小,越差的电池,差别越大。而锂电平衡冲,则是在充电时平衡电压,让电压高的不要超电压,让电压低的迅速补充电压。

            充电涉及到充电电流的问题,建议电流是电池容量的一半至2倍的电流为妥,也就是0.5C~2C之间,例如5000MAH的电池,0.5C就是5000*0.5=2500MA=2.5A,2C就是5000*2=10000MAH=10A,那么这个电池最好使用2.5A~10A之间的电流。完全不用担心电流大了对电池有什么负面影响,现在的大品牌电池随便都能支持5C~6C的电流,区区10A 8A对于好的电池来说根本微不足道。

        使用:使用时,无论何时,都一定要记得设置好锂电保护电压,不要让单节电芯的电压低于2.75V这个极限电压。低于这个电压,会对电池容量和放电能力产生负面影响。一般建议将锂电保护电压设置到3.0V~3.2V之间就可以了。多数电调的保护电压都是指电池在短时间内达到保护值,就会切断输出。因此电调保护之后,电压是会有回升的。假设设置了3.0V,保护之后我们测量电压可能有3.4V也不奇怪。
            网上一些玩家说电池电压不要低于3.7V,这个是毫无必要的。对于模型电池来说,因为C数大,容量大,其极限也更高,玩到3.0V每节对电池来说毫不足道。重点是后面说的存放。

        存放:存放状态对于一个电池来说至关重要。锂电不使用,或者不充电,都是处于存放状态,占一个电池寿命的最多时间。只要做到存放时,电池的单节电压处于3.85V左右,那么对电池来说就是最佳的。也就是说,如果你的电池不是在车上使用,也不是在充电器上充放电的时候,都要尽快让电池的电压变成3.85V每节,这样的电池寿命最长。
            尽快要多快?用完之后,等电池凉快了就充电到3.85V就可以了。然后到你下次要使用之前,再把电池充满。3.85V的电池要充满也很快的,不要贪方便提前一晚就充好电。可能你今晚充满的电池,到明天中午想用的时候,发现电池已经微涨了,也毫不奇怪的。
            但是如果我刚充满了,今天又不用了,怎么办?这还要问吗?马上放电啊,放到3.85V每节,然后等下次要使用的时候再充满吧。如果这点保养都做不好,那电池提前说88就不是电池的错了。

            友情提示:如果电池用完了,一定要记得从电调上拔掉插头哦,不然电调会偷偷的把电池的电压榨干的。

                如果不小心过放(电压低于2.75V)了咋办?如果充电器还能正常识别,那没问题,赶紧充到保存电压。但是如果充电器不认这个电池了,说电压低,那就要人肉加电压让电池起死回生了。操作方法:把锂电池的平衡插头不接到充电器,只接电池的正负极那2根粗线,然后用镍氢或者镍镉电模式,小电流冲几分钟,仔细看电压变化,当电压高于3V每节的时候(假如2S就是总6V),就可以用回正常的锂电平衡冲啦!
                    如果是简易平衡充电器,没有镍氢电模式,但是又无法识别了怎么办?那就要暴力加电压了。假设2S 7.4V的无法识别了,要让电池电压回升到6V以上,不超过8.4V,那么就找个直流电压器,电压在6~8.4V之间的,如果没有,就用几个五号电池串起来变成这个电压值,然后直接正极对正极,负极对负极接到你的锂电池上等片刻就OK了。注意正负极对准啊,接反后果不堪设想。

论坛也有些帖子,教导大家说锂电池新买的时候还要激活。其实这是毫无必要的,现在的锂电池容量大,C数高,寿命有限,每一次循环,就是电池少一次寿命。新到手的电池完全不会比所谓激活过的电池性能差。激活既无必要,又浪费时间。