CARLA 闯红灯预警(RLW)
交通灯状态 + 判停距离 → 三级滞回状态机 (normal → approaching → violation_risk)→ 跃迁事件, 支持纯离线测试与连 CARLA 路口红绿灯场景演示。
1. 概述与目标
本模块实现乘用车 RLW(Red Light Warning,闯红灯预警) 的完整闭环, 在 CARLA 0.9.16 中可一键复现:
| 环节 | 实现 |
|---|---|
| 感知 | 交通灯 API:vehicle.get_traffic_light() 给出自车当前受控的灯,get_stop_locations()(0.9.14+)给停止线位置,计算自车到停止线距离;自车不受灯控时发布 off + 占位大距离 |
| 决策 | 判停距离 d_stop = v²/(2·a_comfort);三级滞回状态机(黄灯只提示接近、红灯且舒适刹停不可行才判"将闯线") |
| 输出 | 分级状态 + 跃迁事件(approach_start / violation_start / violation_clear / approach_clear) |
代码位于 src/ground/carla_red_light_warning/。
1.1 与仓库中其它地面载具模块的区分
| 模块 | 输入 | 算法 | 特点 |
|---|---|---|---|
自动紧急制动 AEB(carla_aeb_braking) |
前向 LiDAR 点云 | 规则式滞回状态机 | 前向障碍制动,需要传感器 |
盲区监测 BSD(carla_bsd_blind_spot) |
侧向 LiDAR 点云 | 三级预警状态机 | 侧向预警,只报不控 |
弯道自适应限速 CSL(carla_curve_speed_limit) |
地图路点 | v=√(a·R) 限速 + 斜坡 | 舒适性件,只控速度 |
车道偏离预警 LDW(carla_lane_departure_warning) |
地图路点 | 横向偏移 + 三级滞回 | 横向预警,只报不控 |
| 本模块(RLW) | 交通灯 API(零传感器) | 判停距离 + 三级滞回 | 路口纵向预警,带演示刹停基建 |
RLW 与 LDW/CSL 同为零传感器依赖模块,但数据源是交通灯 API 而非地图 拓扑——感知由仿真器直接给出(自车受控的灯 + 停止线),前瞻性由 "判停距离 vs 剩余距离"比较保证。全部决策逻辑(判停公式 + 状态机)为 纯离线函数,38 个单元测试不依赖 ROS 与 CARLA。
1.2 语义约定
- 黄灯不判闯线:现实中黄灯越线不违规,黄灯只触发 approaching 提示;
- violation_risk 仅在红灯且 d < d_stop 时触发——即舒适减速已不可行, 需要急刹或将越线的时刻;
- 模块只预警不控车:演示中的"红灯刹停"是演示基建(violation_risk 时 按判停距离亏欠比例施加制动),接入整车时应把事件送入 HMI 提示。
2. 计算原理
2.1 判停距离
以舒适减速度 a_comfort(默认 2.5 m/s²)从速度 v 刹停所需距离:
d_stop = v² / (2 · a_comfort)
v = 8 m/s 时 d_stop ≈ 12.8 m。剩余停止线距离 d 与 d_stop 比较即"能否 舒适停下"。
2.2 三级滞回状态机
normal ──────黄/红灯且 d < warn_enter(30)──▶ approaching
approaching ──红灯且 d < d_stop────────────▶ violation_risk
approaching ──绿灯 或 d > warn_exit(35)────▶ normal
violation_risk ──绿灯─────────────────────▶ normal
violation_risk ──红灯且 d > d_stop×1.2─────▶ approaching
双阈值滞回(warn 30/35 m,brake 1.2×系数)消除临界抖动;事件仅在真实 跃迁时发出一次。
3. 模块结构
src/ground/carla_red_light_warning/
├── carla_red_light_warning/
│ ├── red_light_core.py # 决策核心:判停距离/三级滞回/热身期(纯离线)
│ ├── bridge_node.py # CARLA 桥接:交通灯感知 → /rlw/* 发布
│ ├── rlw_node.py # 预警节点:定时器推进状态机 → /rlw/state + /rlw/event
│ ├── carla_common.py # CARLA 封装(复用 AEB/BSD/CSL/LDW 已验证实现)
│ └── demo.py # 离线/真实 CARLA 一键演示
├── launch/main.launch.py # 桥接+预警两节点一键启动
├── config/rlw_params.yaml # 全部决策参数(顶层 /** 通配,参数可生效)
├── tests/ # 38 个离线单元测试(宿主机无需 ROS/CARLA)
└── main.py # doctor / test / build / demo 统一入口
4. ROS 接口
| 话题 | 方向 | 类型 | 含义 |
|---|---|---|---|
/rlw/light_state |
桥接 → 预警 | String | red / yellow / green / off |
/rlw/dist_to_stop |
桥接 → 预警 | Float32 | 自车到停止线距离(m;无灯时 1e4 占位) |
/rlw/ego_speed |
桥接 → 预警 | Float32 | 自车速度(m/s) |
/rlw/state |
预警 → 外部 | String | normal / approaching / violation_risk |
/rlw/event |
预警 → 外部 | String | 跃迁事件(仅跃迁拍发布一次) |
5. 快速开始与结果复现
5.1 离线测试(无需 ROS 与 CARLA)
cd src/ground/carla_red_light_warning/
python3 main.py doctor # 依赖体检
python3 main.py test # 38 个离线单元测试
python3 main.py demo # 离线演示:合成红灯接近场景
离线场景为自车 8 m/s 循环接近停止线(100 m → 0),灯按 25 s 周期 (10 s 红 / 15 s 绿)切换:每轮触发 approach_start → violation_start → violation_clear 完整事件链。
5.2 CARLA 实测
先启动 CARLA 0.9.16(宿主机离屏渲染),执行(--host 填 CARLA 所在
机器 IP,Python 需可导入 carla 包,见 README 环境说明):
# 方式一:源码直跑(目录:src/ground/carla_red_light_warning/)
python3 main.py demo --live --host <CARLA_IP> --seconds 45
# 方式二:colcon 构建 + launch(目录:ros2 工作空间根目录)
colcon build --packages-select carla_red_light_warning && source install/setup.bash
ros2 launch carla_red_light_warning main.launch.py host:=<CARLA_IP>
# 另开终端:ros2 topic echo /rlw/state
实测现象(Town01):自车 6 m/s 左右巡航,遇红灯路口时 approach_start
(距停止线 30 m 内)→ 红灯且刹停不可行时 violation_start → 演示刹停
→ 变绿灯 violation_clear 起步通过;长直道无红绿灯段状态保持 normal。
6. 演示结果
6.1 事件时间线(CARLA 实测 45 s)
| 时刻 | 事件 | 场景 |
|---|---|---|
| t=4.15 s | approach_start | 路口 1 红灯,进入 30 m 预警区 |
| t=5.10 s | approach_clear | 灯转绿/通过,回 normal |
| t=14.00 s | approach_start | 路口 2 红灯接近 |
| t=14.35 s | violation_start | 剩余距离 < 判停距离,刹停不可行 |
| t=14.70 s | violation_clear | 演示刹停完成(v→0),灯转绿恢复 |
violation_risk 合计 7 拍(0.35 s 内完成"判定→刹停"),全程无假振荡; 长直道段(t≈15~45 s)状态保持 normal,零误报。
6.2 指标汇总
| 指标 | 离线演示 | CARLA 实测 |
|---|---|---|
| 状态链 | 三级齐全、多轮红灯循环 | 2 轮 approach,1 次 violation 判定+刹停 |
| 判停准确性 | — | violation_risk 后 0.35 s 内刹停(v→0) |
| 误报 | 0 | 0(长直道 30 s 全程 normal) |
| 传感器依赖 | 无 | 无(交通灯 API) |
6.3 效果图
接近预警(approach)、将闯线判定(violation)、刹停恢复(recover) 截图,以及停止线距离/状态/灯态三行跟踪曲线 (曲线上 dist=1e4 平台为长直道无红绿灯段的占位值):



