你們好,我是小魚。今天又是週五了,祝你們週末愉快!上週末小魚原本打算去稱稱體重,結果懼怕接受現實,最終尚未勇氣上稱,這周必定要再試一試。\git
不說閒話,今天小魚給你們講一講運動規劃中的路徑搜索算法之RRT(快速隨機擴展樹),最後小魚將帶你們一次運行代碼,直觀感覺一下他們以前的區別。github
機器人要從位置A安全的無碰撞的移動到位置B,同時還須要在移動的過程當中保證運動軌跡的平滑、耗時最短等。這就是運動規劃須要解決的事情。算法
不管是移動機器人仍是機械臂,都須要路徑規劃來幫助規劃出一條合理的路徑(總不能穿牆而過吧),因此運動規劃的重要性就不言而喻了。編程
有的同窗使用過move_base,其實它就是集成了運動規劃和軌跡規劃功能的功能包,負責搜索路徑並控制機器人進行路徑的跟蹤。瀏覽器
快速擴展隨機樹算法是運動規劃算法的一種,其主要用於路徑搜索。安全
下圖是小魚跑的一個開源庫中對rrt算法的搜索結果。左下角爲起點,右上角爲終點。markdown
能夠看到,經過不斷的搜索,最終找到了一條從起點到終點之間的無碰撞路線(紅色)。oop
RRT算法,將起點做爲樹的根節點,經過不斷的隨機採樣,添加葉子節點,生成一個隨機擴展樹。當隨機樹中的葉子節點與目標點重合或接近到某個值之內,則搜索成功。學習
因此今天推薦的開源庫是:github.com/motion-plan…優化
git clone https://github.com/motion-planning/rrt-algorithms.git
複製代碼
使用時須要安裝兩個依賴
pip install Rtreepip install Plotly
複製代碼
先定義一個n維搜索空間,並在搜索空間內插入n維度的障礙物,而後設置好起點和終點的位置以及隨機樹展開迭代次數和最大迭代次數。
X_dimensions = np.array([(0, 100), (0, 100)]) # 搜索空間# 障礙物Obstacles = np.array([(20, 20, 40, 40), (20, 60, 40, 80), (60, 20, 80, 40), (60, 60, 80, 80)])x_init = (0, 0) # 起點位置x_goal = (100, 100) # 終點位置Q = np.array([(8, 4)]) # 樹的邊長r = 20 # 與障礙物相交的最小邊長max_samples = 1024 # 最大搜索次數prc = 0.1 # 判斷是否搜索成功的閾值X = SearchSpace(X_dimensions, Obstacles)# 建立搜索空間# 建立RRT搜索對象並開始搜索rrt = RRT(X, Q, x_init, x_goal, max_samples, r, prc)path = rrt.rrt_search()
複製代碼
pyhton3 rrt_2d.py
複製代碼
純Python(3)實現,依賴也很簡潔,運行代碼後會生成一個網頁並自動打開瀏覽器。
運行結果
該開源庫除了RRT算法,還有作了優化的rrt-connect、rrt*等算法實現。
rrt-connect算法是從起點和終點同時建樹,速度會快不少,小魚截個圖給你們看看。
你們看了rrt算法和rrt-connect算法是否是像小魚同樣以爲不夠滿意呢?
若是本身作的機器人像這樣子走,確定會被老闆炒魷魚的。緣由在於路徑不是最優的,有的地方甚至來來回回折騰着。
因此接下來小魚介紹另一種rrt*,該算法經過將以前搜索過的點加入了路徑計算中來,隨着葉子點增長,在找到目標點或者達到設定的最大循環次數以前,能夠不斷優化路徑。
讓咱們來看一下rrt*的運行結果:
同時該開源庫還給了三維空間的RRT算法使用樣例,作機械臂運動規劃的小夥伴能夠多看一看。
若是有不清楚的或者錯誤的地方,歡迎聯繫小魚~
我是小魚,機器人領域資深玩家,現深圳某獨腳獸機器人算法工程師一枚
初中學習編程,高中開始學習機器人,大學期間打機器人相關比賽實現月入2W+(國特)
目前在作公衆號,輸出機器人學習指南、論文註解、工做經驗,歡迎你們關注小智,一塊兒交流技術,學習機器人