±à¼ÍƼö: |
±¾ÎÄÊ×ÏȽéÉÜÁËCarla Server¡¢Carla ClientÒÔ¼°Driving
BenchmarkÈý¸ö·½Ã棬ϣÍû±¾ÎĶԴó¼ÒÓаïÖú¡£
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
1.Carla Server
CarlaĿǰµÄÎȶ¨°æÎª0.8.2
¼´¿ÉÏÂÔØ£¬linux½âѹºóÃüÁîÐÐÖ´ÐÐ
Õ⽫Æô¶¯Ò»¸öÈ«ÆÁµÄ·ÂÕæ´°¿Ú£¬ÄãÄÜʹÓÃ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
|