DonkeyCar 模拟器使用指南
使用 DonkeyCar 模拟器进行自动驾驶算法开发和测试,无需实体车辆即可训练和验证模型,支持多种赛道场景和条件。
DonkeyCar 模拟器使用指南
在自动驾驶小车开发过程中,实体车辆的测试存在诸多限制:场地受限、硬件损坏风险、天气影响等。DonkeyCar 模拟器提供了一个虚拟测试环境,让你可以在电脑上训练和测试自动驾驶算法,无需实体车辆。
本文将介绍如何安装和使用 DonkeyCar 模拟器,包括环境配置、数据采集、模型训练和自动部署。
模拟器的优势
- 零成本试错:不用担心撞坏硬件
- 快速迭代:可以加速仿真时间
- 可控环境:精确控制赛道、光照、天气等条件
- 大规模数据:自动生成大量训练数据
- 安全测试:测试极端场景和边缘情况
安装模拟器
系统要求
- Windows 10/11、macOS 或 Linux
- 8GB 以上内存
- 支持 OpenGL 3.3+ 的显卡
下载与安装
从 DonkeyCar 官方 GitHub 下载对应平台的模拟器:
# 克隆 DonkeyCar 仓库
git clone https://github.com/autorope/donkeycar.git
cd donkeycar
# 安装 Python 依赖
pip install -e .[pc]
然后从 Releases 页面 下载对应平台的模拟器可执行文件。
启动模拟器
# Linux
./donkey_sim_linux.x86_64
# macOS
open DonkeySimMac.app
# Windows
donkey_sim.exe
启动后选择赛道场景,如 generated_track、warehouse 或 sparkfun_avc。
手动驾驶采集数据
在模拟器中手动驾驶,采集训练数据:
- 启动模拟器,选择赛道
- 点击 “Start” 开始
- 使用键盘控制:
- W/↑:加速
- S/↓:减速
- A/←:左转
- D/→:右转
模拟器会自动将图像和控制数据保存到本地目录。默认保存路径为 ~/.donkey/sim_data/。
通过 Python API 连接
也可以通过 Python 脚本连接模拟器,实现程序化控制:
import donkeycar as dk
from donkeycar.parts.simulation import SteeringServer
# 创建车辆实例
cfg = dk.load_config()
V = dk.vehicle.Vehicle()
# 添加摄像头模拟(从模拟器接收图像)
from donkeycar.parts.cv import ImgArrToJpg
V.add(ImgArrToJpg(), inputs=['cam/image_array'], outputs=['cam/image_bmp'])
# 添加 AI 模型
from donkeycar.parts.keras import KerasCategorical
model_path = 'model.h5'
model = KerasCategorical()
model.load(model_path)
V.add(model, inputs=['cam/image_array'], outputs=['steering', 'throttle'])
# 启动模拟器连接
V.start(rate_hz=20)
在模拟器中训练模型
方法一:使用采集的数据
模拟器采集的数据格式与实体车相同,可以直接用 donkey train 命令训练:
cd ~/mycar
donkey train --tub data/tub_* --model models/mypilot
方法二:使用生成器自动生成数据
DonkeyCar 提供了数据生成器,可以自动生成大量训练样本:
import numpy as np
from donkeycar.parts.simulation import MoveImageSet
# 加载赛道图像
sim_path = '/path/to/sim/track_images/'
mov = MoveImageSet(sim_path)
# 生成训练数据
for i in range(10000):
img, steering, throttle = mov.get_random_sample()
# 保存到 tub
save_record(img, steering, throttle)
模型验证
训练完成后,在模拟器中验证模型性能:
- 启动模拟器
- 选择与训练数据相同的赛道
- 切换到 “AI Driving” 模式
- 观察模型是否能自主完成赛道
评估指标
def evaluate_model(model, sim_connection):
"""评估模型在模拟器中的表现"""
laps_completed = 0
total_time = 0
collisions = 0
for lap in range(5):
start_time = time.time()
while not lap_completed:
image = sim_connection.get_image()
steering, throttle = model.predict(image)
sim_connection.send_control(steering, throttle)
if sim_connection.check_collision():
collisions += 1
break
lap_time = time.time() - start_time
total_time += lap_time
laps_completed += 1
print(f"完成圈数: {laps_completed}")
print(f"平均圈速: {total_time / laps_completed:.2f}s")
print(f"碰撞次数: {collisions}")
高级功能
多赛道训练
为了提高模型的泛化能力,可以在多个不同赛道上采集数据:
# 在不同赛道采集数据
# 赛道 1: generated_track
# 赛道 2: warehouse
# 赛道 3: sparkfun_avc
# 合并所有数据训练
donkey train --tub data/tub_track1/* data/tub_track2/* data/tub_track3/*
域随机化(Domain Randomization)
通过随机改变模拟器的视觉条件,提高模型对真实环境的适应能力:
import random
def randomize_environment(sim):
"""随机化环境参数"""
sim.set_lighting(random.uniform(0.5, 1.5)) # 光照强度
sim.set_texture(random.choice(['asphalt', 'concrete', 'dirt']))
sim.set_weather(random.choice(['clear', 'fog', 'rain']))
与实体车迁移学习
在模拟器中预训练模型,然后用少量实体车数据微调:
# 加载模拟器预训练模型
model = load_model('sim_model.h5')
# 用实体车数据微调
model.fit(real_car_data, epochs=10, learning_rate=0.0001)
常见问题
Q: 模拟器连接失败怎么办? A: 确保防火墙没有阻止端口连接。尝试在本地运行(localhost),检查模拟器版本与 Python 库版本是否匹配。
Q: 模拟器中表现好但实体车不行? A: 这是典型的 sim-to-real gap。建议增加域随机化,或使用迁移学习在实体数据上微调。
Q: 如何加速仿真? A: 在模拟器设置中调整 “Time Scale” 参数,可以 2x 或 4x 速度运行。
总结
DonkeyCar 模拟器是开发和测试自动驾驶算法的强大工具。它让你可以在虚拟环境中快速迭代,积累大量训练数据,然后迁移到实体车辆上。通过合理使用模拟器,可以大幅降低开发成本,加快项目进度。