您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
   
 
     
   
 订阅
  捐助
强化学习与自动驾驶——Carla环境配置与benchmark解读
 
作者昵称:启人zhr
72 次浏览 评价:  
 2021-1-12  
 
编辑推荐:
本文首先介绍了Carla Server、Carla Client以及Driving Benchmark三个方面,希望本文对大家有帮助。
本文来自于csdn,由火龙果软件Anna编辑、推荐。

1.Carla Server

Carla目前的稳定版为0.8.2 即可下载,linux解压后命令行执行

$ ./CarlaUE4.sh

这将启动一个全屏的仿真窗口,你能使用WASD驾驶车辆

实验中往往增加各种参数进行配置

$ ./CarlaUE4.sh -carla-server -benchmark -fps =10 -windowed -ResX=300 -ResY=300

carla-server参数表示以服务端模式运行,等待客户端连接

benchmark fps=10 表示仿真中每一个step的时间间隔相同

windowed ResX=300 ResY=300 表示窗口化以及大小

1.1 无界面启动

配置环境变量:SDL_VIDEODRIVER=offscreen 和 SDL_HINT_CUDA_DEVICE=0

程序中可以这么写

my_env = {**os.environ, 'SDL_VIDEODRIVER': 'offscreen', 'SDL_HINT_CUDA_DEVICE': '0', }
cmd = [path.join(environ.get('CARLA_ROOT'), 'CarlaUE4.sh'), self.map,
"-benchmark", "-carla-server", "-fps=10", "-world-port{}".format(self.port),
"-windowed -ResX={} -ResY ={}".format (carla_config.server_width, carla_config.server_height), "-carla-no-hud"]
p = subprocess.Popen(cmd, env=my_env)

这个目前的缺点是默认第0块GPU,选择其他的会失效,在https://github.com/carla-simulator/carla/issues/225 有提到

如果你想能够选择gpu,可以选择下面的docker启动

1.2 docker启动

关于docker和nvidia docker的安装以及carla镜像的安装可以参考官网

在程序中

p = subprocess.Popen(['docker', 'run', '--rm', '-d', '-p',
str(self.port) + '-' + str(self.port + 2) + ':' +
str(self.port) + '-' + str(self.port + 2),
'--runtime=nvidia', '-e', 'NVIDIA_VISIBLE_DEVICES='+str(self.gpu),
"carlasim/carla: 0.8.4",
'/bin/bash', 'CarlaUE4.sh', self.map, '-windowed',
'-benchmark', '-fps=10', '-world-port=' + str(self.port)], shell=False, stdout=subprocess.PIPE)

如果你的docker为19.03,nvidia-docker是新版,调用gpu的方式有些许不同

p = subprocess.Popen (['docker', 'run', '--rm', '-d', '-p',
str(self.port) + '-' + str(self.port + 2) + ':' +
str(self.port) + '-' + str(self.port + 2),
'--gpus='+str(self.gpu), "carlasim/carla:0.8.4",
'/bin/bash', ' CarlaUE4.sh', self.map, '-windowed',
'-benchmark', '-fps=10', '-world-port=' + str(self.port)], shell=False,
stdout= subprocess.PIPE)

docker启动即是以无界面方式启动

2.Carla Client

在上一步解压后的目录下有一个PythonClient目录,里面包含有客户端连接的样例代码client_example

当以服务端模式启动Carla后,默认监听端口为2000

运行python client_example.py --autopilot可以连接上服务端控制汽车

参数autopilot表示启动内置的自动驾驶功能,若没有这个参数则会随机输出动作

在程序中,我们首先需要读取配置文件。如Example.CarlaSettings.ini文件

若没有给出配置文件位置,在程序中也可以设置配置。

settings = CarlaSettings()
settings.set(
SynchronousMode=True,
SendNonPlayerAgentsInfo=True,
NumberOfVehicles=20,
NumberOfPedestrians=40,
WeatherId=random.choice([1, 3, 7, 8, 14]),
QualityLevel=args.quality_level)
settings.randomize_seeds()

除了基本设置外,我们还需要一个RGB Camera,作为我们以驾驶员视角看到的图像,成为我们训练算法中每一个step的状态输入量。

# The default camera captures RGB images of the scene.
camera0 = Camera('CameraRGB')
# Set image resolution in pixels.
camera0.set_image_size (800, 600)
# Set its position relative to the car in meters.
camera0.set_position (0.30, 0, 1.30)
settings.add_sensor(camera0)

