目錄
傳統(tǒng)人工勢場
引力勢場
斥力勢場
?合力勢場
?傳統(tǒng)人工勢場法存在的問題
?改進的人工勢場函數(shù)
?Matlab代碼實現(xiàn)
參考鏈接:
[1]朱偉達. 基于改進型人工勢場法的車輛避障路徑規(guī)劃研究[D]. 江蘇大學, 2017.
1986年Khatib首先提出人工勢場法,并將其應(yīng)用在機器人避障領(lǐng)域。該方法的基本思想是在障礙物周圍構(gòu)建障礙物斥力勢場,在目標點周圍構(gòu)建引力勢場,類似于物理學中的電磁場。被控對象在這兩種勢場組成的復合場中受到斥力作用和引力作用,斥力和引力的合力指引著被控對象的運動,搜索無碰的避障路徑。
這種方法結(jié)構(gòu)簡單,便于低層的實時控制,在實時避障和平滑的軌跡控制方面,得到了廣泛應(yīng)用,其不足在于存在局部最優(yōu)解,目標不可達、與障礙物碰撞等現(xiàn)象。
傳統(tǒng)人工勢場
引力勢場
斥力勢場
決定障礙物斥力勢場的因素是汽車與障礙物間的距離,當汽車未進入障礙物的影響范圍時,其受到的勢能值為零;在汽車進入障礙物的影響范圍后,兩者之間的距離越大,汽車受到的勢能值就越小,距離越小,汽車受到的勢能值就越大。
?合力勢場
? +?=?
?傳統(tǒng)人工勢場法存在的問題
?改進的人工勢場函數(shù)
?
?Matlab代碼實現(xiàn)
main主函數(shù)
%main主函數(shù)
%created by MW
%date: 2023/2/28
%func: Artificial Potential Field(APF) avoiding obstacle
clc;
clear;
%% 創(chuàng)建并繪制障礙物
obstacle = [2 5;
3 8;
7 9;
4 2;
6 6;
9 3];
figure(1);
scatter(obstacle(:,1),obstacle(:,2),'r')
axis equal;
%% 創(chuàng)建并繪制初始位置和目標位置
start = [0 0];
goal = [10 10];
hold on;
scatter(start(1),start(2),'filled','g');
scatter(goal(1),goal(2),'filled','g');
%% 圖片標注
text(start(1),start(2),'起點');
text(goal(1),goal(2),'終點');
grid on;
axis equal;
axis([0 10 0 10]);
xlabel('x');
ylabel('y');
title('人工勢場法生成避障路徑')
%% 生成并繪制避障路徑
path = APF2D(start, goal, obstacle);
hold on;
plot(path(:,1), path(:,2),'LineWidth',1,'Color','b');
人工勢場法主函數(shù):
function path = APF2D(start,goal,obstacle)
% Artificial Potential Field(APF)avoiding obstacle path
%%APF參數(shù)初始化
%如果不能實現(xiàn)預期目標,可能也與初始的增益系數(shù),Po設(shè)置的不合適有關(guān)。
att = 35;%引力增益系數(shù)
req = 10;%斥力增益系數(shù)
p0 = 5;%障礙物產(chǎn)生影響的最大距離,當障礙與移動目標之間距離大于Po時,斥力為0。
step = 2;%步長
maxIter = 200;%最大循環(huán)迭代次數(shù)
n = length(obstacle(:,1));%障礙物個數(shù)
path = start;%路徑初始化
newNode = start;
for i = 1:maxIter
%% 引力計算
V_att = goal - newNode;%路徑點到目標點的向量
r_att = sqrt(V_att(1)^2 + V_att(2)^2);%路徑點到目標點的歐氏距離
P_att = att * V_att;%引力
%% 斥力計算
%改進的人工勢場法,將斥力分散一部分到引力方向。通過添加隨機擾動r_att^n實現(xiàn),r_att為路徑點到目標點的歐氏距離,本文n取2。
V_req = zeros(n,2);
for j =1:n
V_req(j,:) = [obstacle(j,1) - newNode(1), obstacle(j,2) - newNode(2)];%路徑點到各個障礙物的向量
r_req(j) = sqrt(V_req(j,1)* V_req(j,1) + V_req(j,2)* V_req(j,2));%路徑點到各個障礙物的歐氏距離
end
P_req = 0;
for k = 1:n
if r_req(k) <= p0
P_req1 = req * (1 / r_req(k) - 1 / p0) * r_att^2 / r_req(k)^2;%斥力分量1:障礙物指向路徑點的斥力
P_req2 = req * (1 / r_req(k) - 1 / p0)^2 * r_att;%斥力分量2:路徑點指向目標點的分引力
P_reqk = P_req1 / r_req(k) * V_req(k,:) + P_req2 / r_att * V_att;%合力分散到x,y方向
P_req = P_req + P_reqk;%斥力
end
end
%% 合力計算
P = P_att + P_req;
newNode = newNode + step * P / norm(P);
path = [path; newNode];
end
end
結(jié)果:
需要注意的是,引力、斥力增益、步長的選擇都會影響到結(jié)果,可以進行適當調(diào)整。文章來源:http://www.zghlxwxcb.cn/news/detail-509656.html
特別地,人工勢場法容易陷入局部最小值,即使是加入了調(diào)節(jié)因子進行改進,在某些情況下仍然無法避免。?文章來源地址http://www.zghlxwxcb.cn/news/detail-509656.html
到了這里,關(guān)于路徑規(guī)劃算法3 改進的人工勢場法(Matlab)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!