標注:本文來自本實驗室胡宗盛的研究成果。
定位的技術發展
第一為 GNSS 定位,該定位依托于衛星定位技術,定位精度在 10 米以下;
第二為慣導定位;
第三為高精度定位,該種定位已經實現了對傳感器的建模和對獲取到的傳感器數據的信息的處理等,定位精度已經達到了厘米級的程度。
因此,精確的定位是自動駕駛的基礎,也是核心,缺少精確的定位,自動駕駛可能會出現失誤。
自動駕駛定位系統的基本要求
高精度: 要求達到厘米級;
高可用性:為了保持其穩定性和實用性,自動駕駛測試的階段已經從封閉階段轉換為開放階段,這其實是為了要求我們的定位系統能夠處理日益復雜的情況,應對不可預知的情況發生的能力大大提升;
高可靠性:這個自動駕駛定位系統的輸出是判斷感知的方法,應對措施,提供解決方案反映了應對的能力,這個時候即便有一丁點的小誤差也會給我們帶來極其嚴重的后果;
自主完好性檢測:鑒于當前系統建模的準確性還沒有到達 100%,即便已經比較靠近。所以當我們提供的輸出不夠準確的情況下,我們能做的就是告訴并勸戒駕駛用戶采取相應的措施,以此防止交通事故的發生,我們對它的要求就是在預測發生事故時可以準確的提醒以及降低錯誤提醒的發生概率。
自動駕駛定位的方法與流程
1.在感應到基站的情況下,采用衛星定位和慣導組合的定位技術;
2.根據需求分別自動切換三種自動駕駛的定位技術;
3.在隧道或夜間外界環境光線穩定的情況下,采用視覺里程算法的定位技術;
4.在未感知到基站的情況下,采用激光雷達點云和高精度地圖匹配的定位技術。
Carla.GeoLocation:類包含地理坐標模擬數據,該 carla.Map 可以通過使用模擬轉換位置 OpenDrive文件中的標簽,包括(緯度,經度,高度)。
Carla.GnssMeasurement:定義由 sensor.other.gnss 注冊的 Gnss 數據的類,實際上是通過傳感器的位置和 Open- Drive 地理參考來報告其位置,包括(高度,緯度,經度)。
Carla.IMUMeasurement:繼承自carla.SensorData,定義由secsor.other.imu 注冊的數據的類,根據當前carla.world進行傳感器轉換,實際上起著加速度計,陀螺儀和指南針的作用。
Carla.Image:被用作相機傳感器檢索的初始數據,有不同的相機傳感器(當前為 3 個,分別是RGB,深度和語義分割),并且每個傳感器對圖像的使用方式都不同,包括(圖像水平,圖像高度,圖像寬度)。
自動駕駛 GPS 建模
創建客戶
創建客戶需要標識它的 IP 地址和兩個與服務器通信的 TCP 端口,第三個參數可以設置工作線程的數量。默認情況下為 all(0)。
client = carla.Client(’localhost’,2000)
默認情況下,carla 使用本地主機 IP 和端口 2000 進行連接,但是可以隨意更改,在這種情況下,第二個端口始終為 2001。
創建客戶端后,要設置超時時間。這限制了所有網絡的操作,使得這些操作永遠不會阻止客戶端,如果連接失敗,將會返回錯誤。在實際操作的過程中,發現預定的
10.0 不足以滿足,通常情況下我需要設置的超時時間更長一些。client.set_timeout(100.0)
可能會連接到許多客戶端,因為通常情況下,一次性運行多個腳本是很常見的。在具有高級 carla 功能的多客戶端方案中進行工作將會使得通信變得更加復雜。
需要注意的是客戶端和服務器具有不同的 libcarla 模塊。版本不同的話可能會出現問題,可以使用 get_client_version() 和 get_server_version() 方法進行檢查。
與世界聯系
world=client.get_world()
客戶端可以很容易的連接和檢索當前世界。除此之外,客戶端還可以獲取可用地圖列表以更改當前地圖,這會摧毀當前世界并創造一個新的世界。每個世界都有一個自己的 id,每次客戶要求 load_world() 或者 reload_world() 的時候,前一個世界都會被銷毀, 從頭開始創建新的世界,在此過程中虛幻引擎不會重新啟動。
print(client.get_available_maps())
world=client.load_world(’Town02’)
client.load_world()
地圖示例:
Actor和Blueprint
在 carla 中,參與者不僅僅只包括車輛和步行者,還包括傳感器,交通標志,交通信號燈和行人觀眾,全面了解如何對其進行操作至關重要。藍圖可以使得用戶將新的參與者平穩地合并到模擬中,它們是已經制作的具有動畫和一系列屬性的模型,其中一些是可以修改的,而其他的則不是。這些屬性包括車輛顏色,激光雷達傳感器中的通道數量,行人的速度等。
blueprint_library=world.get_blueprint_library()
每一個藍圖 (blueprint) 有一個 ID 來標志它們,并隨其生成演員。可以在藍圖庫找到某個 ID,隨機選擇這個 ID 對應的藍圖,或者使用通配符模式過濾結果。
世界對象負責生成角色并對其進行跟蹤,生成角色有兩種不同的方法:spawn_actor()如果生成失敗,則會引發異常;try_spawn_actor() 如果生成失敗,則返回 None。
transform=Transform(Location(x=210,y=180,z=50),Rotation(yaw=180)) actor=world.spawn_actor(blueprint,transform)
如果在選定的位置發送碰撞的話,不會生成角色,使用map.get_spawn_points()這個函數返回推薦的生成點列表;同理,world.get_random_location() 可以返回人行道上的隨機點,為行人設置目標位置。
camera=world.spawn_actor(camera_bp,relative_transform,attach_to=my_vehicle,carla.AttachmentType.Ri
這一句將 camera 攝像機固定在創造的汽車上,使得二者的位置保持相對固定。產生角色之后,世界會將它添加到參與者列表之中。
定義角色列表并清理
actor 主要由get() 和 set() 方法組成,這里需要主要的是請求會被異步的發送到模擬器,但是 carla 每次解析它們的時間都是有限的,用 set() 方法會累積滯后。
地圖和導航
創建及改變地圖和世界的方法在上面已經提到過了,與航路點相關的所有事情都發生在客戶端,不需要與服務器進行通信,每個航路點都包含 carla.Transform,說明了它在地圖上的位置以及包含它的車道的方向,carla 的導航是通過 Waypoint API 進行管理的,由 carla.Waypoint 和 carla.Map 的方法摘要組成。
將模擬點轉換為地理坐標,使用緯度和經度值將某個位置轉換為 carla.GeoLocation, 將道路信息轉換為 OpenDrive 格式保存。
my_geolocation=map.transform_to_getlocation(vehicle.transform) info_map=map.to_opendrive()
利用carla.get_transform().location 獲取數據,下圖是運行 50 秒的初始位置和結束位置:
識別位置坐標
可以看出,Carla 中小車的位置最開始在 (0,0,0),經過 50 秒的運行之后位置變化為(196.215607,241.279999,0.271780)。
fqj
-
自動駕駛
+關注
關注
784文章
13787瀏覽量
166406 -
數字孿生
+關注
關注
4文章
1319瀏覽量
12243
發布評論請先 登錄
相關推薦
評論