본문 바로가기

1차완료/ML

DeepRacer 직전 모델 살짝 튜닝, 디폴트 로직 추가

반응형
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']
    
    # [0] 기존 디폴트 코드
    marker_1 = 0.1 * track_width
    marker_2 = 0.25 * track_width
    marker_3 = 0.5 * track_width
    
    # Give higher reward if the car is closer to center line and vice versa
    if distance_from_center <= marker_1:
        reward = 1.0
    elif distance_from_center <= marker_2:
        reward = 0.5
    elif distance_from_center <= marker_3:
        reward = 0.1
    else:
        reward = 1e-3  # likely crashed/ close to off track
    
    # [1]트랙 이탈 방지
    
    if not all_wheels_on_track:
        reward -= 1
    
    
    
    # [2]가급적 트랙 중앙으로 달리게 ( [1]과 중복요소 느낌이긴 한데 세부조정 느낌)
    
    if 0<=distance_from_center and distance_from_center < track_width/2: reward += 1
    
    
    
    # [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 += 0.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 += 1

    return float(reward)

 

 

결과:

1번 이탈

15초

반응형