
感谢 sentdex 分享
《TensorFlow 基础》

今天开始学习如何通过深度学习来驾驶无人汽车在路上正常驾驶。今天我们将要了解到如何在仿真环境中创建车辆以及如何在仿真系统控制汽车,最后了解如何通过传感器获取汽车数据。
这里简化开发流程,将 examples 文件夹 manual_control.py 复制一份在此基础进行开发从而省去许多额外工作,我们就可以专注我们的业务逻辑。
在开始今天代码演示之前我们首先了解几个在 carla 中的术语
- actor:在仿真系统中,actor 是一些会用到的任何物件,可以移动,例如是车辆、行人和传感器。
- blueprint:在创建一个 actor 之前,需要指定其属性,这就是 blueprint 的作用。carla 已经为开发者提供一个 blueprint 库,其中包含许多已经定义好的可用 actor。
- world:表示当前加载的地图,包含根据 blueprint 转换为活动的 actor 等功能。还提供了访问路线图和更改天气条件的功能。
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
这里我们选择任意文件,也可以自己创建项目我们上面代码就是获取 egg 文件
接下来是创建 actor ,我们在小镇中看到车辆、非机动车和行人都属于 actor,在程序结束我们还需将创建好的 actor 进行清理
import carla
actor_list = []
try:
pass
finally:
for actor in actor_list:
actor.destroy()
print("All cleaned up!")
getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'convert', 'fov', 'frame_number', 'height', 'raw_data', 'save_to_disk', 'timestamp', 'transform', 'width']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'convert', 'fov', 'frame_number', 'height', 'raw_data', 'save_to_disk', 'timestamp', 'transform', 'width']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'convert', 'fov', 'frame_number', 'height', 'raw_data', 'save_to_disk', 'timestamp', 'transform', 'width']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'convert', 'fov', 'frame_number', 'height', 'raw_data', 'save_to_disk', 'timestamp', 'transform', 'width']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'convert', 'fov', 'frame_number', 'height', 'raw_data', 'save_to_disk', 'timestamp', 'transform', 'width']
actor_list = []
try:
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]
print(bp)
要访问仿真系统,我们应该创建一个客户端通过访问本地 2000 端口来访问仿真系统进行交互
client = carla.Client('localhost', 2000)
设置连接超时
client.set_timeout(10.0)
通过客户端我们可以直接获取 world
world = client.get_world()
然后从 world 或可定义车辆的图纸,carla 为我们提供丰富的库供我们选择车辆来进行测试
blueprint_library = world.get_blueprint_library()
创建车辆
spawn_point = random.choice(world.get_map().get_spawn_points())
vehicle = world.spawn_actor(bp,spawn_point)
# vehicle.set_autopilot(True)
vehicle.apply_control(carla.VehicleControl(throttle=1.0,steer=0.0))
actor_list.append(vehicle)
spawn_point 是创建车辆的位置,我们通过 world 的 get_map 方法获得小镇的地图,也就是平面图,在地图有许多预留点用于生成汽车供我们使用,我们可以 random 随机函数随机地获取一个点作为我们车辆起始位置。
运行一下程序我们会发现创建好的小车已经上路的。
要训练无人驾驶首先需要通过 seneor 例如雷达或者摄像头等工具获取车辆行驶周围的环境数据,今天我们可以给车辆安装一个摄像头来实时获取车辆行驶的数据。
设置摄像头
cam_bp = blueprint_library.find("sensor.camera.rgb")
cam_bp.set_attribute("image_size_x",f"{IM_WIDTH}")
cam_bp.set_attribute("image_size_y",f"{IM_HEIGHT}")
cam_bp.set_attribute("fov","110")
time.sleep(20)
这里暂时不需要 alpha 通道,所以使用sensor.camera.rgb 相机作为传感器,然后设置相机获取影像的大小,最后我们给 fov 一个值的可以看的范围更广一些。
放置摄像头
设置好一部摄像机我们还需将其安装在车辆上,类似车载记录仪,放的位置根据车辆型号而定这里 x 表示前后方向 z 表示高度,放置后摄像机我们还需要通过回调方式获取摄像头的数据来进行下一步的分析,训练我们的模型。
spawn_point = carla.Transform(carla.Location(x=2.5,z=0.7))
sensor = world.spawn_actor(cam_bp,spawn_point,attach_to=vehicle)
actor_list.append(sensor)
sensor.listen(lambda data:process_img(data))
显示获取图像
import carla
IM_WIDTH = 640
IM_HEIGHT = 480
def process_img(image):
i = np.array(image.raw_data)
# print(dir(image))
print(i.shape)
i2 = i.reshape((IM_HEIGHT,IM_WIDTH,4))
i3 = i2[:,:,:3]
cv2.imshow("",i3)
cv2.waitKey(1)
return i3/255.0
我们通过 numpy 对数据进行清洗获得我们想要数据,然后 opencv 来将数据以图像形式显示给我们,这让我们更加直观地观察数据,如图
完整代码
import glob
import os
import sys
import random
import time
import numpy as np
import cv2
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
IM_WIDTH = 640
IM_HEIGHT = 480
def process_img(image):
i = np.array(image.raw_data)
# print(dir(image))
print(i.shape)
i2 = i.reshape((IM_HEIGHT,IM_WIDTH,4))
i3 = i2[:,:,:3]
cv2.imshow("",i3)
cv2.waitKey(1)
return i3/255.0
actor_list = []
try:
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]
print(bp)
spawn_point = random.choice(world.get_map().get_spawn_points())
vehicle = world.spawn_actor(bp,spawn_point)
# vehicle.set_autopilot(True)
vehicle.apply_control(carla.VehicleControl(throttle=1.0,steer=0.0))
actor_list.append(vehicle)
cam_bp = blueprint_library.find("sensor.camera.rgb")
cam_bp.set_attribute("image_size_x",f"{IM_WIDTH}")
cam_bp.set_attribute("image_size_y",f"{IM_HEIGHT}")
cam_bp.set_attribute("fov","110")
spawn_point = carla.Transform(carla.Location(x=2.5,z=0.7))
sensor = world.spawn_actor(cam_bp,spawn_point,attach_to=vehicle)
actor_list.append(sensor)
sensor.listen(lambda data:process_img(data))
time.sleep(20)
# create sentor
finally:
for actor in actor_list:
actor.destroy()
print("All cleaned up!")
网友评论