人工勢場法Matlab代碼詳解

一、簡介

人工勢場法是一種常用的路徑規劃方法,也被廣泛應用於機械人導航、無人機飛行等領域。本文將通過一個Matlab代碼示例,對人工勢場法的實現進行分析和闡述。

二、代碼實現

為了方便理解,我們先來看一下整個程序的框架:

function artificialPotentialField
clear all; clc; close all;
goal=[90 90];
q_start=[10 10];
boundary=[0 100 0 100];
obstacles= [30 30 10;
               50 50 10;
               70 70 10];
           
for i=1:5000
    % 確定機械人所處位置,這裡採用了隨機漫步的方式
    q_rand = ceil(rand(1,2)*100);
    dist=[];
    
    % 計算機械人到終點的距離
    for j=1:size(q_rand,1)
        dist(j)=magnitude(q_rand(j,:),goal);
    end
    
    % 取距離終點最近的點
    [val,id]=min(dist);
    q_nearest=q_rand(id,:);
    
    % 判斷是否與障礙物相交
    if collisionDetect(q_nearest,obstacles)
        continue;
    end
    
    % 如果與終點距離小於5,結束搜索
    if (val<5)
         quiver(q_nearest(1),q_nearest(2),0,10,0,'filled','MaxHeadSize', 0.8); 
         hold all;
         break;
    end
    
    % 計算q_new
    x=q_nearest;
    y=goal;
    unitvector=(y-x)/norm(y-x);
    angle=atan2(unitvector(2),unitvector(1));
    mindis=10;
    dis=2*mindis;
    q_new=[];
    
    % 隨機搜索區域範圍內有沒有最近距離的點
    for j=-pi/3:0.1:pi/3
        l=mindis*[cos(angle+j),sin(angle+j)];
        if l(1)boundary(2) || l(2)boundary(4)
            continue
        end

        if collisionDetect(l,obstacles)
            continue
        end
        
        if magnitude(l,goal)<dis
            dis=magnitude(l,goal);
            q_new=l;
        end
    end
    
    % 如果沒有最近距離的點,在搜索範圍內隨機
    if norm(q_new)==0
        q_new=10*unitvector+q_nearest;
    end
    
    % 根據人工勢場法計算機械人向目標前進的方向
    delta=0.5;
    eta=2;
    fgoal=(goal-q_new)/magnitude(goal-q_new)*delta;
    fobs=frep(q_new,obstacles,eta);
    fq=fgoal+fobs;
    q=q_new+fq;
    
    % 如果與障礙物相交,捨棄該點
    if collisionDetect(q,obstacles)
        continue
    end
    
    % 繪製機械人運動軌跡
    quiver(q_nearest(1),q_nearest(2),q(1)-q_nearest(1),q(2)-q_nearest(2),0,'filled','MaxHeadSize', 0.8); 
    hold all;
end

% 確定兩點距離
function dist= magnitude(x,y)
dist= sqrt((y(1)-x(1))^2+(y(2)-x(2))^2);
end

% 計算避障向量
function fobs= frep(q,obstacles,eta)
n=size(obstacles,1);
fobs=[0,0];
for i=1:n
    p=obstacles(i,1:2);
    d=magnitude(p,q);
    if d<obstacles(i,3)
        fobs=fobs-(q-p)*eta*(1/d-1/obstacles(i,3))/(d^3);
    end        
end
fobs=fobs';
end

% 判斷是否與障礙物相交
function collision= collisionDetect(q,obstacles)
collision=0;
for i=1:size(obstacles,1)
    if magnitude(q,obstacles(i,1:2))<obstacles(i,3)
        collision=1;
        return;
    end
end
end

三、代碼詳解

上面的程序是一個完整的人工勢場法實踐代碼,接下來我們將對代碼中的每個部分進行詳細解釋。

1. 初始化程序

在程序的第一行到第五行,我們清空了所有變量並關閉了所有圖形界面。這樣做的目的是為了保證每次程序的運行都是從零開始的,避免出現一些難以查找的問題。

function artificialPotentialField
clear all; clc; close all;

2. 設置目標點、機械人起點和邊界

由於人工勢場法是一種路徑規劃方法,所以我們需要事先設定目標點、機械人起點和邊界。這些參數的設置需要根據實際情況進行調整,我們在這裡設置了一個二維障礙物數組。

goal=[90 90];
q_start=[10 10];
boundary=[0 100 0 100];
obstacles= [30 30 10;
               50 50 10;
               70 70 10];

3. 隨機搜索

隨機搜索是人工勢場法的一個重要部分,它用來確定機械人當前所處的位置。在這個實例中,我們採用了隨機漫步的方式進行搜索,代碼如下:

for i=1:5000
    q_rand = ceil(rand(1,2)*100);
    dist=[];
    for j=1:size(q_rand,1)
        dist(j)=magnitude(q_rand(j,:),goal);
    end
    [val,id]=min(dist);
    q_nearest=q_rand(id,:);
    if collisionDetect(q_nearest,obstacles)
        continue;
    end
    if (val<5)
         quiver(q_nearest(1),q_nearest(2),0,10,0,'filled','MaxHeadSize', 0.8); 
         hold all;
         break;
    end

