学习笔记:人工势场法

article/2025/8/23 17:19:16

一、算法简介

1986年Khatib首先提出人工势场法,并将其应用在机器人避障领域,而现代汽车可以看作是一个高速行驶的机器人,所以该方法也可应用于汽车的避障路径规划领域。

二、算法思想

1、人工势场法的基本思想是在障碍物周围构建障碍物斥力势场,在目标点周围构建引力势场,类似于物理学中的电磁场。

2、被控对象在这两种势场组成的复合场中受到斥力作用和引力作用,斥力和引力的合力指引着被控对象的运动,搜索无碰的避障路径。

3、更直观而言,势场法是将障碍物比作是平原上具有高势能值的山峰,而目标点则是具有低势能值的低谷。

 三、算法内容

        引力势场主要与汽车和目标点间的距离有关,距离越大,汽车所受的势能值就越大;距离越小,汽车所受的势能值则越小,所以引力势场的函数为:

        其中n为正比例增益系数,p(q,qg)为一个矢量,表示汽车的位置q和目标点位置qg之间的欧几里德距离|q-qg|,矢量方向是从汽车的位置指向目标点位置。

        响应的引力Fatt(X)为引力场的负梯度:

        决定障碍物斥力势场的因素是汽车与障碍物间的距离,当汽车未进入障碍物的影响范围时,其受到的势能值为零;在汽车进入障碍物的影响范围后,两者之间的距离越大,汽车受到的势能值就越小,距离越小,汽车受到的势能值就越大。斥力势场的势场函数为:

        其中k为正比例系数,p(q,q。)为一矢量,方向为从障碍物指向汽车,大小为汽车与障碍物间的距离|q-q。|,p。为一常数,表示障碍物对汽车产生作用的最大距离。

        响应的斥力为斥力场的负梯度

         设车辆位置为(×,y),障碍物位置为(xg, yg)。则引力势场函数为:

         故有:

         斥力势场函数为:

        目标不可达的问题。由于障碍物与目标点距离太近,当汽车到达目标点时,根据势场函数可知,目标点的引力降为零,而障碍物的斥力不为零,此时汽车虽到达目标点,但在斥力场的作用下不能停下来,从而导致目标不可达的问题。

        陷入局部最优的问题。车辆在某个位置时,如果若干个障碍物的合斥力与目标点的引力大小相等、方向相反,则合力为0,这将导致车辆不再“受力”,故无法向前搜索避障路径。

四、算法缺陷与改进

1、通过改进障碍物斥力势场函数来解决局部最优和目标不可达的问题;

 2、通过建立道路边界斥力势场以限制汽车的行驶区域,并适当考虑车辆速度对斥力场的影响

