CASE-05 · EXPERIMENT 008 · 综合实战

机器人小车智慧交通 综合案例(小车 C1)

把 3.26m × 2.98m 的交通教学沙盘当成一座"微缩城市":小车 C1 先用激光 SLAM 把路网画进地图,再用深度相机看懂红绿灯与标志牌,用 PID 沿车道线守住路口规则,最后在平行车位完成一次可量化验收的智慧泊车——感知、决策、控制、语音四条链路在沙盘上全闭环。

📚 4 个实验 ⏱️ 32 学时(4 × 8) 🤖 硬件:具身智能机器人小车 C1 🚦 智慧交通教学沙盘 🧵 能力闭环:建图 → 感知 → 控制 → 泊车
4
实验项目
32
总学时
8+
自制 SVG 示意图
1
综合路测验收

实验卡片

点击卡片展开实验列表 · 每实验 8 学时(2 理论 + 6 实践,理论融入实验页原理章)
EXP-04

智慧泊车与综合路测

平行车位与垂直车位的标线如何被检测、车位可用性怎么判定?轨迹泊车与 Nav2 精点导航如何结合?最终"巡游→改道→红灯停等→礼让→泊车→语音播报"全流程验收。

车位检测几何轨迹泊车语音播报成绩
1 个实验 · 含泊车轨迹动画 + 路径拖拽互动展开 ▾

技术栈 TECH

