3、工具链搭建:基于Python的仿真环境(如CARLA/SUMO)与可视化工具(Matplotlib/Plotly)配置
说实话,很多做规划控制的同行,算法写得挺漂亮,但一到实车测试就翻车。为什么?因为仿真环境没搭好。你想想看,没有一套趁手的工具链,你连算法在极端工况下会不会崩溃都不知道。
我个人习惯是,花30%的时间搭环境,剩下70%的时间才能安心调参。今天我就把压箱底的配置经验掏出来,咱们一步步把CARLA、SUMO、Matplotlib、Plotly这套组合拳打明白。
3.1 仿真双引擎:CARLA + SUMO 的协同配置
先说CARLA。这东西是个基于虚幻引擎的开源仿真器,画面逼真,传感器模拟也到位。我最早接触它是在2019年,那时候版本还不太稳定,动不动就崩。现在好多了,但配置上还是有坑。
CARLA 0.9.x 系列对 Python 版本有严格限制。我建议直接用 CARLA 0.9.14 搭配 Python 3.8,这个组合我实测最稳。
安装步骤其实不复杂,但顺序错了会出问题。我习惯这样来:
# 第一步:创建干净的虚拟环境
conda create -n carla_env python=3.8
conda activate carla_env
# 第二步:安装CARLA Python API
pip install carla==0.9.14
# 第三步:安装SUMO(用于交通流仿真)
# Ubuntu下直接apt安装
sudo apt install sumo sumo-tools sumo-doc
# 验证安装
python -c "import carla; print('CARLA version:', carla.__version__)"
sumo --version
嗯,这里要注意。CARLA的Python API其实藏在它的安装包里。如果你是从源码编译的,记得把 PythonAPI/carla/dist/ 下的egg文件用pip装上。我当年第一次装的时候,愣是找了半天才找到这个路径。
3.2 双引擎协同:CARLA + SUMO 的桥梁搭建
为什么要同时用CARLA和SUMO?说白了,CARLA擅长微观场景——车怎么动、传感器怎么感知。SUMO擅长宏观交通流——红绿灯怎么变、车流密度怎么调。两者结合,才能模拟出真实的城市交通环境。
我项目中常用的做法是:用SUMO生成交通流,然后通过 carla-sumo-coordination 这个桥接工具,把SUMO里的车辆映射到CARLA中。这样你既能看到逼真的3D画面,又能控制交通流的宏观参数。
桥接配置里最关键的参数是
sync_interval。我一般设成0.1秒,也就是100ms同步一次。太快了CPU扛不住,太慢了车辆位置会跳变。
# 桥接配置示例(YAML格式)
carla:
host: "localhost"
port: 2000
timeout: 10
sumo:
host: "localhost"
port: 8813
gui: true # 打开SUMO GUI方便观察
bridge:
sync_interval: 0.1 # 同步间隔(秒)
step_length: 0.05 # 仿真步长(秒)
vehicle_keep_mode: "normal"
我曾经踩过一个坑:桥接启动后,CARLA里的车辆像喝醉了酒一样左右摇摆。排查了半天,发现是 step_length 设得太大了。改成0.05秒后,车辆轨迹就平滑了。你想想看,仿真步长和同步间隔如果不匹配,控制信号就会抖动。
3.3 可视化双雄:Matplotlib 与 Plotly 的配置
仿真跑起来了,数据也收了,接下来就是看结果。我个人习惯用Matplotlib做静态分析,用Plotly做动态交互。两者各有千秋,别指望一个工具打天下。
3.4 Matplotlib:快速出图,静态分析利器
Matplotlib的好处是轻量、稳定、出图快。我一般用它来画轨迹对比、速度曲线、误差分析这些静态图。配置上其实没什么玄学,但有几个细节能让你少走弯路。
import matplotlib.pyplot as plt
import matplotlib as mpl
# 我个人习惯的全局配置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 支持中文
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
plt.rcParams['figure.dpi'] = 150 # 高清输出
plt.rcParams['figure.figsize'] = (12, 6) # 默认画布大小
# 画一条轨迹对比图
def plot_trajectory_comparison(gt_traj, pred_traj):
fig, ax = plt.subplots()
ax.plot(gt_traj[:, 0], gt_traj[:, 1], 'b-', label='Ground Truth', linewidth=2)
ax.plot(pred_traj[:, 0], pred_traj[:, 1], 'r--', label='Prediction', linewidth=2)
ax.set_xlabel('X (m)')
ax.set_ylabel('Y (m)')
ax.set_title('轨迹对比')
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
return fig
我曾经在Ubuntu服务器上画图,发现中文全变成了方框。后来发现是系统没装中文字体。解决办法:
sudo apt install fonts-wqy-zenhei,然后重启Python内核。
3.5 Plotly:交互式可视化,调试神器
Plotly的优势在于交互。你可以缩放、平移、悬停看数据点。调参的时候,我经常用Plotly同时展示多个维度的数据,比如速度、加速度、曲率、横向误差,鼠标一点就能看到对应时刻的所有状态。
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# 创建一个多子图的交互式图表
def create_interactive_dashboard(time, speed, accel, curvature, lateral_error):
fig = make_subplots(
rows=4, cols=1,
shared_xaxes=True,
subplot_titles=('速度', '加速度', '曲率', '横向误差')
)
fig.add_trace(go.Scatter(x=time, y=speed, mode='lines', name='速度'), row=1, col=1)
fig.add_trace(go.Scatter(x=time, y=accel, mode='lines', name='加速度'), row=2, col=1)
fig.add_trace(go.Scatter(x=time, y=curvature, mode='lines', name='曲率'), row=3, col=1)
fig.add_trace(go.Scatter(x=time, y=lateral_error, mode='lines', name='横向误差'), row=4, col=1)
fig.update_layout(height=800, title_text="规划控制性能仪表盘")
fig.update_xaxes(title_text="时间 (s)", row=4, col=1)
return fig
# 在Jupyter中直接显示
# fig.show()
Plotly的配置有个小技巧:如果你在Jupyter Notebook里用,记得先安装 ipywidgets 并启用扩展。不然图表可能显示不出来。我一般这样处理:
# 安装Jupyter支持
pip install plotly ipywidgets
jupyter nbextension enable --py widgetsnbextension
# 或者在Jupyter Lab中
jupyter labextension install @jupyter-widgets/jupyterlab-manager plotlywidget
3.6 工具链集成:一个脚本搞定全流程
好了,各个工具都配好了,怎么串起来?我习惯写一个启动脚本,一键拉起CARLA、SUMO、桥接、数据记录和可视化。这样每次调参不用重复配环境。
#!/bin/bash
# start_pipeline.sh - 一键启动仿真工具链
echo "🚀 启动CARLA..."
./CarlaUE4.sh -quality-level=Low -carla-rpc-port=2000 &
CARLA_PID=$!
sleep 10 # 等待CARLA启动
echo "🚗 启动SUMO..."
sumo-gui -c sumo_config.sumocfg &
SUMO_PID=$!
sleep 3
echo "🔗 启动桥接..."
python carla_sumo_bridge.py --carla-port 2000 --sumo-port 8813 &
BRIDGE_PID=$!
echo "📊 启动数据记录..."
python data_recorder.py --output ./logs/run_$(date +%Y%m%d_%H%M%S).h5 &
RECORDER_PID=$!
echo "✅ 工具链已启动!"
echo "CARLA PID: $CARLA_PID"
echo "SUMO PID: $SUMO_PID"
echo "Bridge PID: $BRIDGE_PID"
echo "Recorder PID: $RECORDER_PID"
# 等待用户按Ctrl+C退出
trap "kill $CARLA_PID $SUMO_PID $BRIDGE_PID $RECORDER_PID; exit" INT
wait
CARLA和SUMO都是吃内存的大户。我建议至少16GB内存起步,显卡最好有4GB以上显存。如果机器配置不够,可以把CARLA的画质调到Low,或者用无头模式(headless mode)运行。
3.7 可视化框架图:工具链全景
下面这张图是我自己总结的工具链架构。你看一眼就能明白各个模块怎么配合的。
3.8 常见问题与避坑指南
| 问题现象 | 可能原因 | 我的解决方案 |
|---|---|---|
| CARLA启动后黑屏 | 显卡驱动问题或缺少Vulkan支持 | 尝试 ./CarlaUE4.sh -opengl 强制使用OpenGL |
| SUMO桥接后车辆不动 | 端口被占用或同步间隔不匹配 | 检查 netstat -tulpn | grep 8813,换个端口试试 |
| Plotly图表在Jupyter中不显示 | 缺少ipywidgets或扩展未启用 | 重新安装 ipywidgets 并执行 jupyter nbextension enable |
| Matplotlib中文乱码 | 系统缺少中文字体 | 安装 fonts-wqy-zenhei 或指定其他中文字体路径 |
说实话,工具链搭建这件事,第一次总是最痛苦的。但一旦搭好了,后面调参的效率能翻好几倍。我个人建议你把这个配置过程写成脚本,下次换机器或者重装系统,一键就能恢复环境。
嗯,今天就先聊到这儿。工具链是地基,地基稳了,后面咱们才能放心地调那些规划控制的参数。