CS373無人駕駛汽車編程課程講義翻譯一:定位

本文翻譯自Udacity上Sebastian Thrun開設的Artificial Intelligence for Robotics(機器人人工智慧)課程筆記Lesson1Notes,正文如下:

簡介

在這門課程中你將學習如何編程無人駕駛汽車!具體來說,在本單元中,你將學習如何編寫一個定位器,這是一種定向輔助功能,用於幫助機器做出明智的導航決策。

在過去十年中,計算機科學家已經開發出利用感測器、雷達和軟體來對車輛進行編程的方法,這些車輛能夠感知自己的位置、其他車輛的位置和導航路線。

斯坦福大學教授兼斯坦福人工智慧實驗室主任,Sebastian Thrun的無人駕駛汽車:Stanley和Junior,說明了過去十年來在這一領域取得的進展。此外,Google無人駕駛汽車項目旨在進一步研究和開發,使無人駕駛汽車成為世界各地人們可行的選擇。無人駕駛汽車聽起來不錯,想自己編程嗎?

讓我們開始吧!

定位問題

定位是機器在空間中定位自身的能力。

考慮一個在空間中迷失的機器人。在其環境中,機器人如何找到它的位置?

我們將要編寫一個程序來實現定位,而不是在我們的機器人中安裝GPS設備。

與GPS設備相比,我們的定位程序將大大減少誤差範圍,GPS設備的誤差範圍可高達10米。為了使我們的機器人能夠成功準確地自身導航通過空間,我們期望兩者之間的誤差範圍為10厘米。

想像一個機器人居住在一個一維的世界中,就像一條直線上的某個地方,它不知道自己在這個世界的哪裡。 以這樣一個世界為例,我們可以想像一個漫長而狹窄的走廊,只能向前或向後移動;橫向運動是不可能的。

由於我們的機器人對其位置完全無知,所以它認為,這個一維世界中的每個點都可能是其所在的位置。我們可以用數學方式來描述機器人的概率函數在樣本空間(在這種情況下,是機器人的一維世界)上是均勻的(相同的)。

如果我們以縱軸為概率、橫軸為所處位置畫出概率函數的圖像,我們將繪製出一條直的水平線。這條線描述了一個均勻的概率函數,它代表了最大混淆的狀態。

假設有三個標誌物,是三個看起來都一樣的門,我們可以從無門區域區分出門來。

如果機器人感知到它是在門旁邊,這將如何影響我們的信度?或者說機器人靠近門的概率?

在新函數中,有三個凸起與門的位置對齊。由於機器人剛剛感知到它靠近門,它給這些位置分配了更大的概率(由圖中的凸起表示),而所有其他地方都減少了信度。

這個函數表示另一種概率分布,稱為後驗信度,即在機器人的感知測量之後定義函數。

後驗函數是機器人當前信度的最佳表示,其中每個凸起代表機器人對其位置相對於門的評估。

然而,測量不良的可能性不斷籠罩著機器人技術,在這個課程的過程中,我們將看到各種方法來處理這個問題。

機器人運動

如果機器人向右移動一定距離,我們可以根據運動移動信度。

請注意,所有的凸起也會向右移動,正如我們預期的那樣。然而,令人驚訝的是,這些凸起並沒有完全改變。他們也扁平化了。這種扁平化是由於機器人運動的不確定性:由於機器人不知道它已經移動了多遠,所以其認識變得不那麼精確,因此凸起變得不那麼尖銳。

當我們移動和扁平化這些凸起時,我們正在執行卷積。卷積是一種數學運算,它接受兩個函數並測量它們的重疊。更具體地說,當你把一個函數滑到另一個函數時,它測量重疊的數量。例如,如果兩個函數具有零重疊,則它們的卷積值將等於0。

如果它們完全重疊,它們的卷積將等於1。當我們在這兩個極端情況之間滑動時,卷積將取值在0和1之間。這裡和這裡的動畫應該有助於澄清這個概念。

在我們的卷積中,第一個函數是信度函數(上面標記為「posterior」),第二個函數是描述移動距離的函數,我們稍後將會深入討論。這個卷積的結果是下方所示的偏移和扁平的信度函數。

現在,假設在機器人移動之後,它再次感知到自己在門旁,以致於測量與以前相同。就像我們的第一次測量之後,門的感測將會在任何有門的地方通過某種因素增加我們的概率函數。