接着我们可以通过加载设置得到一个场景,场景中包含有许多起始点可供选择(根据Town地图选择的不同而不同,0.8.2版本中有Town1和Town2)

# Now we load these settings into the server. The server replies
# with a scene description containing the available start spots for
# the player. Here we can provide a CarlaSettings object or a
# CarlaSettings.ini file as string.
scene = client.load_settings (settings)
# Choose one player start at random.
number_of_player_starts = len(scene.player_start_spots)
player_start = random.randint (0, max(0, number_of_player_starts - 1))

通过view_start_positions.py脚本我们可以场景中所有起点的编号和位置

选择一个起点编号, 我们就可以开始这趟episode

# Notify the server that we want to start the episode at the
# player_start index. This function blocks until the server is ready
# to start the episode.print ('Starting new episode...')
client.start_episode (player_start)

接下来是这一趟的交互过程

for frame in range (0, frames_per_episode):
measurements, sensor_data = client.read_data()
print_measurements (measurements)

# Save the images to disk if requested.
if args.save_images_to_disk:
for name, measurement in sensor_data.items():
filename = args.out_filename_format.format (episode, name, frame) measurement.save_to_disk (filename)

在每一帧中,我们首先读取状态数据,measurements包含有汽车的各种测量数据,有车辆的xy坐标,速度,碰撞数据(碰撞强度,单位kg*m/s,包括碰撞车辆,行人,其他物体三种),跑出道比例

player_measurements = measurements.player_measurements
pos_x= player_measurements.transform.location.x,
pos_y= player_measurements.transform.location.y,
speed= player_measurements.forward_speed * 3.6, # m/s -> km/h

col_cars= player_measurements.collision_vehicles,
col_ped= player_measurements.collision_pedestrians,
col_other= player_measurements.collision_other,

other_lane=100 * player_measurements .intersection _otherlane,#占其他车道百分比
offroad=100 * player_measurements.intersection _offroad,#跑出道路外百分比

sensor_data是一个字典,为各种定义的传感器,比如之前建立的RGB Camera,里面包含有图像的矩阵数据,取出方法如下

rgb_image = sensor_data['CameraRGB'].data

在读取过状态数据后,我们需要对车辆发送控制指令,Carla支持的控制指令如下

指令

类型,范围

描述

Steer

Float, [-1.0,1.0]

方向盘角度

Throttle

Float, [0.0,1.0]

油门

Brake

Float, [0.0,1.0]

刹车

Hand Brake

Bool, True/False

是否启动手刹

Reverse

Bool,True/False

是否要倒挡

3.Driving Benchmark

在CoRL2017这篇文章里,给出了一个实验benchmark,我们可以在benchmark上跑自己的实验,也可以定制自己的benchmark

论文中定义了四种任务,其实都属于导航任务,即给定不一样的起点和终点

直行:起点和终点处于一道直线上,无动态物体,在Town1中平均距离为200m,在Town2中平均距离为100m

一次转弯:终点距离起点需要一个转弯,无动态物体,在Town1平均距离为400m,在Town2平均距离为170m

导航:起点和终点无特殊限制,无动态物体,Town1平均距离为770m,Town2平均距离为360m.

具有动态障碍物的导航:与之前任务一致,但是具有动态物体(车辆或行人)

在driving_benchmark/ experiment_suites/corl_2017.py给出了详细配置

我们学着写出自己的实验配置,程序中则是继承ExperimentSuite类:

确定起点和终点:

例如我们可以选择起点为140,终点为134,在view_start_position.py脚本中可以可视化其具体位置。

python view_start_positions.py --pos 140,134 --no-labels

类似的我们可以定义四个任务

# Define the start/end position below as tasks
poses_task0 = [[7, 3]]
poses_task1 = [[138, 17]]
poses_task2 = [[140, 134]]
poses_task3 = [[140, 134]]
# Concatenate all the tasks
poses_tasks = [poses_task0, poses_task1 , poses_task1 , poses_task3]

确定车辆数目和行人数目

# Add dynamic objects to tasks
vehicles_tasks = [0, 0, 0, 20]
pedestrians_tasks = [0, 0, 0, 50]

配置实验类

experiments_vector = []
# The used weathers is the union between test and train weathers
for weather in used_weathers:
for iteration in range(len(poses_tasks)):
poses = poses_tasks[iteration]
vehicles = vehicles_tasks[iteration]
pedestrians = pedestrians_tasks[iteration]

