自动泊车轨迹规划场景介绍

自动泊车场景介绍

1、概述

传统泊车系统的轨迹规划主要由直线、圆弧和曲线三个要素组成。通过将这三个要素进行拼接,组成形式多样的行车轨迹。
常见的车位类型为平行车位、垂直车位和斜向车位。其中垂直车位可以理解为特殊的斜向车位,斜向角度为90°斜向车位即为垂直车位。
下面基于嵌入式平台的半实物仿真结果,说明常见的几种泊车轨迹的规划方式。

2、平行泊车

2.1、库位长度满足一次性入库的情形

如下图所示,因为库位足够长,所以可以直接规划一次性曲线,实现车辆一次性入库。

长库位的规划情况

2.2、库位长度不满足一次性入库的情形

如下图所示,因为车位长度不满足一次性入库条件,所以在规划时需先进行反向尝试,使车辆满足泊出条件,然后再进行一次曲线规划。

在这里插入图片描述

3.垂直泊车

3.1车辆离车位足够远的情形

如下图所示,当车辆离车库足够远时,可规划一个圆弧使车辆一次入库。

在这里插入图片描述

3.2车辆离车位近且位置靠前的特殊情形

如下图所示,当车辆离车库较近时,一段圆弧已无法规划入库轨迹。此图描绘的是当车辆位置比较靠前时,可以通过两端圆弧实现倒车入库轨迹。当然这个方式的缺点也很明显,需要向前移动太多距离。

在这里插入图片描述

3.3 车辆离车库近的一般情形

如下图所示,当车辆离库位较近时,车辆停止位置也离库位入口比较近,此时可以进行多次尝试入库。通过规划两个相切圆的方式,使车辆逐步移入库内。

在这里插入图片描述

3.4 车辆离车库近的多次尝试情形

如下图所示,当车辆位置离库位太近时,此时需要进行多次尝试,才能使车辆成功入库。尝试次数,由车辆离库位的距离、库位长度和边角余量决定。

在这里插入图片描述

4 说明

关于上述泊车算法,近期准备整开源出来,有兴趣的同学欢迎点赞.

  • 如果点赞超过100,上述核心算法的代码将开源(坑位1).

感谢大家的支持和点赞,相关软件分享如下:

  1. APA_QT:基于QT平台的算法验证
  2. ROS_RRT: 基于ROS平台的算法验证
  • 上述用到的上位机软件,开源路径如下:APA_DebugAssistant,可供大家学习和交流,如果喜欢记得Star一下哦
  • 本文所参考的论文路径如下:PaperSets
  • 后续我继续更新相关规划和控制相关内容(坑位2),大家的鼓励是我坚持更新的动力哈
  1. 横向控制算法分析文章
  2. 横向控制文章集合
  3. Python仿真代码: 基于control工具库
  4. 动力学仿真: 基于WeBots软件

如果项目对您有帮助,麻烦在Github上点击Star,您支持是我坚持更新的动力。

最近很多小伙伴在后台提问关于软件如何使用的问题,我这里简单说明一下:

  1. 博文中的图片是使用APA_DebugAssistant软件截图的,该软件只是PC端的上位机,用于显示泊车路径,不包含规划控制算法部分,但有一些超声波的处理算法。当时具体的规划控制算法在嵌入式端,目前嵌入式代码未开源。
  2. APA_QT项目包含完整的规划控制算法,并且可以独立运行,所以想研究算法的小伙伴请关注这个项目。
  3. ROS_RRT项目是二代规划算法的探索,但并不表示可以实际项目使用,目前主流的可能还是用A* 加 RS曲线的方式去做路径搜索。
  4. 横向控制算法重点关注后轴反馈算法,实际使用效果很好。
  5. 由于本人目前已离开这个行业,所以这方面的更新频率会比较低,感谢小伙伴们对我的点赞和鼓励,我会尽量抽出时间,回答大家的问题,整出点干货。
### MATLAB 实现混合A*算法用于自主泊车路径规划 为了实现基于MATLAB的混合A*算法来进行自主泊车路径规划,下面提供了完整的代码框架以及关键部分解释。 #### 初始化地图与节点定义 首先,在MATLAB环境中初始化停车场的地图表示形式,并设定起始位置`startNode`和目标位置`goalNode`: ```matlab % 定义停车场地图 (0 表示可通过区域, 1 表示障碍物) parkingMap = [ 1 1 1 1 1; 1 0 0 0 1; 1 0 1 0 1; 1 0 0 0 1; 1 1 1 1 1]; % 设定起点坐标(x,y) 和 终点坐标(x,y),注意这里假设y轴向下增长,x轴向右增长 startNode = [2, 2]; %[x y] goalNode = [4, 4]; ``` #### 混合A*算法核心逻辑 接着是混合A*算法的核心部分,此段代码负责计算从起始点到终点的最佳路径。考虑到车辆的实际转向限制等因素,该版本不仅考虑了距离成本还加入了方向变化的成本评估[^1]。 ```matlab function path = hybridAStar(map, startPos, targetPos) openList = PriorityQueue(); % 使用优先队列存储待处理节点 closedSet = containers.Map('KeyType','double', 'ValueType','any'); % 已访问过的节点集合 % 将起始位置加入open list startState = struct('pos', startPos,'theta', pi/2, ... 'gCost', 0, 'fCost', heuristic(startPos,targetPos),... 'parent', []); put(openList,startState.fCost, startState); while ~isempty(openList) current = get(openList); delete(openList,current.key); if isequal(current.pos, targetPos) path = reconstructPath(closedSet, current); return; end neighbors = expandNeighbors(map, current); for i=1:length(neighbors) neighbor = neighbors(i).state; tentativeGScore = current.gCost + distBetweenStates(current,neighbor); if ~(closedSet.isKey(reshape([neighbors(i).state.pos],[],1))) newFCost = tentativeGScore + heuristic(neighbor.pos,targetPos); put(openList,newFCost, neighbor); closedSet(reshape([current.pos],[],1)) = current; elseif tentativeGScore >= neighbor.gCost continue else remove(openList, reshape([neighbor.pos],[],1)); newFCost = tentativeGScore + heuristic(neighbor.pos,targetPos); put(openList,newFCost, neighbor); closedSet(reshape([current.pos],[],1)) = current; end end end path = []; end ``` #### 辅助函数说明 上述代码中涉及到了几个辅助性的功能函数,这些对于理解整个流程至关重要: - `heuristic`: 计算启发式的估计代价,通常采用曼哈顿距离或欧几里得距离作为估算标准。 - `expandNeighbors`: 扩展当前状态周围的邻居结点,同时考虑汽车的方向性和最小转弯半径等物理特性。 - `reconstructPath`: 当找到目标时回溯构建最终路径序列。 - `distBetweenStates`: 测量两状态间的实际移动开销,包括线性位移和角速度成分。 #### 结果展示 最后一步是在成功求解后打印出所得到的结果路径数据结构,以便进一步分析或者可视化呈现。 ```matlab path = hybridAStar(parkingMap, startNode, goalNode); if isempty(path) disp("无法找到路径!"); else disp("找到路径:"); disp(path); end ```
评论 67
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henry.zhu51

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值