图片与逐拍 CSV 数据已入库 docs/img/ground/carla_red_light_warning/
(PNG 均 < 0.5 MB),复现命令见第 5 节。
7. 参数说明
全部参数集中于 config/rlw_params.yaml,与代码 RLWParams 一一对应:
| 参数 | 默认值 | 含义 |
|---|---|---|
a_comfort |
2.5 | 舒适减速上限(m/s²) |
warn_enter / warn_exit |
30 / 35 | approaching 进/出的停止线距离(m,滞回) |
brake_margin |
1.2 | violation 退出滞回系数(d > d_stop×margin 回退) |
period |
0.05 | 状态机推进周期(s) |
warmup_ticks |
2 | 热身拍数(冷启动灯态未稳定不输出决策) |
8. 已知限制
- 停止线感知依赖
vehicle.get_traffic_light()——仅当自车驶入灯控车道时 仿真器才返回受控灯;路口选择由行驶路线决定(Town01 红绿灯路口密度 有限,45 s 实测遇 2 个灯控路口); - 判停模型未考虑路面附着系数(雨雪天应下调 a_comfort)与坡度;
get_stop_locations()为 CARLA 0.9.14+ API,旧版本自动回退灯位近似 (距离偏保守);- 模块只预警不控车,演示中的刹停为演示基建;实际产品应将 /rlw/event 送入声光提示,并可与 AEB(紧急制动)联动形成纵深防御。