% 人工势场法
% 作者:Ally
% 日期:2021/1/24
clc
clear
close all%% 初始化车的参数
d = 3.5;               % 道路标准宽度
W = 1.8;               % 汽车宽度
L = 4.7;               % 车长P0 = [0,-d/2,1,1];     % 车辆起点信息,1-2列位置,3-4列速度
Pg = [99,d/2,0,0];     % 目标位置
Pobs = [15,7/4,0,0;30,-3/2,0,0;45,3/2,0,0;60,-3/4,0,0;80,7/4,0,0];       % 障碍物位置
P = [Pobs;Pg];         % 将目标位置和障碍物位置合放在一起Eta_att = 5;           % 计算引力的增益系数
Eta_rep_ob = 15;       % 计算斥力的增益系数
Eta_rep_edge = 50;     % 计算边界斥力的增益系数d0 = 20;               % 障碍影响距离
n = size(P,1);         % 障碍与目标总计个数
len_step = 0.5;          % 步长
Num_iter = 200;        % 最大循环迭代次数%% ***************初始化结束,开始主体循环******************
Pi = P0;               %将车的起始坐标赋给Xi
i = 0;
while sqrt((Pi(1)-P(n,1))^2+(Pi(2)-P(n,2))^2) > 1i = i + 1;Path(i,:) = Pi;    % 保存车走过的每个点的坐标%计算车辆当前位置与障碍物的单位方向向量、速度向量for j = 1:n-1    delta(j,:) = Pi(1,1:2) - P(j,1:2);                              % 用车辆点-障碍点表达斥力dist(j,1) = norm(delta(j,:));                                   % 车辆当前位置与障碍物的距离unitVector(j,:) = [delta(j,1)/dist(j,1), delta(j,2)/dist(j,1)]; % 斥力的单位方向向量end%计算车辆当前位置与目标的单位方向向量、速度向量delta(n,:) = P(n,1:2)-Pi(1,1:2);                                    %用目标点-车辆点表达引力   dist(n,1) = norm(delta(n,:)); unitVector(n,:)=[delta(n,1)/dist(n,1),delta(n,2)/dist(n,1)];%% 计算斥力 % 在原斥力势场函数增加目标调节因子(即车辆至目标距离),以使车辆到达目标点后斥力也为0for j = 1:n-1if dist(j,1) >= d0F_rep_ob(j,:) = [0,0];else% 障碍物的斥力1,方向由障碍物指向车辆F_rep_ob1_abs = Eta_rep_ob * (1/dist(j,1)-1/d0) * dist(n,1) / dist(j,1)^2;         F_rep_ob1 = [F_rep_ob1_abs*unitVector(j,1), F_rep_ob1_abs*unitVector(j,2)];   % 障碍物的斥力2,方向由车辆指向目标点F_rep_ob2_abs = 0.5 * Eta_rep_ob * (1/dist(j,1) - 1/d0)^2;                F_rep_ob2 = [F_rep_ob2_abs * unitVector(n,1), F_rep_ob2_abs * unitVector(n,2)];  % 改进后的障碍物合斥力计算F_rep_ob(j,:) = F_rep_ob1+F_rep_ob2;                                   endend% 增加边界斥力势场,根据车辆当前位置,选择对应的斥力函数if Pi(1,2) > -d+W/2 && Pi(1,2) <= -d/2             %下道路边界区域力场,方向指向y轴正向F_rep_edge = [0,Eta_rep_edge * norm(Pi(:,3:4))*(exp(-d/2-Pi(1,2)))];elseif Pi(1,2) > -d/2 && Pi(1,2) <= -W/2           %下道路分界线区域力场,方向指向y轴负向F_rep_edge = [0,1/3 * Eta_rep_edge * Pi(1,2).^2];elseif Pi(1,2) > W/2  && Pi(1,2) < d/2             %上道路分界线区域力场,方向指向y轴正向 F_rep_edge = [0, -1/3 * Eta_rep_edge * Pi(1,2).^2];elseif Pi(1,2) > d/2 && Pi(1,2)<=d-W/2             %上道路边界区域力场,方向指向y轴负向F_rep_edge = [0, Eta_rep_edge * norm(Pi(:,3:4)) * (exp(Pi(1,2)-d/2))];end%% 计算合力和方向F_rep = [sum(F_rep_ob(:,1))  + F_rep_edge(1,1),...sum(F_rep_ob(:,2)) + F_rep_edge(1,2)];                                      % 所有障碍物的合斥力矢量F_att = [Eta_att*dist(n,1)*unitVector(n,1), Eta_att*dist(n,1)*unitVector(n,2)];    % 引力矢量F_sum = [F_rep(1,1)+F_att(1,1),F_rep(1,2)+F_att(1,2)];                             % 总合力矢量UnitVec_Fsum(i,:) = 1/norm(F_sum) * F_sum;                                         % 总合力的单位向量%计算车的下一步位置Pi(1,1:2)=Pi(1,1:2)+len_step*UnitVec_Fsum(i,:);                     %     %判断是否到达终点
%     if sqrt((Pi(1)-P(n,1))^2+(Pi(2)-P(n,2))^2) < 0.2 
%         break
%     end
end
Path(i,:)=P(n,:);            %把路径向量的最后一个点赋值为目标%% 画图
figure
len_line = 100;% 画灰色路面图
GreyZone = [-5,-d-0.5; -5,d+0.5; len_line,d+0.5; len_line,-d-0.5];
fill(GreyZone(:,1),GreyZone(:,2),[0.5 0.5 0.5]);
hold on
fill([P0(1),P0(1),P0(1)-L,P0(1)-L],[-d/2-W/2,-d/2+W/2,-d/2+W/2,-d/2-W/2],'b')  %2号车% 画分界线
plot([-5, len_line],[0, 0], 'w--', 'linewidth',2);  %分界线
plot([-5,len_line],[d,d],'w','linewidth',2);     %左边界线
plot([-5,len_line],[-d,-d],'w','linewidth',2);  %左边界线% 设置坐标轴显示范围
axis equal
set(gca, 'XLim',[-5 len_line]); 
set(gca, 'YLim',[-4 4]); % 绘制路径
plot(P(1:n-1,1),P(1:n-1,2),'ro');   %障碍物位置
plot(P(n,1),P(n,2),'gv');       %目标位置
plot(P0(1,1),P0(1,2),'bs');    %起点位置
plot(Path(:,1),Path(:,2),'.b');%路径点

