3.2 僞代碼和繪制rsvp流程圖
流程圖繪制是一個用來制定目标對整個系統控制流程的rsvp,是一個可以包括任何一種循環、選擇或決策的指令行線性序列。通過使用表示某種工作類型的特殊框符号,流程圖解釋了這個過程。方框内顯示的文本描述了一個任務、過程或指令。
流程圖是一種狀态圖(本章稍後會進行讨論),因為它們也包含被轉換為動作和活動的狀态。決策和重複的事情很容易表示,并且作為一個分支的結果也可以簡單描述。有些人建議在寫僞代碼之前進行流程圖繪制。僞代碼具有易于轉換為一種程式設計語言或用于編制一個程式的優勢。流程圖很容易更改,使用流程圖軟體修改流程圖隻需要增加一點工作量即可完成。
表3-4列出了僞代碼和流程圖繪制各自的優缺點。兩者都是制定步驟的有力工具。在一個特定時間内、一個項目裡,具體選用哪個屬于個人喜好問題。

流程圖繪制中常用的四種符号為:
開始和停止:開始符号表示流程圖的開始,标簽是出現在符号裡的“開始”。停止符号表示流程圖的結束,标簽是出現在符号裡的“停止”字樣。它們是唯一以關鍵詞為标簽的符号。
輸入和輸出:輸入和輸出符号包含用于輸入的資料(例如使用者提供)和處理結果的資料(輸出)。
決策:決策符号包含一個問題或一個必須做出的決定。
過程:過程符号包含一個規則或某個動作發生的簡短描述(幾句話)。
圖3-4展示了流程圖繪制的常用符号。
每個符号有一個入站或出站箭頭指向一個符号或來自另一個符号。開始符号隻有一個出站箭頭,停止符号隻有一個入站箭頭。“開始”符号表示流程圖的開始,以出現在符号的裡的“開始”字樣為标簽。“停止”符号表示流程圖的結束,以出現在符号的裡的“停止”字樣為标簽。它們是唯一以關鍵詞為标簽的符号。決策符号包含一個問題或一個必須做出的決定。過程符号包含一個規則或某個動作發生的簡短描述(幾句話)。決策符号有一個入站箭頭和兩個出站箭頭,每個箭頭表示一個經由過程的決策路徑,該過程始于此符号:
真/是
假/否
過程、輸入和輸出符号有一個入站箭頭和一個出站箭頭。符号包含描述規則或動作、輸入或輸出的文本。圖3-5給出了“點燃蠟燭”的流程圖。
注意,流程圖的開始,在“開始”符号下面,br-1等待直到唱歌開始。對唱歌是否已經開始做出決定。兩種選擇:如果唱歌還沒有開始,“假/否”為問題答案,br-1繼續等待;如果唱歌開始進行,“真/是”為問題答案,br-1進入一個循環或決定。
如果有蠟燭點燃,那就是決策。如果“是”,獲得下一根蠟燭的位置,定位機器人手臂至點燃蠟燭芯合适位置的距離,然後點燃蠟燭芯。一個輸入符号用于接收點燃下一根蠟燭的位置。br-1準備點燃所有的蠟燭,一旦完成任務就停止。
3.2.1 控制流程和控制結構
機器人執行的任務可以是一系列逐漸進行的步驟,是一個順序控制流。控制流術語詳細說明了過程進行的方向,即程式控制“流”。控制流決定了當給定一定的條件和參數時一個計算機将如何響應。圖3-6給出了一個順序控制流的例子。在生日場景的另外一個機器人是br-3,它的任務是為來賓開門,圖3-6展示了這項任務的順序控制流。
流程圖
機器人走向門,打開,說“歡迎”,然後關門并回到“原始位置”。這看起來像一個相當草率的主人。給br-3表示來賓在門口的信号的門鈴響了嗎?如果有人在門口,說“歡迎”後,br-3在關門之前讓來賓進來了嗎?br-3生日聚會上應該能夠以一種可預測方式行事。這意味着基于事件做出決定,做重複的事情。決策符号用于為其他流控制建構分支,用來表達決定、重複和選擇語句。一個簡單的決策是一個if-then或if-then-else語句的結構。
圖3-7a展示了一個針對br-3的簡單if-then決策。“如果門鈴響了,則走到門的位置并打開門”。現在,在說“歡迎”之前,br-3将等待直到來賓進門。注意,如果來賓還未進門可以采取可選擇動作,br-3将等待5秒然後檢查來賓是否已經進門。如果“是”,則br-3說“歡迎”并關門。這種if-then-else決策在圖3-7b給出,可選擇動作是等待。
圖3-7 如果-則和如果-則-否則決策的流程圖
在圖3-7中,需要回答的問題(或條件測試)是門鈴是否已經響了。在br-3準備開門之前,如果确定會遇到超過一個問題/條件測試會怎樣?關于br-1,在點燃蠟燭之前,如果一定會遇到多個條件将會怎樣:
“如果唱歌并且打火機打着了則點燃蠟燭”。
在這種情況下,兩個條件都要滿足,這就是所謂的嵌套決策或條件。
如果一個問題或情況有很多不同的可能的答案,并且每個答案或情況都有不同的動作要執行,将會怎樣?例如,當br-1或br-3經過房間時遇到一個物體,它必須繞開物體而到達目的地,這将如何處理。它可以檢測路徑上物體的距離以決定采取何種規避物體的動作。如果物體在一定距離範圍内,br-1和br-3向左轉90°或45°,選擇物體周圍另外一個路徑,然後再繼續原來前往它們目的地的路徑,如圖3-8所示。
圖3-8 機器人避障
該流程圖可以表示為一系列決策或一個選擇語句。一種情況是在一個問題上有幾個可能答案的決策。對于這一系列決策,同樣的問題被問了三次,每一個都有不同的答案和動作。對于選擇語句,問題僅表達一次。圖3-9對比了這一系列決策和選擇語句,閱讀和了解起來更加簡單。
圖3-10給出了重複和循環。在一個循環中,一個簡單的決策伴随一個條件測試之前或之後執行的動作。根據結果,再次執行動作。在圖3-10a中,動作将至少執行一次。如果條件沒有滿足(唱歌沒有開始-也許每個人玩得太開心了),機器人必須繼續等待。這是一個do-until循環的例子,“do”這個動作“until”條件為真。while循環首先執行條件測試,如果滿足則執行動作。這在圖3-10b中給予描述,唱歌還沒有開始時,等待,br-1将循環和等待直到唱歌開始;和do-until循環相比,差異是在條件滿足後執行等待。另外一種類型是for循環,如圖3-10c所示,其中條件測試控制循環執行的特定次數。
圖3-9 對比選擇語句和系列決策
3.2.2 子程式
當考慮機器人在一個場景或态勢中扮演什麼角色時,角色分解為一系列動作。br-1的角色是一個生日聚會上的主人,該角色分解為4個狀态:
圖3-10 重複流程圖:(a)do-until循環,(b)while循環,(c)for循環
空閑
行走
點燃蠟燭
等待
拿走盤子
這些狀态可以分解為一系列動作或任務:
1.?等待直到唱歌開始。
走到生日蛋糕桌。
點燃蛋糕上的蠟燭。
回到原始位置。
2.?等待直到聚會結束。
拿走蛋糕桌上的盤子。
這些都是任務的簡短描述。每個任務可以進一步分解為一系列的步驟或子程式。“點燃蠟燭”是一個複合狀态,可以分解為其他的子狀态:
定位燭芯
點燃燭芯
實際上,“從蛋糕桌上拿走盤子”和“回到初始位置”也應該分解為一些子程式。從蛋糕桌上拿走盤子需要拿走每個盤子和杯子的機器人手臂定位子程式,行走則需要電機轉動的子程式。
圖3-11給出了點燃蠟燭及其定位燭芯和點燃燭芯子程式的流程圖。
圖3-11 點燃蠟燭、定位燭芯和點燃燭芯子程式的流程圖
子程式符号和過程符号一樣,但是它包含子程式的名字,名字兩邊各有一條垂直線。子程式的名字可以是一個描述子程式意圖的短語。
然後将流程圖開發為這些子程式。使用子程式的優勢是不必馬上弄明白細節,可以暫時不用考慮搞清楚機器人具體如何執行一個任務。可以先制定最進階别的過程,然後對動作(任務)進行分解。
在機器人的設計過程中,如果在不同地方使用了類似的步驟,可以提取為一個子程式并用通式表達。這個過程可以用通式表達并放置在子程式中,以備需要時調用,而非重複一系列步驟或開發不同子程式。例如,行走過程分為br-1行走到蛋糕桌的一系列步驟(tabeltravel)和随後傳回原始位置的一系列步驟(origintravel),這些都是具有不同開始和結束位置的相同任務。需要一個使用機器人目前和最終位置的travel子程式,而非兩個使用開始和結束位置的子程式。