那麼,我們會在第一次測量之後得到相同的後驗信度嗎?不會的!因為這次與我們的第一次測量不同,當時我們處於最大不確定狀態,而這次我們在感知之前就會對我們的位置有所了解。這個先前的信息,連同門的第二次感測,結合起來會給我們一個新的概率分布,如下圖所示。

在這個圖中,我們看到一些小小的凸起,但只有一個尖峰。這個峰值對應於第二扇門。我們已經在數學上解釋了這一點,但讓我們直覺地看看發生了什麼。首先,我們看到了第一扇門。這導致我們相信我們在一些門附近,但我們不知道是哪個。然後我們移動並看到另一扇門。我們連續看到兩扇門!那麼當然,我們的概率函數應該在我們期望連續看到兩個門的唯一位置附近有一個主峰。

再一次,重要的是要注意,我們仍然不能確定我們的位置,但經過兩次測量,我們比在第一次或第零次測量之後更加確信。當我們做出越來越多的測量時,你認為會發生什麼?

祝賀你!現在你理解了概率定位!你剛才學習的定位類型被稱為蒙特卡羅定位,也稱為直方圖濾波器

練習

問題1(均勻概率測驗)

如果機器人可以處在5個網格單元格之一,標記為 X_{i},令i = 1...5,每個 X_{i} 的概率是多少?

答案1(均勻概率測驗)

P( X_{i} )=0.2

問題2(均勻分布測試)

修改空列表:

p = []n

使得 p 在五個網格單元上成為均勻分布,表示為五個概率的向量。例如,機器人在單元格二中的概率可以寫為:

p[2] = 0.2n

並且給定機器人在每個單元格中具有相同的概率,你也可以寫出機器人在單元格5中的概率:

p[5] = 0.2n

對於python的複習,這裡的鏈接將是有幫助的。

答案2(均勻分布測試)

一個簡單的解決方案是指定列表 p 中的每個元素。

p = [0.2, 0.2, 0.2, 0.2, 0.2]nprint pnn[0.2, 0.2, 0.2, 0.2, 0.2]n

問題3(廣義均勻分布)

修改代碼以創建任意大小為 n 的概率向量 p ,例如取:

n=5n

幫助我們驗證我們的解決方案是否適應以前的解決方案。

答案3(廣義均勻分布)

使用 for 循環:

#define global variables p and n.np = []nn = 5n#Use a for loop to search for a cell, i, in a world with a given nnnfor i in range(n)n#Append to the list n elements each of size one over n. Remember to use floating point numbersnn p.append(1./n)nnprint pn

如果我們忘記使用浮點運算,python會將我們的除法解釋為整數除法。 由於1除以5得0,餘數是1,我們的錯誤結果將是[0,0,0,0,0]。

現在我們可以使 p 成為均勻概率分布,而不考慮由 n 指定的可用單元格的數量。

問題4(感知之後的概率)

現在我們可以建立機器人對其在世界中的位置的初始信度,我們希望通過機器人的感測器測量來更新這些信度。

檢查機器人在具有五個單元格x1至x5的世界中的測量。

假說我們知道外部的兩個單元格(x2和x3)是紅色的,另外三個(x1,x4和x5)是綠色的。 我們也知道我們的機器人感知到它駐留在一個紅色的單元格中。

這將如何影響機器人對其在世界中所處位置的信度?

已經知道機器人感知到自己在紅色單元格中,讓我們更新信度向量,使我們更有可能駐留在紅色的單元格中,並且不太可能駐留在綠色單元格中。

為此,基於機器人的「紅色」測量結果,提出一個簡單的規則來表示機器人在紅色或綠色單元格中的概率:

red cells * 0.6ngreen cells * 0.2n

現在,我們已經任意選擇了這些,但是由於0.6是0.2的三倍大,所以這會增加在紅單元格中的概率,比如三倍。

請記住,我們的感測器可能是不正確的,所以我們不希望將綠色單元格的概率乘以零。

機器人在紅色單元格中的概率是多少以及它在綠色單元格中的概率?

答案4(感知之後的概率)

通過將先前的信度(每個單元格是0.2)乘以新因子來尋找每個單元格的概率,這個新因子的值取決於單元格的顏色。

