主距演算法
A. 全面歸納距離和相似度計算方法
距離(distance,差異程度)、相似度(similarity,相似程度)方法可以看作是以某種的距離函數計算元素間的距離,這些方法作為機器學習的基礎概念,廣泛應用於如:Kmeans聚類、協同過濾推薦演算法、相似度演算法、MSE損失函數等等。本文對常用的距離計算方法進行歸納以及解析,分為以下幾類展開:
對於點x=(x1,x2...xn) 與點y=(y1,y2...yn) , 閔氏距離可以用下式表示:
閔氏距離是對多個距離度量公式的概括性的表述,p=1退化為曼哈頓距離;p=2退化為歐氏距離;切比雪夫距離是閔氏距離取極限的形式。
曼哈頓距離 公式:
歐幾里得距離公式:
如下圖藍線的距離即是曼哈頓距離(想像你在曼哈頓要從一個十字路口開車到另外一個十字路口實際駕駛距離就是這個「曼哈頓距離」,此即曼哈頓距離名稱的來源,也稱為城市街區距離),紅線為歐幾里得距離:
切比雪夫距離起源於國際象棋中國王的走法,國際象棋中國王每次只能往周圍的8格中走一步,那麼如果要從棋盤中A格(x1,y1)走到B格(x2,y2)最少需要走幾步?你會發現最少步數總是max(|x2-x1|,|y2-y1|)步。有一種類似的一種距離度量方法叫切比雪夫距離。
切比雪夫距離就是當p趨向於無窮大時的閔氏距離:
距離函數並不一定是距離度量,當距離函數要作為距離度量,需要滿足:
由此可見,閔氏距離可以作為距離度量,而大部分的相似度並不能作為距離度量。
閔氏距離也是Lp范數(如p==2為常用L2范數正則化)的一般化定義。
下圖給出了一個Lp球( ||X||p = 1 )的形狀隨著P的減少的可視化圖:
距離度量隨著空間的維度d的不斷增加,計算量復雜也逐增,另外在高維空間下,在維度越高的情況下,任意樣本之間的距離越趨於相等(樣本間最大與最小歐氏距離之間的相對差距就趨近於0),也就是維度災難的問題,如下式結論:
對於維度災難的問題,常用的有PCA方法進行降維計算。
假設各樣本有年齡,工資兩個變數,計算歐氏距離(p=2)的時候,(年齡1-年齡2)² 的值要遠小於(工資1-工資2)² ,這意味著在不使用特徵縮放的情況下,距離會被工資變數(大的數值)主導, 特別當p越大,單一維度的差值對整體的影響就越大。因此,我們需要使用特徵縮放來將全部的數值統一到一個量級上來解決此問題。基本的解決方法可以對數據進行「標准化」和「歸一化」。
另外可以使用馬氏距離(協方差距離),與歐式距離不同其考慮到各種特性之間的聯系是(量綱)尺度無關 (Scale Invariant) 的,可以排除變數之間的相關性的干擾,缺點是誇大了變化微小的變數的作用。馬氏距離定義為:
馬氏距離原理是使用矩陣對兩兩向量進行投影後,再通過常規的歐幾里得距離度量兩對象間的距離。當協方差矩陣為單位矩陣,馬氏距離就簡化為歐氏距離;如果協方差矩陣為對角陣,其也可稱為正規化的歐氏距離。
根據向量x,y的點積公式:
我們可以利用向量間夾角的cos值作為向量相似度[1]:
餘弦相似度的取值范圍為:-1~1,1 表示兩者完全正相關,-1 表示兩者完全負相關,0 表示兩者之間獨立。餘弦相似度與向量的長度無關,只與向量的方向有關,但餘弦相似度會受到向量平移的影響(上式如果將 x 平移到 x+1, 餘弦值就會改變)。
另外,歸一化後計算歐氏距離,等價於餘弦值:兩個向量x,y, 夾角為A,歐氏距離D=(x-y)^2 = x 2+y 2-2|x||y|cosA = 2-2cosA
協方差是衡量多維數據集中,變數之間相關性的統計量。如下公式X,Y的協方差即是,X減去其均值 乘以 Y減去其均值,所得每一組數值的期望(平均值)。
如果兩個變數之間的協方差為正值,則這兩個變數之間存在正相關,若為負值,則為負相關。
皮爾遜相關系數數值范圍也是[-1,1]。皮爾遜相關系數可看作是在餘弦相似度或協方差基礎上做了優化(變數的協方差除以標准差)。它消除每個分量標准不同(分數膨脹)的影響,具有平移不變性和尺度不變性。
卡方檢驗X2,主要是比較兩個分類變數的關聯性、獨立性分析。如下公式,A代表實際頻數;E代表期望頻數:
Levenshtein 距離是 編輯距離 (Editor Distance) 的一種,指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。允許的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。
像hallo與hello兩個字元串編輯距離就是1,我們通過替換」a「 為 」e「,就可以完成轉換。
漢明距離為兩個等長字元串對應位置的不同字元的個數,也就是將一個字元串變換成另外一個字元串所需要替換的字元個數。例如:1011101 與 1001001 之間的漢明距離是 2,「toned」 與 「roses」 之間的漢明距離是 3
另外的,對於字元串距離來說,不同字元所佔的份量是不一樣的。比如」我樂了「 與【「我怒了」,」我樂了啊」 】的Levenshtein 距離都是1,但其實兩者差異還是很大的,因為像「啊」這種語氣詞的重要性明顯不如「樂」,考慮字元(特徵)權重的相似度方法有:TF-IDF、BM25、WMD演算法。
Jaccard 取值范圍為0~1,0 表示兩個集合沒有重合,1 表示兩個集合完全重合。
但Dice不滿足距離函數的三角不等式,不是一個合適的距離度量。
基礎地介紹下信息熵,用來衡量一個隨機變數的不確定性程度。對於一個隨機變數 X,其概率分布為:
互信息用於衡量兩個變數之間的關聯程度,衡量了知道這兩個變數其中一個,對另一個不確定度減少的程度。公式為:
如下圖,條件熵表示已知隨機變數X的情況下,隨機變數Y的信息熵,因此互信息實際上也代表了已知隨機變數X的情況下,隨機變數Y的(信息熵)不確定性的減少程度。
JS 散度解決了 KL 散度不對稱的問題,定義為:
群體穩定性指標(Population Stability Index,PSI), 可以看做是解決KL散度非對稱性的一個對稱性度量指標,用於度量分布之間的差異(常用於風控領域的評估模型預測的穩定性)。
psi與JS散度的形式是非常類似的,如下公式:
PSI的含義等同P與Q,Q與P之間的KL散度之和。
DTW 距離用於衡量兩個序列之間的相似性,適用於不同長度、不同節奏的時間序列。DTW採用了動態規劃DP(dynamic programming)的方法來進行時間規整的計算,通過自動warping扭曲 時間序列(即在時間軸上進行局部的縮放),使得兩個序列的形態盡可能的一致,得到最大可能的相似度。(具體可參考[5])
圖結構間的相似度計算,有圖同構、最大共同子圖、圖編輯距離、Graph Kernel 、圖嵌入計算距離等方法(具體可參考[4][6])。
度量學習的對象通常是樣本特徵向量的距離,度量學習的關鍵在於如何有效的度量樣本間的距離,目的是通過訓練和學習,減小或限制同類樣本之間的距離,同時增大不同類別樣本之間的距離,簡單歸類如下[2]:
最後,附上常用的距離和相似度度量方法[3]:
B. 數碼相機的主距和焦距
LS的Copy太煩了,而且壓根沒回答。
其實很簡單,
主距:物鏡後節點到像平面的距離。
焦距:物體到焦平面的距離。
C. 高二數學空間距離的求法
1.點線之間距離的演算法
(1)作點到直線的垂線段,通過直角三角形的計算求得;
(2)點(m,n)到直線Ax+By+C=0的距離公式是:
d=(A m+B n+C)/根號(A²+B²)
2.點面之間的距離演算法
作點到平面的垂線段,通過直角三角形的計算求得;
3.異面直線之間的距離演算法
作異面直線a和b的公垂線段,通過計算求得
作法是:過直線a作任意平面與直線b交於點P,
過P作直線a的平行線c,由b和c確定平面(阿爾法)
過直線a上任意一點作到平面(阿爾法)的垂線段即是。
4.線面之間的距離演算法
(1)若直線平行於平面,直線上任意一點到平面的距離即是線面距離;
(2)若直線不平行於平面,則計算直線與該直線在平面內的射影之間的夾角便是。
D. 距離向量的演算法
距離向量演算法的思想很簡單:所有參加RIP協議的路由器周期性地向外廣播路由刷新報文,主要內容是由很多路由項(entry)組成的路由刷新報文。對路由來說,最主要的內容是目的地址和下一跳地址(next hop)。對動態路由協議來說,為了找到本協議概念中的最佳路由,還必須注重路由的開銷(metric)。所以路由項主要包括了目的地址、下一跳地址和路由開銷。其他的如路由標記(tag)等內容在講報文格式時,將具體講到。在設計時,每個路由器的另外RIP治理了一個路由資料庫,該路由資料庫為系統中所有可能的信宿包含一個路由項,並為每個信宿保留如下信息:
·目的地址:在演算法的IP實現中,這指的是主機或網路的IP 地址。
·下一跳地址:到信宿的路由中的第一個路由器。
·介面:用於到下一跳物理網路。
·metric值:一個數,指明本路由器到信宿的開銷。
·定時器:路由項最後一次被修改的時間。
·路由標記:區分路由為內部路由協議的路由還是外部路由協議的路由的標記。
資料庫由與系統直接相連的實體的描述初始化,通過從相鄰路由器受到的報文修改維護。
路由器間交換的最重要的信息是修改報文,參加路由維護計劃的路由器發送當前存在於實體的描述路由資料庫的路由修改報文。
僅通過相鄰路由器間交換路由信息是可以維護整個系統的最佳路由的,這在接下來的討論中會逐步得到證實。
距離向量演算法總是基於一個這樣的事實:路由資料庫中的路由已是目前通過報文交換而得到的最佳路由。同時,報文交換僅限於相鄰的實體間,也就是說,實體共享同一個網路。
當然,要定義路由是最佳的,就必須有衡量的辦法,這就用到前面所說的「metric」。RIP簡單的網路中,通常用可行路由所經的路由器數簡單地計算metric值。在復雜的網路中,metric一般代表該路由傳輸數據報的延遲或其它發送開銷。 令D(i,j)代表從實體i到實體j的最佳路由的metric值,d(i,j)代表從i直接到j的開銷,因為開銷是可加的,演算法中最佳路由如此獲取表示:
D(i,i)=0, 對所有的i
D(i,j)=MIN[d(i,k)+D(k,j)], 當i不等於k時
實體i從相鄰路由器k收到k到j的開銷的估計D(k,j),i將D(k,j)加上i到k的開銷估計d(i,k),i比較從所有相鄰路由器得到的數值,取得最小數,就得到了它到j的最佳路由。
E. 路由演算法的類型有
靜態路由演算法
1.Dijkstra演算法(最短路徑演算法)
Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。Dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的介紹,如數據結構,圖論,運籌學等等。Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN,CLOSE表的方式,這里均採用永久和臨時標號的方式。注意該演算法要求圖中不存在負權迴路。
Dijkstra演算法執行步驟如下:
步驟一:路由器建立一張網路圖,並且確定源節點和目的節點,在這個例子里我們設為V1和V2。然後路由器建立一個矩陣,稱為「鄰接矩陣」。在這個矩陣中,各矩陣元素表示權值。例如,[i,j]是節點Vi與Vj之間的鏈路權值。如果節點Vi與Vj之間沒有鏈路直接相連,它們的權值設為「無窮大」。
步驟二:路由器為網路中的每一個節點建立一組狀態記錄。此記錄包括三個欄位:
前序欄位———表示當前節點之前的節點。
長度欄位———表示從源節點到當前節點的權值之和。
標號欄位———表示節點的狀態。每個節點都處於一個狀態模式:「永久」或「暫時」。
步驟三:路由器初始化(所有節點的)狀態記錄集參數,將它們的長度設為「無窮大」,標號設為「暫時」。
步驟四:路由器設置一個T節點。例如,如果設V1是源T節點,路由器將V1的標號更改為「永久」。當一個標號更改為「永久」後,它將不再改變。一個T節點僅僅是一個代理而已。
步驟五:路由器更新與源T節點直接相連的所有暫時性節點的狀態記錄集。
步驟六:路由器在所有的暫時性節點中選擇距離V1的權值最低的節點。這個節點將是新的T節點。
步驟七:如果這個節點不是V2(目的節點),路由器則返回到步驟5。
步驟八:如果節點是V2,路由器則向前回溯,將它的前序節點從狀態記錄集中提取出來,如此循環,直到提取到V1為止。這個節點列表便是從V1到V2的最佳路由。
2.擴散法
事先不需要任何網路信息;路由器把收到的每一個分組,向除了該分組到來的線路外的所有輸出線路發送。將來會有多個分組的副本到達目的地端,最先到達的,可能是走了「最優」的路徑常見的擴散法是選擇性擴散演算法。
3.LS演算法
採用LS演算法時,每個路由器必須遵循以下步驟:
步驟一:確認在物理上與之相連的路由器並獲得它們的IP地址。當一個路由器開始工作後,它首先向整個網路發送一個「HELLO」分組數據包。每個接收到數據包的路由器都將返回一條消息,其中包含它自身的IP地址。
步驟二:測量相鄰路由器的延時(或者其他重要的網路參數,比如平均流量)。為做到這一點,路由器向整個網路發送響應分組數據包。每個接收到數據包的路由器返回一個應答分組數據包。將路程往返時間除以2,路由器便可以計算出延時。(路程往返時間是網路當前延遲的量度,通過一個分組數據包從遠程主機返回的時間來測量。)該時間包括了傳輸和處理兩部分的時間——也就是將分組數據包發送到目的地的時間以及接收方處理分組數據包和應答的時間。
步驟三:向網路中的其他路由器廣播自己的信息,同時也接收其他路由器的信息。
在這一步中,所有的路由器共享它們的知識並且將自身的信息廣播給其他每一個路由器。這樣,每一個路由器都能夠知道網路的結構以及狀態。
步驟四:使用一個合適的演算法,確定網路中兩個節點之間的最佳路由。
F. 凸透鏡焦距怎麼算
凸透鏡焦距演算法如下:
可以通過透鏡的成像規律來計算焦距:1/u物距+1/v像距=1/f透鏡焦距,其中物距u恆取正值。像距v的正負由像的實虛來確定,實像時v為正,虛像時v為負。凸透鏡的f為正值,凹透鏡的f為負值。
二、凸透鏡原理
凸透鏡擁有放大作用。凸透鏡二倍焦距分大小,一倍焦距分實虛正倒。將平行光線如陽光平行於主光軸凸透鏡兩個球面的球心的連線稱為此透鏡的主光軸射入凸透鏡,光在透鏡的兩面經過兩次折射後,集中在軸上的一點,此點叫做凸透鏡的焦點記號為F、凸透鏡在鏡的兩側各有一實焦點,如為薄透鏡時,此兩焦點至透鏡中心的距離大致相等。
G. 齒輪齒距怎麼計算
1、模數m=齒距p/圓周率π
2、齒距p=模數m*圓周率π
3、咬合中線Ho=齒條高Hk-模數m
4、模數m=齒距p/(圓周率π*三角函數cosB)
5、齒距p=模數m*(圓周率π*三角函數cosB)
6、咬合中線Ho=齒條高Hk-模數m
註:標准斜齒條角度19.5283度(19度31分42秒),三角函數cosB=0.9424764995。
H. 怎樣得出自己的拉距的演算法公式(顯擺篇)
拉鋸=臂展除以2.5再除以2.54取整數(最後單位英寸)(臂展=左手中指尖到右手中指尖的距離)
I. 從感測器到演算法原理,機器人視覺避障原來是這樣的
避障是指移動機器人在行走過程中,通過感測器感知到在其規劃路線上存在靜態或動態障礙物時,按照 一定的演算法實時更新路徑,繞過障礙物,最後達到目標點。
避障常用哪些感測器?
不管是要進行導航規劃還是避障,感知周邊環境信息是第一步。就避障來說,移動機器人需要通過感測器 實時獲取自身周圍障礙物信息,包括尺寸、形狀和位置等信息。避障使用的感測器多種多樣,各有不同的原理和特點,目前常見的主要有視覺感測器、激光感測器、紅外感測器、超聲波感測器等。下面我簡單介紹一下這幾種感測器的基本工作原理。
超聲波
超聲波感測器的基本原理是測量超聲波的飛行時間,通過d=vt/2測量距離,其中d是距離,v是聲速,t是 飛行時間。由於超聲波在空氣中的速度與溫濕度有關,在比較精確的測量中,需把溫濕度的變化和其它因素考慮進去。
上面這個圖就是超聲波感測器信號的一個示意。通過壓電或靜電變送器產生一個頻率在幾十kHz的超聲波脈沖組成波包,系統檢測高於某閾值的反向聲波,檢測到後使用測量到的飛行時間計算距離。超聲波感測器一般作用距離較短,普通的有效探測距離都在幾米,但是會有一個幾十毫米左右的最小探測盲區。由於超聲感測器的成本低、實現方法簡單、技術成熟,是移動機器人中常用的感測器。超聲波感測器也有一些缺點,首先看下面這個圖。
因為聲音是錐形傳播的,所以我們實際測到的距離並不是 一個點,而是某個錐形角度范圍內最近物體的距離。
另外,超聲波的測量周期較長,比如3米左右的物體,聲波傳輸這么遠的距離需要約20ms的時間。再者,不同材料對聲波的反射或者吸引是不相同的,還有多個超聲感測器之間有可能會互相干擾,這都是實際應用的過程中需要考慮的。
紅外
一般的紅外測距都是採用三角測距的原理。紅外發射器按照一定角度發射紅外光束,遇到物體之後,光會反向回來,檢測到反射光之後,通過結構上的幾何三角關系,就可以計算出物體距離D。
當D的距離足夠近的時候,上圖中L值會相當大,如果超過CCD的探測范圍,這時,雖然物體很近,但是感測器反而看不到了。當物體距離D很大時,L值就會很小,測量量精度會變差。因此,常見的紅外感測器 測量距離都比較近,小於超聲波,同時遠距離測量也有最小距離的限制。另外,對於透明的或者近似黑體的物體,紅外感測器是無法檢測距離的。但相對於超聲來說,紅外感測器具有更高的帶寬。
激光
常見的激光雷達是基於飛行時間的(ToF,time of flight),通過測量激光的飛行時間來進行測距d=ct/2,類似於前面提到的超聲測距公式,其中d是距離,c是光速,t是從發射到接收的時間間隔。激光雷達包括發射器和接收器 ,發射器用激光照射目標,接收器接收反向回的光波。機械式的激光雷達包括一個帶有鏡子的機械機構,鏡子的旋轉使得光束可以覆蓋 一個平面,這樣我們就可以測量到一個平面上的距離信息。
對飛行時間的測量也有不同的方法,比如使用脈沖激光,然後類似前面講的超聲方案,直接測量佔用的時間,但因為光速遠高於聲速,需要非常高精度的時間測量元件,所以非常昂貴;另一種發射調頻後的連續激光波,通過測量接收到的反射波之間的差頻來測量時間。
圖一
圖二
比較簡單的方案是測量反射光的相移,感測器以已知的頻率發射一定幅度的調制光,並測量發射和反向信號之間的相移,如上圖一。調制信號的波長為lamda=c/f,其中c是光速,f是調制頻率,測量到發射和反射光束之間的相移差theta之後,距離可由lamda*theta/4pi計算得到,如上圖二。
激光雷達的測量距離可以達到幾十米甚至上百米,角度解析度高,通常可以達到零點幾度,測距的精度也高。但測量距離的置信度會反比於接收信號幅度的平方,因此,黑體或者遠距離的物體距離測量不會像光亮的、近距離的物體那麼好的估計。並且,對於透明材料,比如玻璃,激光雷達就無能為力了。還有,由於結構的復雜、器件成本高,激光雷達的成本也很高。
一些低端的激光雷達會採用三角測距的方案進行測距。但這時它們的量程會受到限制,一般幾米以內,並且精度相對低一些,但用於室內低速環境的SLAM或者在室外環境只用於避障的話,效果還是不錯的。
視覺
常用的計算機視覺方案也有很多種, 比如雙目視覺,基於TOF的深度相機,基於結構光的深度相機等。深度相機可以同時獲得RGB圖和深度圖,不管是基於TOF還是結構光,在室外強光環境下效果都並不太理想,因為它們都是需要主動發光的。
像基於結構光的深度相機,發射出的光會生成相對隨機但又固定的斑點圖樣,這些光斑打在物體上後,因為與攝像頭距離不同,被攝像頭捕捉到的位置也不相同,之後先計算拍到的圖的斑點與標定的標准圖案在不同位置的偏移,利用攝像頭位置、感測器大小等參數就可以計算出物體與攝像頭的距離。而我們目前的E巡機器人主要是工作在室外環境,主動光源會受到太陽光等條件的很大影響,所以雙目視覺這種被動視覺方案更適合,因此我們採用的視覺方案是基於雙目視覺的。
雙目視覺的測距本質上也是三角測距法,由於兩個攝像頭的位置不同,就像我們人的兩隻眼睛一樣,看到的物體不一樣。兩個攝像頭看到的同一個點P,在成像的時候會有不同的像素位置,此時通過三角測距就可以測出這個點的距離。與結構光方法不同的是,結構光計算的點是主動發出的、已知確定的,而雙目演算法計算的點一般是利用演算法抓取到的圖像特徵,如SIFT或SURF特徵等,這樣通過特徵計算出來的是稀疏圖。
要做良好的避障,稀疏圖還是不太夠的,我們需要獲得的是稠密的點雲圖,整個場景的深度信息。稠密匹配的演算法大致可以分為兩類,局部演算法和全局演算法。局部演算法使用像素局部的信息來計算其深度,而全局演算法採用圖像中的所有信息進行計算。一般來說,局部演算法的速度更快,但全局演算法的精度更高。
這兩類各有很多種不同方式的具體演算法實現。能過它們的輸出我們可以估算出整個場景中的深度信息,這個深度信息可以幫助我們尋找地圖場景中的可行走區域以及障礙物。整個的輸出類似於激光雷達輸出的3D點雲圖,但是相比來講得到信息會更豐富,視覺同激光相比優點是價格低很多,缺點也比較明顯,測量精度要差 一些,對計算能力的要求也高很多。當然,這個精度差是相對的,在實用的過程中是完全足夠的,並且我們目前的演算法在我們的平台NVIDIA TK1和TX1上是可以做到實時運行。
KITTI採集的圖
實際輸出的深度圖,不同的顏色代表不同的距離
在實際應用的過程中,我們從攝像頭讀取到的是連續的視頻幀流,我們還可以通過這些幀來估計場景中 目標物體的運動,給它們建立運動模型,估計和預測它們的運動方向、運動速度,這對我們實際行走、避障規劃是很有用的。
以上幾種是最常見的幾種感測器 ,各有其優點和缺點,在真正實際應用的過程中,一般是綜合配置使用多種不同的感測器 ,以最大化保證在各種不同的應用和環境條件下,機器人都能正確感知到障礙物信息。我們公司的E巡機器人的避障方案就是以雙目視覺為主,再輔助以多種其他感測器,保證機器人周邊360度空間立體范圍內的障礙物都能被有效偵測到,保證機器人行走的安全性。
避障常用演算法原理
在講避障演算法之前,我們假定機器人已經有了一個導航規劃演算法對自己的運動進行規劃,並按照規劃的路徑行走。避障演算法的任務就是在機器人執行正常行走任務的時候,由於感測器的輸入感知到了障礙物的存在,實時地更新目標軌跡,繞過障礙物。
Bug演算法知乎用戶無方表示
Bug演算法應該是最簡單的一種避障演算法了,它的基本思想是在發現障礙後,圍著檢測到的障礙物輪廓行走,從而繞開它。Bug演算法目前有很多變種, 比如Bug1演算法,機器人首先完全地圍繞物體,然後從距目標最短距離的點離開。Bug1演算法的效率很低,但可以保證機器人達到目標。
Bug1演算法示例
改進後的Bug2演算法中,機器人開始時會跟蹤物體的輪廓,但不會完全圍繞物體一圈,當機器人可以直接移動至目標時,就可以直接從障礙分離,這樣可以達到比較短的機器人行走總路徑。
Bug2演算法示例
除此之外,Bug演算法還有很多其他的變種, 比如正切Bug演算法等等。在許多簡單的場景中,Bug演算法是實現起來比較容易和方便的,但是它們並沒有考慮到機器人的動力學等限制,因此在更復雜的實際環境中就不是那麼可靠好用了。
勢場法(PFM)
實際上,勢場法不僅僅可以用來避障,還可以用來進行路徑的規劃。勢場法把機器人處理在勢場下的 一個點,隨著勢場而移動,目標表現為低谷值,即對機器人的吸引力,而障礙物扮演的勢場中的一個高峰,即斥力,所有這些力迭加於機器人身上,平滑地引導機器人走向目標,同時避免碰撞已知的障礙物。當機器人移動過程中檢測新的障礙物,則需要更新勢場並重新規劃。
上面這個圖是勢場比較典型的示例圖,最上的圖a左上角是出發點,右下角是目標點,中間三個方塊是障礙物。中間的圖b就是等勢點陣圖,圖中的每條連續的線就代表了一個等勢位的一條線,然後虛線表示的在整個勢場裡面所規劃出來的一條路徑,我們的機器人是沿著勢場所指向的那個方向一直行走,可以看見它會繞過這個比較高的障礙物。
最下面的圖,即我們整個目標的吸引力還有我們所有障礙物產生的斥力最終形成的一個勢場效果圖,可以看到機器人從左上角的出發點出發,一路沿著勢場下降的方向達到最終的目標點,而每個障礙物勢場表現出在很高的平台,所以,它規劃出來的路徑是不會從這個障礙物上面走的。
一種擴展的方法在基本的勢場上附加了了另外兩個勢場:轉運勢場和任務勢場。它們額外考慮了由於機器人本身運動方向、運動速度等狀態和障礙物之間的相互影響。
轉動勢場考慮了障礙與機器人的相對方位,當機器人朝著障礙物行走時,增加斥力, 而當平行於物體行走時,因為很明顯並不會撞到障礙物,則減小斥力。任務勢場則排除了那些根據當前機器人速度不會對近期勢能造成影響的障礙,因此允許規劃出 一條更為平滑的軌跡。
另外還有諧波勢場法等其他改進方法。勢場法在理論上有諸多局限性, 比如局部最小點問題,或者震盪性的問題,但實際應用過程中效果還是不錯的,實現起來也比較容易。
向量場直方圖(VFH)
它執行過程中針對移動機器人當前周邊環境創建了一個基於極坐標表示的局部地圖,這個局部使用柵格圖的表示方法,會被最近的一些感測器數據所更新。VFH演算法產生的極坐標直方圖如圖所示:
圖中x軸是以機器人為中心感知到的障礙物的角度,y軸表示在該方向存在障礙物的概率大小p。實際應用的過程中會根據這個直方圖首先辨識出允許機器人通過的足夠大的所有空隙,然後對所有這些空隙計算其代價函數,最終選擇具有最低代價函數的通路通過。
代價函數受三個因素影響:目標方向、機器人當前方向、之前選擇的方向,最終生成的代價是這三個因素的加權值,通過調節不同的權重可以調整機器人的選擇偏好。VFH演算法也有其他的擴展和改進,比如在VFH+演算法中,就考慮了機器人運動學的限制。由於實際底層運動結構的不同,機器的實際運動能力是受限的,比如汽車結構,就不能隨心所欲地原地轉向等。VFH+演算法會考慮障礙物對機器人實際運動能力下軌跡的阻擋效應,屏蔽掉那些雖然沒有被障礙物占據但由於其阻擋實際無法達到的運動軌跡。我們的E巡機器人採用的是兩輪差動驅動的運動形式,運動非常靈活,實際應用較少受到這些因素的影響。
具體可以看 一下這個圖示:
類似這樣傳統的避障方法還有很多,除此之外,還有許多其他的智能避障技術,比如神經網路、模糊邏輯等。
神經網路方法對機器人從初始位置到目標位置的整個行走路徑進行訓練建模,應用的時候,神經網路的輸 入為之前機器人的位姿和速度以及感測器的輸 入,輸出期望的下一目標或運動方向。
模糊邏輯方法核心是模糊控制器,需要將專家的知識或操作人員的經驗寫成多條模糊邏輯語句,以此控制機器人的避障過程。比如這樣的模糊邏輯:第一條,若右前方較遠處檢測到障礙物,則稍向左轉;第 二條,若右前方較近處檢測到障礙物,則減速並向左轉更多角度等等。