1. 项目概述
垂直车位自动泊车是自动驾驶领域最具挑战性的场景之一。与平行泊车相比,垂直泊车需要更精确的路径规划和更复杂的转向控制。我在最近的项目中尝试用Matlab实现了一个基于Hybrid A*算法的垂直泊车仿真系统,虽然简化了部分车辆动力学模型,但完整呈现了从路径搜索到最终入库的全过程。
这个仿真最有趣的部分在于模拟了人类驾驶员的操作逻辑——当检测到两侧有障碍物时,系统会先让车辆前移并外摆车头,创造足够的转向空间。这种"甩一把方向"的操作策略,在算法中被转化为多阶段的路径搜索问题。通过调整步长和转向角度的组合,我们最终实现了平滑的倒车入库轨迹。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法解析
2.1 Hybrid A*算法原理
Hybrid A是对传统A算法的改进,特别适合车辆运动规划。与离散化的A不同,Hybrid A在连续空间中搜索,同时考虑车辆的运动约束:
- 状态表示:每个节点包含(x,y,θ)三要素,分别代表车辆位置和航向角
- 运动基元:预设一组转向角度(如-30°, -15°, 0°, 15°, 30°)
- 代价函数:f(n) = g(n) + h(n),其中:
- g(n):从起点到当前节点的实际代价
- h(n):启发式函数(通常用Dubins路径或Reeds-Shepp路径估算)
matlab复制% 典型的状态节点结构
node = struct('x',0,'y',0,'theta',0,'steer',0,'g',0,'h',0,'parent',[]);
2.2 垂直泊车的特殊处理
针对垂直泊车场景,算法做了以下关键优化:
-
多阶段搜索策略:
- 阶段1:前进外摆(最大转向角)
- 阶段2:倒车入库(减小转向角)
- 阶段3:微调修正(最小转向角)
-
动态步长调整:
matlab复制if norm(currentNode(1:2)-goalPose(1:2)) < 1
stepSize = 0.1; % 精细调整阶段
maxSteer = pi/6; % 限制转向角度
end
- 非完整约束处理:
通过车辆运动学模型确保生成的路径符合实际转向能力:code复制其中L为车辆轴距dx = stepSize * cos(θ + steer) dy = stepSize * sin(θ + steer) dθ = (stepSize/L) * tan(steer)
3. 碰撞检测实现
3.1 车辆轮廓建模
采用半圆+矩形的组合模型更符合实际碰撞检测需求:
-
前保险杠半圆:
- 半径:0.9米
- 覆盖角度:-90°到90°
- 采样点:10个(可根据精度需求调整)
-
车身矩形:
- 长度:3米(前后各1.5米)
- 宽度:1.6米
matlab复制% 前保险杠半圆生成
theta = linspace(-pi/2, pi/2, 10);
frontCircle = [cos(theta')*1.2, sin(theta')*0.9] + pose(1:2);
% 车身矩形旋转处理
carBox = [-1.5, -0.8;
1.5, -0.8;
1.5, 0.8;
-1.5, 0.8];
rotationMatrix = [cos(pose(3)), sin(pose(3));
-sin(pose(3)), cos(pose(3))];
rotatedBox = carBox * rotationMatrix;
3.2 障碍物检测算法
采用分离轴定理(SAT)进行多边形碰撞检测:
- 将车辆检测区域和障碍物投影到多个轴上
- 检查投影区间是否重叠
- 如果所有轴上都存在重叠,则判定碰撞
matlab复制function collision = satCollision(poly1, poly2)
polygons = {poly1, poly2};
for i = 1:length(polygons)
polygon = polygons{i};
for j = 1:size(polygon,1)
% 获取边向量
k = mod(j, size(polygon,1)) + 1;
edge = polygon(k,:) - polygon(j,:);
% 获取法向量(分离轴)
axis = [-edge(2), edge(1)];
axis = axis / norm(axis);
% 投影计算(省略具体实现)
[min1, max1] = project(poly1, axis);
[min2, max2] = project(poly2, axis);
% 重叠检查
if max1 < min2 || max2 < min1
collision = false;
return;
end
end
end
collision = true;
end
4. 路径平滑处理
4.1 轨迹优化技术
原始Hybrid A*生成的路径可能存在锯齿现象,采用以下方法优化:
-
梯度下降平滑:
- 定义目标函数包含三个项:
- 路径长度项
- 平滑度项(相邻节点角度变化)
- 障碍物距离项
- 通过迭代调整节点位置最小化目标函数
- 定义目标函数包含三个项:
-
B样条拟合:
使用3阶B样条曲线保证路径连续可导:matlab复制% 生成均匀参数化节点向量 knots = linspace(0,1,length(path)); % 构造B样条基函数 sp = spapi(3, knots, path'); % 采样平滑路径 smoothPath = fnval(sp, linspace(0,1,100))';
4.2 速度规划策略
虽然本仿真未实现完整运动控制,但合理的速度规划应包括:
| 阶段 | 速度策略 | 转向策略 |
|---|---|---|
| 前进外摆 | 低速恒定 (0.5m/s) | 最大转向角 |
| 倒车入库 | 变速控制 (0.3-0.8m/s) | 动态调整 |
| 最终微调 | 极低速 (0.1m/s) | 最小转向角 |
5. 仿真实现细节
5.1 主程序架构
完整的仿真程序包含以下模块:
-
环境配置模块:
- 车位尺寸定义(标准2.5m×5m)
- 障碍物位置设置
- 车辆初始位姿设定
-
路径搜索模块:
- Hybrid A*核心算法
- 启发式函数计算
- 节点扩展逻辑
-
可视化模块:
- 实时显示搜索过程
- 最终路径动画
- 调试信息输出
matlab复制function main()
% 环境初始化
[startPose, goalPose, obstacles] = initEnvironment();
% 路径搜索
path = HybridAStar(startPose, goalPose, obstacles);
% 路径优化
smoothPath = pathSmoothing(path);
% 结果显示
visualizeResult(startPose, goalPose, obstacles, smoothPath);
end
5.2 关键参数配置
下表列出了影响算法性能的核心参数及推荐值:
| 参数名称 | 推荐值 | 作用说明 | 调整建议 |
|---|---|---|---|
| stepSize | 0.3m | 搜索步长 | 值越大搜索越快但精度越低 |
| maxSteer | π/4 | 最大转向角 | 应根据车辆实际转向能力设置 |
| goalTolerance | 0.1m | 目标容差 | 决定何时终止搜索 |
| collisionCheckStep | 0.1m | 碰撞检测步长 | 影响检测精度和性能 |
| heuristicWeight | 1.2 | 启发式权重 | 平衡搜索速度与最优性 |
6. 常见问题与调试技巧
6.1 典型问题排查
-
路径找不到问题:
- 检查碰撞检测是否过于保守
- 验证启发式函数是否合理
- 尝试增大maxSteer或stepSize
-
路径不合理问题:
- 检查车辆运动学模型实现
- 确认代价函数各项权重
- 查看节点扩展逻辑是否正确
-
算法性能问题:
- 优化碰撞检测(如使用空间分区)
- 调整启发式函数计算方式
- 限制最大搜索节点数
6.2 MATLAB实用技巧
-
性能优化:
matlab复制% 预先分配数组内存 openSet = repmat(struct('x',0,'y',0,'theta',0), 10000, 1); % 向量化计算 distances = sqrt(sum((nodes - target).^2, 2)); -
调试工具:
- 使用
tic/toc计时关键代码段 - 通过
disp输出搜索过程信息 - 利用MATLAB的调试断点功能
- 使用
-
可视化技巧:
matlab复制% 实时更新绘图 hPlot = plot(nan, nan, 'r-'); set(hPlot, 'XData', path(:,1), 'YData', path(:,2)); drawnow;
7. 扩展与改进方向
7.1 动力学模型增强
当前仿真使用简化运动学模型,可进一步引入:
- 方向盘响应延迟(一阶惯性环节)
- 轮胎滑移模型
- 车辆质量分布影响
matlab复制% 一阶方向盘模型示例
steerRate = 0.5; % 转向速率(rad/s)
actualSteer = min(max(desiredSteer, prevSteer - steerRate*dt), ...
prevSteer + steerRate*dt);
7.2 复杂场景处理
-
斜向车位泊车:
- 修改目标位姿判断条件
- 调整启发式函数计算方式
-
动态障碍物处理:
- 引入速度障碍物概念
- 实现重规划机制
-
多车协同泊车:
- 设计分布式路径规划算法
- 建立车辆间通信协议
7.3 硬件在环测试
将算法移植到实时系统进行硬件验证:
- 使用ROS或Autoware框架
- 搭建1:10比例测试平台
- 采集实际传感器数据优化模型
实际工程中,路径规划算法需要与控制系统紧密配合。建议先进行充分的仿真测试,再逐步过渡到实车验证。我在项目中发现,仿真中看似合理的路径,在实际车辆执行时可能会因为执行器延迟、地面摩擦等因素导致偏差,因此需要保留足够的裕度。
