A*算法与人工势场法结合的路径规划(附MATLAB源码)

A*算法与人工势场法(APF)结合实现路径规划

路径规划是机器人、无人机及自动驾驶等领域中的一个重要问题。本文结合了经典的 A* 算法与 人工势场法(Artificial Potential Field, APF),实现了一种改进的路径规划方法。下面将从代码结构、功能实现和关键算法进行详细介绍。


一、背景知识
  1. A*算法
    • A*算法是一种基于图的搜索算法,用于在一个栅格地图中找到从起点到终点的最短路径。
    • 通过评价函数 f(n)=g(n)+h(n)f(n) = g(n) + h(n),其中 g(n)g(n) 是起点到当前节点的实际代价,h(n)h(n) 是当前节点到目标的估计代价(启发函数)。
  2. 人工势场法(APF)
    • APF是一种基于力场的路径规划方法,将目标点视为“引力源”、障碍物视为“斥力源”,机器人在引力和斥力的合力作用下移动。
    • 优势是计算简单、实时性强,但容易陷入局部最优。

结合A*算法与APF方法,本文代码先通过A*算法找到一条粗略路径,然后利用APF对路径进行优化,进一步避开动态障碍物并生成更平滑的路径。


二、代码功能概述

本文代码主要分为以下几个部分:

  1. 地图初始化与绘制

    • 定义一个20*20的栅格地图,加载地图数据并标记障碍物、起点和终点。
  2. A*算法实现

    • 计算起点到终点的初步路径,储存路径点及其代价。
  3. 人工势场法路径优化

    • 基于A*生成的路径,结合动态障碍物的位置调整路径。
  4. 可视化与性能评估

    • 动态显示路径规划过程,计算路径长度与规划时间。

三、代码结构解析
1. 地图初始化与绘制
m = 20;   % 地图行数
n = 20;   % 地图列数
load MAP; % 加载地图数据

% 起点和终点定义
start_node = [1, 1];
target_node = [20, 20];

% 绘制栅格地图框架
figure('Name', 'A-APF Path Planning', 'Color', 'w');
draw_grid(m, n, start_node, target_node, obs);
  • 代码通过加载 MAP 文件定义障碍物,并使用 fill 函数绘制地图。
  • 起点和终点用红色星标表示,障碍物用红色方块填充。
2. A*算法实现

A*算法的核心包括以下步骤:

  • OpenList 和 CloseList:分别存储待探索节点和已探索节点。
  • 代价计算
    • gg:从起点到当前节点的代价。
    • hh:当前节点到目标的曼哈顿距离。
    • f=g+hf = g + h:总代价。
  • 路径扩展
    • 按代价从OpenList中选择代价最小的节点进行扩展。
    • 判断是否到达终点。

以下是主要代码片段:

while flag   % 循环直到找到目标
    % 计算子节点
    child_nodes = child_nodes_cal(parent_node, m, n, obs, closeList);

    % 更新OpenList
    for i = 1:size(child_nodes,1)
        g = openList_cost(min_idx, 1) + norm(parent_node - child_node);
        h = abs(child_node(1) - target_node(1)) + abs(child_node(2) - target_node(2));
        f = g + h;
        % 比较更新代价或添加新节点
    end

    % 更新CloseList
    closeList(end+1,: ) =  openList(min_idx,:);
end
3. 人工势场法路径优化

基于A*生成的初步路径,使用APF对其优化,主要步骤包括:

  • 引力计算

    • 目标点对机器人产生吸引力,吸引力大小与目标距离成正比。
    F_att = [Eta_att*dist(N,1)*unitVector(N,1), Eta_att*dist(N,1)*unitVector(N,2)];
    
  • 斥力计算

    • 静态障碍物和动态障碍物产生斥力,斥力随距离增大而减小。
    if dist(j,1) >= d0
        F_rep_ob(j,:) = [0,0];
    else
        F_rep_ob1_abs = Eta_rep_ob * (1/dist(j,1)-1/d0) * dist(N,1) / dist(j,1)^2;
        F_rep_ob(j,:) = F_rep_ob1;
    end
    
  • 动态障碍物处理

    • 障碍物位置实时更新,基于相对速度计算斥力。
  • 位置更新

    • 车辆按照总合力方向前进。
    F_sum = [F_rep(1,1)+F_att(1,1),F_rep(1,2)+F_att(1,2)];
    Pi(1,1:2) = Pi(1,1:2) + len_step * UnitVec_Fsum(i,:);
    
