python無人機路徑規劃算法_RRT算法在Python中的實現,快速,拓展,隨機,樹

"""

《基于智能優化與RRT算法的無人機任務規劃方法研究》博士論文

《基于改進人工勢場法的路徑規劃算法研究》碩士論文

"""

import matplotlib.pyplot as plt

import random

import math

import copy

show_animation = True

class Node(object):

"""

RRT Node

"""

def __init__(self, x, y):

self.x = x

self.y = y

self.parent = None

class RRT(object):

"""

Class for RRT Planning

"""

def __init__(self, start, goal, obstacle_list, rand_area):

"""

Setting Parameter

start:Start Position [x,y]

goal:Goal Position [x,y]

obstacleList:obstacle Positions [[x,y,size],...]

randArea:random sampling Area [min,max]

"""

self.start = Node(start[0], start[1])

self.end = Node(goal[0], goal[1])

self.min_rand = rand_area[0]

self.max_rand = rand_area[1]

self.expandDis = 1.0

self.goalSampleRate = 0.05 # 選擇終點的概率是0.05

self.maxIter = 500

self.obstacleList = obstacle_list

self.nodeList = [self.start]

def random_node(self):

"""

產生隨機節點

:return:

"""

node_x = random.uniform(self.min_rand, self.max_rand)

node_y = random.uniform(self.min_rand, self.max_rand)

node = [node_x, node_y]

return node

@staticmethod

def get_nearest_list_index(node_list, rnd):

"""

:param node_list:

:param rnd:

:return:

"""

d_list = [(node.x - rnd[0]) ** 2 + (node.y - rnd[1]) ** 2 for node in node_list]

min_index = d_list.index(min(d_list))

return min_index

@staticmethod

def collision_check(new_node, obstacle_list):

a = 1

for (ox, oy, size) in obstacle_list:

dx = ox - new_node.x

dy = oy - new_node.y

d = math.sqrt(dx * dx + dy * dy)

if d <= size:

a = 0 # collision

return a # safe

def planning(self):

"""

Path planning

animation: flag for animation on or off

"""

while True:

# Random Sampling

if random.random() > self.goalSampleRate:

rnd = self.random_node()

else:

rnd = [self.end.x, self.end.y]

# Find nearest node

min_index = self.get_nearest_list_index(self.nodeList, rnd)

# print(min_index)

# expand tree

nearest_node = self.nodeList[min_index]

# 返回弧度制

theta = math.atan2(rnd[1] - nearest_node.y, rnd[0] - nearest_node.x)

new_node = copy.deepcopy(nearest_node)

new_node.x += self.expandDis * math.cos(theta)

new_node.y += self.expandDis * math.sin(theta)

new_node.parent = min_index

if not self.collision_check(new_node, self.obstacleList):

continue

self.nodeList.append(new_node)

# check goal

dx = new_node.x - self.end.x

dy = new_node.y - self.end.y

d = math.sqrt(dx * dx + dy * dy)

if d <= self.expandDis:

print("Goal!!")

break

if True:

self.draw_graph(rnd)

path = [[self.end.x, self.end.y]]

last_index = len(self.nodeList) - 1

while self.nodeList[last_index].parent is not None:

node = self.nodeList[last_index]

path.append([node.x, node.y])

last_index = node.parent

path.append([self.start.x, self.start.y])

return path

def draw_graph(self, rnd=None):

"""

Draw Graph

"""

print('aaa')

plt.clf() # 清除上次畫的圖

if rnd is not None:

plt.plot(rnd[0], rnd[1], "^g")

for node in self.nodeList:

if node.parent is not None:

plt.plot([node.x, self.nodeList[node.parent].x], [

node.y, self.nodeList[node.parent].y], "-g")

for (ox, oy, size) in self.obstacleList:

plt.plot(ox, oy, "sk", ms=10*size)

plt.plot(self.start.x, self.start.y, "^r")

plt.plot(self.end.x, self.end.y, "^b")

plt.axis([self.min_rand, self.max_rand, self.min_rand, self.max_rand])

plt.grid(True)

plt.pause(0.01)

def draw_static(self, path):

"""

畫出靜態圖像

:return:

"""

plt.clf() # 清除上次畫的圖

for node in self.nodeList:

if node.parent is not None:

plt.plot([node.x, self.nodeList[node.parent].x], [

node.y, self.nodeList[node.parent].y], "-g")

for (ox, oy, size) in self.obstacleList:

plt.plot(ox, oy, "sk", ms=10*size)

plt.plot(self.start.x, self.start.y, "^r")

plt.plot(self.end.x, self.end.y, "^b")

plt.axis([self.min_rand, self.max_rand, self.min_rand, self.max_rand])

