跳轉到內容

Cyberbotics 機器人課程/中級程式設計練習

來自 Wikibooks,開放世界中的開放書籍

在上一章中,您學習瞭如何使用 C 程式語言詳細地操作 e-puck 裝置。現在您具備了開始本章關於機器人行為的技術背景。將使用不同的技術來程式設計 e-puck 的行為。值得注意的是,您將看到您的機器人擁有記憶。

程式設計自動機 [中級]

[edit | edit source]

在本練習中,您將把 初級程式設計練習 中的 FSM 轉換成 C 程式語言。首先,將提供一個簡單的示例,即 簡單行為:有限狀態機 練習的新版本。然後,您將建立自己的 FSM。它將是 更好的碰撞避免演算法 練習的新版本。

開啟世界檔案

[edit | edit source]

開啟以下世界檔案

.../worlds/intermediate_finite_state_machine.wbt

您應該看到與 簡單行為:有限狀態機 部分相同的環境。

FSM 的示例

[edit | edit source]

根據圖 感測器到執行器迴圈.png,您的程式主迴圈應始終按照以下順序執行其指令

  1. 獲取感測器值
  2. 根據預期行為處理這些值
  3. 向執行器傳送命令

在我們的例子中,機器人的行為部分是使用 FSM 建模的。

[Q.1] 在給定的 C 程式設計程式碼中,找出這 3 個點的位置。解釋在每個點中執行了什麼操作。

[Q.2] 描述 FSM 是如何實現的,即當前狀態是如何建模的,使用了哪種控制結構,狀態中執行了哪些指令,從一個狀態切換到另一個狀態的條件是什麼等等。

建立你自己的 FSM

[edit | edit source]

[P.1] 使用 FSM 實現牆體跟隨演算法。(提示:開始設計自動機的結構,然後找到觸發轉換的方式,最後根據經驗設定引數。)

*割草機* [中級]

[edit | edit source]

在本可選練習中,您將發現機器人技術的另一個主題:窮盡式探索,即您的 e-puck 將在形狀未知的表面上移動,並且必須經過每個地方。清潔機器人或自動割草機是這種運動的典型應用。有不同的方法可以處理這個主題。本練習介紹了其中兩種:隨機行走和“掃描”行走。

隨機行走

[edit | edit source]

開啟以下世界檔案

.../worlds/intermediate_lawn_mower.wbt

您應該看到一個帶有白色樹籬的草坪。目前,機器人的控制器與上一個練習的控制器相同,即一個簡單的 FSM,它允許您的 e-puck 在遇到牆壁時返回。在本節中,您將建立一個隨機行走。

當您的 e-puck 遇到牆壁時,它必須旋轉並朝另一個方向移動,如下圖所示。下圖描繪了隨機行走可能的自動機。