For red cells, 0.2*0.6 = .12nFor green cells, 0.2*0.2 = 0.04n

所以這些是我們的概率?

問題5(計算總和)

不! 這些不是我們的概率,因為它們相加不等於1。 由於我們知道我們在某個單元格中,所以個體概率必須加起來等於1。 現在我們稱之為非標準化概率分布

那麼,我們如何標準化我們的分布?

首先,找出個體概率的當前和。 然後,找到適當的概率分布。 概率分布是表示任何變數 i 的概率的函數, i 取特定值。

如果你有一個合適的概率分布,計算值的總和看看——總和應該是1。

答案5(計算總和)

由於單元格的總和不是1,所以我們更新的分布不是適當的概率分布。

問題6(標準化分布)

為了獲得概率分布,將每個框中的數字除以總和0.36。

答案6(標準化分布)

  • 綠色單元格 = 1/9
  • 紅色單元格= 1/3

這個概率分布寫成: P( X_{i} |Z)

並讀為:測量Z給出位置 X_{i}後驗分布,Z是來自機器人感測器的測量。 這是條件概率的一個例子。 如果你需要更多關於此主題的幫助,此視頻可能有所幫助。

問題7(pHit和pMiss)

從我們的最大混淆狀態開始

p = [0.2, 0.2, 0.2, 0.2, 0.2]n

我們想編寫一個程序,它會將每個條目乘以適當的因子:pHit或pMiss。

我們可以先不用擔心這個分布是否總和為1(無論是否標準化),都可以開始。 正如我們在最後幾個問題中所展示的那樣,我們可以很容易地將其標準化。

寫出一段代碼在相應的位置乘以pHit和pMiss之後輸出p。

  • pHit = 0.6 → 匹配測量結果的因子
  • pMiss = 0.2 → 不匹配測量結果的因子

答案7(pHit和pMiss)

執行此操作的一種方法是遍歷所有五種情況,並手動乘以pMiss或pHit的情況:

p = [0.2, 0.2, 0.2, 0.2, 0.2)npHit = 0.6npMiss = 0.2np[0] = p[0]*pMissnp[1] = p[1]*pHitnp[2] = p[2]*pHitnp[3] = p[3]*pMissnp[4] = p[4]*pMissnprint pnn0.040000000000000008, 0.12, 0.12, 0.040000000000000008, 0.040000000000000008n

問題8(概率之和)

我們知道這不是一個有效的分布,因為它的總和不是1。 在我們標準化這種分布之前,我們需要計算單個概率的總和。

修改程序,以便得到所有p的總和。

答案8(概率之和)

使用Python的sum函數:

p = [0.2, 0.2, 0.2, 0.2, 0.2)npHit = 0.6npMiss = 0.2np[0] = p[0]*pMissnp[1] = p[1]*pHitnp[2] = p[2]*pHitnp[3] = p[3]*pMissnp[4] = p[4]*pMissnprint sum(p)nn0.36n

問題9(感知函數)

我們通過引入一個變數world來指定每個單元格的顏色——紅色或綠色,以使我們的代碼更加優雅。

p = [0.2, 0.2, 0.2, 0.2, 0.2]n#introduce variable worldnworld = [green, red, red, green, green]npHit = 0.6npMiss = 0.2n

此外,假設機器人感知到它在一個紅色的單元格,所以我們定義測量Z為紅色:

p = [0.2, 0.2, 0.2, 0.2, 0.2]nworld = [green, red, red, green, green]nn#define the measurement Z to be rednZ = rednpHit = 0.6npMiss = 0.2n

定義一個叫做sense的測量更新的函數,它將初始分布 p 和測量 Z 作為輸入。

啟用該函數以輸出 q 的非標準化分布,其中 q 根據相應世界單元格中的顏色是紅色(命中)還是綠色(缺失),反映pHit值或pMiss的輸入概率(0.2)的非標準化結果。

p = [0.2, 0.2, 0.2, 0.2, 0.2]nworld = [green, red, red, green, green]nZ = rednpHit = 0.6npMiss = 0.2ndef sense(p, Z):n #Define a function sensenn return qnprint sense(p, Z)n