plt.plot([data[0] for data in path], [data[1] for data in path], '-r')

plt.grid(True)

plt.show()

def main():

print("start RRT path planning")

obstacle_list = [

(5, 1, 1),

(3, 6, 2),

(3, 8, 2),

(1, 1, 2),

(3, 5, 2),

(9, 5, 2)]

# Set Initial parameters

rrt = RRT(start=[0, 0], goal=[8, 9], rand_area=[-2, 10], obstacle_list=obstacle_list)

path = rrt.planning()

print(path)

# Draw final path

if show_animation:

plt.close()

rrt.draw_static(path)

if __name__ == '__main__':

main()

ff805ef60d0ec3ab2b871a013e7dd4da.png

6ca8ca8462a1556e02e8500b6339b900.png

1dff98b62474d0fa368d8aab1394057b.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532883.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uc3842改可調電源教程_明緯開關電源改可調詳細教程

1.拆除啟動電阻&#xff0c;電路板是R12R59R58R9 四個150K的電阻。2.拆除原494供電&#xff0c;去掉J22一根跳線&#xff0c;12V輔助電源正極接J22到494一端&#xff0c;負極接地。3.去掉J15更換為20K電阻&#xff0c;同時拆掉變壓器下面的ZD1過壓保護&#xff0c;輸出可達到50…

duino例程 stm32_stm32duino

