姓名:王澤華褐奥;學號:22011211045咖耘;學院:通信工程學院
原文鏈接:https://blog.csdn.net/qq_45066628/article/details/124456279
【嵌牛導讀】自動駕駛算法的調試和效果評測首先要在仿真環(huán)境中去做撬码,因此,一個強大呜笑、靈活的仿真環(huán)境是開發(fā)、測試過程中必不可少的要素蹈垢。我們在查找可用的仿真工具時主要關注以下幾個特性:1.開源袖裕,免費;2.包含高速場景急鳄;3.可以便捷的控制、切換場景的環(huán)境疾宏,且場景、環(huán)境盡可能的豐富與真實坎藐;4.可以便捷的控制、切換場景內移動物體(如車輛岩馍、行人等)的行為模式,且行為模式盡可能的豐富與真實蛀恩;第1條基本上把商用的軟件排除掉了,如PreScan双谆,VTD等······席揽。事實上谓厘,在論文庫的檢索過程中,CARLA的出現(xiàn)頻率是最高的庞呕,因此本文將介紹該模擬器及其使用方法。
【嵌牛鼻子】自動駕駛住练、Python
【嵌牛提問】如何運用CARLA進行自動駕駛仿真?
一讲逛、CARLA基本介紹
CARLA是一個開源的自動駕駛模擬器。它是從頭開始構建的盏混,用作模塊化和靈活的API,以解決自動駕駛問題中涉及的一系列任務止喷。 CARLA的主要目標之一是幫助自動駕駛研發(fā)民主化,它是一種易于用戶使用和定制的工具弹谁。為此句喜,模擬器必須滿足一般駕駛問題(例如學習駕駛策略预愤,訓練感知算法等)內不同用例的要求咳胃。 CARLA基于Unreal Engine來運行模擬,并使用OpenDRIVE標準(今天為1.4)定義道路和城市環(huán)境展懈。通過使用Python和C ++處理的API授予對模擬的控制權,該API隨項目的發(fā)展而不斷增長存崖。
為了簡化開發(fā),培訓和驗證駕駛系統(tǒng)的過程金句,CARLA演變成由社區(qū)圍繞主要平臺構建的項目生態(tài)系統(tǒng)。在這種情況下,重要的是要了解有關CARLA如何工作的一些知識偶房,以便充分理解其功能。
二棕洋、CARLA模擬器
CARLA仿真器由可擴展的客戶端-服務器體系結構組成乒融。
服務器負責與仿真本身相關的所有事情:傳感器渲染掰盘,物理計算赞季,世界狀態(tài)及其參與者的更新等等。 由于它旨在獲得逼真的結果申钩,因此最合適的方法是使用專用GPU運行服務器,尤其是在處理機器學習時撒遣。
客戶端由一些客戶端模塊組成,這些客戶端模塊控制場景中演員的邏輯并設置世界條件义黎。 這可以通過利用CARLA API(Python或C ++)來實現(xiàn),CARLA API是在服務器和客戶端之間進行中介的層泻云,該層不斷地發(fā)展以提供新的功能。
1.交通流管理:除了用于學習的系統(tǒng)外壶愤,還內置了一個控制車輛的系統(tǒng)馏鹤。它作為CARLA提供的指揮者,以逼真的行為再現(xiàn)城市般的環(huán)境湃累。
2.傳感器:車輛依靠它們來發(fā)布周圍環(huán)境的信息。在CARLA中治力,它們是附著在車輛上的一種特殊的行為體,它們接收到的數據可以被檢索和存儲宵统,以簡化這一過程。目前該項目支持不同類型的傳感器马澈,從攝像頭到雷達、激光雷達等等痊班。
3.記錄器:此功能用于為世界上的每個演員一步步重演模擬。它允許訪問世界上任何地方的時間線中的任何時刻涤伐,是一個很好的追蹤工具。
4.ROS bridge和Autoware實施方法:作為一個普遍化的問題凝果,CARLA項目結和致力于將模擬器整合到其他學習環(huán)境中。
5.開放性資產:CARLA為城市環(huán)境的不同地圖提供便利豆村,并對天氣條件進行控制,同時提供一個藍圖庫掌动,其中有大量的行為者可供使用。然而粗恢,這些元素可以定制,并且可以按照簡單的準則生成新的元素眷射。
6.場景運行器:為了簡化車輛的學習過程,CARLA提供了一系列描述不同情況的路線涌庭,供大家迭代。這些也為CARLA挑戰(zhàn)賽奠定了基礎欧宜,開放給大家測試自己的解決方案坐榆,并進入排行榜。
三冗茸、CARLA 簡單上手
CARLA的快速上手指南請參考官方文檔https://carla.readthedocs.io/en/latest/getting_started/
CARLA 目前僅支持 Linux 和 Windows席镀,需要去下載相應的版本。在本文寫作的時間夏漱,Windows 僅支持到 0.9.5 版本豪诲,Linux 支持到0.9.6。
需要 安裝 numpy 和 pygame.
下載解壓文件夾之后挂绰,Windows 環(huán)境下直接運行 “CarlaUE4.exe” 文件屎篱,linux 環(huán)境下 終端命令: “./CarlaUE4.sh” 即可打開模擬器。
模擬器就是一個小鎮(zhèn)的環(huán)境,有道路交播,建筑专肪,街道,交通燈等等堪侯。不過目前是沒有行人和車輛的嚎尤。需要運行 python 腳本代碼。
? ? ? ?python spawn_npc.py -n 80
也可以運行這個腳本添加天氣變量(天黑伍宦,下雨芽死,刮風等)次洼。
? ? ? python dynamic_weather.py
當然也可以體驗一下手動駕駛汽車的感覺关贵,僅需要運行這個腳本就可以了。
? ? ? python manual_control.py
如上圖所示卖毁,可以像玩游戲一樣手動操作窗口中汽車前進揖曾、后退、轉彎和剎車等動作亥啦,同時環(huán)境的及時反饋也可以收集到炭剪。可以感應到周圍車輛的大小翔脱,交通燈信號奴拦,是否有撞擊等等。
當然你也可以用快捷鍵 P 讓汽車處于自動駕駛狀態(tài)届吁。不過需要注意的是错妖,此時汽車的自動駕駛并不是通過機器學習得到的模型,而是通過對模擬器中設置的汽車行駛交通規(guī)則實現(xiàn)的疚沐。
注意如果在運行腳本的時候出現(xiàn)導入 carla 失敗的錯誤暂氯,請檢測python版本。在PythonAPI\carla\dist 目錄中可以看到相應的python 版本的.egg 文件亮蛔。筆者使用的是0.9.5 版本 carla 其中 Windows 10 需要使用 python 3.7. Linux 需要使用 python 3.5.
四痴施、Python 控制汽車快速上手
為了便于進后機器學習的需要,本文我們快速在模擬器中創(chuàng)建一輛汽車尔邓,并讓他直線行駛晾剖,通過攝像頭將感知到的圖片顯示出來锉矢。之后我們便可用攝像頭收集到的圖像信息以及汽車在環(huán)境中的反饋訓練(強化學習)模型梯嗽,完成自動駕駛的任務。詳細指南請參考官方 Python API 指南沽损。
初始化環(huán)境灯节。創(chuàng)建 Client 連接模擬器的服務器,并通過 “blueprint” 創(chuàng)建一個汽車blueprint。
? ? ? ?# set up the environment
? ? ? ? ? ?client = carla.Client("localhost", 2000)
? ? ? ? ? ?client.set_timeout(2.0)
? ? ? ? ? ?world = client.get_world()
? ? ? ? ? ?blueprint_library = world.get_blueprint_library()
? ? ? ? ? ?bp = blueprint_library.filter("model3")[0]
初始化汽車炎疆,在模擬器世界中卡骂,隨機出現(xiàn)一輛汽車
? ? ? ? ? spawn_point = random.choice(world.get_map().get_spawn_points())
? ? ? ? ? ? ? ? vehicle = world.spawn_actor(bp,spawn_point)
控制汽車,當然你可以用自動駕駛模式"vehicle.set_autopilot(True)"讓汽車根據模擬器制定的規(guī)則行駛形入,不過我們在這里讓汽車直行
? ? ? ? ? vehicle.apply_control(carla.VehicleControl(throttle=1.0,steer=0.0)) # car go straight
? ? ? ? ? actor_list.append(vehicle)
設置攝像頭
? ? ? ? ?cam_bp = blueprint_library.find("sensor.camera.rgb")
? ? ? ? ? ? ? ? cam_bp.set_attribute("image_size_x", "{}".format(IM_WIDTH))
? ? ? ? ? ? ? ? cam_bp.set_attribute("image_size_y", "{}".format(IM_HEIGHT))
? ? ? ? ? ? ? ? cam_bp.set_attribute("fov","110") #"fov" feel of view
? ? ? ? ? ? ? ? spawn_point = carla.Transform(carla.Location(x=2.5,z=0.7)) #locate the camera
? ? ? ? ? ? ? ? sensor = world.spawn_actor(cam_bp, spawn_point, attach_to = vehicle)
? ? ? ? ? ? ? ? actor_list.append(sensor)
獲取攝像頭圖片全跨,這里通過 .listen 的 lambda 函數傳回數據。當然不要忘了設計一個延時亿遂。
? ? ? ? sensor.listen(lambda data: process_img(data))
? ? ? ? time.sleep(25)
其中通過 process_img() 方法傳回攝像頭圖像
? ? ? ?def process_img(image):
? ? ? ? ? ? ? ? i = np.array(image.raw_data)
? ? ? ? ? ? ? ? # print(i.shape)
? ? ? ? ? ? ? ? i2 = i.reshape((IM_HEIGHT,IM_WIDTH,4)) #4 changels "rgba"
? ? ? ? ? ? ? ? i3 = i2[:,:,:3] # 3 changels "rgb"
? ? ? ? ? ? ? ?cv2.imshow("",i3)
? ? ? ? ? ? ? ?cv2.waitKey(1)
? ? ? ? ? ? ? ?return i3/255.0
這里需要注意的是浓若,攝像頭得到的圖片有4個通道 “rgba”,需要將第四個通道去掉蛇数,并用opencv 的 cv2.imshow() 將攝像頭捕捉到的圖片 歸一化之后回傳回來挪钓。
最后,我們運行一下這個python 腳本獲取汽車直線前進耳舅,攝像頭所“看到” 的畫面碌上。汽車直行然后撞在了隧道的墻壁上。