当前位置:首页 » 《休闲阅读》 » 正文

路径处理 | 关键点提取之Douglas–Peucker算法(附ROS C++/Python实现)

0 人参与  2024年09月25日 10:41  分类 : 《休闲阅读》  评论

点击全文阅读


目录

0 专栏介绍1 路径关键点提取2 道格拉斯-普克算法Douglas–Peucker3 算法实现与可视化3.1 ROS C++仿真3.2 Python仿真

0 专栏介绍

?课设、毕设、创新竞赛必备!?本专栏涉及更高阶的运动规划算法轨迹优化实战,包括:曲线生成、碰撞检测、安全走廊、优化建模(QP、SQP、NMPC、iLQR等)、轨迹优化(梯度法、曲线法等),每个算法都包含代码实现加深理解

?详情:运动规划实战进阶:轨迹优化篇


1 路径关键点提取

路径关键点提取也称为路径降采样,在路径规划中主要用于简化和优化路径表示。一方面,路径降采样可以去除冗余点,从而减少路径中的采样点数量,减小数据存储和传输的成本;另一方面,在路径跟踪和导航时,较少的点可以提高计算效率,减少实时处理的负担。在环境噪声敏感型的算法中,简化路径保留了路径的关键特征和形状,而滤除了噪点,可以增强在执行过程中对微小抖动或误差的鲁棒性

2 道格拉斯-普克算法Douglas–Peucker

道格拉斯-普克算法(Douglas–Peucker)是一种经典的路径关键点提取算法,其基于分治思想,以采样前后路径误差最小化为目标,提取路径关键点。

以下图为例阐述算法原理

初始给定一组有序的路径点列 { p } 0 N − 1 \left\{ \boldsymbol{p} \right\} _{0}^{N-1} {p}0N−1​与误差阈值 δ \delta δ,其中 N N N是路径点数;
在这里插入图片描述

以路径首末点组成的 p 0 p N − 1 \boldsymbol{p}_0\boldsymbol{p}_{N-1} p0​pN−1​为初始待处理线段,查找 p 0 p N − 1 \boldsymbol{p}_0\boldsymbol{p}_{N-1} p0​pN−1​之间的点列中离 p 0 p N − 1 \boldsymbol{p}_0\boldsymbol{p}_{N-1} p0​pN−1​最远的点,并判断该距离 d d d是否大于阈值 δ \delta δ,若 d > δ d>\delta d>δ则说明该点不能剪枝(否则剪枝前后曲线误差超过预期);若 d ≤ δ d \le \delta d≤δ则说明该点可以忽略;如图所示需要保留 p 3 \boldsymbol{p}_3 p3​;

在这里插入图片描述

对需要保留的节点进行分治,重复步骤(2)直到遍历结束;如图所示,分别以 p 0 p 3 \boldsymbol{p}_0\boldsymbol{p}_3 p0​p3​、 p 3 p N − 1 \boldsymbol{p}_3\boldsymbol{p}_{N-1} p3​pN−1​为待处理线段进行递归

在这里插入图片描述

最终得到剪枝后的路径点列如图所示

在这里插入图片描述

3 算法实现与可视化

3.1 ROS C++仿真

核心代码如下所示

