DonkeyCar 模拟器使用指南

使用 DonkeyCar 模拟器进行自动驾驶算法开发和测试,无需实体车辆即可训练和验证模型,支持多种赛道场景和条件。

donkeycar 模拟器 自动驾驶 仿真 Unity
DonkeyCar 模拟器使用指南

DonkeyCar 模拟器使用指南

在自动驾驶小车开发过程中,实体车辆的测试存在诸多限制:场地受限、硬件损坏风险、天气影响等。DonkeyCar 模拟器提供了一个虚拟测试环境,让你可以在电脑上训练和测试自动驾驶算法,无需实体车辆。

本文将介绍如何安装和使用 DonkeyCar 模拟器,包括环境配置、数据采集、模型训练和自动部署。

模拟器的优势

  1. 零成本试错:不用担心撞坏硬件
  2. 快速迭代:可以加速仿真时间
  3. 可控环境:精确控制赛道、光照、天气等条件
  4. 大规模数据:自动生成大量训练数据
  5. 安全测试:测试极端场景和边缘情况

安装模拟器

系统要求

  • 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_trackwarehousesparkfun_avc

手动驾驶采集数据

在模拟器中手动驾驶,采集训练数据:

  1. 启动模拟器,选择赛道
  2. 点击 “Start” 开始
  3. 使用键盘控制:
    • 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)

模型验证

训练完成后,在模拟器中验证模型性能:

  1. 启动模拟器
  2. 选择与训练数据相同的赛道
  3. 切换到 “AI Driving” 模式
  4. 观察模型是否能自主完成赛道

评估指标

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 模拟器是开发和测试自动驾驶算法的强大工具。它让你可以在虚拟环境中快速迭代,积累大量训练数据,然后迁移到实体车辆上。通过合理使用模拟器,可以大幅降低开发成本,加快项目进度。