news 2026/5/12 1:21:01

最近在搞路径规划项目,发现A*这玩意儿真是又好用又有趣。今天咱们用Matlab从头撸个带自定义地图的A*路径规划,保证代码比教程还清楚,直接开整

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
最近在搞路径规划项目,发现A*这玩意儿真是又好用又有趣。今天咱们用Matlab从头撸个带自定义地图的A*路径规划,保证代码比教程还清楚,直接开整

A*算法路径规划 A星Matlab路径规划 自定义栅格 可自行更改绘制栅格地图,自定义起始点目标点位置、未知障碍物位置 matlab实现 详细注释!

先来个灵魂草图:地图用栅格表示,0能走,1是墙,起点终点自己定。Matlab矩阵直接当地图简直不要太方便,先搞个10x10的示例地图:

% 初始化地图(可随便改尺寸) map = zeros(10,10); % 手动加墙(中间一堵墙) map(4:7,3) = 1; map(4,4:7) = 1;

接下来定义起点终点。这里我故意把起点终点放在墙的两侧,看算法能不能绕过去:

start_node = [2, 3]; % [行, 列] goal_node = [8, 7];

A*的核心是节点数据结构,咱们用Matlab的结构体搞定:

node.g = 0; % 从起点到当前节点的实际代价 node.h = 0; % 启发式估计值 node.f = 0; % g + h node.parent = []; % 路径回溯用 node.position = []; % 当前坐标

重点来了——启发函数。这里用曼哈顿距离(适合四方向移动),想用欧式距离的自己改:

function h = heuristic(pos, goal) % 曼哈顿距离 h = abs(pos(1)-goal(1)) + abs(pos(2)-goal(2)); % 欧式距离:norm(pos - goal) * 10 end

主循环才是重头戏。开放列表用优先队列(按f值排序),每次取最优节点展开:

open_list = struct2table(node); closed_list = []; while ~isempty(open_list) % 找f值最小的节点 [~, idx] = min(open_list.f); current_node = open_list(idx, :); % 到达终点就收工 if isequal(current_node.position, goal_node) path = reconstruct_path(current_node); break end % 把当前节点挪到关闭列表 open_list(idx, :) = []; closed_list = [closed_list; current_node]; % 遍历四个邻居方向 neighbors = [... -1, 0; % 上 1, 0; % 下 0, -1; % 左 0, 1]; % 右 for k = 1:size(neighbors,1) neighbor_pos = current_node.position + neighbors(k,:); % 跳过越界和障碍 if neighbor_pos(1)<1 || neighbor_pos(1)>size(map,1) || ... neighbor_pos(2)<1 || neighbor_pos(2)>size(map,2) || ... map(neighbor_pos(1), neighbor_pos(2)) == 1 continue end % 计算新g值(移动成本算10) tentative_g = current_node.g + 10; % 检查是否在关闭列表 in_closed = any(cellfun(@(x) isequal(x, neighbor_pos), closed_list.position)); % 新路径更优时才更新 if ~in_closed || tentative_g < existing_g new_node = struct(); new_node.position = neighbor_pos; new_node.parent = current_node.position; new_node.g = tentative_g; new_node.h = heuristic(neighbor_pos, goal_node); new_node.f = new_node.g + new_node.h; % 加入开放列表前查重 in_open = find(cellfun(@(x) isequal(x, neighbor_pos), open_list.position)); if isempty(in_open) open_list = [open_list; struct2table(new_node)]; elseif open_list.g(in_open(1)) > tentative_g open_list(in_open(1), :) = struct2table(new_node); end end end end

路径回溯函数像倒带一样往回找:

function path = reconstruct_node(node) path = []; while ~isempty(node.parent) path = [node.position; path]; % 在关闭列表里找父节点 parent_idx = find(cellfun(@(x) isequal(x, node.parent), closed_list.position)); node = closed_list(parent_idx, :); end path = [start_node; path]; % 补上起点 end