當你得到 q 時,您應該期望獲得與問題6相同的向量答案,但現在我們將使用函數計算它。 此函數適用於任何可能的Z(紅色或綠色)和任何有效的 p[] 。

答案9(感知函數)

步驟1:一種方法如下:

p = [0.2, 0.2, 0.2, 0.2, 0.2)nworld = [green, red, red, green, green]nZ = rednpHit = 0.6npMiss = 0.2nndef sense(p, Z):n q = [ ]n for i in range(len(p)):n hit = (Z == world[i])n q.append(p[i] * (hit * pHit + (1--hit) * pMiss))n return qnnprint sense(p, Z)n

當測量與 world 當前條目相同時,該代碼設置 hit 等於1,否則為0。當hit=1時,下一行附加到列表q[]等於p[i] * pHit的條目,當hit = 0時,p [i] * pMiss。

這將給我們一個非標準化分布。「二進位標誌」是指以下代碼:(hit * pHit +(1-hit)* pMiss)。這個名字來自於一個事實,即當項(hit)是1時,項(1-hit)是零,反之亦然。

問題10(標準化感知函數)

修改這個代碼,使其對感知函數的輸出進行標準化,並且加起來等於1。

答案10(標準化感知函數)

p = [0.2, 0.2, 0.2, 0.2, 0.2]nworld = [green, red, red, green, green]nZ = rednpHit = 0.6npMiss = 0.2ndef sense(p, Z):n q = [ ]n for i in range(len(p)):n hit = (Z == world[i])n q.append(p[i] * (hit * pHit + (1--hit) * pMiss))nn #First, compute the sum of vector q, using the sum functionn s = sum(q)n for i in range (len(p)):n # normalize by going through all the elements in q and divide by sn q[i]=q[i]/sn return qnnprint sense(p, Z)nn[0.1, 0.3, 0.3, 0.1, 0.1]n

問題11(測試感知函數)

嘗試在你的感知的測量變數Z中輸入綠色,然後重新運行代碼以查看是否獲得正確的結果。

答案11(測試感知函數)

p = [0.2, 0.2, 0.2, 0.2, 0.2]nworld = [green, red, red, green, green]n#Make green your Z, measurement variable, and re-run your code to see if you get the correct resultnZ = greennpHit = 0.6npMiss = 0.2ndef sense(p, Z):n q = []n for i in range(len(p)):n hit = (Z == world[i])n q.append(p[i] * (hit * pHit + (1--hit) * pMiss))nn s = sum(q)n for i in range (len(p)):n q[i] = q[i]/sn return qnprint sense(p, Z)nn[0.27, 0.09, 0.09, 0.27, 0.27]n

這個輸出看起來不錯。 現在,綠色單元格的概率都比紅色單元格高。視頻中提到的「除以44」來自於標準化步驟中我們除以總和。在這種情況下的總和是0.44。

問題12(多次測量)

通過用測量向量替換Z來進行多次測量,從而修改代碼。

假設機器人將感知到紅色,然後是綠色。

你能修改代碼以使其更新概率兩次,並在兩次測量後結合給出後驗分布,以便可以處理任何測量序列,無論長度如何嗎?

答案12(多次測量)

p = [0.2, 0.2, 0.2, 0.2, 0.2]nworld = [green, red, red, green, green]n#Replace Z with measurements vector and assume the robot is going to sense red, then greennmeasurements = [red, green]npHit = 0.6npMiss = 0.2ndef sense(p, Z):n q = []n for i in range(len(p)):n hit = (Z == world[i])n q.append(p[i] * (hit * pHit + (1--hit) * pMiss))n s = sum(q)n for i in range (len(p)):n q[i] = q[i]/sn return qnfor k in range(len(measurements)):n p = sense(p, measurements[k])n print pn #run this twice and get back the uniform distribution:n

此代碼定義了感知函數,然後每次測量時調用該函數一次並更新分布。

[0.2, 0.2, 0.2, 0.2, 0.2]n

精確運動

假設在單元格上有一個分布,如:

frac{1}{9} frac{1}{3} frac{1}{3} frac{1}{9} frac{1}{9}

我們知道機器人向右移動,我們將假設世界是循環的。 因此,當機器人到達最右邊的單元格時,它將繞回到第一個最左邊的單元格。

問題1(精確運動)

假設機器人向右移動一個位置,運動後的後驗概率分布是多少?