為了生成 0 到 X 之間的隨機整數,匯入標準庫 (#include <stdlib.h>) 和時間庫 (#include <time.h>),並編寫以下兩條指令

// The utility of this line is to have at every simulation a different
// series of random number
srand(time(0));

// change X by the maximal bound (in the double format)
int random_value = X * rand() / (RAND_MAX+1);
在隨機行走中,此圖顯示了當 e-puck 檢測到障礙物時可能的輸出方式。
隨機行走可能的自動機。

[Q.1] 使用 BotStudio 無法實現隨機行走的哪一部分?

[P.1] 實現圖中給出的自動機:隨機行走。對於停止條件,您可以使用定時器或使用編碼器的條件。(提示:您可以合併“左轉”狀態和“隨機左轉”狀態。右邊的部分也是如此。)

[Q.2] 一般來說,隨機遊走演算法在表面覆蓋方面是否有效?(提示:e-puck 會經過每個點嗎?是否有 e-puck 花費更多時間的地方?)

掃描式行走

[編輯 | 編輯原始碼]

另一種執行全面覆蓋的解決方案是“掃描”區域,如圖所示。首先,執行水平掃描,然後,當機器人沒有更多前進的可能性時,執行垂直掃描。相應的自動機在下一張圖中顯示。這個自動機是你迄今為止見過的最大的自動機。

掃描式行走的可能軌跡
掃描式行走的可能自動機。OF、OR 和 OL 分別表示在機器人前方、右側或左側檢測到障礙物。FR 和 FL 分別表示在右側和左側未檢測到障礙物。

[P.2] 實現圖中給出的自動機:“掃描式行走”。(提示:你可以利用此自動機的對稱性來簡化實現。)

[Q.3] 一般來說,掃描式行走演算法在表面覆蓋方面是否有效?(提示:你能找到另一種房間拓撲結構,以便找到 e-puck 永遠不會經過的地方嗎?是否有 e-puck 花費更多時間的地方?)

你的進度

[編輯 | 編輯原始碼]

現在,你知道程式如何使用 FSM 來建立機器人行為。FSM 可以用數學方式形式化。此外,這個概念背後有一個理論:自動機理論。FSM 只是這個理論的一部分。你可以在那裡找到其他型別的自動機。例如,機率自動機在其轉換上具有機率。因此,一個狀態和固定的感測器值可能具有不同的下一個狀態。有關此主題的更多資訊,你可以參考

自動機理論

這是一個良好的起點。在文獻中,你會找到幾本相關的書籍。

基於行為的人工智慧

[編輯 | 編輯原始碼]

到目前為止,你已經學會了使用有限狀態自動機來程式設計機器人行為。接下來的三個練習將向你解釋一個完全不同的處理此主題的方法:基於行為的機器人,由教授 Rodney Brooks[1] 在 1986 年的論文[2] 中提出。

基於行為的機器人是一種建立機器人行為(程式設計機器人控制器)的方法。其想法是將複雜的行為分成多個更小的行為模組。這些模組是獨立的且半自主的。它們有其特定的作用。它們共同工作,無需同步。這些模組的典型示例可能是:“向前走”、“保持直立”、“有障礙物就停止”、“沿著牆壁走”、“尋找食物”、“快樂”或“幫助社群”。你可以觀察到這些例子是按層次結構排列的。在層次結構的較低層,將有反射模組(如“保持直立”)。在層次結構的較高層,將有機器人的目標(如“找到食物”)。反射模組可以影響其層次結構上的上級。實際上,如果你絆倒了,保持站立是最重要的:來自你腳部感覺的命令會支配你思考的能力。

模組的外部結構在圖中顯示。模組直接從感測器或另一個模組接收輸入值。這些值可以被另一個模組抑制。類似地,輸出值被直接定向到執行器或另一個模組。最後,模組可能具有重置功能。

有多種方法可以實現這些模組。我們決定使用 C 函式來模擬它們。實際上,函式接收引數作為輸入並返回輸出值。為了簡化程式碼,這些值中的一些儲存在全域性變數中,以便於模組之間的通訊。

行為模組的外部形狀

行為模組 [中級]

[編輯 | 編輯原始碼]

在本練習中,你將實際觀察到基於行為的機器人,它有兩個模組:避障模組和循牆模組。首先,你將獨立觀察這些模組。然後,你將把它們混合在一起。

本練習與接下來的兩個練習密切相關。

開啟世界檔案

[編輯 | 編輯原始碼]

開啟以下世界檔案

.../worlds/intermediate_oam.wbt

你應該觀察到一個被障礙物點綴的環境。不要猶豫,移動它們或重疊它們。

避障模組 (OAM)

[編輯 | 編輯原始碼]

給定的機器人控制器實際上只使用避障模組 (OAM)。該模組是一個反射模組。它會一直執行。它接收 IR 感測器值作為輸入。如果在 e-puck 前方檢測到障礙物,OAM 將計算其自身的加速度估計,以避免碰撞。它只能使機器人自轉(左速度 = - 右速度)。最後,OAM 更新side變數以記住牆壁的位置。此資訊將有助於其他模組。

[P.1] 在虛擬 e-puck 和實際 e-puck 上執行模擬。

[Q.1] 描述 e-puck 的行為。它遇到牆壁時的反應是什麼?在它前方沒有障礙物時,它的軌跡是什麼?

[Q.2] OAM 產生電機速度差,但機器人向前移動。為什麼?

[Q.3] 在 OAM 函式中,如何計算電機速度差(delta變數)?

循牆模組 (WFM)

[編輯 | 編輯原始碼]

第二個模組(稱為循牆模組 (WFM))根據side變數建立恆定的電機速度差。它的作用是吸引 e-puck 靠近牆壁。如果只有這個模組,機器人會撞到牆壁。幸運的是,如果 OAM 模組也被啟用,它會產生排斥力。這兩個模組的組合會產生更強大的行為:機器人將能夠沿著牆壁走。在生物學中,這種現象被稱為湧現

圖描述了這兩個模組之間的互動。水平方向上,圖表的劃分類似於 感測器到執行器迴圈.png 中的劃分,它就是感知到行動的迴圈。垂直方向上,模組被層次結構層級劃分。最底層是反射層級。來自 OAM 到 WFM 的黑色箭頭表示sidevariable。

OAM 和 WFM 之間的互動

[P.2] 在主函式的主迴圈中,取消註釋wfm()函式呼叫,並編譯您的程式。在虛擬機器和真實的 e-puck 上執行模擬。觀察機器人的行為。嘗試移動 e-puck 所“連結”的障礙物。

[Q.4] 描述 e-puck 的行為。

[Q.5] 比較圖和給定的控制器程式碼。 (提示:黑色箭頭是如何實現的?感測器值是如何傳送到模組的?)

[Q.6] 解釋wb_differential_wheels_set_speed(...)函式呼叫中每個求和項的用途。

*[P.3]* 在模擬中,嘗試透過更改宏變數(檢視使用 #define 語句定義的變數)來獲得儘可能平滑的 e-puck 軌跡。帶有兩個箭頭(綠色和紅色)的圖形顯示了與蛇形軌跡相比的平滑軌跡。請注意,平滑軌跡在很大程度上取決於環境,即,如果您獲得了平滑軌跡,並且更改了障礙物寬度,您的機器人可能會出現蛇形軌跡。

綠色箭頭表示平滑軌跡,而紅色箭頭表示蛇形軌跡。

建立一條線跟隨模組 [中級]

[edit | edit source]

在上一節練習中,您觀察了兩個模組之間的互動。在本節練習中,您將同樣看到一些其他模組及其互動。本節練習的目的是觀察三個模組如何生成一個強大的線跟隨控制器。最後,您將建立自己的模組。

開啟世界檔案

[edit | edit source]

開啟以下世界檔案

.../worlds/intermediate_lfm.wbt

e-puck 準備好在起跑線上繞環形軌道轉彎。

用於牆跟隨的三個模組

[edit | edit source]

本節練習的機器人控制器使用三個模組

  • 線跟隨模組 (LFM):首先,該模組接收線性相機值(相機最後一行)。藉助find_middle(...)函式,它找到機器人前方黑線的中點。然後,它計算出自身對電機速度的理解。與 OAM 類似,此函式只建立電機速度差。這是一個高階模組。它的輸入值可以被抑制。
  • 線進入模組 (LEM):此模組也觀察線性相機值。它會注意到機器人的視野中是否有線。
  • 線離開模組 (LLM):此模組與 LEM 協同工作。它會注意到機器人的視野中是否沒有線。

LEM 和 LLM 的用途在 e-puck 進入或離開線時顯現。透過使用這些模組,這兩個事件得以掌控。在本節練習中,這兩個模組用於在沒有線可跟隨時抑制 LFM。這使得機器人能夠直線前進。在下一節練習中,我們將使用這兩個事件來實現更有用的目的。

這些模組之間的互動在示意圖中有所體現。

LFM、LEM 和 LLM 之間的互動

[P.1] 在虛擬 e-puck 和實際 e-puck 上執行模擬。

[Q.1] 比較圖和給定的控制器程式碼。暫時不要看 UTM。 (提示:LFM 抑制器的作用是什麼?LEM 和 LFM 在程式碼中是如何關聯的?為什麼圖中它們之間沒有連結?等等)

[Q.2] 解釋 LEM 的演算法。

[P.2] 修改給定的程式碼,以便在 e-puck 檢測到線時開啟 8 個 LED,並在沒有檢測到線時關閉它們。

您自己的模組

[edit | edit source]

[P.3] 實現一個新的模組(稱為utm()),當機器人前方不再有線時,該模組可以讓 e-puck 進行 U 形轉彎。當 WFM 被抑制時,此模組將起作用,反之亦然。在此模組中,機器人應該只產生電機速度差。

多個模組的混合 [中級]

[edit | edit source]

在之前的兩個練習中,您觀察了 5 個不同的模組。現在,您將組合它們以獲得更復雜的行為。

開啟世界檔案

[edit | edit source]

開啟以下世界檔案

.../worlds/intermediate_behavior_based.wbt

您應該觀察圖中顯示的世界。地面上繪製了一條線。它呈“C”形。一些障礙物散落在這條線上。

本節練習的環境

多個模組的組合

[edit | edit source]

本節練習的目標是獲得以下行為:e-puck 沿著這條線行走,但如果它檢測到障礙物,它必須繞過障礙物,直到再次找到這條線。

給定的機器人控制器包含所有先前的模組,但它們之間沒有連結。該示意圖顯示了一種可能的連結方式。該示意圖中最重要的點是觀察從一個模組到另一個模組的互動

  • OAM:它是唯一一個反射模組。如果 OAM 檢測到障礙物,它必須抑制 LFM 以避免其影響。OAM 還必須告知 WFM 牆的位置。
  • LEM:它的作用是在檢測到黑線時解除對 LFM 的抑制。此外,它必須告知 WFM 它必須停止跟隨牆壁。
  • LLM:如果丟失黑線,它必須抑制 LFM。
所有模組之間的互動

[P.1] 實現模組之間的互動,以獲得上面描述的行為。參考示意圖以瞭解互動方式。 (提示:您需要修改的程式碼片段以 TODO 註釋標記。)

[Q.1] 與基於有限狀態機的機器人相比,基於行為的機器人的優勢是什麼?劣勢是什麼?可以將這兩種技術結合起來使用嗎?舉例說明。


  1. 參見 羅德尼·布魯克斯 獲取更多資訊。
  2. Brooks, R. A. "用於移動機器人的魯棒分層控制系統", IEEE 機器人與自動化雜誌,第 2 卷,第 1 期,1986 年 3 月,第 14-23 頁; 也是 MIT AI 備忘錄 864,1985 年 9 月。
華夏公益教科書