天天看點

《機器人程式設計實戰》一一3.3 目标和機器人狀态圖

3.3 目标和機器人狀态圖

狀态圖是狀态機的一種可視化方式。

注釋

狀态機是在一個環境中單一機器人或物體的行為模型。狀态是當某事發生時機器人或物體所經曆的轉換。

例如,“狀态改變”可以簡單看作位置的改變。機器人從它的初始位置走到桌子旁邊的位置就是一個機器人的狀态改變。另外一個例子是生日蠟燭從未點燃狀态到點燃狀态的改變。狀态機捕捉事件、轉換并響應。狀态圖是這些活動的一個圖解。狀态圖用于捕獲目标在場景中的可能态勢。正如你在第2章所學到的,一個态勢是場景中一個事件的快照。br-1可能的态勢為:

态勢1:br-1等待信号移動到新位置

态勢2:br-1走到蛋糕桌

态勢3:br-1接近尚未點燃蠟燭的桌上蛋糕

态勢4:br-1定位打火機至蠟燭的距離,等等。

所有這些态勢代表了機器人狀态的變化。當某事發生時,機器人或目标的狀态發生變化。事件可以是一個信号、一個操作結果或隻是時間的流逝。當一個事件發生時,根據對象的目前狀态,發生某個動作。目前狀态決定了事件可能是什麼。事件作為産生一個條件的觸發或刺激,在這個條件裡狀态可能發生變化。這種從一個狀态到另一個狀态的變化被稱為轉換。目标從源狀态即狀态a,向目标狀态即狀态b轉換。圖3-12展示了br-1的一個簡單狀态機。

《機器人程式設計實戰》一一3.3 目标和機器人狀态圖

圖3-12顯示了br-1的兩種狀态:空閑或行走。當br-1處于空閑狀态,它在等待一個事件發生,該事件是一個包含機器人新位置的信号。一旦機器人接收到這個信号,它就從空閑狀态向行走狀态轉換。br-1繼續前進直到它到達目标位置。一旦到達,機器人從行走狀态回到空閑狀态。信号、動作和活動可能由對象或外部力量執行或控制。例如,新的位置将不是由br-1産生,而是其他的作用者。br-1在行走時具有檢查其位置的能力。

開發狀态圖

正如前文所述,狀态是一個對象的條件或态勢,代表對象生命過程中的一個轉換。狀态機展示了狀态和狀态之間的轉換。表示狀态機的方式很多,在本書中,我們将狀态機表示為使用統一模組化語言(unified modeling language,uml)的狀态圖。狀态圖用額外的符号表示事件、動作、條件、轉換部分、狀态部分和類型。

三種狀态類型:

初始:狀态機的預設起點。用一個實黑點來表示轉換的第一個狀态。

最終:結束狀态,意味着對象到達了生命周期的終點,用内嵌實心點的圓表示。

複合狀态和子狀态:一個狀态包含另外一個狀态就被稱為超級狀态或複合狀态。

狀态具有不同的部分,表3-5列出了狀态部分的簡短描述。一個顯示其名字的狀态節點也可以表示本表列出的狀态部分。這些部分可以用來表示對象轉換到新狀态時發生的過程。一旦對象進入和離開狀态可能要采取動作。當對象處于一個特定狀态時,可能必須要采取動作。所有這些都可以在狀态圖中進行标記。

《機器人程式設計實戰》一一3.3 目标和機器人狀态圖
《機器人程式設計實戰》一一3.3 目标和機器人狀态圖

圖3-13展示了狀态節點和動作、活動和内部轉換的語句格式。

在一個狀态圖中,節點是狀态,弧線是轉換。狀态表示為圓或圓角矩形,圖形裡面顯示狀态名。轉換是連接配接源狀态和目标狀态的弧線,箭頭指向目标狀态。

進入和退出動作語句使用下列格式:

entry/action or activity

exit/action or activity

這是一個稱為“驗證”狀态的進入和退出動作語句示例:

進入動作:entry/validate(data)

退出動作:exit/send(data)

當進入“驗證”狀态時調用“validate(data)”函數。當退出此狀态時調用退出動作“exit/send(data)”函數。

内部轉換在狀态内部發生,如果有的話,它們是在進入動作之後和退出動作之前發生的事件。自我轉換不同于内部轉換。對于自我轉換,要執行進入和退出動作。狀态在左邊,執行退出動作。然後再進入同樣的狀态并且執行進入動作。在退出動作之後和進入動作之前執行自我轉換的動作。自我轉換表示為一個回環并指向同一狀态的有向直線。

内部轉換或自我轉換語句格式為:

name/action or function

例如:

do/createchart(data)

“do”是活動标簽,函數“createchart(data)”是執行。

一個轉換有多個部分,兩個狀态之間有聯系。我們知道觸發導緻發生轉換,動作可以與觸發耦合。滿足條件也可以導緻一個轉換。表3-6列出了一個轉換的部分。

《機器人程式設計實戰》一一3.3 目标和機器人狀态圖

守護條件是一個評估“真”或“假”的布爾數值或表達式,用方括号括起來。守護條件必須滿足,函數才會執行。它可以在一個狀态或轉換語句中使用。

validated是一個布爾值。對于createchart( )執行,它是一個必須滿足的條件。

作為一個狀态動作語句,事件觸發有以下類似格式:

name[guard]/action or function

例如,對于一個内部轉換語句,可以添加一個守護條件:

do[validated]/createchart(data)

圖3-14為br-1的狀态圖。

該圖有5個狀态:空閑、行走、點燃蠟燭、等待和拿掉盤子。當從空閑向行走轉換時,br-1獲得新的位置并且知道其任務:

do[getposition]/setmission( )

行走狀态有兩個轉換:

行走至點燃蠟燭

行走至清除盤子

當目标實作且任務是蠟燭時,行走轉換為點燃蠟燭。當目标實作且任務是盤子時,行走轉換為清除盤子。從點燃蠟燭轉換,“蠟燭”任務必須完成。從拿掉盤子向最終狀态轉換,所有任務必須完成。

點燃蠟燭是一個複合狀态,包含兩個子狀态:定位燭芯和點燃燭芯。當進入點燃蠟燭狀态時,已計算出唱歌的布爾值。如果唱歌,則準備點燃蠟燭。首先必須定位燭芯位置,然後将手臂移動到該位置,最後點燃燭芯。在定位燭芯狀态中,進入動作計算出下面表達式:

candles > 0

如果“真”,當檢索到第一個或下一個蠟燭位置時狀态退出,然後機器人的手臂移動到該位置。

檢索到燭芯位置,br-1轉換到“點燃燭芯”。進入後,檢查打火機是否點着。如果點着,點燃燭芯(一個内部狀态),退出該狀态。如果candles > 0,則再次進入“定位燭芯”狀态。如果candles = 0,則br-1轉換到“等待”狀态。一直等到聚會結束,然後br-1可以清除所有盤子。在“等待”狀态,有一個“聚會沒有結束”的自轉換。記住,對于自轉換,當狀态處于退出和再進入時,才執行退出和進入動作。在這種情形裡,沒有退出動作,但有一個“等待5分鐘”的進入動作。檢查守護條件“聚會沒有結束”,如果聚會沒有結束,則再次進入該狀态并執行進入動作,br-1等待5分鐘。一旦聚會結束,則br-1轉換到“清除盤子”,這是最後一個狀态。如果布爾值“所有任務完成”為真,br-1轉換到最終狀态。但是,有些對象可能沒有到最後狀态,則br-1繼續工作。狀态圖有利于處理在生命周期内形勢不斷變化的對象。它展示了對象從一個狀态到另外一個狀态的控制流。

《機器人程式設計實戰》一一3.3 目标和機器人狀态圖

繼續閱讀