答案1(精確運動)

一切都向右移動1個單元格。

問題2(移動函數)

定義一個移動函數,它將分布 p 和運動數 U 作為輸入,其中 U 是向右或向左移動的網格單元的數量。

編寫一個返回新分布 q 的函數,其中如果U == 0,q與p相同。

  • 如果U == 1,所有值循環向右移1
  • 如果U == 3,所有值循環向右移3
  • 如果U == -1,所有值循環向左移1

將單元格2的概率從0改為1能讓我們看到運動的影響。

p = [0, 1, 0, 0, 0)nworld = [green, red, red, green, green]nmeasurements = [red, green]npHit = 0.6npMiss = 0.2ndef sense(p, Z):n q = []n for i in range(len(p)):n hit = (Z == world[i])n q.append(p[i] * (hit * pHit + (1--hit) * pMiss))n s = sum(q)n for i in range (len(p)):n q[i] = q[i]/sn return qnnprint sense(p, Z)nndef move(p, U):n #Enter your code herenn return qnfor k in range(len(measurements)):n p = sense(p, measurements[k])n print move(p, 1)n

答案2(移動函數)

def move(p, U):n q= [] #Start with empty listn for i in range(len(p)):n #Go through all the elements in pn #Construct q element by element by accessing the corresponding p which is shifted by Un q.append(p[(i--U) % len (p)])n return qnnfor k in range(len(measurements)):n p = sense(p, measurements[k])n print move(p, 1)n

上述函數中的(i-U)可能是首先令人困惑的地方。

如果你向右移動,你可能會試圖使用加號。別!不要把它當作 p 轉移到 q 中的一個單元格,而是將這個函數看作是 q 從 p 中獲取一個單元格。

例如,如果我們將 p 向右移動一格,則 q 中的每個單元格都必須從 p 中的單元格的左邊一個獲取其值。

替代方案:

U = U % len(p)nq = p[-U:] + p[:-U]n

不精確的機器人運動:定位是很難的

問題1(不精確運動)

假設機器人以高概率(0.8)正確地執行其動作;同時有小概率(0.1),它會超過目標,並且還有小概率(再次為0.1)會少於目標。

請注意,這是一個更準確的真實機器人運動模型。

給出一個先驗分布,你可以給出運動之後的分布嗎?

使用這個公式:

答案1(不精確運動)

如預期的那樣,概率分布已經轉移和擴展。 移動導致信息丟失。

問題2(不精確運動)

這次,給定單元格2和4的值為0.5,填寫後驗分布。

答案2(不精確運動)

我們以與前一個問題相同的方式來回答這個問題,但是這次我們必須考慮到這個單元格5可以通過兩種方式到達:單元格4的少於目標或單元格2的超過目標。

問題3(不精確運動)

給定均勻分布,填寫運動後的分布,使用公式。

答案3(不精確運動)

我們可以通過兩種方式回答這個問題:

  1. 如圖所示:明確計算到達每個單元格的可能方式。 這需要相當多的計算,但會給我們正確的答案。
  2. 要知道,如果我們從一個均勻的先驗分布(最大混淆狀態)開始,然後移動,我們必須以均勻分布結束。因為這個問題從一個最大混淆的狀態開始,然後移動(記住,從來沒有增加我們對系統的認識),我們必須保持在最大混淆狀態。

問題4(不精確運動函數)

修改運動程序來容納增加的概率。

p = [0, 1, 0, 0, 0)nworld = [green, red, red, green, green]nmeasurements = [red, green]npHit = 0.6npMiss = 0.2n#Add exact probabilitynpExact = 0.8n#Add overshoot probabilitynpOvershoot = 0.1npUndershoot = 0.1nndef move(p, U):n q= []n for i in range(len(p)):n q.append(p[(i--U) % len (p)])n return qn

答案4(不精確運動函數)

def move(p, U):n #Introduce auxiliary variable sn q= []n for i in range(len(p)):n s = pExact * p[(i--U) % len(p)]n s = s + pOvershoot * p[(i--U--1) % len(p)]n s = s + pUndershoot * p[(i--U+1) % len(p)]n q.append(s)n return qnn[0.0, 0.1, 0.8, 0.1, 0.0]n

