EXP-04 · 8 学时(2 理论 + 6 实践)

智慧泊车与综合路测

收口实验:先让小车"看懂车位"(标线四点检测 + 可用性判定),再"一把倒进去"(两段圆弧几何轨迹或 Nav2 精点导航),最后跑全流程综合任务——巡游 → 按标志改道 → 红灯停等 → 斑马线礼让 → 寻位泊车 → 语音播报成绩,形成一张可量化的验收评分表。

理论2+实践6车位检测轨迹泊车Nav2 精点导航全流程计分

01本节目标

  • 完成车位标线检测:下视/前视 ROI 中提取车位四角点,区分平行车位与垂直(直角)车位模型。
  • 完成可用性判定:净空高度/占据色块 + 几何余量双判据,输出 occupied / free。
  • 完成入库执行:任选其一——几何两段圆弧轨迹(可控、可解释)或 Nav2 /navigate_to_pose 精点导航(复用建图成果)。
  • 串联全流程综合任务六阶段,全部由 /traffic/*、巡线、泊车三个已验证模块驱动,中途零人工干预。
  • 接入 car1_speech:任务结束 ASR 起评、TTS 播报总分,形成闭环反馈。
  • 牢记两句话:入库先留侧隙(≥2cm)再回正;全流程跑前必设初始位姿、必用低速起步。
素材说明:本实验无沙盘实拍素材,示意图与交互动画为准;s3 中小车为 C1 官方产品图。沙盘元素按同类教学沙盘典型规格设计,以现场沙盘实际元素为准。

02核心原理:认车位 → 判空位 → 算轨迹——泊车三连

第一步"认车位":相机 ROI 里只有白色标线,车位 = 三条边组成的开口矩形(平行车位沿路缘、垂直车位垂直路缘)。对预处理后的二值图做轮廓提取与多边形逼近,拿到四角点后与两种模板匹配:长宽比 ≈ 45:35 判平行车位、短边朝路判垂直车位。第二步"判空位":标线在 ≠ 有位可用——用深度图/色块占据检测算净空:车位框内障碍高度 < 阈值且角点完整,才发布 available=true;被占用则跳过继续巡游。第三步"算轨迹":平行车位用两段圆弧入库——45° 切入角起手,R1、R2 两段相切圆弧加一次回正,全程曲率连续;车长固定的 C1 若车位长 ≥ 车长 + 15cm 即可一把进。垂直车位更简单:外摆拉开横向间距 → 90° 切弧直入。

两种执行器二选一:几何轨迹按时间开环发 /cmd_vel,路径完全可预测、便于逐段录像复盘;Nav2 精点导航把终点位姿发给 /navigate_to_pose,AMCL 负责把 map 下的目标点换算成车体动作——复用 EXP-01 的 slam_map,代价是要保证初始位姿已设置、定位误差 ≤5cm。教学建议:先几何轨迹过"能进",再换 Nav2 过"停得正"。

平行车位两段圆弧入库几何(示意比例,以现场沙盘为准) 路缘 平行车位 45cm × 35cm 前车 C1 ① 沿路驶过车位(对齐起始参考) ② R1 切入弧(45°) ③ R2 回正弧 → ④ 摆正居中 侧隙 ≥2cm 判据:车位长 ≥ 车长+15cm 切入角 45° · 曲率连续 入库全程 v ≤ 0.10 m/s
图 4-1|自制示意图:平行泊车两段圆弧——驶过、切弧、回正、摆正四段分解,标注侧隙与曲率约束,对应 s4 步骤与 s7 互动拖拽。
车位线怎么提
二值化 → 形态学闭运算补断线 → findContours → minAreaRect:长宽比与开口方向决定车位类型。
空位怎么判
双判据:角点完整度 ≥80% 且框内占据高度/色块面积低于阈值,才 free——防"有线有车"误入。
两段弧为何相切
相切保证曲率不跳变,麦克纳姆轮低速下无侧滑;不相切会在衔接点出现横向甩尾。
几何 vs Nav2
几何轨迹开环可控、复盘直观;Nav2 闭环精停但依赖 AMCL 初值——先几何后 Nav2 两步走。

03硬件与场景

HP60C 前视 + 下视
前视找车位开口、下视复核边线;0.5m 近盲区恰是"车头顶到线"的距离——入库末端改看侧向雷达兜底。
2D 激光雷达侧隙
入库横向间隙用雷达近距点云校核,<2cm 硬停;弥补相机近距失焦。
麦克纳姆轮横移
垂直车位"平移入格"是麦轮独有能力;平行车位仍走两段弧以贴近真实驾驶教学。
slam_map 复用
EXP-01 语义标注中的车位点位直接作为候选搜索区,不必从全图盲找。
具身智能机器人小车 C1 斜视图
图 4-2|小车 C1 官方产品图:麦克纳姆轮全向底盘 + 顶部深度相机,泊车实验的执行本体。
练习科目通过标准常见失败
平行车位检出三种光照下检出率 ≥9/10,类型不误判ROI 盖太窄漏角点;反光处断线
可用性判定有车/空位各 10 例全对只看标线不看占据 → 撞"幽灵空位"
几何轨迹入库10/10 不压线,侧隙 ≥2cm,一次进切入角过小蹭前车;速度过快甩尾
Nav2 精点入库停位偏差 ≤3cm、航向 ≤5°,3/3 成功AMCL 初值没设 → 目标点整体平移
全流程综合路测6 阶段评分 ≥85 分,零人工干预任一前序模块话题断流未接 fail-safe
生活化类比:认车位像超市找车位:先看划线(几何),再看有没有车(占据),最后才是打方向进去(轨迹)——三步顺序错一步就是事故。

04操作步骤

S1车位感知
ROI 标线提取 → 四角点 → 平行/垂直分类
→
S2可用性判定
占据高度 + 角点完整度 → free/occupied
→
S3轨迹规划
两段圆弧(平行)/ 外摆切弧(垂直)
→
S4入库执行
几何轨迹 或 Nav2 精点 → 侧隙校核回正
→
S5全流程路测
巡游→改道→红灯→礼让→泊车 计分
→
S6语音播报
car1_speech 汇报总分与扣分项
  1. 车位感知标定:依次在三种光照下采集空位/有车各 5 帧,调二值化阈值与最小轮廓面积(太小=噪声标线,太大=车位+车道粘连),保存 slot_vision.yaml——光照变化重新标定是硬规矩。
  2. 可用性判定:发布 /parking/slot {type, corners[], available};故意在车位放入障碍模型复测 10 例,"有车误判为空"按不通过处理。
  3. 几何入库:v ≤ 0.10m/s,R1/R2 按车长自动生成;每 10cm 记录一次横向间隙,低速起步、途中间隙 <2cm 立即停。
  4. Nav2 精点版:先 RViz2 设初始位姿(2D Pose Estimate)对齐地图,再发目标位姿入库——AMCL 误差直接进停位误差,初始位姿必设。
  5. 全流程联调:按图 4-3 检查点逐站通过后再连跑;任务节点订阅 /traffic/*、巡线偏差、泊车状态,统一计时计分,任一阶段超时 FAIL 并记扣分项。
  6. 播报与留痕:任务结束调 car1_speech TTS 播报("任务完成,得分 95");录 rosbag + 评分表截图交作业。
全流程综合任务六检查点(可量化验收路线) P1巡游 ≤±2cm P2改道 ≤0.5s P3红灯 10/10 P4礼让 10/10 P5泊车 不压线 P6播报得分
图 4-3|自制示意图:六检查点即计分点——P1~P6 分别对应 s5 评分表扣分项,任一站不达标当场 FAIL。
写入 s4 的验收速查(总分 100):巡线 20 + 改道 15 + 红灯 15 + 礼让 15 + 泊车 25 + 播报 10;≥85 分且零人工干预为通过。易错点:初始位姿没设(Nav2 停位整体偏移)、光照换了没重标(车位漏检)、入库中间停车导致轨迹断点、播报时机早于评分结算。

05关键命令

车位/任务节点为本实验新增,其余沿用 xlsx 命令风格;评分表与话题契约见 s4。

# ① 起相机 + 车位检测节点(标线参数包 slot_vision.yaml)
ros2 launch ascamera hp60c.launch.py
python3 src/parking/perception.py --config config/slot_vision.yaml
ros2 topic echo /parking/slot                  # type/corners/available

# ② 目标位姿换算(map→车体变换,核对 TF 链)
ros2 run tf2_ros tf2_echo map base_link
ros2 run tf2_tools view_frames                 # out/frames.pdf 查 map→odom→base_link

# ③-A 几何轨迹入库(两段圆弧,开环 /cmd_vel)
ros2 run car1_parking arc_park_node.py --ros-args \
  --params-file src/car1_parking/config/arc_park.yaml
ros2 topic echo /parking/status                # IDLE/PLANNING/DONE + 实时侧隙

# ③-B Nav2 精点入库(先在 RViz2 用 2D Pose Estimate 设初始位姿!)
ros2 launch car1_navigation navigation.launch.py map:=slam_map
ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose \
  "{pose: {header: {frame_id: map}, pose: {position: {x: 3.42, y: -1.08}, orientation: {z: 0.0, w: 1.0}}}}"

# ④ 全流程任务节点(六阶段计分)+ car1_speech 语音播报
ros2 launch car1_speech speech.launch.py
ros2 run car1_mission route_mission.py --ros-args -p mode:=full
ros2 topic pub --once /speech/tts std_msgs/String "{data: '任务完成,总分95,泊车满分'}"
ros2 bag record -a -o smart_route_bag          # 全程留痕回放复盘
验收判据 ①
车位检出 9/10、类型零误判;可用性 20 例全对(含 10 例有车)。
验收判据 ②
几何入库 10/10 不压线、侧隙 ≥2cm;Nav2 精点 3/3 停位 ≤3cm/≤5°。
验收判据 ③
全流程 6 阶段 ≥85 分、零人工干预,/parking/status 全程无 FAIL 跳变。
验收判据 ④
TTS 播报分数与评分表一致(结算后 ≤2s 播出),rosbag 可回放核对。

06原理动画:两段圆弧入库与全流程时序

驶过车位 → 倒车切弧 → 回正摆正(8s 循环) 路缘 平行车位 前车 C1 ① 0~3s 沿路驶过对齐 ② 3~6s 倒车切 R1/R2 双弧 ③ 6~8s 摆正,侧隙 ≥2cm 判 DONE
动画 4-1:黄块小车沿灰色虚线"驶过 → 倒车切双弧 → 摆正",绿点标记倒车入库段;衔接点处两弧相切,曲率不跳变。
全流程六阶段:每个方块是一个已验证模块的复用 P1 巡游EXP-03 巡线 20分 P2 改道EXP-02 标志 15分 P3 红灯停/traffic/light 15分 P4 礼让行人 ROI 15分 P5 泊车本实验 ⭐25分 P6 播报car1_speech 10分 12s 压缩演示(实车约 3~5min 单圈) 评分器日志: 阶段通过 → 累加分数;话题断流 ≥2s → 该阶段 FAIL 扣全部分(fail-safe 不放行) 全部阶段结算 → /score → car1_speech TTS:"任务完成,总分 XX"
动画 4-2:高亮方块沿时间轴推进 = 当前执行阶段;任一阶段失败即扣该模块分值——综合路测的"可量化"就落在这张表上。
观察动画 4-1 中倒车段(绿点)比驶过段慢得多——泊车不败在规划,败在速度:v 从 0.18 降到 0.10 以下,才有足够时间窗发现侧隙过小并刹停。全流程复用模块同理:接口对了,剩下的都是参数问题。

07互动实验:泊车轨迹拖拽仿真 + 六阶段评分器

拖动起始点与切入角,看两段圆弧能不能一把进库
路缘 平行车位 45cm×35cm 前车 y0=214 入库区

玩法:① 切入角拉到 25° → 弧太缓,车尾压路缘线判 FAIL;拉到 70° → 急切,中段侧隙 <2cm;45° 附近一把进。② 起始点太靠前(y0 小于 180)→ 没有足够摆正距离。③ 可用性切到"占用" → 评分器应直接判 NO-GO,"有位不进"才是正确行为。

全流程评分器:勾选六阶段通过情况,实时算总分(≥85 过关)
85 分过关线 100 / 100 · PASS

08常见问题

Q 车位检出忽有忽无?
反光/光照变化:ROI 内先做灰度归一化,阈值按 s4-1 三种光照分别标定;轮廓面积上下限同时约束。
Q 把有车车位判成空位?
只看标线没看占据:启用双判据(角点完整 + 占据高度),障碍模型复测 10 例全对才放行。
Q 入库总蹭前车?
切入角偏大或起始点太近:θ 回 45°、起始点后移到 y0≥200;雷达侧隙 <2cm 硬停逻辑必须挂上。
Q Nav2 停位整体偏移?
初始位姿没设或设歪了——每次导航前 RViz2 2D Pose Estimate 必设;查 AMCL 粒子收敛云图。
Q 几何轨迹开环走偏?
地面打滑轮差累积:全程每 10cm 用雷达/下视复核一次横向间隙,偏差 >2cm 就小幅修正而非全程盲走。
Q 全流程中途卡死?
订阅的 /traffic/* 或巡线话题断流:任务节点设 2s 看门狗,断流即 FAIL + 语音报错,别无限等待。
Q 播报分数对不上?
播报早于结算:TTS 必须订阅 score 的 final 事件触发;连续播报需排队,避免两句话叠音。
Q 麦轮横移时压线?
垂直车位别贪横移:横移只做微调(±3cm 内),大位移用转弯弧完成——横移量越大航向漂移越大。

09拓展阅读

  • 《自动泊车中的路径规划方法综述》:几何弧线法 vs 样条/搜索法的取舍——本课两段弧是工程教学的最小完备解。
  • Nav2 costmap 与精点停位:inflation 层半径设大会让目标点"停不进去",调小又擦线——对照 s5 的 3cm 判据理解权衡。
  • ROS 2 QoS 与任务编排:里程碑评分器本质是 topics 编排(BPMN/状态机之辩),可对照 EXP-03 的优先级 FSM 看分层。
  • 失败注入测试:主动拔话题、遮相机、放障碍——可靠课程系统靠 fail-safe 而不是靠运气。
  • 上下文:EXP-01 语义标注提供车位地图点位,EXP-03 状态机提供 P1~P4 执行器——本实验只做编排与收口。

10思考题 · 自测

✅ 完成成果
车位检出 9/10、入库 10/10 不压线、全流程 ≥85 分零干预、TTS 播报一致,rosbag 留痕。
🧠 原理收获
讲清"检测→判定→规划→执行"四步链与几何/Nav2 两条执行路线的适用边界。
🛠 技能收获
独立完成车位标定、两段弧参数整定、AMCL 初值设置、评分节点联调。
📐 评分速览
感知 30% + 入库 30% + 全流程 30% + 播报留痕 10%。
思考 1如果沙盘只有一个垂直车位而没有平行车位,图 4-1 的两段弧几何哪一步要改?写出新轨迹的分段(提示:外摆段 + 单弧段 + 直行段)。
思考 2全流程评分器为什么必须"断流即 FAIL"而不是"断流保持上一次通过"?用一次真实事故链(遮挡相机 → 灯态丢失 → 抢红灯)说明 fail-safe 的价值。