基於carla和python的自動駕駛模擬系列3
歡迎來到卡拉自動駕駛汽車的Python程式設計教程的第3部分。在本教程中,我們將利用Carla API的知識,嘗試將這個問題轉化為一個強化學習問題。
在OpenAI開創了強化學習環境和解決方案的開放原始碼之後,我們就有了一種接近強化學習環境的標準化方法。
這裡的想法是,您的環境將有一個step
方法,它返回:observation, reward, done, extra_info
,以及一個reset
方法,它將基於某種done
標誌重新啟動環境。
我們所需要做的就是建立程式碼來表示這個。我們將從卡拉經常進口的東西開始:
import glob
import os
import sys
try:
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 carla
接下來,我們將建立環境的類,我們將其命名為CarEnv。在模型、代理和環境的指令碼頂部新增一些常量會很方便,所以我要做的第一件事就是建立我們的第一個常量,即SHOW PREVIEW
:
SHOW_PREVIEW = False
現在讓我們為環境類設定一些初始值:
class CarEnv:
SHOW_CAM = SHOW_PREVIEW
STEER_AMT = 1.0
im_width = IMG_WIDTH
im_height = IMG_HEIGHT
actor_list = []
front_camera = None
collision_hist = []
我認為這些都是不言自明的,但是SHOW_CAM
是我們是否要顯示預覽的關鍵。為了除錯的目的,檢視一個可能很有用,但您不一定想要一直顯示一個,因為執行所有這些可能會耗費大量資源。
STEER_AMT
是我們想要應用在轉向上的。目前,這是一個全面的轉變。後來我們可能會發現,最好是控制的力度小一點,也許做一些累積的事情……等。現在,全力駕駛!
將使用collision_hist
,因為碰撞感測器報告事故歷史。基本上,如果這個列表中有任何東西,我們會說我們碰撞了。對於init方法。你在之前的教程中看到的所有東西:
def __init__(self):
self.client = carla.Client('localhost', 2000)
self.client.set_timeout(2.0)
# Once we have a client we can retrieve the world that is currently
# running.
self.world = self.client.get_world()
# The world contains the list blueprints that we can use for adding new
# actors into the simulation.
blueprint_library = self.world.get_blueprint_library()
# Now let's filter all the blueprints of type 'vehicle' and choose one
# at random.
#print(blueprint_library.filter('vehicle'))
self.model_3 = blueprint_library.filter('model3')[0]
接下來,我們將建立reset
方法。
def reset(self):
self.collision_hist = []
self.actor_list = []
self.transform = random.choice(self.world.get_map().get_spawn_points())
self.vehicle = self.world.spawn_actor(self.model_3, self.transform)
self.actor_list.append(self.vehicle)
self.rgb_cam = self.world.get_blueprint_library().find('sensor.camera.rgb')
self.rgb_cam.set_attribute('image_size_x', f'{self.im_width}')
self.rgb_cam.set_attribute('image_size_y', f'{self.im_height}')
self.rgb_cam.set_attribute('fov', '110')
transform = carla.Transform(carla.Location(x=2.5, z=0.7))
self.sensor = self.world.spawn_actor(self.rgb_cam, transform, attach_to=self.vehicle)
self.actor_list.append(self.sensor)
self.sensor.listen(lambda data: self.process_img(data))
self.vehicle.apply_control(carla.VehicleControl(throttle=0.0, brake=0.0)) # initially passing some commands seems to help with time. Not sure why.
這裡你看到的所有東西,沒有什麼新的或新奇的,只是變成OOP。接下來,我們將碰撞感測器新增到這個方法中:
time.sleep(4) # sleep to get things started and to not detect a collision when the car spawns/falls from sky.
colsensor = self.world.get_blueprint_library().find('sensor.other.collision')
self.colsensor = self.world.spawn_actor(colsensor, transform, attach_to=self.vehicle)
self.actor_list.append(self.colsensor)
self.colsensor.listen(lambda event: self.collision_data(event))
我們在這裡開始了四秒鐘的睡眠,因為汽車真的“掉入”了模擬器。通常情況下,當汽車撞到地面時,我們會得到一個碰撞記錄。而且,最初,它會花一些時間讓這些感測器初始化和返回值,所以我們會用一個安全可靠的4秒。為了防止需要更長的時間,我們可以做以下事情:
while self.front_camera is None:
time.sleep(0.01)
但是我們不能這麼做,因為我們需要確定賽車在衍生時已經從天上掉下來了。最後,讓我們記錄下這一集的實際開始時間,確保沒有使用剎車和油門,並返回我們的第一個觀察結果:
self.episode_start = time.time()
self.vehicle.apply_control(carla.VehicleControl(brake=0.0, throttle=0.0))
return self.front_camera
完整的程式碼為我們的CarEnv
到目前為止是:
class CarEnv:
SHOW_CAM = SHOW_PREVIEW
STEER_AMT = 1.0
im_width = IMG_WIDTH
im_height = IMG_HEIGHT
actor_list = []
front_camera = None
collision_hist = []
def __init__(self):
self.client = carla.Client('localhost', 2000)
self.client.set_timeout(2.0)
# Once we have a client we can retrieve the world that is currently
# running.
self.world = self.client.get_world()
# The world contains the list blueprints that we can use for adding new
# actors into the simulation.
blueprint_library = self.world.get_blueprint_library()
# Now let's filter all the blueprints of type 'vehicle' and choose one
# at random.
#print(blueprint_library.filter('vehicle'))
self.model_3 = blueprint_library.filter('model3')[0]
def reset(self):
self.collision_hist = []
self.actor_list = []
self.transform = random.choice(self.world.get_map().get_spawn_points())
self.vehicle = self.world.spawn_actor(self.model_3, self.transform)
self.actor_list.append(self.vehicle)
self.rgb_cam = self.world.get_blueprint_library().find('sensor.camera.rgb')
self.rgb_cam.set_attribute('image_size_x', f'{self.im_width}')
self.rgb_cam.set_attribute('image_size_y', f'{self.im_height}')
self.rgb_cam.set_attribute('fov', '110')
transform = carla.Transform(carla.Location(x=2.5, z=0.7))
self.sensor = self.world.spawn_actor(self.rgb_cam, transform, attach_to=self.vehicle)
self.actor_list.append(self.sensor)
self.sensor.listen(lambda data: self.process_img(data))
self.vehicle.apply_control(carla.VehicleControl(throttle=0.0, brake=0.0))
time.sleep(4) # sleep to get things started and to not detect a collision when the car spawns/falls from sky.
colsensor = self.world.get_blueprint_library().find('sensor.other.collision')
self.colsensor = self.world.spawn_actor(colsensor, transform, attach_to=self.vehicle)
self.actor_list.append(self.colsensor)
self.colsensor.listen(lambda event: self.collision_data(event))
while self.front_camera is None:
time.sleep(0.01)
self.episode_start = time.time()
self.vehicle.apply_control(carla.VehicleControl(brake=0.0, throttle=0.0))
return self.front_camera
現在,讓我們新增collision_data
和process_img
方法:
def collision_data(self, event):
self.collision_hist.append(event)
def process_img(self, image):
i = np.array(image.raw_data)
#np.save("iout.npy", i)
i2 = i.reshape((self.im_height, self.im_width, 4))
i3 = i2[:, :, :3]
if self.SHOW_CAM:
cv2.imshow("",i3)
cv2.waitKey(1)
self.front_camera = i3
現在我們需要用step
方法。該方法採取一個動作,然後按照通常的強化學習正規化返回observation, reward, done, any_extra_info 。開始:
def step(self, action):
'''
For now let's just pass steer left, center, right?
0, 1, 2
'''
if action == 0:
self.vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=0))
if action == 1:
self.vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=-1*self.STEER_AMT))
if action == 2:
self.vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=1*self.STEER_AMT))
上面展示了我們如何根據傳遞給我們的數值動作來採取一個動作,現在我們只需要處理observation, possible collision, and reward:
v = self.vehicle.get_velocity()
kmh = int(3.6 * math.sqrt(v.x**2 + v.y**2 + v.z**2))
if len(self.collision_hist) != 0:
done = True
reward = -200
elif kmh < 50:
done = False
reward = -1
else:
done = False
reward = 1
if self.episode_start + SECONDS_PER_EPISODE < time.time():
done = True
return self.front_camera, reward, done, None
我們得到了飛行器的速度,從速度轉換為千米每小時。我這樣做是為了避免探員在一個狹小的圈子裡開車。如果我們需要一定的速度來獲得獎勵,這應該有希望抑制它。
接下來,我們會檢視是否已經耗盡了我們的回合時間,然後我們會返回所有的東西。這樣,我們的環境就完成了!
完整的程式碼到這一點:
import glob
import os
import sys
try:
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 carla
SHOW_PREVIEW = False
class CarEnv:
SHOW_CAM = SHOW_PREVIEW
STEER_AMT = 1.0
im_width = IMG_WIDTH
im_height = IMG_HEIGHT
actor_list = []
front_camera = None
collision_hist = []
def __init__(self):
self.client = carla.Client('localhost', 2000)
self.client.set_timeout(2.0)
# Once we have a client we can retrieve the world that is currently
# running.
self.world = self.client.get_world()
# The world contains the list blueprints that we can use for adding new
# actors into the simulation.
blueprint_library = self.world.get_blueprint_library()
# Now let's filter all the blueprints of type 'vehicle' and choose one
# at random.
#print(blueprint_library.filter('vehicle'))
self.model_3 = blueprint_library.filter('model3')[0]
def reset(self):
self.collision_hist = []
self.actor_list = []
self.transform = random.choice(self.world.get_map().get_spawn_points())
self.vehicle = self.world.spawn_actor(self.model_3, self.transform)
self.actor_list.append(self.vehicle)
self.rgb_cam = self.world.get_blueprint_library().find('sensor.camera.rgb')
self.rgb_cam.set_attribute('image_size_x', f'{self.im_width}')
self.rgb_cam.set_attribute('image_size_y', f'{self.im_height}')
self.rgb_cam.set_attribute('fov', '110')
transform = carla.Transform(carla.Location(x=2.5, z=0.7))
self.sensor = self.world.spawn_actor(self.rgb_cam, transform, attach_to=self.vehicle)
self.actor_list.append(self.sensor)
self.sensor.listen(lambda data: self.process_img(data))
self.vehicle.apply_control(carla.VehicleControl(throttle=0.0, brake=0.0))
time.sleep(4) # sleep to get things started and to not detect a collision when the car spawns/falls from sky.
colsensor = self.world.get_blueprint_library().find('sensor.other.collision')
self.colsensor = self.world.spawn_actor(colsensor, transform, attach_to=self.vehicle)
self.actor_list.append(self.colsensor)
self.colsensor.listen(lambda event: self.collision_data(event))
while self.front_camera is None:
time.sleep(0.01)
self.episode_start = time.time()
self.vehicle.apply_control(carla.VehicleControl(brake=0.0, throttle=0.0))
return self.front_camera
def collision_data(self, event):
self.collision_hist.append(event)
def process_img(self, image):
i = np.array(image.raw_data)
#np.save("iout.npy", i)
i2 = i.reshape((self.im_height, self.im_width, 4))
i3 = i2[:, :, :3]
if self.SHOW_CAM:
cv2.imshow("",i3)
cv2.waitKey(1)
self.front_camera = i3
def step(self, action):
'''
For now let's just pass steer left, center, right?
0, 1, 2
'''
if action == 0:
self.vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=0))
if action == 1:
self.vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=-1*self.STEER_AMT))
if action == 2:
self.vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=1*self.STEER_AMT))
v = self.vehicle.get_velocity()
kmh = int(3.6 * math.sqrt(v.x**2 + v.y**2 + v.z**2))
if len(self.collision_hist) != 0:
done = True
reward = -200
elif kmh < 50:
done = False
reward = -1
else:
done = False
reward = 1
if self.episode_start + SECONDS_PER_EPISODE < time.time():
done = True
return self.front_camera, reward, done, None
在下一篇教程中,我們將編寫Agent類,它將與這個環境互動,並容納我們實際的強化學習模型。
相關文章
- Carla 自動駕駛模擬平臺的安裝與配置指南自動駕駛
- 雙開《GTA》和《模擬市長》:騰訊玩自動駕駛的清奇腦洞自動駕駛
- ChinaEV100:2020中國自動駕駛模擬藍皮書自動駕駛
- 自動駕駛系列(七)——聊聊人機互動中的DMS駕駛員監控系統自動駕駛
- 基於數值優化的自動駕駛實時運動規劃優化自動駕駛
- 阿里雲“大算力”支援嬴徹自動駕駛模擬提速 20 倍阿里自動駕駛
- 自動駕駛哪國強?各國和地區自動駕駛成熟度指數自動駕駛
- 基於數值最佳化的自動駕駛實時運動規劃自動駕駛
- 帶你瞭解基於Ploto構建自動駕駛平臺自動駕駛
- 自動駕駛資料閉環:實現高階自動駕駛的必由之路自動駕駛
- 自動駕駛 Apollo 原始碼分析系列,感知篇(一)自動駕駛原始碼
- 自動駕駛系列(五)——環境感知之純視覺和融合感知自動駕駛視覺
- 拼了!英特爾擬2.5億美元投資自動駕駛自動駕駛
- 新一代虛擬駕駛模擬平臺
- 自動駕駛研究報告自動駕駛
- 自動駕駛拉鋸戰自動駕駛
- GaussDB技術解讀系列:運維自動駕駛探索運維自動駕駛
- 奧迪:自動駕駛的脈搏自動駕駛
- 自動駕駛系統的決策規劃模組介紹自動駕駛
- 蔚來事故背後,“致命彎道”在輔助駕駛和自動駕駛之間自動駕駛
- 自動駕駛測試全流程自動駕駛
- 自動駕駛復甦在 2020自動駕駛
- 大疆攪局自動駕駛自動駕駛
- 自動駕駛定位已知方式自動駕駛
- 自動駕駛控制演算法自動駕駛演算法
- 蘋果自動駕駛背後的故事蘋果自動駕駛
- 告別「五毛」模擬環境:百度擴增實境自動駕駛模擬系統登上 Science 子刊自動駕駛
- 自動駕駛系列(二)——環境感知之行人檢測技術自動駕駛
- 智駕模擬測試實戰之自動泊車HiL模擬測試
- 自動駕駛終於出了第一個生態聯盟自動駕駛
- 奧迪研發自動駕駛模擬器,讓使用者體驗的同時還收集資料自動駕駛
- SAE自動駕駛分級介紹自動駕駛
- 自動駕駛出行,進入下半場自動駕駛
- 【面試】滴滴自動駕駛測開面試自動駕駛
- 自動駕駛系列(一)——環境感知之車輛檢測技術自動駕駛
- PIX SOLUTION | 如何助力全球低速自動駕駛市場規模化落地自動駕駛
- 寶馬設立自動駕駛研發中心,2021年釋出自動駕駛汽車自動駕駛
- 美政府研究人們駕駛走神時間,證明自動駕駛的必要性自動駕駛