該函數通過遍歷 p 中的每個單元格並且在 q 中3個單元格上適當的分配概率(距離為 U 的預期要去的單元格,以及超過和不足的單元格),以適應少於或超過我們預期運動目標的概率。

問題5(極限分布測驗)

如果機器人沒有感知但永遠執行運動會發生什麼。什麼會是最後的極限或平穩分布?

當分布不隨時間變化時,分布是平穩的。 在運動機器人的情況下,這對應於移動之前的概率分布與移動之後的分布相同。

答案5(極限分布測驗)

事實上,結果是一個均勻分布是不足為奇的。

記住在不精確運動3時,我們看到當我們用均勻分布作用於函數move時,我們得到了均勻分布。移動不影響均勻分布,這正是平穩狀態的定義!

我們還可以通過實現每個單元格是三個其他單元格的可能目的地來解決每個單元格的概率。 這是課程中使用的方法,如下所示。 當然,無論我們的方法如何,我們都得到了相同的答案:均勻分布。

問題6(移動兩次)

編寫使機器人移動兩次的代碼,從初始分布開始:

p = [0, 1, 0, 0, 0]n

答案6(移動兩次)

p = move(p, 1)np = move(p, 1)nnprint pnn[0.01, 0.01, 0.16, 0.66, 0.16]n

結果是一個向量,其中0.66是最大值,而不是0.8。 這是預期的:兩次移動已經平坦化,並且擴大了我們的分布。

問題7(移動1000次)

編寫一段代碼,移動1000步,並給出你的最終分布。

答案7(移動1000次)

#Write a loop for 1,000 stepsnfor k in range(1000):n p = move(p, 1)n print pn #Final distribution is 0.2 in each case as expectedn

經過1000次移動,我們基本上失去了關於機器人位置的所有信息。 如果我們想知道機器人的位置,我們需要不斷感知。

機器人感知與運動

定位,特別是我們在這裡使用的蒙特卡羅定位方法,只不過是感知和移動的重複。 有一個初步的信度被拋到了循環中。 如果你先感覺到它到左邊。 定位通過移動和感知循環。 每次它移動都會丟失信息,每次感知都會獲得信息。熵是衡量分布信息的度量。

熵和信息熵都是迷人的話題。 隨時閱讀關於他們的更多!

問題1(感知和運動)

給定motions為1和1,這意味著機器人向右移動2次:

motions = [1, 1]n

如果機器人首先感知到紅色,然後右移一格,然後感知到綠色,然後再次向右移動,計算後驗分布。開始於均勻的先驗分布:

p = [0.2, 0.2, 0.2, 0.2, 0.2]n

答案1(感知和運動)

for k in range(len(measurements)):n p = sense(p, measurements[k])n p = move(p, motions[k])n print pn

機器人可能從網格單元3中開始,網格單元3是兩個紅色單元格中最右側的單元格。

問題2(感知和運動)

你可以修改上一個問題,以使機器人連續感知到紅色兩次。你認為機器人最有可能存在的單元格是哪個?

這個概率與上一個問題的概率如何比較?

答案2(感知和運動)

最可能的單元格是單元格4(不是單元格3——不要忘記我們在每次感知之後移動)。

這個程序是Google無人駕駛汽車蒙特卡羅定位方法的精髓。

定位總結(定位總結)

定位涉及機器人不斷更新其對所有可能位置的信度。從數學上講,我們可以說機器人不斷更新其在樣本空間上的概率分布。對於一輛真正的無人駕駛汽車,這意味著道路上的所有位置都有一個概率。如果人工智慧正常工作,這種概率分布應該有兩個特徵:

  1. 它應該有一個尖峰。這表明汽車對其當前位置有非常明確的信度。
  2. 峰值應該是正確的! 如果不是這樣,那車子會非常堅定地相信它在錯誤的位置。這對Stanley是壞事。

我們的蒙特卡羅定位程序可以寫成一系列步驟:

  1. 從我們當前位置的信度開始。
  2. 用我們感知測量的結果乘以這種分布。
  3. 標準化所得到的分布。
  4. 通過執行卷積移動。這聽起來比實際情況更複雜:這一步實際上涉及到乘法和加法,以便在每個位置獲得新的概率。

請記住,第2步總是增加我們的認知,第4步總是減少我們對我們的位置的了解。

