強(qiáng)化學(xué)習(xí):自動(dòng)駕駛——Carla 模擬器簡(jiǎn)介

自動(dòng)駕駛是機(jī)器學(xué)習(xí)的一個(gè)重要的應(yīng)用領(lǐng)域,作為普通學(xué)習(xí)者,我們是否可以運(yùn)用自己學(xué)到的機(jī)器學(xué)習(xí)方法訓(xùn)練自動(dòng)駕駛模型,完成自動(dòng)駕駛的任務(wù)呢?是否需要一輛真實(shí)的汽車和真實(shí)的馬路環(huán)境呢?

對(duì)于普通學(xué)習(xí)者來(lái)說(shuō),我們當(dāng)然沒(méi)有必要去駕駛真實(shí)的汽車。使用模擬器可以大大降低自動(dòng)駕駛研究的門檻,這篇文章我們就簡(jiǎn)單地介紹一下 Carla 這個(gè)開(kāi)源的用于自動(dòng)駕駛研究的開(kāi)源模擬器。

1. CARLA 簡(jiǎn)介

Carla 是一個(gè)開(kāi)源的模擬器,可以模擬真實(shí)的交通環(huán)境,行人行為,汽車傳感器信號(hào)等等。如下圖所示,模擬器使用C++ 和虛幻 (Unreal) 引擎構(gòu)成,使用者可以通過(guò) Python API 使用 Python 腳本代碼對(duì)模擬器的環(huán)境進(jìn)行操作和控制。

CARLA Modules

image from carla with MIT license

2. CARLA 簡(jiǎn)單上手

CARLA的快速上手指南請(qǐng)參考官方文檔, 本文僅做簡(jiǎn)單介紹和總結(jié)

  1. CARLA 目前僅支持 Linux 和 Windows,需要去下載相應(yīng)的版本。在本文寫作的時(shí)間,Windows 僅支持到 0.9.5 版本,Linux 支持到0.9.6。
  2. 需要 安裝 numpy 和 pygame.
  3. 下載解壓文件夾之后,Windows 環(huán)境下直接運(yùn)行 “CarlaUE4.exe” 文件,linux 環(huán)境下 終端命令: “./CarlaUE4.sh” 即可打開(kāi)模擬器。

模擬器就是一個(gè)小鎮(zhèn)的環(huán)境,有道路,建筑,街道,交通燈等等。不過(guò)目前是沒(méi)有行人和車輛的。需要運(yùn)行 python 腳本代碼。

終端 cd 到 \PythonAPI\examples 目錄,里面有不少python 腳本實(shí)例,首先我們運(yùn)行 spawn_npc.py 可以在模擬器中增加 80 倆汽車。

python spawn_npc.py -n 80

也可以運(yùn)行這個(gè)腳本添加天氣變量(天黑,下雨,刮風(fēng)等)

python dynamic_weather.py

當(dāng)然也可以體驗(yàn)一下手動(dòng)駕駛汽車的感覺(jué),僅需要運(yùn)行這個(gè)腳本就可以了。

python manual_control.py
manual_control.py

image from carla with MIT license

如上圖所示,可以像玩游戲一樣手動(dòng)操作窗口中汽車前進(jìn)、后退、轉(zhuǎn)彎和剎車等動(dòng)作,同時(shí)環(huán)境的及時(shí)反饋也可以收集到??梢愿袘?yīng)到周圍車輛的大小,交通燈信號(hào),是否有撞擊等等。

當(dāng)然你也可以用快捷鍵 P 讓汽車處于自動(dòng)駕駛狀態(tài)。不過(guò)需要注意的是,此時(shí)汽車的自動(dòng)駕駛并不是通過(guò)機(jī)器學(xué)習(xí)得到的模型,而是通過(guò)對(duì)模擬器中設(shè)置的汽車行駛交通規(guī)則實(shí)現(xiàn)的。

注意如果在運(yùn)行腳本的時(shí)候出現(xiàn)導(dǎo)入 carla 失敗的錯(cuò)誤,請(qǐng)檢測(cè)python版本。在PythonAPI\carla\dist 目錄中可以看到相應(yīng)的python 版本的.egg 文件。筆者使用的是0.9.5 版本 carla 其中 Windows 10 需要使用 python 3.7. Linux 需要使用 python 3.5.

3. Python 控制汽車快速上手

