第一次接触Carla Leaderboard时,我也被各种术语和流程搞得晕头转向。经过几个月的实战,我总结出了这套适合新手的完整指南。Carla Leaderboard是自动驾驶领域最具影响力的开源评测平台之一,它模拟了真实城市道路环境,要求参赛者提交的自动驾驶智能体完成指定路线,同时遵守交通规则。
这个平台最吸引人的地方在于它的开放性。不同于某些商业平台的封闭性,Carla完全开源,任何人都可以免费使用。我刚开始参与时,团队只有两个人,用的还是实验室的老旧显卡,但这并不妨碍我们做出有竞争力的方案。平台提供了Town01到Town07共7个不同风格的城市地图,包含交叉路口、环岛、高速公路等复杂场景。
参与Leaderboard需要准备以下基础环境:
提示:虽然官方支持CUDA 9.0,但我推荐使用CUDA 11.3+,能获得更好的性能表现。我在RTX 3090上测试时,CUDA 11.7的推理速度比CUDA 9.0快了近30%。
首先下载Carla 0.9.10.1版本(当前Leaderboard支持的最新稳定版)。这个版本大约8GB,建议使用迅雷等工具加速下载。解压后你会得到一个名为CarlaUE4的可执行文件,这就是仿真器本体。
我习惯创建一个conda环境来管理依赖:
bash复制conda create -n carla python=3.7
conda activate carla
cd CARLA_0.9.10.1
pip install -r PythonAPI/carla/requirements.txt
启动仿真器时,我推荐使用以下参数:
bash复制./CarlaUE4.sh -quality-level=Low -world-port=2000
把画质设为Low可以显著提升性能,特别是在本地测试阶段。等最终提交前,再切换为Epic画质进行最后验证。
官方提供了两个关键组件:
安装步骤:
bash复制git clone -b stable --single-branch https://github.com/carla-simulator/leaderboard.git
cd leaderboard
pip install -r requirements.txt
git clone -b leaderboard --single-branch https://github.com/carla-simulator/scenario_runner.git
cd scenario_runner
pip install -r requirements.txt
为了方便使用,我在~/.bashrc中添加了这些环境变量:
bash复制export CARLA_ROOT=~/CARLA_0.9.10.1
export SCENARIO_RUNNER_ROOT=~/leaderboard/scenario_runner
export LEADERBOARD_ROOT=~/leaderboard
export PYTHONPATH="${CARLA_ROOT}/PythonAPI/carla/:${SCENARIO_RUNNER_ROOT}:${LEADERBOARD_ROOT}:${CARLA_ROOT}/PythonAPI/carla/dist/carla-0.9.10-py3.7-linux-x86_64.egg:${PYTHONPATH}"
创建一个测试脚本test_run.sh:
bash复制#!/bin/bash
export SCENARIOS=${LEADERBOARD_ROOT}/data/all_towns_traffic_scenarios_public.json
export ROUTES=${LEADERBOARD_ROOT}/data/routes_devtest.xml
export REPETITIONS=1
export DEBUG_CHALLENGE=1
export TEAM_AGENT=${LEADERBOARD_ROOT}/leaderboard/autoagents/human_agent.py
export CHECKPOINT_ENDPOINT=results.json
export CHALLENGE_TRACK_CODENAME=SENSORS
./scripts/run_evaluation.sh
这个脚本会启动一个手动控制模式,你可以用WASD键控制车辆完成路线。通过这个测试,你能直观了解评测流程和计分规则。我第一次测试时因为闯红灯被扣了30%的分数,这让我意识到交通规则在评测中的重要性。
一个完整的自动驾驶智能体通常包含以下模块:
我建议新手从简单的规则系统开始。比如基于车道线检测的循迹算法,虽然简单但能帮你快速理解整个流程。我的第一个版本只用了OpenCV的车道线检测+PID控制,就在简单路线上拿到了60分。
智能体的核心是一个继承自AutonomousAgent的类:
python复制from leaderboard.autoagents.autonomous_agent import AutonomousAgent
class MyAgent(AutonomousAgent):
def setup(self, path_to_conf_file):
# 初始化模型和参数
self.model = load_your_model(path_to_conf_file)
def sensors(self):
# 定义需要的传感器
sensors = [
{'type': 'sensor.camera.rgb', 'x': 1.5, 'y': 0.0, 'z': 2.4,
'roll': 0.0, 'pitch': 0.0, 'yaw': 0.0,
'width': 800, 'height': 600, 'fov': 100},
# 可以添加更多传感器
]
return sensors
def run_step(self, input_data, timestamp):
# 处理传感器数据
image = input_data['rgb'][1]
# 调用你的算法
control = self.model.predict(image)
# 返回控制指令
return control
注意:run_step方法的执行时间直接影响得分。官方要求单帧处理时间不超过100ms,我在优化时发现把PyTorch模型转为TensorRT能提升2-3倍速度。
Carla提供了丰富的API来自动采集训练数据:
python复制import carla
client = carla.Client('localhost', 2000)
world = client.get_world()
# 设置天气和光照
weather = carla.WeatherParameters(
cloudiness=10.0,
precipitation=0.0,
sun_altitude_angle=70.0)
world.set_weather(weather)
# 添加车辆和传感器
blueprint_library = world.get_blueprint_library()
vehicle_bp = blueprint_library.find('vehicle.tesla.model3')
transform = world.get_map().get_spawn_points()[0]
vehicle = world.spawn_actor(vehicle_bp, transform)
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera_transform = carla.Transform(carla.Location(x=1.5, z=2.4))
camera = world.spawn_actor(camera_bp, camera_transform, attach_to=vehicle)
我建议至少采集10小时的不同天气、光照条件下的驾驶数据。记得要包含各种特殊情况:行人横穿马路、前车急刹、施工路段等。
官方提供了Dockerfile模板,位于leaderboard/scripts/Dockerfile.master。我们需要在"BEGINNING OF USER COMMANDS"和"END OF USER COMMANDS"之间添加自己的配置:
dockerfile复制ENV TEAM_AGENT /workspace/team_code/my_agent.py
ENV TEAM_CONFIG /workspace/team_code/config.yaml
ENV CHALLENGE_TRACK_CODENAME SENSORS
# 安装额外依赖
RUN apt-get update && apt-get install -y libgeos-dev
RUN pip install opencv-python torch==1.9.0
构建镜像时遇到的一个常见问题是pip版本冲突。解决方法是在Dockerfile中指定pip版本:
dockerfile复制RUN python -m pip install --upgrade pip==20.2.4
构建完成后,先在本地测试Docker镜像:
bash复制docker run -it --net=host --gpus all leaderboard-user /bin/bash
./leaderboard/scripts/run_evaluation.sh
我在这里踩过一个坑:Docker内的时间与主机不同步会导致评测失败。解决方法是在启动时添加:
bash复制docker run -it --net=host --gpus all -v /etc/localtime:/etc/localtime:ro leaderboard-user
注册AlphaDrive账号后,使用以下命令提交:
bash复制alpha benchmark:submit --split 3 leaderboard-user:latest
提交后通常需要等待24-48小时才能得到结果。我的经验是:
在我的实践中,以下优化手段效果显著:
一个典型的多线程架构:
python复制from threading import Thread
from queue import Queue
class PerceptionThread(Thread):
def __init__(self, input_queue, output_queue):
super().__init__()
self.input = input_queue
self.output = output_queue
def run(self):
while True:
data = self.input.get()
result = process_data(data)
self.output.put(result)
perception_queue = Queue()
planning_queue = Queue()
perception_thread = PerceptionThread(perception_queue, planning_queue)
perception_thread.start()
我遇到最棘手的问题是车辆偶尔会"卡住"不动。后来发现是控制指令的频率不稳定导致的,通过添加一个定时器解决了这个问题:
python复制import time
class ControlTimer:
def __init__(self, interval=0.05): # 20Hz
self.interval = interval
self.last_time = time.time()
def wait(self):
elapsed = time.time() - self.last_time
if elapsed < self.interval:
time.sleep(self.interval - elapsed)
self.last_time = time.time()
参与Carla Leaderboard是个长期迭代的过程。我的第一个版本只得了30分,经过三个月优化提升到了85分。关键是要持续分析评测报告,找出扣分点针对性改进。比如发现经常在十字路口失误,就多采集类似场景的数据重新训练模型。