額外的信息:你可能好奇我們如何使用單個格子代表一條路。畢竟,一條道路並沒有被整齊地劃分成幾個單元,讓我們在兩者之間跳躍:數學上,我們會說道路不是離散的,而是連續的。起初,這似乎是一個問題。幸運的是,每當我們在一個我們不需要準確精度的情況下——記住對於我們的車只需要2-10厘米的精度——我們可以將連續分布碎片化並使這些碎片儘可能小。

在下一個單元中,我們將討論使用連續概率分布描述信度的卡爾曼濾波器。

問題1(概率的正式定義)

記住,概率為0意味著一個事件是不可能的,而概率為1意味著它是必然的。因此,我們知道所有概率必須滿足 0≤P (x)≤1。假設 X_{1}X_{2} 是互補事件:一個或另一個必須發生。如果P( X_{1} ) = 0.2,那麼 P( X_{2} )?

答案1(概率的正式定義)

答案是0.8。

問題2(概率的正式定義)

如果 P( X_{1} ) = 0, 那麼 P( X_{2} )是多少?

答案2(概率的正式定義)

P( X_{2} ) = 1.

在這兩個問題中,我們使用了所有概率的總和必須為1這個事實。概率分布必須標準化。

問題3(概率的正式定義)

給定:

填寫第五個網格單元格的值。

答案3(概率的正式定義)

貝葉斯規則

貝葉斯規則是進行測量後更新概率分布的工具。

  • x = 網格單元格
  • Z = 測量

貝葉斯規則的方程式如下所示:

P (x|Z) = frac{P(Z|x)P(x)}{P(Z)}

該方程的左邊應該被看作「觀察Z後X的概率」。在概率上,我們經常要在進行測量後更新我們的概率分布。有時,這不容易直接做。

貝葉斯規則告訴我們,這個概率(方程式的左邊)等於另一個概率(方程的右邊),這通常更容易計算。在這些情況下,我們使用貝葉斯規則以可解決的方式來重新表述問題。

為了使用貝葉斯規則,我們首先計算由P(Z|X)P(X)給出的非標準化概率分布,然後將其除以測量Z的總概率P(Z),這就是所謂的標準化。

這可能看起來有點混亂。如果你仍然對貝葉斯規則有點不確定,繼續下一個例子,看看我們如何把它付諸實踐。

癌症測試問題

假設存在某種非常罕見的癌症:

  • P(C) = 0.001 = 患癌症的可能性
  • P(?C) = 0.999 = 不患癌症的可能性

假設我們有一個很好的確定疾病患者患有癌症的測試(它的概率為0.8),但偶爾(概率為0.1)誤診了健康患者患有癌症:

  • P(POS|C) = 0.8 = 病人出現癌症時陽性檢測的概率
  • P(POS|?C) = 0.1 = 在無癌患者中陽性檢測的概率(「假陽性」)

使用這些信息,你是否可以計算出獲得陽性測試的癌症概率?

  • P(C|POS) = ?

答案:(癌症測試)

測試陽性的100人中只有0.79人患有癌症,即使他們有陽性的癌症檢測結果!(這個數學假設沒有任何外部理由來測試個體的癌症:他們被隨機選擇進行測試。)

你可以應用與以前相同的機制來獲得此結果。貝葉斯規則的非標準化結果是先驗概率P(C)乘以陽性測試概率P(POS|C):

  • P(C|POS)=

代入概率:

  • P(C|POS) = 0.001 * 0.8 = 0.0008

給予陽性測試的相反事件的非標準化概率:

  • P(?C|POS) = 0.999 * 0.1 = 0.0999

標準化(陽性測試後有癌症的概率和陽性檢測後無癌症概率的總和):

  • P(C|POS) + P(?C|POS) = 0.1007

將非標準化概率0.0008除以標準化概率0.1007,給出答案:0.0079。

全概率定理

現在我們來看看運動,這將是我們稱之為全概率的東西。希望你記得我們關心過一個網格單元「xi」,並且我們問過機器人運動後在xi的概率是多少。現在,我們將使用時間指數來表示運動之前和之後:

