日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

使用 Carla 和 Python 的自动驾驶汽车第 2 部分 —— 控制汽车并获取传感器数据

發(fā)布時(shí)間:2024/5/17 python 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 Carla 和 Python 的自动驾驶汽车第 2 部分 —— 控制汽车并获取传感器数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

歡迎來(lái)到 Carla 自動(dòng)駕駛汽車教程系列的第 2 部分。在本教程中,我們將向您介紹 Carla 的 Python API 方面。

首先,Carla 中有幾種類型的對(duì)象:

  • world:這是你的環(huán)境;
  • actors:actors是您的汽車、汽車上的傳感器、行人等;
  • blueprint:blueprint是我們actor的屬性。
  • 有了這些信息,讓我們開始編寫一些實(shí)際的代碼。首先,讓我們制作一輛生成并簡(jiǎn)單地向前行駛的汽車,然后我們希望看到來(lái)自我們將放置在汽車引擎蓋上的常規(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

    上面的代碼非常簡(jiǎn)單,除了 try/except 之外。這里所做的就是找到 carla egg 文件,這是我們用于 Carla 包本身的文件。為了真正導(dǎo)入 carla,我們需要找到它,這也是我們現(xiàn)在只是將文件扔到示例目錄中的原因。您也可以將所需的 Carla 文件移動(dòng)到您的 Python site-packages中,并以這種方式導(dǎo)入。

    接下來(lái),我們將做更多的導(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)行客戶端時(shí),我們會(huì)在服務(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位會(huì)為我們清理它。

    接下來(lái),回想一下我們?cè)?Carla 中有 3 個(gè)主要“事物”:世界、藍(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()

    請(qǐng)注意,您需要運(yùn)行 carla(shell 或 .exe)才能連接。

    現(xiàn)在我們有了藍(lán)圖,我們可以過濾一些東西。例如:

    bp = blueprint_library.filter('model3')[0]

    這將為我們提供特斯拉model 3的默認(rèn)藍(lán)圖?,F(xiàn)在我們有了藍(lán)圖,我們可以生成這輛車,但是在哪里呢? Carla 有 200 個(gè)出生點(diǎn),所以我們可以隨機(jī)選擇其中一個(gè):

    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í)際上可以用它來(lái)運(yùn)行。讓我們運(yùn)行 5 秒鐘然后清理:

    time.sleep(5)

    現(xiàn)在,您可能很難在 5 秒內(nèi)找到您的汽車,但您可以轉(zhuǎn)到可視化 carla 環(huán)境的服務(wù)器位,使用鼠標(biāo)向下看,然后 s 開始放大。您應(yīng)該對(duì)環(huán)境有一個(gè)俯視圖,例如:

    到目前為止,我們可以運(yùn)行我們的腳本,從上面看,我們可能會(huì)發(fā)現(xiàn)它是直行的:

    很難看到,但是,當(dāng)它移動(dòng)時(shí),很容易發(fā)現(xiàn)。請(qǐng)注意,汽車可能在隧道中生成。如果您沒有碰巧看到您的車輛,只需再次運(yùn)行該腳本。

    好的,很好,到目前為止一切正常。我們接下來(lái)想要的是在我們的汽車上安裝一個(gè)攝像頭,并弄清楚如何訪問這些數(shù)據(jù)。理想情況下,這款引擎蓋相機(jī)將是我們的主要傳感器。我們以后也可以合并其他傳感器,但引擎蓋攝像頭似乎是一個(gè)好的開始。

    您可以在此處了解有關(guān)各種可用傳感器以及如何使用它們的更多信息:Carla Sensors?,F(xiàn)在,我將只展示如何使用 RGB 相機(jī):

    在我們腳本的頂部,讓我們?cè)O(shè)置幾個(gè)常量:

    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')

    接下來(lái),我們需要將它添加到我們的汽車中。首先,我們將從相對(duì)位置調(diào)整傳感器,然后將其連接到我們的汽車上。所以我們會(huì)說(shuō)這個(gè)傳感器,從它的相對(duì)位置(汽車),我們想要向前移動(dòng) 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)

    最后,我們想用這個(gè)傳感器做點(diǎn)什么。我們想從中獲得圖像,所以我們想聽。

    要對(duì)我們從傳感器獲得的數(shù)據(jù)做一些事情,我們可以使用 lambda 函數(shù):

    sensor.listen(lambda data: process_img(data))

    在這種情況下,我們將從傳感器獲取數(shù)據(jù),并將其傳遞給一個(gè)名為 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)該會(huì)彈出一個(gè)新窗口來(lái)顯示相機(jī)傳感器:

    偉大的!現(xiàn)在,讓我們?cè)谶@里進(jìn)行一些強(qiáng)化學(xué)習(xí)!應(yīng)該很容易…對(duì)吧?

    總結(jié)

    以上是生活随笔為你收集整理的使用 Carla 和 Python 的自动驾驶汽车第 2 部分 —— 控制汽车并获取传感器数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。