使用 Carla 和 Python 的自动驾驶汽车第 2 部分 —— 控制汽车并获取传感器数据
歡迎來到 Carla 自動駕駛汽車教程系列的第 2 部分。在本教程中,我們將向您介紹 Carla 的 Python API 方面。
首先,Carla 中有幾種類型的對象:
有了這些信息,讓我們開始編寫一些實(shí)際的代碼。首先,讓我們制作一輛生成并簡單地向前行駛的汽車,然后我們希望看到來自我們將放置在汽車引擎蓋上的常規(guī) RGB 相機(jī)的信息。
前幾行代碼,我只是從示例目錄中的其他腳本之一復(fù)制和粘貼,我也將在示例目錄中編寫此代碼。
import glob import os import systry:sys.path.append(glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % (sys.version_info.major,sys.version_info.minor,'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0]) except IndexError:passimport carla上面的代碼非常簡單,除了 try/except 之外。這里所做的就是找到 carla egg 文件,這是我們用于 Carla 包本身的文件。為了真正導(dǎo)入 carla,我們需要找到它,這也是我們現(xiàn)在只是將文件扔到示例目錄中的原因。您也可以將所需的 Carla 文件移動到您的 Python site-packages中,并以這種方式導(dǎo)入。
接下來,我們將做更多的導(dǎo)入:
import random import time import numpy as np import cv2如果需要,可以安裝 numpy 和 cv2:
pip install numpy pip install opencv-python我們將立即處理的第一件事是演員列表,并在我們完成后清理它們。回想一下,我們既有客戶端也有服務(wù)器。當(dāng)我們開始在服務(wù)器上運(yùn)行客戶端時,我們會在服務(wù)器上創(chuàng)建參與者。如果我們直接退出而不進(jìn)行清理,我們的演員仍將在服務(wù)器上。
actor_list = [] try:finally:print('destroying actors')for actor in actor_list:actor.destroy()print('done.')在這里,我們將在 try/finally 中封裝主要的大部分代碼。我們將把所有的邏輯和actor創(chuàng)建放在try中,然后finally位會為我們清理它。
接下來,回想一下我們在 Carla 中有 3 個主要“事物”:世界、藍(lán)圖和演員。首先,我們將連接到我們的服務(wù)器,獲取世界,然后訪問藍(lán)圖。
actor_list = [] try:client = carla.Client('localhost', 2000)client.set_timeout(2.0)world = client.get_world()blueprint_library = world.get_blueprint_library()請注意,您需要運(yùn)行 carla(shell 或 .exe)才能連接。
現(xiàn)在我們有了藍(lán)圖,我們可以過濾一些東西。例如:
bp = blueprint_library.filter('model3')[0]這將為我們提供特斯拉model 3的默認(rèn)藍(lán)圖。現(xiàn)在我們有了藍(lán)圖,我們可以生成這輛車,但是在哪里呢? Carla 有 200 個出生點(diǎn),所以我們可以隨機(jī)選擇其中一個:
spawn_point = random.choice(world.get_map().get_spawn_points())現(xiàn)在我們可以生成那輛車:
vehicle = world.spawn_actor(bp, spawn_point)我們還可以通過以下方式控制汽車:
vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=0.0))最后,我們不要忘記將這輛車添加到我們需要跟蹤和清理的演員列表中:
actor_list.append(vehicle)太好了,我們有一輛汽車,我們實(shí)際上可以用它來運(yùn)行。讓我們運(yùn)行 5 秒鐘然后清理:
time.sleep(5)現(xiàn)在,您可能很難在 5 秒內(nèi)找到您的汽車,但您可以轉(zhuǎn)到可視化 carla 環(huán)境的服務(wù)器位,使用鼠標(biāo)向下看,然后 s 開始放大。您應(yīng)該對環(huán)境有一個俯視圖,例如:
到目前為止,我們可以運(yùn)行我們的腳本,從上面看,我們可能會發(fā)現(xiàn)它是直行的:
很難看到,但是,當(dāng)它移動時,很容易發(fā)現(xiàn)。請注意,汽車可能在隧道中生成。如果您沒有碰巧看到您的車輛,只需再次運(yùn)行該腳本。
好的,很好,到目前為止一切正常。我們接下來想要的是在我們的汽車上安裝一個攝像頭,并弄清楚如何訪問這些數(shù)據(jù)。理想情況下,這款引擎蓋相機(jī)將是我們的主要傳感器。我們以后也可以合并其他傳感器,但引擎蓋攝像頭似乎是一個好的開始。
您可以在此處了解有關(guān)各種可用傳感器以及如何使用它們的更多信息:Carla Sensors。現(xiàn)在,我將只展示如何使用 RGB 相機(jī):
在我們腳本的頂部,讓我們設(shè)置幾個常量:
IM_WIDTH = 640 IM_HEIGHT = 480現(xiàn)在,我們加載傳感器的藍(lán)圖并設(shè)置一些屬性:
# https://carla.readthedocs.io/en/latest/cameras_and_sensors # get the blueprint for this sensor blueprint = blueprint_library.find('sensor.camera.rgb') # change the dimensions of the image blueprint.set_attribute('image_size_x', f'{IM_WIDTH}') blueprint.set_attribute('image_size_y', f'{IM_HEIGHT}') blueprint.set_attribute('fov', '110')接下來,我們需要將它添加到我們的汽車中。首先,我們將從相對位置調(diào)整傳感器,然后將其連接到我們的汽車上。所以我們會說這個傳感器,從它的相對位置(汽車),我們想要向前移動 2.5 和向上 0.7。我不知道這是以米為單位還是什么。隨意根據(jù)您選擇的車輛調(diào)整這些值,或者只使用我的。
# Adjust sensor relative to vehicle spawn_point = carla.Transform(carla.Location(x=2.5, z=0.7))# spawn the sensor and attach to vehicle. sensor = world.spawn_actor(blueprint, spawn_point, attach_to=vehicle)現(xiàn)在我們想將此傳感器添加到我們的演員列表中:
# add sensor to list of actors actor_list.append(sensor)最后,我們想用這個傳感器做點(diǎn)什么。我們想從中獲得圖像,所以我們想聽。
要對我們從傳感器獲得的數(shù)據(jù)做一些事情,我們可以使用 lambda 函數(shù):
sensor.listen(lambda data: process_img(data))在這種情況下,我們將從傳感器獲取數(shù)據(jù),并將其傳遞給一個名為 process_img 的函數(shù)。這還不存在,所以讓我們讓它:
def process_img(image):i = np.array(image.raw_data) # convert to an arrayi2 = i.reshape((IM_HEIGHT, IM_WIDTH, 4)) # was flattened, so we're going to shape it.i3 = i2[:, :, :3] # remove the alpha (basically, remove the 4th index of every pixel. Converting RGBA to RGB)cv2.imshow("", i3) # show it.cv2.waitKey(1)return i3/255.0 # normalize完整的代碼是:
import argparse import glob import os import systry:sys.path.append(glob.glob('./carla/dist/carla-*%d.%d-%s.egg' % (sys.version_info.major,sys.version_info.minor,'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0]) except IndexError:pass import carlaimport random import time import numpy as np import cv2IM_WIDTH = 640 IM_HEIGHT = 480def process_img(image):i = np.array(image.raw_data)i2 = i.reshape((IM_HEIGHT, IM_WIDTH, 4))i3 = i2[:, :, :3]cv2.imshow("", i3)cv2.waitKey(1)return i3 / 255.0actor_list = [] try:argparser = argparse.ArgumentParser(description=__doc__)argparser.add_argument('--host',metavar='H',default='127.0.0.1',help='IP of the host server (default: 127.0.0.1)')argparser.add_argument('-p', '--port',metavar='P',default=2000,type=int,help='TCP port to listen to (default: 2000)')args = argparser.parse_args()actor_list = []client = carla.Client(args.host, args.port)client.set_timeout(2.0)world = client.get_world()blueprint_library = world.get_blueprint_library()bp = blueprint_library.filter('model3')[0]print(bp)spawn_point = random.choice(world.get_map().get_spawn_points())vehicle = world.spawn_actor(bp, spawn_point)vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=0.0))# vehicle.set_autopilot(True) # if you just wanted some NPCs to drive.actor_list.append(vehicle)# https://carla.readthedocs.io/en/latest/cameras_and_sensors# get the blueprint for this sensorblueprint = blueprint_library.find('sensor.camera.rgb')# change the dimensions of the imageblueprint.set_attribute('image_size_x', f'{IM_WIDTH}')blueprint.set_attribute('image_size_y', f'{IM_HEIGHT}')blueprint.set_attribute('fov', '110')# Adjust sensor relative to vehiclespawn_point = carla.Transform(carla.Location(x=2.5, z=0.7))# spawn the sensor and attach to vehicle.sensor = world.spawn_actor(blueprint, spawn_point, attach_to=vehicle)# add sensor to list of actorsactor_list.append(sensor)# do something with this sensorsensor.listen(lambda data: process_img(data))time.sleep(20)finally:print('destroying actors')for actor in actor_list:actor.destroy()print('done.')這應(yīng)該會彈出一個新窗口來顯示相機(jī)傳感器:
偉大的!現(xiàn)在,讓我們在這里進(jìn)行一些強(qiáng)化學(xué)習(xí)!應(yīng)該很容易…對吧?
總結(jié)
以上是生活随笔為你收集整理的使用 Carla 和 Python 的自动驾驶汽车第 2 部分 —— 控制汽车并获取传感器数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 3981.字符串替换
- 下一篇: 2020年第十一届蓝桥杯 - 省赛 -