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的文件不一致。如果有报这种错误,可以把本地代码库上面的对应文件覆盖到树莓派上解决。

七、参考创新方向

无人驾驶车障碍竞速

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

无人捡球车


参考文献

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

Leave a Reply

Your email address will not be published. Required fields are marked *