ROS 2 Humbleslam_toolbox(car1_slam / slam_map) Nav2 + AMCL(car1_navigation)TF2 view_frames HP60C 深度相机 /ascamera_hp60c/** 2D 激光雷达 6 TOPS NPU · YOLOv8 RKNN OpenCV HSV 颜色分割 PID 巡线控制/cmd_vel 速度控制 优先级状态机 IDLE/CROSSING/WAITING 麦克纳姆轮底盘car1_speech 语音播报 RViz2 可视化

学习路径 PATH

四实验即四阶段,前一实验的产出是后一实验的输入
STAGE 1 · EXP-01

先认路,再画图

沙盘元素认知与安全边界先行:遍历建图并保存 slam_map,给路口、灯口、车位做语义标注——没有地图与点位,后面全是空中楼阁。

STAGE 2 · EXP-02

感知先行

HSV 三态灯 + NPU 标志检测输出标准话题 /traffic/light、/traffic/sign,光照一变就重新标定——感知的输出决定控制的输入。

STAGE 3 · EXP-03

控制收敛

PID 巡线压中心偏差,路口状态机管"停、等、行、让",低速起步、提前减速两条铁律贯穿始终。

STAGE 4 · EXP-04

综合收口

泊车入库 + 全流程路测,每一环都有量化指标与评分表,语音播报成绩作为最终交付。

数据契约 DATA CONTRACT

前一实验的产出是后一实验的输入——四段接口决定了 32 学时能串成一个案例
EXP-01 → EXP-04 的数据契约(话题与文件) EXP-01 建图导航 slam_map.yaml 语义点位 waypoints.yaml (路口 / 灯口 / 车位) EXP-02 交通视觉 /traffic/light · /traffic/sign HSV 三态 10Hz · 标志 15Hz NPU 端侧推理 6 TOPS EXP-03 车道与信号 /cmd_vel(PID + 状态机) IDLE / WAITING / CROSSING 行人 > 红灯 > 巡线 EXP-04 泊车 + 路测 /score → car1_speech 播报 六阶段计分 ≥85 分过关 零人工干预 · rosbag 留痕 地图 灯态 通行 四段接口任一断流,后级按 fail-safe 处理——这就是"综合案例"区别于四个孤立实验的地方

学时与验收 SCHEDULE

32 学时 = 4 实验 × 8(2 理论 + 6 实践),理论融入各实验页"02 核心原理"章
实验(8 学时 · 2 理论 + 6 实践)关键命令(xlsx 风格)量化验收
EXP-01 沙盘认知与建图导航
元素认知 → SLAM → Nav2 → 语义标注
ros2 launch car1_slam slam.launch.py
ros2 run nav2_map_server map_saver_cli -f slam_map
ros2 launch car1_navigation navigation.launch.py map:=slam_map
闭环回路完整无断图;点到点 10/10;语义点位 ≥6 处
EXP-02 交通标志与红绿灯识别
HSV 三态 → NPU 检测 → 话题标准化
ros2 launch ascamera hp60c.launch.py
python3 src/app.py --model models/*.rknn
ros2 topic echo /traffic/light
红黄绿三态 ≥95%;四类标志 mAP 达标;话题频率稳(10/15Hz)
EXP-03 车道保持与路口信号通行
PID 巡线 → 红停绿行 → 礼让 → 状态机
ros2 run car1_control lane_follow_node.py --params-file lane_follow.yaml
ros2 param set /lane_follow_node kp 0.60
ros2 run tf2_tools view_frames
直道偏差 ≤±2cm;红灯 10/10;礼让 10/10;迁移无振荡
EXP-04 智慧泊车与综合路测
车位检测 → 轨迹入库 → 全流程计分播报
ros2 action send_goal /navigate_to_pose …
ros2 launch car1_speech speech.launch.py
ros2 bag record -a -o smart_route_bag
入库 10/10 不压线;全流程 ≥85 分、零干预;TTS 播报一致

开课准备 PREP

硬件、软件、交付物、安全四张清单,开课前逐项打勾
清单 A · 硬件

沙盘与小车点验

小车 C1 电量与麦克纳姆轮检查;HP60C、2D 雷达紧固;沙盘按现场实际清点车道线、红绿灯、标志牌、车位与行人模型——以现场沙盘实际元素为准。

清单 B · 软件

环境一次配好

ROS 2 Humble + slam_toolbox + Nav2/AMCL + ascamera 驱动 + car1_speech;YOLO 权重导出 RKNN(INT8,6 TOPS NPU);RViz2 配置与 slam_map 初始文件就位。

清单 C · 交付物

四实验的作业包

slam_map + 语义点位 yaml → HSV 与置信度标定文件 → 直道偏差曲线、状态机迁移日志 → 泊车评分表 + rosbag;每一项都可复盘、可量化。

清单 D · 安全

低速与断流兜底

巡线 ≤0.25m/s、入库 ≤0.10m/s 起步;/traffic/* 断流 ≥1s 按红灯 fail-safe;每次导航前设初始位姿;光照变化先重新标定再动手。

常见问答 FAQ

开课前学生最常问的五个问题
没有现场沙盘,页面还能学吗?

能。四个实验页的原理、动画、互动仿真全部自包含,不依赖实拍素材;沙盘元素按同类教学沙盘典型规格(车道约 40cm、直角弯 ×4、平行车位 45×35cm 等)设计,一切以现场沙盘实际元素为准,到现场后对照点验即可。

"2 理论 + 6 实践"的理论讲在哪?

不单独设理论页:每实验页"02 核心原理"就是 2 学时理论(含自制 SVG 示意图),"04~07"合计 6 学时实践;"06 原理动画 / 07 互动实验"可作理论收尾的课堂演示。

/traffic/light、/traffic/sign 是谁发布的?

EXP-02 的识别节点:HSV 颜色分割输出红黄绿三态(约 10Hz),NPU 上的 YOLOv8 输出四类标志(约 15Hz)。EXP-03 状态机与 EXP-04 全流程评分器只订阅这两个标准话题,感知模型换代不影响控制代码。

为什么反复强调"初始位姿必设"?

Nav2 精点导航的目标点定义在 map 坐标系:AMCL 初值歪 5cm,停位就歪 5cm——泊车 ≤3cm 的验收直接失败。每次启动 navigation.launch.py 后,先在 RViz2 用 2D Pose Estimate 对齐,再发 /navigate_to_pose。

光照一变就漏检,怎么根治?

没有一劳永逸的阈值。按实验页给出的流程:换光照 → 重采空位/有车样本 → 重标 HSV 与二值化阈值 → 复测 10 例回归。NPU 侧的标志检测同理,训练集要覆盖沙盘现场的灯光条件。

CASE-05 与已有课程什么关系?卡片编号在哪?

本课程是 cases 目录下第 5 个综合案例(编号 CASE-05,目录名 exp008-smart-traffic),首页总索引的回填由主控统一完成;课程内四实验自成闭环,硬件统一为具身智能机器人小车 C1 + 智慧交通教学沙盘(选型参考:淘宝 id=696594369848「ROS机器人无人驾驶沙盘」,¥899,塔克创新品牌店)。

素材与规格说明:本课程按同类教学沙盘典型规格设计(车道宽约 40cm、直角弯 ×4、T 形路口、红绿灯模型、斑马线、平行车位、交通标志牌、高对比识别线等),并抓取了 Hiwonder 同类产品公开页图片作为参照,一切以现场沙盘实际元素为准;教学沙盘选型参考:淘宝 id=696594369848「ROS机器人无人驾驶沙盘」(¥899,塔克创新品牌店)。未标注来源的示意图均为本课程自制示意图;动画与互动组件全部页内自包含、无外部依赖。