要計算這個,可以通過查看機器人可能來自早於(在時間t-1)一個時間步長的所有單元格,並用字母 j 對這些單元格進行索引,在我們的示例中為1到5。對於每個這些單元格,看先驗概率P( X_{j}^{t-1} ), 並將其與從單元 X_{j} 移動到單元 X_{i}P( X_{i} | X_{j} )的概率相乘。這給出我們在時間 t 時我們將在單元格 X_{i} 中的概率:

P( X_{t}^{i} ) = sum_{j}^{}{(P(x_{j}^{t-1})*P(X_{i}|X_{j}))}

你可以看到 A 與時間 t 時位置 i 的對應關係和所有不同的 B 與可能的先前位置的對應關係。這通常被稱為全概率定理。

P(A) = sum_{B}^{}{(P(A|B)*P(B))}

問題1(拋硬幣測驗)

拋硬幣:拋出一枚公平的硬幣,出現正面(H)或反面(T)的概率是:P(T) = P(H) = 0.5.

如果硬幣出現反面,你就停下來接受結果;但是如果它出現正面,你再把它拋出,然後接受結果。那最後的結果是正面的概率是多少?

答案1(拋硬幣測驗)

在第二步中出現正面的概率P( H^{2} )。取決於在第一步中出現正面P( H^{1} ), 我們可以寫作條件P( H^{2} | H^{1} )P( H^{1} ). 加上在第一步中出現反面的條件下第二步出現正面的概率P( H^{2} | T^{1} ),乘以第一步中出現反面的概率P( T^{1} )。

這可以寫成

  • P( H^{2} )=P( H^{2} | H^{1} )P( H^{1} )+P( H^{2} | T^{1} )P( T^{1} )

這個方程式的最後一項P( H^{2} | T^{1} )P( T^{1} ),是在第一次出現反面後第二次出現正面的概率與第一次出現反面的概率的乘積。因為我們被告知當第一次出現反面後則停止,即P( H^{2} | T^{1} ) = 0,所以我們可以忽略這一項。

我們的方程式變為 P( H^{2} ) = P( H^{2} | H^{1} )P( H^{1} ),就是 frac{1}{4} = frac{1}{2} * frac{1}{2}

請注意,在這個問題中H和T旁邊的上標表示我們是說第一次還是第二次拋出。他們不是指數。

我們也可以將這個問題作為概率樹來解決,其中向下移動任何分支的概率是1/2。我們可以看到,到達第二次拋出正面的唯一路徑就是出現兩次正面的路徑。

問題2(兩枚硬幣測驗)

假說你有兩個硬幣,其中一個是公平的,另一個是不公平的。每個硬幣拋出正面的概率如下所示。

  • 公平的硬幣:P(H) = 0.5
  • 不公平的硬幣:P(H) = 0.1

有50%的機會拋出公平或不公平的硬幣。如果你拋出正面,你拋出的硬幣是公平的概率是多少?

答案2(兩枚硬幣測驗)

這個問題,觀察到H的情況下拋出的是公平硬幣的概率,可以寫成:

  • P(F|H) = ?

因為你正在進行觀察,所以使用貝葉斯規則。我們將用小寫p表示拋出公平硬幣的非標準化概率是:

  • p(F|H) = P(H|F) P(F)
  • p(F|H) = 0.5 * 0.5

沒有拋出公平硬幣,但拋出不公平硬幣的非標準化概率是:

  • p(?F|H) = P(H|?F) P(?F)
  • p(?F|H) = 0.1 * 0.5

當你算出這些的總和,結果是:

  • 0.25 + 0.05 = 0.3

現在,我們將非標準化概率除以這個總和得到我們的答案:frac{0.25}{0.3} = 0.833。

結論(結論)

這是你這節課所學的:

  • 定位
  • 蒙特卡羅定位
  • 概率
  • 貝葉斯規則
  • 全概率定理

你現在可以使一個機器人定位,並且你可以直觀的理解稱為過濾器的概率方法。下節課我們將學習有關:

  • 卡爾曼濾波器

推薦閱讀:

技術乾貨|從FMEA角度來分析如何在開發過程中降低自動駕駛的風險
高級車道線識別演算法
無人駕駛:或許只是一場不切實際的「春夢」
酷站推薦 - tusimple.com - 北京圖森未來科技 | 中國自動駕駛商業化領跑者
CES2017-駕駛輔助會思考

TAG:无人驾驶车 | 人工智能 | 定位人生追求 |