学习自B站:小黎的Ally

视频链接:路径规划与轨迹跟踪系列算法学习_第6讲_人工势场法_哔哩哔哩_bilibili


http://chatgpt.dhexx.cn/article/bb89QtwA.shtml

相关文章

人工势场法matlab讲解,传统人工势场法(matlab)

【实例简介】 人工势场法路径规划是由Khatib提出的一种虚拟力法(Oussama Khatib,Real-Time obstacle Avoidance for Manipulators and Mobile Robots. Proc of The 1994 IEEE.)。它的基本思想是将机器人在周围环境中的运动,设计成一种抽象的人造引力场中的运动,目标点对移动…

路径规划-人工势场法(Artifical Potential Field)

人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。 一、简介 如图所示&#xff0c;机器人在一个二维环境下运动&#xff0c;图中指出了机器人&#xff0c;障碍和目标之间的相对位置。 这个图比较清晰的说明了人工势场法的作用&#…

人工势场法

文章目录 前言一、人工势场法二、简要理解 1.示例2.代码总结 前言 路径规划是移动机器人领域的一个重要组成部分&#xff0c;传统的路径规划代表算法包括 A*算法、Dijkstra 算法、人工势场法以及仿生学的蚁群算法。人工势场法是机器人路径规划算法中一种简单有效的方法。人工势…

路径规划-人工势场法(Artificial Potential Field)

人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。 1. 简介 如图所示&#xff0c;机器人在一个二维环境下运动&#xff0c;图中指出了机器人&#xff0c;障碍和目标之间的相对位置。 这个图比较清晰的说明了人工势场法的作用&#xf…

路径规划算法3.1 人工势场法APF

路径规划算法3.1 人工势场法APF 前言电场与电势场人工势场人工势场的构建梯度下降与局部最小问题后记 前言 人工势场法APF(Artificial Potential Field)&#xff0c;是非场经典的寻路方法&#xff0c;常用于移动机器人的局部路径规划&#xff0c;其主要思想是通过目标的引力与…

【路径规划】局部路径规划算法——人工势场法(含python实现 | c++实现)

文章目录 参考资料1. 算法简介2. 算法精讲2.1 引力势场2.2 斥力势场2.3 合力势场 3. 引力斥力推导计算4. 算法缺陷与改进4.1 目标不可达的问题4.2 陷入局部最优的问题4.3 解决方案4.3.1 改进障碍物斥力势场函数4.3.2 道路边界斥力势场 5. python实现6. c实现 参考资料 路径规划…

人工势场法路径规划算法(APF)

本文主要对人工势场法路径规划算法进行介绍&#xff0c;主要涉及人工势场法的简介、引力和斥力模型及其推导过程、人工势场法的缺陷及改进思路、人工势场法的Python与MATLAB开源源码等方面 一、人工势场法简介 人工势场法是由Khatib于1985年在论文《Real-Time Obstacle Avoidan…

美团笔试题之查找幸运星

美团笔试题之查找幸运星 题目其实很简单&#xff0c;特别简单&#xff0c;当时看一眼题目我心中就有思路了&#xff0c;问题就是我卡在了如何循环输入上了&#xff0c;简直是不可思议&#xff0c; 当时我想复杂了&#xff0c;现在看来如此简单的问题我卡了这么久&#xff0c;…