{"data":{"id":"8000-000000437045-0","name":"SEO專題頁欄目分發組","type":"1","position":"8000-000000004003-0","status":1,"linkList":[{"id"…

java webservice ip_通過Web Service實現IP地址查詢功能的示例

實例01 實現一個簡單的Web服務訪問本實例將實現IP地址查詢接口服務&#xff0c;根據用戶傳入的IP地址返回IP所在的省、市、地區&#xff0c;實例中將會用到IP地址庫用于查詢信息&#xff0c;由于數據較多&#xff0c;所以讀者可在光盤資源文件中直接附加數據庫文件&#xff0c;…

java默認數組值_數組元素默認的初始值都是什么

在Java中&#xff0c;使用數組時&#xff0c;如果為數組分配了內存空間&#xff0c;但是沒有為數組元素指定初始值&#xff0c;系統會自動為數組元素指定初始值。數組元素的初始值與數組的數據類型有關&#xff0c;對于不同數據類型的數組&#xff0c;其數組元素的初始值是不一…

java 異步通信處理_java異步通信

在Merlin之前,編寫Socket程序是比較繁瑣的工作.因為輸入輸出都必須同步.這樣,對于多客戶端客戶/服務器模式,不得不使用多線程.即為每個連接的客戶都分配一個線程來處理輸入輸出.由此而帶來的問題是可想而知的.程序員不得不為了避免死鎖,線程安全等問題,進行大量的編碼和測試.很…

Java統計做題正確率_ResNet:訓練期間的準確率為100%,但使用相同數據的預測準確率為33%...

我之前遇到過類似的問題&#xff0c;但解決方案非常簡單 . 你需要增加時代數 . 這是1000個紀元后的輸出[[ 9.99999881e-01 8.58182432e-08 9.54004670e-12][ 8.58779623e-20 9.99999881e-01 6.76907632e-08][ 2.12900631e-26 4.09224481e-34 1.00000000e00]]這是培訓日志..Epoc…

java成員初始化順序_Java成員初始化順序

1. 初始化順序在類的內部&#xff0c;變量定義的先后順序決定了初始化的順序。即使變量散布于方法定義之間&#xff0c;他們仍會在任何方法(包括構造器)被調用之前初始化。2. 靜態成員初始化順序1??初始化類的靜態成員或者靜態塊&#xff0c;靜態初始化只在Class對象首次加載…

java五星好評點評器_親,麻煩給個五星好評!—RatingBar

引言上一篇的CheckBox已經讓大家越來越接近實戰演練了&#xff0c;本章我們繼續分享干貨給大家&#xff0c;今天介紹一個實用的UI控件RatingBar(星級評分條)&#xff0c;對于使用過電商APP(某東&#xff0c;某寶等)的小伙伴們來說&#xff0c;應該不會陌生。在對商品進行評價時…

java激光推送ios_關于ios極光推送server端注意的地方

今天試用了極光推送API用它是因為&#xff0c;大多數人說它的文檔是最全的&#xff0c;但是用過之后&#xff0c;發現關于IOS的文檔&#xff0c;還是很不夠&#xff0c;導致走了一點彎路&#xff01;特別是服務端的代碼&#xff1a;https://github.com/jpush/jpush-api-java-cl…

日是這一年的等幾天Java代碼_java中計算指定日期是一年的第幾天的方法

Java輸入日期計算是這年的第幾天&#xff1a;思路通過年份區分出是閏年還是平年&#xff0c;平年 2 月 28 天&#xff0c;閏年 2 月 29 天&#xff1b;1、3、5、7、8、10、12 月份 31 天其余月份均為 30 天&#xff1b;然后將每個月的天數相加即可&#xff0c;注意如果輸入的是…

[2021-CVPR] Fine-grained Angular Contrastive Learning with Coarse Labels 論文簡析

[2021-CVPR] Fine-grained Angular Contrastive Learning with Coarse Labels 論文簡析 論文地址&#xff1a;https://arxiv.org/abs/2012.03515 代碼地址&#xff1a;https://github.com/guybuk/ANCOR 首先通俗地介紹一下細粒度&#xff08;fine-grained&#xff09;&#…

orcle mysql 查詢_Oracle與Mysql的高級查詢與難點sql

一、連接查詢 1. 內連接 內連接用于返回滿足連接條件的所有記錄。默認情況下&#xff0c;在執行連接查詢時如果沒有指定任何連接操作符&#xff0c;那么這些連接查詢都屬于內連接。 Sql 代碼 1. SELECT a.dname,b.ename from depta,empb where a.deptnob.deptno and a.deptno10…

[2020-AAAI] Revisiting Image Aesthetic Assessment via Self-Supervised Feature Learning 論文簡析

[2020-AAAI] Revisiting Image Aesthetic Assessment via Self-Supervised Feature Learning 論文簡析 論文鏈接&#xff1a;https://arxiv.org/abs/1911.11419 本文探索從自監督的角度進行美學評估。基于一個基本的動機&#xff1a;一個好的美學特征表示應該能夠辨別出不同的…

java9 堆外內存_java堆外內存泄漏排查

當考慮Java中的內存泄漏時&#xff0c;我們通常會考慮Java堆泄漏&#xff0c;即在堆中分配的對象沒有被垃圾收集。這是我在處理一臺服務器內存泄漏時的想法&#xff0c;但我即將經歷的遠超出我的想象。癥狀&#xff1a;運行Vertx應用程序(沒有交換分區)的生產服務器被Linux內存…

[2020-CVPR] Dynamic Region-Aware Convolution 論文簡析

[2020-CVPR] Dynamic Region-Aware Convolution 論文簡析 論文地址&#xff1a;https://arxiv.org/abs/2003.12243 參考代碼地址&#xff08;非官方&#xff09;&#xff1a;https://github.com/shallowtoil/DRConv-PyTorch 代碼筆者自己試了一下&#xff0c;應該是可以的&…

java activity模式_Activity的啟動模式

Android系統采用任務棧的方式來管理Activity實例。棧是后進先出的數據結構。通常一個應用程序對應一個任務棧&#xff0c;默認情況下&#xff0c;每啟動一個Activity都會入棧&#xff0c;處于棧頂位置。用戶操作的永遠都是棧頂的Activity。Activity可以層疊擺放&#xff0c;每啟…

Python 中的可執行對象 eval,exec 和 compile與其在深度學習訓練中的應用實例

Python 中的可執行對象 eval&#xff0c;exec 和 compile 與其在深度學習訓練中的應用實例 eval 計算指定表達式的值。也就是說它要執行的python代碼只能是單個表達式&#xff08;注意eval不支持任何形式的賦值操作&#xff09;&#xff0c;而不能是復雜的代碼邏輯。 eval(s…

php寫簡單接口_php寫接口的日常

php寫接口的日常/*評論列表*/public function commentListW(){$base new Base();$info $base->getUserByToken();$shop_id $info[shop_id];$page $this->data[page]?:1;$pagesize $this->data[pagesize]?:C(ROLLPAGE);$search $this->data[search];$and &…

mmdetection 使用筆記 01: 安裝與簡單的推理demo

mmdetection 使用筆記 01: 安裝與簡單的推理demo mmdetection是來自商湯和港中文聯合實驗室openmmlab推出的目標檢測工具包&#xff0c;與其同系列的還有基礎視覺包mmcv&#xff0c;圖像分類mmclassification&#xff0c;還有mmaction&#xff0c;mmaction2等等。 今天第一次…

php無限評論回復_php實現無限級評論功能_后端開發

php去除數組的鍵名的方法_后端開發在php中可以使用“array_values()”函數去除數組的鍵名&#xff0c;該函數返回包含數組中所有的值的數組&#xff0c;其語法是“array_values(array)”&#xff0c;其參數“array”表示規定的數組&#xff0c;返回值是包含數組中所有的值的數組…