在這裡,我們通過隨機漫步的方式找到了機械人的當前位置,並計算了機械人和目標點的距離。如果機械人和障礙物相交,我們就跳過這一步,再重新進行一次隨機漫步,直到找到不與障礙物相交的點為止。如果機械人到目標點的距離小於5,我們就認為機械人到達了終點,直接繪製機械人運動軌跡並退出程序。

4. 計算q_new

計算q_new的過程與隨機搜索類似,我們從q_nearest開始向目標點進行探索,最終找到一個最近距離的點q_new,代碼如下:

x=q_nearest;
y=goal;
unitvector=(y-x)/norm(y-x);
angle=atan2(unitvector(2),unitvector(1));
mindis=10;
dis=2*mindis;
q_new=[];
for j=-pi/3:0.1:pi/3
    l=mindis*[cos(angle+j),sin(angle+j)];
    if l(1)boundary(2) || l(2)boundary(4)
        continue
    end
    if collisionDetect(l,obstacles)
        continue
    end
    if magnitude(l,goal)<dis
        dis=magnitude(l,goal);
        q_new=l;
    end
end
if norm(q_new)==0
    q_new=10*unitvector+q_nearest;
end

在這裡,我們首先計算了目標點和當前點q_nearest的單位向量unitvector,然後設置了一個最小距離mindis。隨後,我們定義了一個角度範圍[-pi/3, pi/3],通過遍歷這個範圍內的點來找到最近距離的點q_new。如果在隨機探索範圍內找不到最近距離的點,我們就通過機械人當前的前進方向來設置一個默認的q_new。

5. 人工勢場法求解機械人運動方向

在人工勢場法中,我們需要計算機械人的向目標點前進的方向fgoal和避障方向fobs,然後將兩個方向相加得到機械人的運動方向fq。最後,通過將q_new和fq相加,得到機械人的新位置q,代碼如下:

delta=0.5;
eta=2;
fgoal=(goal-q_new)/magnitude(goal-q_new)*delta;
fobs=frep(q_new,obstacles,eta);
fq=fgoal+fobs;
q=q_new+fq;

其中,delta和eta是兩個重要的參數,用來控制機械人向目標點和避免障礙物的方向。在我們的代碼中,delta=0.5,eta=2。

6. 碰撞檢測

碰撞檢測是人工勢場法中不可或缺的一個部分,它可以幫助機械人避開障礙物。在我們的代碼中,我們通過判斷機械人是否與障礙物相交來進行碰撞檢測,代碼如下:

function collision= collisionDetect(q,obstacles)
collision=0;
for i=1:size(obstacles,1)
    if magnitude(q,obstacles(i,1:2))<obstacles(i,3)
        collision=1;
        return;
    end
end
end

如果機械人與障礙物相交,我們就返回1,否則返回0。

7. 避障向量計算

在計算避障方向fobs時,我們通過計算機械人與障礙物之間的距離,來調整機械人的運動方向。具體來說,我們用下面的公式來計算fobs:

fobs=(q-p)*eta(1/d-1/ro)/(d^3)

其中,q表示機械人的當前位置,p表示障礙物的位置,d表示機械人與障礙物之間的距離,ro表示障礙物的觸發距離,eta表示控制避障力度的參數。

在我們的代碼中,計算避障向量的函數如下:

function fobs= frep(q,obstacles,eta)
n=size(obstacles,1);
fobs=[0,0];
for i=1:n
    p=obstacles(i,1:2);
    d=magnitude(p,q);
    if d<obstacles(i,3)
        fobs=fobs-(q-p)*eta*(1/d-1/obstacles(i,3))/(d^3);
    end        
end
fobs=fobs';
end

四、總結

本文簡要介紹了人工勢場法的實現方法,並通過一個完整的Matlab代碼示例,對人工勢場法的各個方面進行了詳細的介紹和闡述。通過本文的學習,相信讀者已經可以理解人工勢場法的基本原理和實現方式,並可以根據自己的需要進行代碼的修改和運用。

原創文章,作者:VUZJX,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/370457.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
VUZJX的頭像VUZJX
上一篇 2025-04-22 01:14
下一篇 2025-04-22 01:14

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在着手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • 怎麼寫不影響Python運行的長段代碼

    在Python編程的過程中,我們不可避免地需要編寫一些長段代碼,包括函數、類、複雜的控制語句等等。在編寫這些代碼時,我們需要考慮代碼可讀性、易用性以及對Python運行性能的影響。…

    編程 2025-04-29
  • Python愛心代碼動態

    本文將從多個方面詳細闡述Python愛心代碼動態,包括實現基本原理、應用場景、代碼示例等。 一、實現基本原理 Python愛心代碼動態使用turtle模塊實現。在繪製一個心形的基礎…

    編程 2025-04-29
  • 北化教務管理系統介紹及開發代碼示例

    本文將從多個方面對北化教務管理系統進行介紹及開發代碼示例,幫助開發者更好地理解和應用該系統。 一、項目介紹 北化教務管理系統是一款針對高校學生和教職工的綜合信息管理系統。系統實現的…

    編程 2025-04-29

發表回復

登錄後才能評論