4. 动态可视化
  • 每次迭代实时绘制路径、障碍物及车辆位置。
rectangle('Position',[Pi(1)-0.5-0.25,Pi(2)-0.5-0.25,0.5,0.5],'Curvature',1,'FaceColor','b');
pause(0.1);
cla;

四、实验结果

通过运行代码,可以观察到以下现象:

  1. A*路径生成

    • 初步路径通过A*生成,绕过了主要的静态障碍物。
  2. APF路径优化

    • 车辆按照人工势场的总力方向调整路径,避开动态障碍物。
  3. 路径平滑与动态避障

    • 最终路径更加平滑,车辆成功避开动态障碍物到达目标点。

五、性能分析
  1. 路径长度

    • 代码动态计算路径总长度:
    length = length + norm(Path(i+1,:) - Path(i,:));
    disp(['The length =',num2str(length)]);
    
  2. 规划时间

    • 总体规划时间由 tictoc 函数统计。
  3. 优缺点

    • 优点:结合A*和APF,兼顾全局路径搜索与局部优化。
    • 缺点:复杂场景下,动态障碍物处理仍可能陷入局部最优。

六、总结

本文通过将A*算法与人工势场法相结合,解决了路径规划中的全局与局部优化问题。代码不仅实现了基本功能,还加入了动态障碍物处理及路径平滑优化。未来可以尝试改进势场函数或引入机器学习方法进一步提升性能。