void RDP::process(const rmp::common::geometry::Points2d& path_in, rmp::common::geometry::Points2d& path_out){  path_out.clear();  int max_idx = -1;  double max_dist = -1.0;  int path_size = static_cast<int>(path_in.size());  rmp::common::geometry::LineSegment2d line({ path_in[0].x(), path_in[0].y() },                                            { path_in[path_size - 1].x(), path_in[path_size - 1].y() });  for (int i = 1; i < path_size - 1; i++)  {    double d = line.distanceTo({ path_in[i].x(), path_in[i].y() });    if (d > max_dist)    {      max_dist = d;      max_idx = i;    }  }  if (max_dist > delta_)  {    rmp::common::geometry::Points2d left_pts, right_pts;    left_pts.reserve(max_idx + 1);    right_pts.reserve(path_size - max_idx);    for (int i = 0; i <= max_idx; i++)    {      left_pts.emplace_back(path_in[i].x(), path_in[i].y());    }    for (int i = max_idx; i < path_size; i++)    {      right_pts.emplace_back(path_in[i].x(), path_in[i].y());    }    rmp::common::geometry::Points2d left_result, right_result;    process(left_pts, left_result);    process(right_pts, right_result);    path_out.insert(path_out.end(), left_result.begin(), left_result.end() - 1);    path_out.insert(path_out.end(), right_result.begin(), right_result.end());  }  else  {    path_out.emplace_back(path_in[0].x(), path_in[0].y());    path_out.emplace_back(path_in[path_size - 1].x(), path_in[path_size - 1].y());  }}

我们用红色的原点表示路径点,绿色曲线段表示路径。下面显示的是未处理的路径点,因为地图栅格分辨率是 0.05 m 0.05m 0.05m,所以看起来非常稠密

在这里插入图片描述

经过算法剪枝后的路径如下所示,可以看到既保留了原始路径的几何特征,又大幅度降低了路径冗余度

在这里插入图片描述

3.2 Python仿真

核心代码如下所示:

def rdp_rec(M, epsilon, dist=pldist):    dmax = 0.0    index = -1    for i in xrange(1, M.shape[0]):        d = dist(M[i], M[0], M[-1])        if d > dmax:            index = i            dmax = d    if dmax > epsilon:        r1 = rdp_rec(M[:index + 1], epsilon, dist)        r2 = rdp_rec(M[index:], epsilon, dist)        return np.vstack((r1[:-1], r2))    else:        return np.vstack((M[0], M[-1]))

完整工程代码请联系下方博主名片获取


? 更多精彩专栏

《ROS从入门到精通》《Pytorch深度学习实战》《机器学习强基计划》《运动规划实战精讲》…
?源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系?

点击全文阅读


本文链接:http://m.zhangshiyu.com/post/164306.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • (此去经年无故人)南初陆南城:结局+番外精品选集起点章节+阅读即将发布预订
  • 沈凝夏叶晚怡附加完整在线阅读(归雁不栖故人枝)最近更新列表
  • 剧情人物是时初,白浩雄的玄幻言情小说《召诸神,踏万界,天命帝女逆乾坤》,由网络作家&ldquo;海鸥&rdquo;所著,情节扣人心弦,本站TXT全本,欢迎阅读!本书共计381345字,185章节,:结局+番外免费品鉴:结局+番外评价五颗星
  • 凤青禾,江明远,***枢小说(别人修仙我捡漏,卷王们破防了)最近更新(凤青禾,江明远,***枢)整本无套路阅读
  • 薛梨小说无删减+后续(曾经亲情似草芥)畅享阅读
  • 沈南栀小说(穿越时空,我要修补时空裂缝)章节目录+起点章节(沈南栀)全篇清爽版在线
  • 未婚妻被巨蟒缠身,我该吃就吃该喝就喝前言+后续_阿豪林月周然后续+番外_小说后续在线阅读_无删减免费完结_
  • 陆骁,陆本初小说(陆骁,陆本初)(癫!睁眼穿成老太太挥鞭***逆子)前传+阅读全新作品预订
  • 姐姐含冤而死后冥王另娶,我杀穿整个地府在线阅读_阎罗殿殷红别提一口气完结_小说后续在线阅读_无删减免费完结_
  • (书荒必看)毒后重生:疯王的神医小娇妻沈清歌,萧绝:+后续热血十足
  • 重生后我和太监联手灭了敌国喻辰,林雪续集(重生后我和太监联手灭了敌国)终极反转(喻辰,林雪)全篇一口气阅读
  • 我不做灵媒后,自称灵媒摆渡人的养妹害怕了内容精选_苏晓霍老阿姐无广告_小说后续在线阅读_无删减免费完结_

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1