跑起来的效果:算法会先贴着墙边试探,发现走不通马上绕远路。障碍物设置成L型的话,路径会拐两个直角弯。要是把启发函数换成对角线距离,路径会更丝滑,不过要注意移动成本的计算方式得跟着改。

A*算法路径规划 A星Matlab路径规划 自定义栅格 可自行更改绘制栅格地图,自定义起始点目标点位置、未知障碍物位置 matlab实现 详细注释!

几个可以魔改的地方:

  1. 把地图改成20x20,加点随机障碍物(用randi生成)
  2. 在计算g值时加入地形权重(比如沼泽地g+20)
  3. 允许斜角移动(八方向搜索)

遇到坑爹情况怎么办?比如完全封闭的环境,代码会陷入死循环。解决方法是在while循环里加个计数器,超过最大步数直接break报错。不过咱们示例地图是通的,所以不用慌。

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

【拯救HMI】HMI导航逻辑:如何构建清晰的信息架构避免“迷路”

一、工业迷宫的困局 很多HMI系统随着功能的迭代&#xff0c;变成了一座庞大的迷宫。菜单层层嵌套&#xff0c;找一个参数要点进五六层页面&#xff1b;一旦报警发生&#xff0c;操作员根本记不住那个控制阀藏在哪个子菜单里。 “迷路”在工业现场意味着事故。 一个优秀的HMI导…

作者头像 李华
网站建设 2026/5/1 17:26:35

【收藏必备】RAG系统调优秘籍:3大方向+12个技巧全面提升检索准确率

#本文系统介绍了RAG高级技术与调优方法&#xff0c;分为知识库处理、高效召回和图谱检索三大方向。知识库处理包括问题生成、对话沉淀、健康度检查和版本管理&#xff1b;高效召回涵盖查询扩展、混合检索(BM25向量)、重排序等策略&#xff1b;图谱检索则利用知识图谱构建结构化…

作者头像 李华
网站建设 2026/5/1 14:09:21

数字化转型的大坑:只上系统,不动管理?当心钱花了,问题还在!

在“数字化浪潮”席卷各行各业的今天&#xff0c;越来越多的企业将数字化转型视为提升竞争力的“灵丹妙药”。然而&#xff0c;许多企业在推进过程中却陷入了一个根本性的误区——把数字化当作万能钥匙&#xff0c;认为只要投入技术、上线系统&#xff0c;就能解决所有管理痛点…

作者头像 李华
网站建设 2026/5/3 11:46:13

OpenClaw,一只掀桌子的“龙虾”

最近被OpenClaw&#xff08;龙虾&#xff09;刷屏&#xff0c;据说它把AI大模型真的“装进了”电脑&#xff0c;你只需要通过QQ、飞书等遥控指挥&#xff0c;就可以让Claude、DeepSeek们7*24小时帮你干活&#xff0c;而不只是聊聊天。有的人可能不知道OpenClaw&#xff0c;它一…

作者头像 李华
网站建设 2026/5/9 8:34:26

开发智能体调试与预览---真机测试

1、开发者可在智能体调试与预览区域&#xff0c;点击真机测试图标-点击【白名单】跳转至智能体白名单配置页面。 2、勾选用于测试的群组&#xff0c;点击屏幕左侧【编排】返回智能体编排页面进行真机测试发布。若无可用真机调试用户组&#xff0c;开发者需要创建一个用户组并添…

作者头像 李华
网站建设 2026/5/11 19:12:15

【必藏】基于RAG技术的智能客服系统业务架构图详解

本文详细介绍了基于RAG技术的智能客服系统业务架构图&#xff0c;展示了客服用户、知识管理员和系统管理员三大角色及其交互用例。系统包含用户查询、知识检索与生成、知识库更新、系统配置和性能监控五大功能模块&#xff0c;其中知识检索与生成模块采用RAG技术从本地知识库检…

作者头像 李华