為了便于進(jìn)后機(jī)器學(xué)習(xí)的需要,本文我們快速在模擬器中創(chuàng)建一輛汽車,并讓他直線行駛,通過(guò)攝像頭將感知到的圖片顯示出來(lái)。之后我們便可用攝像頭收集到的圖像信息以及汽車在環(huán)境中的反饋訓(xùn)練(強(qiáng)化學(xué)習(xí))模型,完成自動(dòng)駕駛的任務(wù)。詳細(xì)指南請(qǐng)參考官方 Python API 指南。

  1. 初始化環(huán)境。創(chuàng)建 Client 連接模擬器的服務(wù)器,并通過(guò) "blueprint" 創(chuàng)建一個(gè)汽車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]
  1. 初始化汽車,在模擬器世界中,隨機(jī)出現(xiàn)一輛汽車
    spawn_point = random.choice(world.get_map().get_spawn_points())
    vehicle = world.spawn_actor(bp,spawn_point)
  1. 控制汽車,當(dāng)然你可以用自動(dòng)駕駛模式"vehicle.set_autopilot(True)"讓汽車根據(jù)模擬器制定的規(guī)則行駛,不過(guò)我們?cè)谶@里讓汽車直行
    vehicle.apply_control(carla.VehicleControl(throttle=1.0,steer=0.0)) # car go straight
    actor_list.append(vehicle)
  1. 設(shè)置攝像頭
    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)
  1. 獲取攝像頭圖片,這里通過(guò) .listen 的 lambda 函數(shù)傳回?cái)?shù)據(jù)。當(dāng)然不要忘了設(shè)計(jì)一個(gè)延時(shí)。

    sensor.listen(lambda data: process_img(data))
    
    time.sleep(25)
    

    其中通過(guò) process_img() 方法傳回?cái)z像頭圖像

    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個(gè)通道 “rgba”,需要將第四個(gè)通道去掉,并用opencv 的 cv2.imshow() 將攝像頭捕捉到的圖片 歸一化之后回傳回來(lái)。

最后,我們運(yùn)行一下這個(gè)python 腳本獲取汽車直線前進(jìn),攝像頭所“看到” 的畫(huà)面。汽車直行然后撞在了隧道的墻壁上。

gif animation created by @hongtao

4. 總結(jié)

本文簡(jiǎn)單介紹了 Carla 這個(gè)開(kāi)源自動(dòng)駕駛的環(huán)境,并簡(jiǎn)單上手并實(shí)現(xiàn)了創(chuàng)建汽車,控制汽車直線運(yùn)動(dòng),同時(shí)將汽車上攝像頭捕捉的圖像信號(hào)傳回。后面我們將使用這些圖像信號(hào)和環(huán)境的其他反饋,通過(guò)強(qiáng)化學(xué)習(xí)的方式訓(xùn)練模型,實(shí)現(xiàn)自動(dòng)駕駛。


參考資料

[1] Reinforcement Learning: An Introduction (2nd Edition)
[2] David Silver's Reinforcement Learning Course (UCL, 2015)
[3] Github repo: Reinforcement Learning


相關(guān)文章

用 Keras 搭建 Double DQN 模型
深度強(qiáng)化學(xué)習(xí)——Policy Gradient 玩轉(zhuǎn) CartPole 游戲
強(qiáng)化學(xué)習(xí)——MC(蒙特卡洛)玩21點(diǎn)撲克游戲
強(qiáng)化學(xué)習(xí)實(shí)戰(zhàn)——?jiǎng)討B(tài)規(guī)劃(DP)求最優(yōu)MDP
強(qiáng)化學(xué)習(xí)——強(qiáng)化學(xué)習(xí)的算法分類
強(qiáng)化學(xué)習(xí)——重拾強(qiáng)化學(xué)習(xí)的核心概念
AI學(xué)習(xí)筆記——Sarsa算法
AI學(xué)習(xí)筆記——Q Learning
AI學(xué)習(xí)筆記——?jiǎng)討B(tài)規(guī)劃(Dynamic Programming)解決MDP(1)
AI學(xué)習(xí)筆記——?jiǎng)討B(tài)規(guī)劃(Dynamic Programming)解決MDP(2)
AI學(xué)習(xí)筆記——MDP(Markov Decision Processes馬可夫決策過(guò)程)簡(jiǎn)介


首發(fā)steemit

歡迎掃描二維碼關(guān)注我的微信公眾號(hào)“tensorflow機(jī)器學(xué)習(xí)”,一起學(xué)習(xí),共同進(jìn)步

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容