본문 바로가기

1차완료/ML

DeepRacer 내가 만든 reward function

반응형

메모:

우선 장애물/경쟁차 회피 제외하고 생각

 

import math
# import random
# import numpy
# import scipy
# import shapely

def reward_function(params):

    # 초기화
    
    reward = 0
    
    # param 값 다 가져오기
    
    all_wheels_on_track = params['all_wheels_on_track']
    
    x = params['x']
    
    y = params['y']
    
    closest_objects = params['closest_objects']
    
    closest_waypoints = params['closest_waypoints']
    
    distance_from_center = params['distance_from_center']
    
    is_crashed = params['is_crashed']
    
    is_left_of_center = params['is_left_of_center']
    
    is_offtrack = params['is_offtrack']
    
    is_reversed = params['is_reversed']
    
    heading = params['heading']
    
    objects_distance = params['objects_distance']
    
    objects_heading = params['objects_heading']
    
    objects_left_of_center = params['objects_left_of_center']
    
    objects_location = params['objects_location']
    
    objects_speed = params['objects_speed']
    
    progress = params['progress']
    
    speed = params['speed']
    
    steering_angle = params['steering_angle']
    
    steps = params['steps']
    
    track_length = params['track_length']
    
    track_width = params['track_width']
    
    waypoints = params['waypoints']
    
    
    
    # [1]트랙 이탈 방지
    
    if not all_wheels_on_track:
        reward -= 10
    
    
    
    # [2]가급적 트랙 중앙으로 달리게 ( [1]과 중복요소 느낌이긴 한데 세부조정 느낌)
    
    if 0<=distance_from_center and distance_from_center < track_width/2: reward += 10
    
    
    
    # [3]진척률 확인
    
    #매 순간 측정되는 값에 진척률이 고려되면 오히려 노이즈인것 같음
    
    #목적지로 가는 방향만 잘 설정되면 되지 진척률은 순간순간으로 보면
    
    #해당 순간까지의 시간을 변수로 받아올 수 없어서 의미 없어 보임
    
    
    
    # [4]속도 확인, 일단 빠른 속도가 좋은걸로
    
    reward += speed * 2
    
    
    
    # [5]주행 방향 고려, 뒤에 있는 트랙좌표와 앞에 있는 트랙좌표 간 각도와 유사하게
    
    np = waypoints[closest_waypoints[1]] #공홈 
    
    pp = waypoints[closest_waypoints[0]] #공홈
    
    
    
    track_direction = math.atan2(np[1] - pp[1], np[0] - pp[0]) #공홈
    
    track_direction = math.degrees(track_direction) #공홈
    
    
    
    direction_diff = abs(track_direction - heading) #공홈
    
    
    
    if direction_diff < 5: 
        reward += 5



	# [6]트랙 좌표 고려 - 정주행 확인, 다음, 다음, 다음 지점으로 향하게 heading 조절
    if closest_waypoints[1] + 2 < len(waypoints):
    	nnnp = waypoints[closest_waypoints[1] + 2]
    	track_direction = math.atan2(nnnp[1] - y, nnnp[0] - x) #공홈
    
    	track_direction = math.degrees(track_direction) #공홈
		if track_direction < 5
        reward += 10;

    return float(reward)

 

결과: 

2번 이탈

16초

 

 

 

다음에 해볼거:

급커브 예측해서 속도 낮을때 가산점 / 스티어링 많이 꺾으면 가산점

반대로 직진 구간 예측해서 속도 높으면 가산점

기존 디폴트 로직 그대로 추가해서 학습시켜보기

최저속도는 1로 급커브때문에

반응형