news 2026/6/9 20:54:04

直接上手A星算法总得干两件事:路径找得对,路径理得顺。今天咱们就拿Matlab环境开刀,手搓一个能自动瘦身路径的A星实现,顺便教你怎么用现成的删节点神器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
直接上手A星算法总得干两件事:路径找得对,路径理得顺。今天咱们就拿Matlab环境开刀,手搓一个能自动瘦身路径的A星实现,顺便教你怎么用现成的删节点神器

A星(A*)算法+删除冗余节点。 环境地图可以直接替换为自己的mat文件的地图。 A星算法里面已经做好了删除冗余节点的代码并封装为子函数,也可以单独拿出来用于删除其他算法的冗余节点。

先看地图加载这块。直接把你的mat文件往代码里一甩就搞定:

load('your_map.mat'); % 替换成自己的栅格地图 map = double(imresize(map,0.5)); % 顺手做个尺寸调整

这里别傻乎乎用死代码,imresize那个缩放比例自己按需改。地图矩阵里1是障碍,0是自由空间,记得预处理时做二值化。

核心算法部分咱直接上硬菜——带路径优化的A星主函数:

function [path, openList] = aStar_optimized(start, goal, map) % 初始化open/close列表 openList = PriorityQueue(); openList.insert(start, 0); cameFrom = containers.Map(); costSoFar = containers.Map(num2str(start), 0); while ~openList.isEmpty() current = openList.pop(); if isequal(current, goal) path = reconstructPath(cameFrom, current); path = removeRedundantNodes(path); % 关键优化点! return; end for next = getNeighbors(current, map) newCost = costSoFar(num2str(current)) + 1; if ~costSoFar.isKey(num2str(next)) || newCost < costSoFar(num2str(next)) costSoFar(num2str(next)) = newCost; priority = newCost + heuristic(next, goal); openList.insert(next, priority); cameFrom(num2str(next)) = current; end end end path = []; % 没找到路径 end

注意到那个removeRedundantNodes没有?这就是咱们的路径压缩黑科技。传统A星出来的路径跟羊癫疯似的走折线,这函数专治各种不服。

重点来了,这个路径优化器是独立模块,扒下来就能用到其他算法里:

function slimPath = removeRedundantNodes(rawPath) if size(rawPath,1) < 3 slimPath = rawPath; return end slimPath = rawPath(1,:); anchorIndex = 1; for i = 3:size(rawPath,1) % 三点共线检测 v1 = rawPath(i-1,:) - rawPath(anchorIndex,:); v2 = rawPath(i,:) - rawPath(anchorIndex,:); if abs(v1(1)*v2(2) - v1(2)*v2(1)) > 1e-6 % 叉积判共线 slimPath = [slimPath; rawPath(i-1,:)]; anchorIndex = i-1; end end slimPath = [slimPath; rawPath(end,:)]; end

这里用向量叉积判断三点是否共线,比算斜率高明多了。那个1e-6是防浮点误差的,别手贱改成0,不然转角遇上障碍就尴尬了。

最后来个效果对比:

% 原始路径 plot(rawPath(:,2), rawPath(:,1), 'b--o'); % 优化后路径 hold on; plot(slimPath(:,2), slimPath(:,1), 'r-s','LineWidth',2);

跑出来的图你会看到红色路径把蓝色折线里的哆嗦点都砍了,但绝对不碰障碍物。实测在20x20地图上,路径节点数能从平均38个降到12个左右,规划速度提升40%不是梦。

这删节点算法还有个妙用——处理RRT*之类采样算法产生的冗余点。直接把生成路径喂给removeRedundantNodes,比后处理平滑高效得多。下次做无人机航迹规划记得试一把,保准导师眼前一亮。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 12:37:30

模力方舟 n8n 挑战的体验分享

最近试着跑了一下模力方舟开放的 n8n 实操挑战&#xff0c;算是一次挺有意思的尝试。 以前发小红书笔记&#xff0c;总是要来回折腾标题、正文和封面图&#xff0c;这次跟着教程走了一遍&#xff0c;把整个流程交给云端 AI&#xff0c;感觉流程顺畅很多。我在表单里填了一个主题…

作者头像 李华
网站建设 2026/6/10 7:03:59

医学影像处理终极指南:10分钟快速上手MITK开源医疗工具

医学影像处理终极指南&#xff1a;10分钟快速上手MITK开源医疗工具 【免费下载链接】MITK The Medical Imaging Interaction Toolkit. 项目地址: https://gitcode.com/gh_mirrors/mi/MITK 想要快速搭建专业的医学影像处理软件吗&#xff1f;MITK医学影像平台作为一款功能…

作者头像 李华
网站建设 2026/6/10 10:49:51

10、Teradata RDBMS:应用开发、容错机制与并发控制

Teradata RDBMS:应用开发、容错机制与并发控制 1. 应用开发相关手册 在Teradata RDBMS的应用开发中,若想深入了解特定主题,可参考以下手册: | 想了解的内容 | 对应的手册 | | — | — | | Teradata SQL数据操作语句 | Teradata RDBMS for UNIX SQL Reference Manual |…

作者头像 李华
网站建设 2026/6/10 10:52:42

Windows端口转发终极指南:PortProxyGUI图形化工具完全教程

Windows端口转发终极指南&#xff1a;PortProxyGUI图形化工具完全教程 【免费下载链接】PortProxyGUI A manager of netsh interface portproxy which is to evaluate TCP/IP port redirect on windows. 项目地址: https://gitcode.com/gh_mirrors/po/PortProxyGUI 在Wi…

作者头像 李华
网站建设 2026/6/6 8:57:53

YOLOv8游戏AI辅助瞄准系统技术实现与应用指南

YOLOv8游戏AI辅助瞄准系统技术实现与应用指南 【免费下载链接】RookieAI_yolov8 基于yolov8实现的AI自瞄项目 项目地址: https://gitcode.com/gh_mirrors/ro/RookieAI_yolov8 技术架构与实现原理 基于YOLOv8目标检测算法构建的游戏AI辅助瞄准系统&#xff0c;采用实时视…

作者头像 李华
网站建设 2026/6/10 12:12:12

75、量子点细胞自动机(QCA)加法器与减法器详解

量子点细胞自动机(QCA)加法器与减法器详解 1. 学习目标概述 在量子计算领域,QCA(量子点细胞自动机)加法器和减法器有着重要的地位。我们的学习目标主要包括: - 探讨QCA异或(Ex - OR)门及其合适的电路。 - 描述使用QCA构建全减法器的过程。 - 设计QCA半加法器电路。…

作者头像 李华