自動駕駛談談 狀態模式

2021-09-07 11:50:58 字數 3263 閱讀 4442

目錄:設計模式之小試牛刀原始碼路徑:github-design pattern

當乙個物件內在狀態改變時允許其改變行為,這個物件看起來像改變了其類。

說到科技,我們就來簡單**下自動駕駛涉及到的技術。首先,這一切都需要必不可少的硬體支援,比如感測器、攝像頭、雷達。有了硬體就可以進行資料採集,收集駕駛過程中的各種資訊,通過演算法進行資料分析,來控制當前的駕駛行為。

換句話說,自動駕駛是結合外部因素和內部因素通過演算法分析來控制驅動的。外部因素無外乎道路狀況、交通標誌等。內部因素比如電池容量、車況等等。

那這跟我們這節講的狀態模式有什麼區別呢?

在我理解,自動駕駛也是狀態和行為相結合的。

比如攝像頭檢測到路邊的限速標記,自動控制車速,比如攝像頭檢測到前方十字路**通訊號燈為紅燈,則停車等待。

其中限速標記和交通燈都是乙個狀態的體現,控制車速和停車等待則是狀態驅動的結果。但是呢,這些狀態行為並不符合我們狀態模式的定義(當乙個物件內在狀態改變時允許其改變行為)。很顯然限速標記和交通燈是外部狀態。

別失望,我們來找找特斯拉的內部狀態。作為一輛車它的狀態其實很簡單,也就是執行、加速、減速、停車狀態。在停車狀態,我們可以控制它啟動執行,切換至執行狀態;在執行狀態,自動駕駛根據行駛條件控制加速減速,切換至加速減速狀態;到達目的地後,泊車切換到停車狀態。

這個應用場景其實很簡單,按照我們傳統的寫法,我們肯定幾個if..else或用switch..case就搞定了。的確,但是呢,傳統的寫法就擴充套件性和**結構上就十分差強人意。廢話不多說,下面我們就以特斯拉自動駕駛為例,分析下狀態模式的應用。

首先我們定義乙個狀態介面:

/// /// 狀態介面類

///

public inte***ce icarstate

然後我們依次實現這四種狀態。

執行狀態下可以切換到其他三種狀態。

/// /// 執行狀態

///

public class runingstate : icarstate

public void stop(car car)

public void speedup(car car)

public void speeddown(car car)

}

停車狀態下,只能切換到啟動狀態,不可加速減速。

/// /// 停車狀態

///

public class stopstate : icarstate

已啟動,開始自動駕駛!");

car.currentcarstate = car.runstate;

}public void stop(car car)

public void speedup(car car)

public void speeddown(car car)

}

加速狀態也是執行狀態,可減速或停車。

/// /// 加速狀態

///

public class speedupstate : icarstate

public void stop(car car)

public void speedup(car car)

public void speeddown(car car)

}

減速狀態也是執行狀態,可加速或停車。

/// /// 減速狀態

///

public class speeddownstate : icarstate

public void stop(car car)

public void speedup(car car)

public void speeddown(car car)

}

定義完狀態,下面我們就來看看實際的車類。

public class car

public car()

internal static icarstate stopstate = new stopstate();

internal static icarstate runstate = new runingstate();

internal static icarstate speeddownstate = new speeddownstate();

internal static icarstate speedupstate = new speedupstate();

public icarstate currentcarstate

public void run()

public void stop()

public void speedup()

public void speeddown()

}

car類也比較簡單,主要是預先申明並例項化了幾種狀態並暴露設定當前狀態的屬性,以及提供了狀態對應的行為方法,並委託給具體的狀態去執行相應的動作。

下面就是簡單的場景類了。

狀態模式隱藏了具體的狀態變化,但行為還是由狀態變化驅動的。

就狀態模式而言,其實就僅僅三個角色:

優點:結構清晰;符合ocp和srp;封裝性好。

缺點:在狀態過多的情況下,會導致具體狀態類的膨脹。

行為隨狀態改變而改變。

狀態已確定,且狀態不宜過多。

重構if..elseswitch..case的不二之選。

自動駕駛汽車與自動駕駛網路

談到自動駕駛網路很容易讓人聯想到自動駕駛汽車,恰好讀到google的工程師用自動駕駛汽車和自動駕駛網路做的乙個模擬,感覺很有道理的樣子,記錄並分享一下 開發一輛自動駕駛汽車所需要的 1 一輛比較現代的車 2 各式各樣的感測器 效能強大的計算機 ai軟體。3 大量的訓練和測試。類似地,開發自動駕駛網路...

自動駕駛相關

計畫 2021年1月10號前,查資料,了解相關資訊 學習目標 1 路徑規劃,有地圖的基礎上,起點到終點的路徑規劃 2 路徑規劃的技術上,避障等如何實現 自動駕駛工程師,谷歌認證機器學習專家,蘭州大學無人駕駛團隊創始人,主攻深度學習,無人駕駛汽車方向。學習資料記錄 優達學城 學習筆記 20200102...

自動駕駛相關

在實際上行駛中,自動駕駛車輛除了直行,還需要根據需求右轉 左轉或者是倒車,倒車的可能性很小,幾乎沒有自動駕駛公司去做這個場景,左轉相比右轉會更難。尤其是在沒有交通訊號燈,或者是停車標識來引導的左轉,這稱之為無保護左轉,即便是對人類司機而言,都是相當困難的,自動駕駛車輛遇到同樣的難題。waymo的行為...