代码获取:A*算法与人工势场法(APF)结合实现路径规划A*算法与人工势场法(APF)结合实现路径规划A*算法与人工势场法结合的路径规划(附MATLAB源码)-CSDN博客路径规划是机器人、无人机及自动驾驶等领域中的一个重要问题。本文结合了经典的 A* 算法与 人工势场法(Artificial Potential Field, APFicon-default.png?t=O83Ahttps://mbd.pub/o/bread/Z52Xk5pw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949030.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SASS 简化代码开发的基本方法

概要 本文以一个按钮开发的实例,介绍如何使用SASS来简化CSS代码开发的。 代码和实现 我们希望通过CSS开发下面的代码样式,从样式来看,每个按钮的基本样式相同,就是颜色不同。 如果按照传统的方式开发,需要开发btn &…

Spring为什么要用三级缓存解决循环依赖?

1.什么是循环依赖 本文为了方便说明,先设置两个业务层对象,命名为AService和BService。其中Spring是如何把一个Bean对象创建出来的,其生命周期如下: 构造方法–> 不同对象 --> 注入依赖 -->初始化前 --> 初始化后–&…

R shiny app | 网页应用 空格分隔的文本文件在线转csv

shiny 能快速把R程序以web app的形式提供出来,方便使用,降低技术使用门槛。 本文提供的示例:把空格分隔的txt文件转为逗号分隔的csv文件。 前置依赖:需要有R环境(v4.2.0),安装shiny包(v1.9.1)。括号内是我使用的版本…

LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 教程 (4)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务,通过网络接口,提供 AI 模型功能的服务,允许通过发送 HTTP 请求,交互大模型,通常基于云计算架构,无需在本地部署复杂的模型和硬件,…

【《python爬虫入门教程11--重剑无峰168》】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 【《python爬虫入门教程11--selenium的安装与使用》】 前言selenium就是一个可以实现python自动化的模块 一、Chrome的版本查找?-- 如果用edge也是类似的1.chrome…

自定义Bitmap

使用场景 Bitmap 是一种使用 位数组(bit array) 来表示数据的结构,每一位(bit)表示一个值的状态。由于每个位只占用 1 bit,因此Bitmap 的存储效率非常高,特别适用于大数据去重、标记布尔值状态…

公司资产网站

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…

第431场周赛:最长乘积等价子数组、计算字符串的镜像分数、收集连续 K 个袋子可以获得的最多硬币数量、不重叠区间的最大得分

Q1、最长乘积等价子数组 1、题目描述 给你一个由 正整数 组成的数组 nums。 如果一个数组 arr 满足 prod(arr) lcm(arr) * gcd(arr),则称其为 乘积等价数组 ,其中: prod(arr) 表示 arr 中所有元素的乘积。gcd(arr) 表示 arr 中所有元素的…

掌握RabbitMQ:全面知识点汇总与实践指南

前言 RabbitMQ 是基于 AMQP 高级消息队列协议的消息队列技术。 特点:它通过发布/订阅模型,实现了服务间的高度解耦。因为消费者不需要确保提供者的存在。 作用:服务间异步通信;顺序消费;定时任务;请求削…

国内Ubuntu环境Docker部署Stable Diffusion入坑记录

国内Ubuntu环境Docker部署Stable Diffusion入坑记录 本文旨在记录使用dockerpython进行部署 stable-diffusion-webui 项目时遇到的一些问题,以及解决方案,原项目地址: https://github.com/AUTOMATIC1111/stable-diffusion-webui 问题一览: …

SpringBoot3-深入理解自动配置类的原理(尚硅谷SpringBoot3-雷神)

文章目录 目录了解自动配置 一、导入对应场景的Mean依赖:1、引入依赖**找到自动配置类的所有配置都存放在哪里** 二、编写主程序:SpringBootApplication观察源码时所需要知道的几个核心注解:1、观察SpringBootApplication源码都做了什么 三、…

【沉默的羔羊心理学】汉尼拔的“移情”游戏:操纵与理解的艺术,精神分析学视角下的角色互动

终极解读《沉默的羔羊》:弗洛伊德精神分析学视角下的深层剖析 关键词 沉默的羔羊弗洛伊德精神分析学角色心理意识与潜意识性别与身份 弗洛伊德精神分析学简介 弗洛伊德的精神分析学是心理学的一个重要分支,主要关注人类行为背后的无意识动机和冲突。…

字玩FontPlayer开发笔记3 性能优化 大量canvas渲染卡顿问题

字玩FontPlayer开发笔记3 性能优化 大量canvas渲染卡顿问题 字玩FontPlayer是笔者开源的一款字体设计工具,使用Vue3 ElementUI开发,源代码: github: https://github.com/HiToysMaker/fontplayer gitee: https://gitee.com/toysmaker/fontpl…

javaEE-网络编程-3 UDP

目录 Socaket套接字 UDP数据报套字节编程 1.DatagrameSocket类 DatagramSocaket构造方法: DatagramSocaket常用方法: 2.DatagramPacket类 DatagramPacket构造方法: UDP回显服务器实现 UDP服务端实现: 创建一个Socket类对象&#xf…

Linux:操作系统不朽的传说

操作系统是计算机的灵魂,它掌控着计算机的硬件和软件资源,为用户和应用程序提供了一个稳定、高效、安全的运行环境。 在众多操作系统中,Linux 的地位举足轻重。它被广泛应用于服务器、云计算、物联网、嵌入式设备等领域。Linux 的成功离不开…

模拟出一个三维表面生成表面点,计算体积,并处理边界点

python代码 生成表面点,计算体积,并处理边界点,最终模拟出一个三维表面。 步骤: 初始参数设置: initial_fixed_point:一个初始固定点的坐标。 slop_thre:坡度阈值。 v_thre:体积阈值。 slope_rad:将坡度从度转换为弧度。 step_size:步长。 lam_x, lam_y:泊松分布的…

STM32拓展 低功耗案例1:睡眠模式 (register)

需求描述 让MCU进入睡眠模式,然后通过串口发送消息来唤醒MCU退出睡眠模式。观察LED在进入休眠模式后是否仍然开启。 思考 首先睡眠模式,唤醒的条件是中断,外部内部都可以,这里的串口接收中断时内部中断。 拓展:中断…

vue 基础参数增加多语言配置

js 对数组的增删改查 字段在数据库存储为nvarchar ,varchar存储波斯语会乱码 数组格式: {"en": [{"type": "10","value": "Confirm","color": ""},{"type": "…

[桌面运维]windows自动设置浅深色主题

设置自动浅色/深色主题 我看很多up主的教程过于繁琐,需要添加四个功能,并且有些还不能生效! 大多数都是教程: 自动任务栏浅色 add HKCUSOFTWAREMicrosoftWindowsCurrentVersionThemesPersonalize/v SystemUsesLightTheme /t …

[ubuntu-22.04]ubuntu不识别rtl8153 usb转网口

问题描述 ubuntu22.04插入rtl8153 usb转网口不识别 解决方案 安装依赖包 sudo apt-get install libelf-dev build-essential linux-headers-uname -r sudo apt-get install gcc-12 下载源码 Realtek USB FE / GBE / 2.5G / 5G Ethernet Family Controller Softwarehttps:/…