Donkeycar:一个Python自动驾驶库
Donkeycar是一个极简且模块化的Python自动驾驶库。它专为业余爱好者和学生开发,专注于快速实验和便捷的社区贡献。它正在高中和大学层面被积极用于学习和研究。它提供了一个丰富的图形界面,并包含一个模拟器,因此即使在您构建机器人之前,您也可以体验自动驾驶。
快速链接
如果您想要以下内容,请使用Donkeycar:
- 构建一个机器人并教会它自动驾驶。
- 实验自动驾驶、GPS、计算机视觉和神经网络。
- 参加自动驾驶比赛,如DIY Robocars,包括与来自世界各地的竞争对手进行在线模拟器比赛。
- 参与一个充满活力的在线社区,学习尖端技术并享受其中的乐趣。
开始之前您需要知道什么?(简而言之,什么都不需要)
Donkeycar被设计为自动驾驶的"Hello World";它简单yet灵活且强大。不需要特定的先决知识,但如果您了解以下内容会有所帮助:
- Python编程。您无需进行任何编程就可以使用Donkeycar。您编辑以配置汽车的文件
myconfig.py
是一个Python文件。您主要只需取消注释要更改的部分并进行编辑;如果您了解Python的注释和缩进工作原理,就可以避免常见错误。 - 树莓派。树莓派是Donkeycar首选的车载计算机。设置和使用过树莓派会有帮助,但不是必需的。Donkeycar文档描述了如何在RaspberryPi OS上安装软件,但使用Raspberry Pi Imager安装RaspberryPi OS的具体细节以及如何使用raspi-config配置树莓派则留给树莓派文档,这些文档非常详尽且相当不错。我建议您按照树莓派文档设置树莓派,然后稍微玩一玩;使用浏览器访问网站并观看YouTube视频,比如这个在Donkeycar的第一次户外比赛中拍摄的视频。使用文本编辑器编写并保存文件。打开终端并学习如何浏览文件系统(见下文)。如果您熟悉树莓派,那么您就不必同时学习树莓派和Donkeycar了。
- Linux命令行shell。命令行shell通常也被称为终端。您将在终端中输入命令来安装和启动Donkeycar软件。Donkeycar文档描述了这是如何工作的。了解如何浏览文件系统以及如何列出、复制和删除文件和目录/文件夹也很有帮助。您还可以远程访问您的车;因此,您需要知道如何启用和连接WIFI,以及如何从主机计算机启用和启动SSH终端或VNC会话,以在您的车上获得命令行。
开始驾驶。
构建Donkeycar并安装 Donkeycar软件后,您可以选择自动驾驶模板并校准您的车,然后开始驾驶!
修改您的车的行为。
Donkeycar包含许多预构建的模板,通过更改配置即可轻松开始。预构建的模板可能是您所需要的全部,但如果您想更进一步,可以更改模板或创建自己的模板。Donkeycar模板被组织为一系列软件部件,这些部件在每次通过车辆循环时按顺序运行,在运行时从车辆的软件内存中读取输入并写入输出。典型的车辆包含以下部件:
- 从相机获取图像。Donkeycar支持多种不同类型的相机,包括3D相机和激光雷达。
- 从GPS接收器获取位置读数。
- 从游戏控制器或RC控制器获取转向和油门输入。Donkeycar支持PS3、PS4、XBox、WiiU、Nimbus和罗技蓝牙游戏控制器,以及任何可与树莓派兼容的游戏控制器。Donkeycar还实现了一个WebUI,允许连接任何浏览器兼容的游戏控制器,并提供了一个适用于手机的屏幕触摸控制器。
- 控制车辆驱动系统的电机以实现加速和转向。Donkeycar支持各种驱动系统,包括大多数RC汽车常见的ESC/转向舵机配置和差速驱动配置。
- 保存遥测数据,如相机图像、转向和油门输入、激光雷达数据等。
- 自动驾驶汽车。Donkey支持三种自动驾驶系统:深度学习自动驾驶、GPS自动驾驶和计算机视觉自动驾驶。深度学习自动驾驶支持Tensorflow、Tensorflow Lite和Pytorch以及多种模型架构。
如果没有一个Donkeycar部件能满足您的需求,那么编写自己的部件并将其添加到车辆模板中。
#定义一个车辆,每秒拍摄并记录10次图片。
import time
from donkeycar import Vehicle
from donkeycar.parts.cv import CvCam
from donkeycar.parts.tub_v2 import TubWriter
V = Vehicle()
IMAGE_W = 160
IMAGE_H = 120
IMAGE_DEPTH = 3
#添加相机部件
cam = CvCam(image_w=IMAGE_W, image_h=IMAGE_H, image_d=IMAGE_DEPTH)
V.add(cam, outputs=['image'], threaded=True)
#预热相机
while cam.run() is None:
time.sleep(1)
#添加tub部件以记录图像
tub = TubWriter(path='./dat', inputs=['image'], types=['image_array'])
V.add(tub, inputs=['image'], outputs=['num_records'])
#以10 Hz的频率启动驾驶循环
V.start(rate_hz=10)
查看主页、文档 或加入Discord服务器以了解更多信息。