第一讲:Carla仿真结果可视化与报告生成——课程介绍、环境搭建与数据准备
大家好,我是你们这门课的主讲。说实话,做自动驾驶仿真这么多年,我踩过的坑比走过的路还多。今天咱们要聊的这门课,说白了就是帮大家解决一个实际问题:仿真跑完了,结果怎么展示?报告怎么生成?
我个人习惯是,先看结果再讲原理。所以第一讲,咱们先把环境搭好,把数据准备好。别急,一步步来。
1.1 这门课到底讲什么?
先说说这门课的定位。它不是教你如何用Carla做仿真——那是另一门课的事。它要解决的是:仿真跑完之后,你怎么把数据变成有价值的报告。
我遇到过不少团队,仿真跑了上千公里,结果就是一堆log文件。领导问「效果怎么样?」答不上来。你想想看,这多尴尬。
所以这门课的核心就三件事:
- 可视化:把传感器数据、车辆轨迹、碰撞检测这些结果,用图表、动画展示出来
- 分析:从数据里提取关键指标,比如平均速度、碰撞次数、路径偏差
- 报告生成:自动生成PDF或HTML报告,方便分享和存档
说白了,就是让仿真结果「看得见、说得清、存得下」。
1.2 环境搭建——别在这步卡住
嗯,这里要注意。环境搭建往往是新手最容易放弃的地方。我刚开始做Carla开发时,光装依赖就折腾了两天。后来总结了一套「稳如老狗」的安装流程,分享给大家。
1.2.1 硬件要求
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 4核8线程 | 8核16线程 |
| 内存 | 16GB | 32GB |
| 显卡 | GTX 1060 6GB | RTX 3070 8GB |
| 硬盘 | 50GB空闲 | SSD 100GB |
1.2.2 软件安装步骤
我个人习惯用Python 3.8 + Carla 0.9.14这个组合,兼容性最好。为什么?因为我在项目中试过3.10,有些库不兼容,折腾半天。
- 安装Carla:去官网下载预编译包,解压即可。别从源码编译,除非你想体验「编译两小时,报错一分钟」的快感。
- 创建虚拟环境:
python -m venv carla_env
source carla_env/bin/activate # Linux/Mac
carla_env\Scripts\activate # Windows
- 安装依赖:
pip install carla==0.9.14
pip install numpy matplotlib pandas
pip install opencv-python # 图像处理
pip install fpdf2 # PDF报告生成
pip install carla -i https://pypi.tuna.tsinghua.edu.cn/simple
1.3 数据准备——仿真结果从哪来?
环境搭好了,接下来就是数据。你可能会问:「数据从哪来?」其实就两个来源:
- 实时采集:仿真运行时,通过Carla的传感器接口实时获取数据
- 离线日志:Carla可以记录仿真过程,生成.log文件,事后回放分析
我建议初学者先用离线日志,因为可以反复调试,不用每次都跑仿真。我曾经为了调试一个可视化脚本,跑了20遍仿真,后来发现用日志文件一次搞定。
1.3.1 启动Carla并记录数据
先启动Carla服务端:
./CarlaUE4.sh -quality-level=Low -fps=10
然后运行一个简单的客户端脚本,记录数据:
import carla
import time
client = carla.Client('localhost', 2000)
world = client.get_world()
# 设置记录器
client.start_recorder("simulation.log", True)
# 跑一段仿真
vehicle = world.spawn_actor(...)
vehicle.set_autopilot(True)
time.sleep(30)
# 停止记录
client.stop_recorder()
start_recorder的第二个参数是additional_data,设为True可以记录更多信息,比如碰撞事件、交通灯状态。我建议一直开着,数据多了总比少了强。
1.3.2 数据文件结构
记录完成后,你会得到一个.log文件。但别急着打开——它是二进制格式,需要用Carla的API读取。数据内容大致包括:
| 数据类型 | 说明 | 频率 |
|---|---|---|
| 车辆状态 | 位置、速度、加速度、转向角 | 每帧 |
| 传感器数据 | 相机图像、激光雷达点云、GPS坐标 | 取决于传感器设置 |
| 事件记录 | 碰撞、车道偏离、交通灯违规 | 发生时记录 |
| 交通参与者 | 其他车辆、行人、自行车的位置和状态 | 每帧 |
1.3.3 读取日志文件
读取日志的代码也很简单:
import carla
client = carla.Client('localhost', 2000)
log_data = client.show_recorder_file_info("simulation.log", True)
# 解析每一帧
for frame in log_data:
print(f"帧号: {frame.frame}, 时间: {frame.timestamp}")
# 这里可以提取车辆位置、速度等
show_recorder_file_info查看时间范围,然后用start_replaying从指定时间开始回放。我在做碰撞分析时经常这么干,省时间。
1.4 数据预处理——别让脏数据坑了你
数据拿到手了,但别急着可视化。你想想看,仿真过程中难免有异常帧——比如车辆瞬移、传感器丢包。这些脏数据如果不处理,画出来的图表会误导人。
我遇到过最离谱的一次,仿真里一辆车突然飞到天上,然后掉下来。如果不做滤波,平均速度曲线会多出一个尖峰,看起来像「超音速汽车」。
所以,预处理这一步不能省:
- 去除异常值:比如速度超过200km/h的帧,直接过滤掉
- 插值补全:传感器丢包导致的数据缺失,用线性插值补上
- 时间对齐:不同传感器的采样频率不同,需要对齐到统一时间轴
import pandas as pd
import numpy as np
# 假设data是DataFrame,包含时间戳和速度
# 去除速度大于50m/s的异常帧
data = data[data['speed'] < 50]
# 线性插值补全缺失值
data = data.interpolate(method='linear')
# 重采样到固定频率(10Hz)
data = data.set_index('timestamp').resample('0.1S').mean()
1.5 课程后续内容预告
好了,第一讲的内容就到这里。我们搭好了环境,学会了记录和读取仿真数据,还做了基本的预处理。下一讲,我们会开始真正的可视化——用Matplotlib画出车辆的轨迹、速度曲线,甚至做一个简单的动画。
说实话,看到数据变成图表的那一刻,还是挺有成就感的。咱们下节课见。
公众号:蓝海资料掘金营,微信deep3321