路径平滑算法

路径平滑算法概述

路径平滑方案
1、路径规划阶段将机器人约束模型加入规划器。
2、规划阶段不考虑任何约束,在后处理步骤考虑非完整约束。

后处理平滑方法
三种方法:优化、差值和拟合
基于插值的方案,平滑后路径经过路径中所有的路径点,形成更长的曲线。
基于拟合的方案,平滑后路径远离规划路径的路径点,产生的曲线更短。

基于优化的路径平滑

一、APOLLO参考性平滑方法
参考线平滑,高精地图给出的道路中心线的平滑性往往都不能满足规划模块的需求,因此规划中是不能拿来直接用的,需要对其进行平滑操作。共有三种参考性平滑算法:
1)QpSpline Smoother:分段5次多项式拟合+二次规划
参考链接:https://zhuanlan.zhihu.com/p/345175084
2)SpiralReferenceLine Smoother:多项式螺旋线优化
参考链接:https://zhuanlan.zhihu.com/p/347373426
3)DiscretePoints Smoother:默认配置,离散点平滑
参考链接:https://zhuanlan.zhihu.com/p/371585754
二、Hybrid A*平滑
优化目标包括障碍物、曲率、顺滑、voronoi势场项等。代码并没有使用论文中共轭梯度下降法,而是使用了普通的梯度下降法。
参考链接:https://zhuanlan.zhihu.com/p/113697820
代码:
https://github.com/karlkurzer/path_planner【源代码】
https://github.com/linxigjs/path_smoother【加curvature项、voronoi成本、平滑项重写】
三、其余基于优化的平滑算法:
1、数字地图(高精地图)中获取道路中心线,即初步的参考线;使用共轭梯度非线性优化方法使其平滑;使用三次B样条曲线插值
参考资料:https://zhuanlan.zhihu.com/p/109341571
2、使用梯度下降法,移动和插入顶点使得离障碍物更远、离障碍物近的地方路径点更密集;使用基于cost的short-cutting方法删除不必要的路径点。
参考资料:https://zhuanlan.zhihu.com/p/113697820
代码:https://github.com/eric-heiden/grips

基于插值或者拟合的路径平滑

主要为曲线生成技术,主要分为图形方法和函数方法。
基于图的曲线生成方法:直线、弧和圆构成;圆弧组合两个直线路径段时,它们面临着曲率不连续性。包括dubins曲线和R-S曲线。
dubins:前向运动,直线+最小转弯半径圆弧。具有曲率约束的最短路径,但是曲率不连续
r-s曲线:前向或者反向运动,没有考虑障碍物信息。在障碍物环境下,搜索困难

基于函数曲线生成方法:clothoids【回旋线】、贝塞尔、b样条、三次样条、多项式插值等。
曲线参考链接https://zhuanlan.zhihu.com/p/364421182
clothiod:clothiod的曲率半径和长度成线性关系。可以考虑有限长度的clothoid应用到机器人领域。
多项式插值:拉格朗日多项式插值、Hermite多项式插值。计算复杂,龙格现象
贝塞尔曲线
参考链接:https://zhuanlan.zhihu.com/p/437529481
代码:https://gitee.com/alanby/PathPlanning
b样条:
参考链接:https://zhuanlan.zhihu.com/p/260724041
https://blog.youkuaiyun.com/tuqu/article/details/4749586
代码:https://github.com/hubery05/A-start-with-B-spline

基于佛洛依德算法的路径平滑

参考链接:https://www.cnblogs.com/miaolegemi/archive/2017/12/05/7986335.html

备注:

总结不完善,仅供自看

A星算法路径平滑在实际应用中具有重要意义,能够提高路径的美观性和实际应用效果。常见的方法及实现如下: - **常用路径平滑方法**:站内引用提及了一些常用的路径平滑方法,但未详细展开。不过从优化A星算法的角度来看,可通过精简节点、平滑路径转折来实现路径平滑。优化后的路径剔除了大量冗余节点,转折更加平滑自然,没有明显的锐角或突然的方向变化,提高了路径的实际应用效果[^2]。 - **Hybrid A star算法路径平滑**:Hybrid A star算法利用梯度下降法对规划的路径进行平滑处理。其代码的平滑部分优化目标函数主要分为四个部分:曲率项、平滑项、维诺图项(voronoi)和避碰项。这些代码可以在ROS环境下运行和可视化,具有较大的参考价值。同时,还有对该代码进行注释解释的仓库以及相关写得很好的博客可供参考[^3]。 - **C++实现A星寻路的平滑处理**:通过代码实现将路径去掉共线点的方式进行平滑处理。以下是具体的代码示例: ```cpp #include <vector> struct sVec2 { double x; double y; }; class MapReader { public: typedef sVec2 sVec2; }; class Astar { public: std::vector<MapReader::sVec2> pathCreat(std::vector<MapReader::sVec2> path) { //1.将路径去掉共线点 int max = path.size() - 2; for (int i = 0; i < max; ) { if ((path[i].x * path[i + 1].y - path[i + 2].y * path[i].x) + (path[i + 1].x * path[i + 2].y - path[i].y * path[i + 1].x) + (path[i + 2].x * path[i].y - path[i + 2].x * path[i + 1].y) == 0) //判断三点共线 { path.erase(path.begin() + i + 1); max = path.size() - 2; } else { i++; } } return path; } }; ``` 上述代码定义了一个`Astar`类,其中的`pathCreat`方法接收一个路径点的向量,通过判断三点是否共线,将共线的中间点从路径中移除,从而实现路径平滑处理[^5]。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值