conditions = CarlaSettings()
conditions.set(
SendNonPlayerAgentsInfo=True,
NumberOfVehicles=vehicles,
NumberOfPedestrians=pedestrians,
WeatherId=weather

)
# Add all the cameras that were set for this experiments
conditions.add_sensor(camera)
experiment = Experiment()
experiment.set(
Conditions=conditions,
Poses=poses,
Task=iteration,
Repetitions=1
)
experiments_vector.append(experiment)

除了之前的设置外,我们还可以配置评价标准,默认设置如下:

return {

'intersection_offroad': {'frames_skip': 10,
'frames_recount': 20,
'threshold': 0.3
},
'intersection_otherlane': {'frames_skip': 10,
'frames_recount': 20,
'threshold': 0.4
},
'collision_other': {'frames_skip': 10,
'frames_recount': 20,
'threshold': 400
},
'collision_vehicles': {'frames_skip': 10,
'frames_recount': 30,
'threshold': 400
},
'collision_pedestrians': {'frames_skip': 5,
'frames_recount': 100,
'threshold': 300
},

}

里面的frame_skip表示了计算违规操作时(碰撞,越道)跳过的帧数,当两帧违规量之差大于threshold这个定义的限制时,则记为一次违规操作,frame_recount则定义了跳过多少帧后再次重新计算违规操作,一般这些保持默认值即可。

这些配置都可以在basic_experiment_suite类查看

除了实验配置外,我们还要定义自己的智能体,这里我们定义一个只前进的智能体,即油门量设置为0.9。

class ForwardAgent(Agent):
"""
Simple derivation of Agent Class,
A trivial agent agent that goes straight
"""
def run_step (self, measurements, sensor_data, directions, target):
control = VehicleControl()
control.throttle = 0.9

return control

定义好实验设置和智能体后,启动Carla服务器,直接调用driving_benchmark.py中的run_driving_benchmark函数就可以运行benchmark了。

详细代码可以参考benchmark_example.py

运行benchmark_example后,我们会发现在当前目录下生成一个实验结果的文件夹,里面大概包含这四个文件

第一个log文件记录了实验的进行过程,大概类似这样的结果

Start Task 0
Start Poses (7 3 ) on weather 1
Start Task 1
Start Poses (138 17 ) on weather 1
Start Task 2
Start Poses (140 134 ) on weather 1
Start Task 3
Start Poses (140 134 ) on weather 1
====== Finished Entire Benchmark ======

第二个文件measurements.csv记录了每个实验任务每一帧汽车所处的xy位置,以及当时的控制量

第四个文件summary.csv记录了每个实验任务的结果

result=1代表本次任务成功到底终点,每次实验开始会计算起点与终点的距离(欧式距离),实验结束也会计算一次目前距离终点的距离。

程序中内置了一个planner规划器,在给定起点和终点后会以A star算法规划一条路径,目的是为了给训练时提供一个高级指令信号(左转,右转,直行),同时也会计算一个超时时间,超过这个时间则算作失败。

第三个文件metric.json文件有计算出的’episodes_completion’, ‘intersection_offroad’, ‘intersection_otherlane’, ‘collision_pedestrians’, ‘collision_vehicles’, ‘collision_other’,‘episodes_fully_completed’, ‘average_speed’, ‘driven_kilometers’各种指标值。

最终print出训练和测试中各种指标值,类似result

 

   
72 次浏览     评价: 订阅 捐助
相关文章

我们该如何设计数据库
数据库设计经验谈
数据库设计过程
数据库编程总结
 
相关文档

数据库性能调优技巧
数据库性能调整
数据库性能优化讲座
数据库系统性能调优系列
相关课程

高性能数据库设计与优化
高级数据库架构师
数据仓库和数据挖掘技术
Hadoop原理、部署与性能调优
最新课程计划
 
最新文章
小米深度学习平台架构与实现
深度学习架构
卷积神经网络之前向传播算法
从0到1搭建AI中台
从零开始:用Python搭建神经网络
最新课程
人工智能,机器学习和深度学习
人工智能与机器学习应用实战
人工智能-图像处理和识别
人工智能、机器学习& TensorFlow+Keras框架实践
人工智能+Python+大数据
更多...   
成功案例
某综合性科研机构 人工智能与机器学习应用
某银行 人工智能+Python+大数据
北京 人工智能、机器学习& TensorFlow框架实践
某领先数字地图提供商 Python数据分析与机器学习
中国移动 人工智能、机器学习和深度学习
更多...