课程实验大纲如下:后面会详细说明车道识别、相机标定、坐标转换和控制算法。
📘 《车道保持控制(Lane Keeping)》
一、课程基本信息
- 课程名称:自动驾驶技术 / 计算机控制系统应用
- 课时:4~6学时(建议2次课+1次实验)
- 教学对象:本科三年级(已学信号处理/控制基础)
- 实验平台:MATLAB + USB相机 + Arduino小车
二、教学目标(必须明确)
1️ ⃣ 知识目标
学生掌握:
- 相机成像模型(内参/外参)
- 车道线检测基本算法
- 图像坐标 → 车辆坐标转换
- 车道保持控制原理(Stanley / Pure Pursuit)
2️ ⃣ 能力目标
学生能够:
- 完成相机标定
- 实现车道线识别(MATLAB)
- 设计简单车道保持控制器
- 控制小车沿车道行驶
3️ ⃣ 工程目标
实现完整闭环:
📷 相机 → 🧠算法 → 🎯控制 → 🚗执行
三、课程整体结构(课堂逻辑)
👉 "看见车道 → 理解位置 → 计算偏差 → 控制方向"
四、第一部分:相机标定(核心基础)
4.1 为什么必须标定?
👉 图像 ≠ 真实世界
问题:
- 图像是透视的
- 存在畸变
- 尺度不一致
📌 结论:
必须获取:
- 内参(焦距、主点)
- 外参(位置、姿态)
4.2 相机畸变
两类:
- 径向畸变(桶形/枕形)
- 切向畸变
👉 MATLAB函数:
undistortedImage = undistortImage(I, cameraParams);
4.3 MATLAB 标定流程(实验重点)
步骤:
1️⃣ 拍摄棋盘格(10~20张)
2️⃣ 打开 Camera Calibrator
3️⃣ 输入格子尺寸
4️⃣ 自动提取角点
5️⃣ 计算参数
👉 注意(考试点):
- 分辨率必须一致
- 覆盖不同角度
- 棋盘至少占20%画面
五、第二部分:坐标变换(核心难点)
5.1 为什么要坐标转换?
👉 图像偏差 ≠ 真实偏差
5.2 三个坐标系
- 图像坐标 (u, v)
- 相机坐标 (Xc, Yc, Zc)
- 车辆坐标 (X, Z)
5.3 关键思想(教学重点)
👉 假设:地面是平面
👉 可求解:
- 横向偏差
- 航向角
5.4 工程简化(建议课堂用)
👉 方法1(推荐):
- 相机装在车头中心
- 忽略外参
👉 方法2:
- 标定棋盘格直接得到外参
六、第三部分:车道线识别(视觉核心)
6.1 基本流程(必须讲清)
灰度化
- 边缘检测
- ROI区域提取
- Hough变换
- 后处理
6.2 边缘检测(Canny)
edge_img = edge(gray,'canny',0.3,0.4);
6.3 ROI 区域(关键工程技巧)
bw = roipoly(img, x, y);
👉 作用:
- 去掉天空/干扰
- 只保留道路区域
6.4 Hough 直线检测(核心)
👉 本质:
图像空间:
y = mx + b
Hough空间:
一个点 → 一条线
👉 MATLAB实现:
H,T,R = hough(BW);
P = houghpeaks(H,3);
lines = houghlines(BW,T,R,P);
6.5 后处理(工程关键)
👉 必须讲:
- 左右车道分离
- polyfit拟合
- 滤波稳定
七、第四部分:复杂环境问题(重点加分)
7.1 阳光影响(必讲)
问题:
- 过曝
- 阴影
- 反光
解决方法:
1️⃣ HSV颜色空间
2️⃣ 自适应阈值
3️⃣ Gamma校正
7.2 异常车道(工程重点)
问题:
- 虚线
- 遮挡
- 错误识别(瓷砖等)
解决策略:
方法1:时间滤波(推荐)
当前帧 + 上一帧融合
方法2:模型约束
- 左右车道应平行
- 宽度固定
方法3:Kalman滤波(进阶)
八、第五部分:车道保持控制算法(核心)
8.1 控制目标
👉 让车辆沿车道中心行驶
8.2 两个关键量
- 横向偏差 e
- 航向误差 θ
⭐ 8.3 Stanley 控制(重点讲)
控制律:

物理意义:
- θ → 方向纠正
- e → 偏移纠正
👉 必须强调:
⚠️ 只用角度会失败!
8.4 Pure Pursuit (对比讲)
核心:
👉 "追一个前方点"

8.5 两种方法对比
|--------------|--------|--------|
| 方法 | 优点 | 缺点 |
| Stanley | 稳定 | 低速震荡 |
| Pure Pursuit | 平滑 | 偏差大 |
九、第六部分:完整车道保持算法(课堂用)
⭐ 推荐教学算法
👉 适合本科生:
Step 1 :读取相机
cam = webcam;
img = snapshot(cam);
Step 2 :车道检测
- 灰度
- 边缘
- Hough
Step 3 :提取车道中心
Step 4 :计算偏差
Step 5 :控制输出
steer = -k1*theta - k2*e;
十、实验设计(必须有)
实验1:相机标定
输出:
- cameraParams
实验2:车道检测
输出:
- 左右车道线
实验3:控制小车
实现:
- 自动循迹
十一、MATLAB完整示例(核心)
img = snapshot(cam);
gray = rgb2gray(img);
edge_img = edge(gray,'canny',0.3,0.4);
H,T,R = hough(edge_img);
P = houghpeaks(H,2);
lines = houghlines(edge_img,T,R,P);
% 简化控制
theta = ...;
e = ...;
steer = -0.5*theta - 0.2*e;
十二、课堂总结
👉 车道保持 = 感知 + 建模 + 控制
三层理解:
1️⃣ 看见车道(视觉)
2️⃣ 理解位置(几何)
3️⃣ 控制车辆(控制)
十三、拓展(自学习)
- 深度学习车道检测(YOLO)
- BEV(鸟瞰变换)
- 自动驾驶系统架构