news 2026/4/23 13:17:51

最近在搞路径规划项目,发现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/3/27 10:44:45

Infoseek字节探索赋能媒介投放:全链路技术架构解析与API实操指南

一、前言&#xff1a;媒介投放智能化的核心技术诉求随着AIGC技术普及与媒介渠道碎片化&#xff0c;企业媒介投放已从“渠道覆盖”的粗放式模式&#xff0c;升级为“精准触达舆情可控数据驱动”的精细化模式&#xff0c;对媒介投放系统的技术要求也随之提升&#xff0c;核心技术…

作者头像 李华
网站建设 2026/4/23 12:35:49

龙蜥社区第七届理事大会召开,丁津泰、包云岗、章文嵩等专家加入第二届顾问团

近日&#xff0c;龙蜥社区第七届理事大会在杭州郭庄成功举行。本次会议有龙蜥社区理事及代表、高级顾问/特约顾问、特邀嘉宾等共计 35 位成员出席。本次会议由龙蜥社区运营委员会主席陈绪主持&#xff0c;会上正式成立龙蜥社区第二届顾问团&#xff0c;并全票通过了关于修订龙蜥…

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

自动获客软件的优势和使用方法解析

自动获客软件的基本概述在如今竞争激烈的市场中&#xff0c;自动获客软件成了企业获取潜在客户的重要伙伴。这类销售工具通过智能的数据分析&#xff0c;帮助我们快速找到并吸引目标客户。尤其是基于AI销售自动化的智能获客系统&#xff0c;让我们的客户获取效率大幅提升&#…

作者头像 李华
网站建设 2026/4/22 18:39:16

mbedtls之mac-ansi919算法实现

/*** @brief ANSI X9.19 MAC算法的3DES版本实现* 更接近原始代码的3DES实现** @param pdata 输入数据* @param datalen 数据长度* @param pkey 密钥(16或24字节)* @param keylen 密钥长度* @param pmac 输出的MAC(8字节)* @param use_padding 是否使用填充* @return 0成功,…

作者头像 李华