美团笔试题解2022-3-12号

第一题 签到 题目大意 n组数据&#xff0c;判断每组是否可以被11整除或者还有两个数位1 两个条件满足其一输出yes 否则输出no 第二题 双指针 题目大意 输入一个序列 只含1 输出连续子序列乘积为正的数目 #include<bits/stdc.h> using namespace std; const int N…

美团笔试题及解析(时间:2022年9月3号)

最新美团笔试题及解析&#xff08;时间&#xff1a;2022年9月3号&#xff09; T1 乒乓球 乒乓球&#xff0c;被称为中国的“国球”&#xff0c;是一种世界流行的球类体育项目。一局比赛的获胜规则如下&#xff1a; 当一方赢得至少11分&#xff0c;并且超过对方2分及以上时&…

春招秋招--忆美团笔试

请看https://mp.weixin.qq.com/s/LKIHHOWAT_nRsD6D9Sma3Q ** **

2023校招美团笔试

这两天状态不是很好&#xff0c;美团笔试的题比较常规&#xff0c;五个编程&#xff0c;没有选择填空&#xff0c;做的一般&#xff0c;A了两道多&#xff0c;脑子感觉因为天天熬夜有点迟钝&#xff0c;最后几个题直接摆烂了。 第一题&#xff1a;送外卖 这道题当时思路出了点…

美团笔试题_20220409

前言 笔试一共五道编程题&#xff08;四一&#xff09;&#xff0c;一为专项编程题&#xff0c;估计不同岗位有题目不一样&#xff0c;使用的是赛码网&#xff0c;允许跳出界面使用自己的IDE。 在此感谢筱羊冰冰提供的部分题目及题解。 题目一&#xff1a;数圈游戏 给定一个…

美团笔试记录

美团笔试 今天下午参加了美团校招的笔试&#xff08;web前端/移动端&#xff09;&#xff0c;题型如下&#xff1a;20道选择题、20道专项选择题、2道编程题、1道论述题。但是我肯定不能说出具体是什么题目&#xff0c;毕竟好像要保护题目的隐私。 选择题 选择题难度有点大&a…

美团2023年春招在线前端笔试题回忆版

提示&#xff1a;题目不一定完全正确&#xff0c;只能说给大家参考会考察哪些知识点。 文章目录 前言一、单选&#xff08;计算机基础知识&#xff09;二、专项选择三、编程题1. 某地有一个火车站如下图所示&#xff0c;小红很好奇火车是怎么驶进驶出的&#xff0c;然后每天记录…

关于信息学奥赛一本通(C++版)在线评测系统 1153 绝对素数

信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统网址&#xff1a;信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn) 1153&#xff1a;绝对素数 时间限制: 1000 ms 内存限制: 65536 KB …

信奥一本通1365

1365&#xff1a;FBI树(fbi) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6443 通过数: 4366 【题目描述】 我们可以把由“0”和“1”组成的字符串分为三类&#xff1a;全“0”串称为B串&#xff0c;全“1”串称为I串&#xff0c;既含“0”又含“1”的串则称为…

信息学奥赛一本通评测系统P1336

恭喜你看到了这篇题解&#xff0c;他会让你避开很多坑(新手推荐&#xff0c;大佬提些建议嘛) 当然&#xff0c;我不想让大佬像下面这道题中大佬一样。[AHOI2017/HNOI2017]大佬 - 洛谷https://www.luogu.com.cn/problem/P3724 1336&#…

信息学奥赛一本通---1000:入门测试题目

1000&#xff1a;入门测试题目 时间限制: 1000 ms 内存限制: 32768 KB 提交数: 254022 通过数: 152601 【题目描述】 求两个整数的和。 【输入】 一行&#xff0c;两个用空格隔开的整数。 【输出】 两个整数的和。 【输入样例】 2 3 【输出样例】 5 答案如下: #…

信息学奥赛一本通(C++版)在线评测系统网址

信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn)http://ybt.ssoier.cn:8088/index.php