728x90
반응형

하이브리드 차량 모델링 코드를 사용할 일이 있어서 코드를 자세히 분석하고 정리하였다. 

분석한 모델링 코드는 하이브리드 차량 중에서도 Toyata의 Prius 모델로 여러 하이브리드 시스템 중에서도 직병렬 하이브리드 시스템이다. 

하이브리드 차량 구동 원리(직렬, 병렬, 직병렬, 플러그 인)

 

코드는 링크를 참조하였다.

자동차 시스템을 잘 알지는 못하지만 하이브리드 시스템 이해를 위해 정리해보았다. 


import 라이브러리

"""
the Model of Prius
"""

import numpy as np
from scipy.interpolate import interp1d, interp2d
import math
import scipy.io as scio

init: 기본 파라미터 초기화

class Prius_model():
    def __init__(self):
        # paramsmeters of car
        self.Wheel_R = 0.287
        self.mass = 1449
        self.C_roll  = 0.013
        self.density_air = 1.2
        self.area_frontal = 2.23
        self.G = 9.81
        self.C_d = 0.26
        # the factor of F_roll
        self.T_factor = 1
       
        # paramsmeters of transmission system
        # number of teeth
        self.Pgs_R = 78
        self.Pgs_S = 30
        # speed ratio from ring gear to wheel
        self.Pgs_K = 3.93  
  • 차량 파라미터
    • self.Wheel_R = 0.287: 휠 반지름 (단위: 미터)
    • self.mass = 1449: 차량의 질량 (단위: kg)
    • self.C_roll = 0.013: 구름 저항 계수
    • self.density_air = 1.2: 공기 밀도 (단위: kg/m³)
    • self.area_frontal = 2.23: 차량의 전면적 (단위: m²)
    • self.G = 9.81: 중력 가속도 (단위: m/s²)
    • self.C_d = 0.26: 공기 저항 계수
  • 변속기 파라미터
    • self.Pgs_R = 78: 변속기의 링 기어의 톱니 수
    • self.Pgs_S = 30: 변속기의 썬 기어의 톱니 수
    • self.Pgs_K = 3.93: 변속기에서 링 기어와 휠 간의 속도비
        # The optimal curve of engine   
        self.Eng_pwr_opt_list = np.arange(0, 57, 1) * 1000
        self.W_list = [91.106186954104, 83.77580409572782, 83.77580409572782, ...]
        self.Eng_pwr_func = interp1d(self.Eng_pwr_opt_list, self.W_list)  
  • 엔진 효율 곡선
    • self.Eng_pwr_opt_list: 엔진 출력의 범위 리스트 (0~56000 kW)
    • self.W_list: 엔진 출력에 대응하는 엔진 속도 (rad/s) (총 57개의 값)
      • 예를 들어, 출력이 0W일 때는 약 91.1 rad/s, 출력이 56,000W일 때는 약 459.7 rad/s

interp1d를 사용하여 엔진 출력과 속도의 함수

 

        Eng_spd_list = np.arange(0, 4501, 125) * (2 * math.pi) / 60
        Eng_spd_list = Eng_spd_list[np.newaxis, :]
        Eng_trq_list = np.arange(0, 111, 5) * (121 / 110)
        Eng_trq_list = Eng_trq_list[np.newaxis, :]
  • 엔진 속도 리스트 (Eng_spd_list):
    • np.arange(0, 4501, 125)는 0부터 4500까지 125 간격으로 숫자를 생성. RPM(분당 회전수).
    • (2 * math.pi) / 60: RPM을 rad/s로 변환하는 상수. 이를 곱해 엔진 속도를 rad/s로 변환
    • Eng_spd_list[np.newaxis, :]: 나중에 행렬 연산을 쉽게 하기 위해 리스트를 2차원 배열로 바꾸는 과정
  • 엔진 토크 리스트 (Eng_trq_list):
    • np.arange(0, 111, 5)는 0부터 110까지 5 간격으로 값을 생성. 엔진 토크
    • 121 / 110은 단위 변환 또는 비율을 맞추기 위한 계수(?) 토크 값을 스케일링
    • 이 리스트도 np.newaxis를 사용해 2차원 배열로 변환

 

        data_path = 'Eng_bsfc_map.mat'
        data = scio.loadmat(data_path)
        Eng_bsfc_map = data['Eng_bsfc_map'] 
        
        self.Eng_trq_maxP = [-4.1757e-009, 6.2173e-006, -3.4870e-003, 9.1743e-001, 2.0158e+001]
  • 연료 소비량 계산
    • Eng_bsfc_map는 연료 소비 효율을 나타내는 값으로, 토크속도에 따라 달라짐
    • Eng_spd_list.T * Eng_trq_list: 엔진 속도와 토크를 곱한 값. Eng_spd_list.T는 속도 리스트의 전치 행렬(transpose)
    • / 3600: 연료 소비량을 시간을 기준으로 나타내기 위해 시간을 초 단위로 변환
    • / 1000: 연료 소비량을 그램(g) 단위로 변환

  • BSFC Map (g/kWh): 엔진의 브레이크 특유 연료 소비율을 나타내는 그래프
    • g/kWh 단위로 측정되며, 이는 1 kWh의 에너지를 생성하는 데 소비된 연료의 양을 그램 단위로 표현
    • BSFC가 낮을수록 엔진이 더 효율적으로 연료를 사용한다는 의미
  • Max Engine Torque (Polynomial Fit): 엔진이 주어진 속도에서 낼 수 있는 최대 토크를 시각적으로 나타낸 그래프. 최대 토크 한계를 설정함으로써 엔진의 기계적 제약을 반영.
    • X축: 엔진 속도 (rad/s) - 엔진이 분당 몇 번 회전하는지 Y축: 최대 엔진 토크 (Nm) - 엔진이 특정 속도에서 낼 수 있는 최대 회전력
    • 낮은 속도에서 높은 토크: 그래프의 왼쪽 부분에서 속도가 낮을 때, 엔진은 더 높은 토크를 발생. 이 구간은 주로 출발 시저속에서 강한 회전력을 요구할 때 엔진이 힘을 많이 내는 구간임
    • 속도가 증가할수록 토크 감소: 속도가 증가함에 따라 최대 토크는 서서히 감소. 이는 엔진이 높은 속도에서 더 많은 출력을 낼 수 있지만, 최대 회전력(토크)은 줄어드는 엔진의 특성을 반영함.
    • 그래프의 곡선은 해당 엔진이 낮은 속도에서부터 중간 속도까지는 점진적으로 토크가 증가하고, 중간 속도 이상에서는 토크가 감소하는 전형적인 성능 곡선
        Eng_fuel_map = Eng_bsfc_map * (Eng_spd_list.T * Eng_trq_list) / 3600 / 1000
        
        # fuel consumption (g)
        self.Eng_fuel_func = interp2d(Eng_trq_list, Eng_spd_list, Eng_fuel_map)
  • 연료 소비량 계산
  • Eng_fuel_map: 엔진의 속도와 토크에 따른 연료 소비량(g) 계산
    • Eng_bsfc_map: 브레이크 특유 연료 소비율(BSFC)
    • Eng_spd_list.T * Eng_trq_list: 엔진 속도(Eng_spd_list)와 엔진 토크(Eng_trq_list) 곱한 값
      • 엔진 속도와 토크를 곱하면, 엔진이 일정 시간 동안 발생시키는 기계적 출력(에너지)을 계산 가능. 이 값은 속도와 토크의 곱으로 계산되며, 단위는 주로 kW(킬로와트)
    • / 3600: 연료 소비량을 초 단위로 맞추기 위한 상수
    • / 1000: 연료 소비량을 그램(g) 단위로 변환하기 위한 상수
  • self.Eng_fuel_func: 연료 소비량을 보간하여 연속된 속도와 토크 값에 대한 연료 소비량을 예측할 수 있는 함수를 생성
    • 엔진 토크 리스트, 엔진 속도 리스트, 각 속도와 토크 조합에서의 연료 소비량(g)를 이용
    • 특정 토크와 속도 값을 입력받아, 해당 조건에서의 연료 소비량을 추정할 수 있는 함수

  • Fuel Consumption Map (g): 엔진의 연료 소비량을 나타내는 맵
  • Interpolated Fuel Consumption: 보간된 연료 소비량의 등고선 그래프

 

모터 (Motor1)

        # Motor 1
        # motor speed list (rad/s)
        Mot_spd_list = np.arange(-6000, 6001, 200) * (2 * math.pi) / 60        
        # motor torque list (Nm)
        Mot_trq_list = np.arange(-400, 401, 10)
  • 모터 속도 리스트
    • 모터의 속도를 rad/s 단위로 나타냄
    • 음수 값은 역방향 회전을 의미하며, 양수 값은 정방향 회전을 의미
  • 모터 토크 리스트
    • 모터가 발생시킬 수 있는 토크(Nm 단위)를 나타냄
    • 음수는 역방향 토크, 양수는 정방향 토크를 의미

 

        # motor efficiency map
        data_path1 = 'Mot_eta_quarter.mat'
        data1 = scio.loadmat(data_path1)
        Mot_eta_quarter = data1['Mot_eta_quarter']
        
        Mot_eta_alltrqs = np.concatenate(([np.fliplr(Mot_eta_quarter[:, 1:]), Mot_eta_quarter]), axis = 1)
        Mot_eta_map = np.concatenate(([np.flipud(Mot_eta_alltrqs[1:, :]), Mot_eta_alltrqs]))
        
        # motor efficiency
        self.Mot_eta_map_func = interp2d(Mot_trq_list, Mot_spd_list, Mot_eta_map)
  • Mot_eta_quarter: 모터 효율 맵의 일부 데이터로, 모터가 정방향으로 회전할 때의 효율을 나타내는 1/4 구간의 효율 맵. 이 데이터는 모터 효율 맵의 정방향 회전에서 일부 구간(1/4)을 나타내며, 전체 효율 맵을 구성하기 위한 기초 데이터를 제공함(양의 토크양의 속도에서의 효율성)
    • 모터의 대칭성을 고려하여, 많은 경우 모터는 정방향과 역방향에서 대칭적인 효율 곡선을 보입니다. 따라서 효율 맵 전체를 제공하는 대신, 1/4만 제공된 데이터를 활용하여 전체 효율 맵을 대칭적으로 확장할 수 있음
    • X축: 토크의 인덱스 Y축: 속도의 인덱스
    • 밝은 색: 효율이 높은 구간. 모터가 상대적으로 적은 전력 소모많은 출력을 낼 수 있는 상태
    • 어두운 색: 효율이 낮은 구간. 이 경우 모터가 비효율적으로 동작하고 있음을 의미
    • 예: 정방향 속도 150 rad/s와 토크 100 Nm에서 효율이 80%라면, 모터는 이 조건에서 입력 전력의 80%를 유용하게 쓰고, 나머지 20%는 열이나 손실로 소모된다는 의미
  • Mot_eta_alltrqs: 좌우 대칭된 효율 맵. Mot_eta_quarter를 좌우로 대칭시켜 정방향과 역방향에서의 모터 효율을 결합한 결과
    • X축: 토크의 인덱스 (양방향 토크를 포함) Y축: 속도의 인덱스
  • Mot_eta_map: 전체 모터 효율 맵으로, Mot_eta_alltrqs를 위아래로 대칭시켜 모터 속도와 토크에 따른 효율을 전체적으로 표현한 그래프
    • 정방향과 역방향, 그리고 양의 속도와 음의 속도 모두를 포함한 데이터를 시각화
    • X축: 모터 토크 (Nm) - 실제 토크 값 Y축: 모터 속도 (rad/s) - 실제 속도 값
  • Mot_eta_map_func: 보간된 효율 맵으로, 주어진 토크와 속도 값에서 효율을 보간하여 추정한 값을 보여줌. 이는 연속적인 값을 예측 가능.
    • X축: 모터 토크 (Nm) Y축: 모터 속도 (rad/s)

 

        #  motor maximum torque
        Mot_trq_max_quarter = np.array([400,400,400,400,400,400,400,347.200000000000,...])
        Mot_trq_max_quarter = Mot_trq_max_quarter[np.newaxis, :]
        Mot_trq_max_list = np.concatenate((np.fliplr(Mot_trq_max_quarter[:, 1:]), Mot_trq_max_quarter), axis = 1)        
        
        # motor minimum torque 
        Mot_trq_min_list = - Mot_trq_max_list
        self.Mot_trq_min_func = interp1d(Mot_spd_list, Mot_trq_min_list, kind = 'linear', fill_value = 'extrapolate')
        self.Mot_trq_max_func = interp1d(Mot_spd_list, Mot_trq_max_list, kind = 'linear', fill_value = 'extrapolate')
  • Mot_trq_max_quarter: 모터가 특정 속도 구간에서 발생할 수 있는 최대 토크
    • 최대 토크가 속도에 따라 어떻게 변하는지를 보여줌. 일반적으로 모터는 낮은 속도에서 더 높은 토크를 발생시키고, 속도가 증가할수록 최대 토크는 감소하는 경향이 있음.
  • Mot_trq_max_list: 최대 토크 배열(Mot_trq_max_quarter)을 좌우 대칭으로 결합하여 전체 최대 토크 맵을 구성
    • 모터가 정방향 회전역방향 회전에서 발생할 수 있는 최대 토크를 모두 포함한 배열(정방향이든 역방향이든 동일한 힘을 낼 수 있음)
    • 낮은 속도 구간에서는 모터가 400 Nm의 높은 최대 토크를 발생시킬 수 있음. 이는 모터가 출발하거나 저속에서 강한 회전력을 요구할 때 매우 강한 힘을 발휘할 수 있음을 나타냄.
    • 속도가 증가할수록 모터의 최대 토크는 점차 감소. 높은 속도에서는 모터가 회전 속도는 빠르지만, 토크는 상대적으로 낮아지는 특성을 보임.
  • Mot_trq_min_list: 최대 토크의 음수 값을 구해, 최소 토크를 계산한 리스트
    • 모터의 최소 토크역방향에서 모터가 발생할 수 있는 최소 토크를 의미. 모터가 얼마나 역방향으로 회전할 수 있는지를 나타냄.
    • 낮은 속도 구간에서 모터는 역방향으로도 매우 강한 토크를 낼 수 있음. 예를 들어, 낮은 속도에서는 -400 Nm까지의 최소 토크 발생 가능
    • 속도가 증가할수록 모터의 최소 토크 값(즉, 음의 토크 값)은 점차 감소. 역방향으로 회전할 때도 속도가 빠를수록 회전력은 약해진다는 것을 의미
  • Mot_trq_min_func/Mot_trq_max_func: 속도(Mot_spd_list)에 따른 최소 토크(Mot_trq_min_list)와 최대 토크(Mot_trq_max_list) 값을 계산할 수 있도록 만든 보간 함수.

발전기 (Motor2)

        # Generator (Motor 2)
        # generator speed list (rad/s)
        Gen_spd_list = np.arange(-10e3, 11e3, 1e3) * (2 * math.pi) / 60
        Gen_trq_list = np.arange(-75, 76, 5) 
  • Gen_spd_list: 발전기의 속도. X축은 인덱스이며, Y축은 속도를 rad/s 단위.
    • 속도는 -1,000 RPM ~ 1,000 RPM까지 변화
  • Gen_trq_list: 발전기 토크. X축은 인덱스이며, Y축은 토크 값.
    • 토크는 -75 Nm에서 75 Nm까지 변화

 

        # motor efficiency map
        Gen_eta_quarter = np.array([[0.570000000000000,0.570000000000000,..]])
        Gen_eta_alltrqs = np.concatenate((Gen_eta_quarter[:, 1:], Gen_eta_quarter), axis = 1)    
        Gen_eta_map = np.concatenate(([np.flipud(Gen_eta_alltrqs[1:, :]), Gen_eta_alltrqs]))
        # efficiency of the electric generator
        self.Gen_eta_map_func = interp2d(Gen_trq_list, Gen_spd_list, Gen_eta_map)
  • Gen_eta_quarter: 발전기의 효율성을 나타내는 1/4 구간의 효율 맵
    • 주어진 속도와 토크에서 얼마나 효율적으로 발전기가 동작하는지를 나타냄
    • 0.57에서 0.9025까지의 범위를 가지며, 발전기 속도와 토크에 따른 효율성을 의미
  • Gen_eta_alltrqs: 좌우 대칭된 발전기 효율 데이터. 발전기가 정방향과 역방향 모두에서 효율성을 가지도록 만듦.
  • Gen_eta_map: 발전기의 전체 효율성을 나타내는 맵. 정방향 및 역방향 회전에 대한 효율성을 모두 포함한 전체 효율 맵
  • Gen_eta_map_func: 발전기 속도와 토크 값에 따른 효율성을 보간할 수 있는 함수
    • 주어진 속도와 토크 값에 대해 효율성 값을 예측가능

  • 중간 토크와 중간 속도 영역에서 효율이 가장 높음(노란 부분)
  • 토크나 속도가 0에 가까워질 때 효율이 급격히 떨어짐

 

        # generator maxmium torque
        Gen_trq_max_half = np.array([76.7000000000000,.])
        Gen_trq_max_half = Gen_trq_max_half[np.newaxis, :]
        Gen_trq_max_list = np.concatenate((np.fliplr(Gen_trq_max_half[:, 1:]), Gen_trq_max_half), axis = 1)
        
        # generator minimum torque
        Gen_trq_min_list = -Gen_trq_max_list
        self.Gen_trq_min_func = interp1d(Gen_spd_list, Gen_trq_min_list, kind = 'linear', fill_value = 'extrapolate')
        self.Gen_trq_max_func = interp1d(Gen_spd_list, Gen_trq_max_list, kind = 'linear', fill_value = 'extrapolate')
  • Gen_trq_max_half: 발전기의 최대 토크 값의 절반을 나타내는 배열
  • Gen_trq_max_list: Gen_trq_max_half를 좌우 대칭으로 결합하여 전체 토크 범위를 나타냄
  • Gen_trq_min_list: Gen_trq_max_list의 음수 값으로, 최소 토크를 나타냄.
  • Gen_trq_min_func: 속도에 따른 최소 토크 보간 함수
  • Gen_trq_max_func: 속도에 따른 최대 토크 보간 함수

  • 발전기의 속도에 따른 최대 및 최소 토크 범위
  • X축은 -1000 rad/s에서 1000 rad/s까지의 속도 범위 Y축은 약 -80 Nm에서 80 Nm 사이의 토크 범위
  • 음의 속도는 발전기가 모터로 작동하는 상태를, 양의 속도는 발전기로 작동하는 상태를 나타냄.
  • 양의 토크는 발전기가 저항 토크를 생성하는 상태를, 음의 토크는 모터로 작동하며 구동 토크를 생성하는 상태를 나타냄.
  • 속도가 0에 가까울 때 토크가 최대. 이는 정지 상태나 저속에서 최대 토크를 낼 수 있음을 의미
    • 제1사분면 (오른쪽 위): 발전기 모드. 양의 속도와 양의 토크로, 기계적 에너지를 전기 에너지로 변환.
    • 제3사분면 (왼쪽 아래): 모터 모드. 음의 속도와 음의 토크로, 전기 에너지를 기계적 에너지로 변환.
    • 제2, 4사분면: 회생 제동 영역. 발전기가 에너지를 흡수하여 속도를 줄이는 데 사용될 수 있음.

 

배터리

        # Battery
        # published capacity of one battery cell
        Batt_Q_cell = 6.5     
        # coulombs, battery package capacity
        self.Batt_Q = Batt_Q_cell * 3600  
  • self.Batt_Q_cell: 단일 배터리 셀의 공칭 용량(Ah)을 나타냄. 6.5Ah인 배터리를 사용.
  • self.Batt_Q: 전체 배터리 패키지의 용량을 쿨롱(C) 단위로 나타냄.
    • 6.5Ah * 3600s/h = 23400C (1Ah = 3600C)
        # resistance and OCV list
        Batt_rint_dis_list = [0.7,0.619244814,0.443380117,...] # ohm
        Batt_rint_chg_list = [0.7,0.623009741,0.477267027,...] # ohm
        Batt_vol_list  = [202,209.3825073,213.471405,...] # V
  • Batt_rint_dis_list: 방전 시 배터리의 내부 저항(Ω) 리스트. SOC에 따라 변화.
  • Batt_rint_chg_list: 충전 시 배터리의 내부 저항(Ω) 리스트. SOC에 따라 변화.
  • Batt_vol_list: 배터리의 개방 회로 전압(V) 리스트. SOC에 따라 변화.

배터리의 SOC에 따른 특성 변화를 모델링하기 위해 사용됨.

11개의 값을 가지고 있어, 0%에서 100%까지 10% 간격으로 SOC를 나타냄.

 

        # resistance and OCV
        SOC_list = np.arange(0, 1.01, 0.1) 
        self.Batt_vol_func = interp1d(SOC_list, Batt_vol_list, kind = 'linear', fill_value = 'extrapolate')
        self.Batt_rint_dis_list_func = interp1d(SOC_list, Batt_rint_dis_list, kind = 'linear', fill_value = 'extrapolate')
        self.Batt_rint_chg_list_func = interp1d(SOC_list, Batt_rint_chg_list, kind = 'linear', fill_value = 'extrapolate')  
  • SOC_list: 0부터 1까지 0.1 간격으로 생성된 SOC 값 리스트
  • Batt_vol_func: SOC에 따른 OCV를 선형 보간하는 함수
  • Batt_rint_dis_list_func: SOC에 따른 방전 시 내부 저항을 선형 보간하는 함수
  • Batt_rint_chg_list_func: SOC에 따른 충전 시 내부 저항을 선형 보간하는 함수
        #Battery current limitations
        self.Batt_I_max_dis = 196
        self.Batt_I_max_chg = 120 
  • Batt_I_max_dis: 배터리의 최대 방전 전류(A)
  • Batt_I_max_chg: 배터리의 최대 충전 전류(A)

배터리의 안전한 작동 범위를 정의하며, 과도한 충방전으로 인한 배터리 손상을 방지하는 데 사용

 

 

차량 동역학 코드

1. 바퀴 회전 속도 계산

  • 차량의 선속도를 바퀴의 각속도로 변환
    • 차량이 미끄러짐 없이 움직인다고 가정할 때, 바퀴의 접선 속도는 차량의 속도와 같아야 함
    def run(self, car_spd, car_a, Eng_pwr_opt, SOC):   
        # Wheel speed (rad/s)
        Wheel_spd = car_spd / self.Wheel_R
  • Wheel_spd: 바퀴의 각속도 (rad/s)
  • car_spd: 차량의 선속도 (m/s)
  • Wheel_R: 바퀴의 반지름 (m)

 

2. 주행 저항력 계산

  • 구름 저항: 타이어와 도로 표면 사이의 변형으로 인한 저항력
    • 차량이 정지해 있을 때는 구름 저항이 없다고 가정(속도가 0일 때 0)
     		# Wheel torque (Nm) 
        F_roll = self.mass * self.G * self.C_roll * (self.T_factor if car_spd > 0 else 0)
  • F_roll: 구름 저항력 (N)
  • mass: 차량의 질량 (kg)
  • G: 중력 가속도 (m/s^2)
  • C_roll: 구름 저항 계수
  • T_factor: 온도 인자 (온도에 따른 구름 저항의 변화를 고려)

 

2.2 공기 저항

  • 공기 저항: 차량이 공기를 가르며 움직일 때 발생하는 저항력
    • 속도의 제곱에 비례하여 증가
        F_drag = 0.5 * self.density_air * self.area_frontal * self.C_d *(car_spd ** 2)
  • F_drag: 공기 저항력 (N)
  • density_air: 공기 밀도 (kg/m^3)
  • area_frontal: 차량의 전면 투영 면적 (m^2)
  • C_d: 항력 계수
  • car_spd: 차량 속도 (m/s)

 

2.3 가속 저항

뉴턴의 제2법칙에 따라, 차량을 가속하는 데 필요한 힘을 계산

        F_a = self.mass * car_a
  • F_a: 가속 저항력 (N)
  • mass: 차량의 질량 (kg)
  • car_a: 차량의 가속도 (m/s^2)

 

바퀴에 작용하는 토크 계산

모든 저항력의 합을 바퀴 반지름과 곱하여 바퀴에 작용하는 토크를 계산

        T = self.Wheel_R * (F_a + F_roll + F_drag )
  • T: 바퀴에 작용하는 토크 (Nm)
  • Wheel_R: 바퀴의 반지름 (m)

 

4. 필요 동력 계산

토크와 각속도의 곱으로 필요한 동력을 계산

량을 현재 속도로 유지하거나 가속하는 데 필요한 동력을 나타냄.

        P_req = T * Wheel_spd
  • P_req: 필요한 동력 (W)

 

엔진 동작 및 연료 소비 모델링 코드 상세 설명

1. 엔진 출력 제한

  • 엔진 출력의 상한과 하한을 설정
    • 엔진 최대 출력을 56kW로 제한
    • 엔진 최소 출력을 500W로 설정하고, 요구 토크가 음수일 때(제동 시) 엔진을 끔
        # Engine  
        if Eng_pwr_opt > 56000:
            Eng_pwr_opt = 56000
        
        if (Eng_pwr_opt < 500) or (T < 0):    
            Eng_pwr_opt = 0  
  • Eng_pwr_opt: 최적화된 엔진 출력 (W)
  • T: 이전에 계산된 바퀴에 작용하는 토크 (Nm)

 

2. 엔진 속도와 토크 계산

주어진 출력에 대한 최적의 엔진 속도를 계산하고, 그에 따른 엔진 토크를 계산

        Eng_spd = self.Eng_pwr_func(Eng_pwr_opt)
        Eng_trq = Eng_pwr_opt / Eng_spd  
  • Eng_spd: 엔진 회전 속도 (rad/s)
  • Eng_trq: 엔진 토크 (Nm)
  • Eng_pwr_func: 엔진 출력에 따른 최적 엔진 속도를 반환하는 함수

 

3. 최소 엔진 출력 및 제동 에너지 회수 조건

엔진의 최소 작동 출력 이하이거나 제동 상황일 때 엔진을 완전히 정지

        # The minimum power of engine and braking energy recovery    
        if (Eng_pwr_opt < 500) or (T < 0):
            Eng_trq = 0
            Eng_spd = 0

 

4. 연료 소비율 계산

현재 엔진 상태에서의 연료 소비율을 계산

        Eng_fuel_mdot = self.Eng_fuel_func(Eng_trq, Eng_spd)
  • Eng_fuel_mdot: 연료 소비율 (kg/s)
  • Eng_fuel_func: 엔진 토크와 속도에 따른 연료 소비율을 반환하는 함수

 

5. 최대 엔진 토크 경계 확인

현재 엔진 속도에서 가능한 최대 토크를 계산하고, 요구되는 토크가 이를 초과하는지 확인

				# maximum engine torque boundary (Nm)
				Eng_trq_max = np.polyval(Eng_trq_maxP, Eng_spd)
				inf_eng = (Eng_trq > Eng_trq_max)
  • Eng_trq_max: 현재 엔진 속도에서의 최대 가능 토크 (Nm)
  • Eng_trq_maxP: 엔진 속도에 따른 최대 토크를 나타내는 다항식 계수
  • inf_eng: 계산된 토크가 최대 토크를 초과하는지 여부

 

6. 엔진 전력 소비 계산

연료 소비율에 연료의 발열량을 곱하여 엔진이 소비하는 총 에너지를 계산

        # engine power consumption
        Eng_pwr = Eng_fuel_mdot * 42600
  • Eng_pwr: 엔진이 소비하는 전력 (W)
  • 42600: 연료의 저위발열량 (kJ/kg)

 

7. 연료 소비량 계산

엔진 전력 소비를 다시 연료의 발열량으로 나누어 실제 연료 소비량을 계산

        # Calculate fuel consumption
        cost = (Eng_pwr / 42600)
  • cost: 연료 소비량 (kg/s)

 

8. 유성 기어세트 힘 계산

엔진 토크를 유성 기어세트에 작용하는 힘으로 변환. 하이브리드 동력 분배 시스템에서 중요한 역할을 함.

        F_pgs = (Eng_trq / (self.Pgs_R + self.Pgs_S))   
  • F_pgs: 유성 기어세트에 작용하는 힘 (N)
  • Pgs_R: 유성 기어세트의 링 기어 반경 (m)
  • Pgs_S: 유성 기어세트의 선 기어 반경 (m)

 

전기 모터 동작 모델링 코드 상세 설명

1. 모터 속도 계산

  • 바퀴의 회전 속도를 모터의 회전 속도로 변환
  • 유성 기어세트의 기어비를 통해 속도가 변환됨
        # motor rotating speed and torque
        Mot_spd = self.Pgs_K * Wheel_spd
  • Mot_spd: 모터 회전 속도 (rad/s)
  • Pgs_K: 행성 기어세트의 기어비
  • Wheel_spd: 바퀴의 회전 속도 (rad/s)

 

2. 모터 토크 계산

바퀴에 필요한 토크를 모터 토크로 변환하고, 엔진에서 전달되는 토크를 고려

        Mot_trq = T / self.Pgs_K - F_pgs * self.Pgs_R
  • Mot_trq: 모터 토크 (Nm)
  • T: 바퀴에 필요한 토크 (Nm)
  • F_pgs: 유성 기어세트에 작용하는 힘 (N)
  • Pgs_R: 유성 기어세트의 링 기어 반경 (m)

 

3. 모터 토크 제한 적용

  • 모터 토크를 최대 및 최소 제한 내로 조정
    • 음의 토크(제동)일 때 최소 토크 제한을 적용
    • 양의 토크(구동)일 때 최대 토크 제한을 적용
    • 제한 내의 토크는 그대로 유지
        Mot_trq = (Mot_trq < 0) * (Mot_trq < self.Mot_trq_min_func(Mot_spd)) * self.Mot_trq_min_func(Mot_spd) +\\
                  (Mot_trq < 0) * (Mot_trq > self.Mot_trq_min_func(Mot_spd)) * Mot_trq +\\
                  (Mot_trq >= 0) * (Mot_trq > self.Mot_trq_max_func(Mot_spd)) * self.Mot_trq_max_func(Mot_spd) +\\
                  (Mot_trq >= 0) * (Mot_trq < self.Mot_trq_max_func(Mot_spd)) * Mot_trq 

Mot_trq_min_func와 Mot_trq_max_func는 모터 속도에 따른 최소 및 최대 토크를 반환하는 함수

 

4. 모터 토크 배열 변환

        Mot_trq = np.array(Mot_trq).flatten()  

 

5. 모터 효율 계산

모터 속도가 0일 때 효율을 1로 설정하고, 그 외의 경우 효율 맵 함수를 사용하여 효율을 계산

        Mot_eta = (Mot_spd == 0) + (Mot_spd != 0) * self.Mot_eta_map_func(Mot_trq, Mot_spd * np.ones(1)) #need to edit  
  • Mot_eta: 모터 효율
  • Mot_eta_map_func: 모터 토크와 속도에 따른 효율을 반환하는 함수

 

6. 유효하지 않은 작동점 확인

  • 효율이 NaN인 경우
  • 음의 토크가 최소 제한을 초과하는 경우
  • 양의 토크가 최대 제한을 초과하는 경우
        inf_mot = (np.isnan(Mot_eta)) + (Mot_trq < 0) * (Mot_trq < self.Mot_trq_min_func(Mot_spd)) + (Mot_trq >= 0) * (Mot_trq > self.Mot_trq_max_func(Mot_spd))

 

7. NaN 효율 처리

효율이 NaN인 경우 1로 설정

        Mot_eta[np.isnan(Mot_eta)] = 1        

 

8. 전기 동력 소비 계산

모터의 동작 모드에 따라 전기 동력 소비를 계산

  • 발전 모드(Mot_trq * Mot_spd <= 0): 기계적 동력에 효율을 곱함
  • 구동 모드(Mot_trq * Mot_spd > 0): 기계적 동력을 효율로 나눔
        # Calculate electric power consumption
        Mot_pwr = (Mot_trq * Mot_spd <= 0) * Mot_spd * Mot_trq * Mot_eta + (Mot_trq * Mot_spd > 0) * Mot_spd * Mot_trq / Mot_eta
  • Mot_pwr: 모터의 전기 동력 소비 (W)

 

하이브리드 차량 발전기 동작 모델링 코드 상세 설명

1. 발전기 회전 속도 계산

  • 유성 기어세트를 통한 동력 분배를 모델링
    • 엔진과 모터의 속도가 어떻게 발전기 속도에 영향을 미치는지 보여줌
    • 하이브리드 차량의 복잡한 동력 전달 시스템을 반영
        # genertor rotating speed and torque 
        Gen_spd = (Eng_spd * (self.Pgs_R + self.Pgs_S) - Mot_spd * self.Pgs_R ) / self.Pgs_S
  • Gen_spd: 발전기 회전 속도 (rad/s)
  • Eng_spd: 엔진 회전 속도 (rad/s)
  • Mot_spd: 모터 회전 속도 (rad/s)
  • Pgs_R: 행성 기어세트의 링 기어 잇수
  • Pgs_S: 행성 기어세트의 선 기어 잇수

 

2. 발전기 토크 계산

행성 기어세트를 통해 발전기에 전달되는 토크를 계산

음의 부호는 발전기가 저항 토크를 제공함을 의미

        Gen_trq = - F_pgs * self.Pgs_S
  • Gen_trq: 발전기 토크 (Nm)
  • F_pgs: 행성 기어세트에 작용하는 힘 (N)

 

3. 발전기 효율 계산

  • 발전기 속도가 0일 때는 효율을 1로 설
  • 그 외의 경우, 효율 맵 함수를 사용하여 현재 토크와 속도에 따른 효율을 계산
        Gen_eta = (Gen_spd == 0) + (Gen_spd != 0) * self.Gen_eta_map_func(Gen_trq, Gen_spd)        
  • Gen_eta: 발전기 효율
  • Gen_eta_map_func: 발전기 토크와 속도에 따른 효율을 반환하는 함수

 

4. 유효하지 않은 작동점 확인

  • 효율이 NaN인 경우
  • 음의 토크가 최소 제한을 초과하는 경우
  • 양의 토크가 최대 제한을 초과하는 경우
        inf_gen = (np.isnan(Gen_eta)) + (Gen_trq < 0) * (Gen_trq < self.Gen_trq_min_func(Gen_spd)) + (Gen_trq >= 0) * (Gen_trq > self.Gen_trq_max_func(Gen_spd))

Gen_trq_min_func와 Gen_trq_max_func는 발전기 속도에 따른 최소 및 최대 토크를 반환하는 함수

 

5. NaN 효율 처리

효율이 NaN(Not a Number)인 경우, 해당 값을 1로 설정. 계산 오류 방지

        Gen_eta[np.isnan(Gen_eta)] = 1

 

6. 전기 동력 생산/소비 계산

발전기의 동작 모드에 따라 전기 동력 생산 또는 소비를 계산

  • 발전 모드(Gen_trq * Gen_spd <= 0): 기계적 동력에 효율을 곱하여 전기 에너지 생산량 계산
  • 모터 모드(Gen_trq * Gen_spd > 0): 필요한 기계적 동력을 효율로 나누어 전기 에너지 소비량 계산
        # Calculate electric power consumption
        Gen_pwr = (Gen_trq * Gen_spd <= 0) * Gen_spd * Gen_trq * Gen_eta + (Gen_trq * Gen_spd > 0) * Gen_spd * Gen_trq / Gen_eta
  • Gen_pwr: 발전기의 전기 동력 생산/소비 (W)

 

하이브리드 차량 배터리 동작 모델링 코드 상세 설명

1. 배터리 전압 계산

현재 배터리 충전 상태에 따른 전압을 계산

        Batt_vol = self.Batt_vol_func(SOC)
  • Batt_vol: 배터리 전압 (V)
  • Batt_vol_func: 배터리 충전 상태(SOC)에 따른 전압을 반환하는 함수
  • SOC: 배터리 충전 상태 (State of Charge)

 

2. 배터리 전력 계산

모터와 발전기의 전력 합계를 계산하여 배터리에서 요구되는 전력을 결정

        Batt_pwr = Mot_pwr + Gen_pwr  
  • Batt_pwr: 배터리 전력 (W)
  • Mot_pwr: 모터 전력 소비 (W)
  • Gen_pwr: 발전기 전력 생산 (W)

 

3. 배터리 내부 저항 계산

배터리의 충전 상태와 전력 흐름 방향에 따라 적절한 내부 저항을 선택

        Batt_rint = (Batt_pwr > 0) * self.Batt_rint_dis_list_func(SOC) + (Batt_pwr <= 0) * self.Batt_rint_chg_list_func(SOC)
  • Batt_rint: 배터리 내부 저항 (Ω)
  • Batt_rint_dis_list_func: 방전 시 내부 저항을 반환하는 함수
  • Batt_rint_chg_list_func: 충전 시 내부 저항을 반환하는 함수

 

4. 쿨롱 효율 및 최대 전류 설정

배터리의 충전/방전 상태에 따라 쿨롱 효율과 최대 허용 전류를 설정. 충전 시 효율은 0.9로 설정.

        #columbic efficiency (0.9 when charging)
        Batt_eta = (Batt_pwr > 0) + (Batt_pwr <= 0) * 0.9
        Batt_I_max = (Batt_pwr > 0) * self.Batt_I_max_dis + (Batt_pwr <= 0) * self.Batt_I_max_chg
  • Batt_eta: 배터리 쿨롱 효율
  • Batt_I_max: 최대 허용 전류 (A)

 

5. 배터리 전력 제한 조건 확인 및 처리

배터리의 물리적 제한을 고려

  • 만약 요구 전력이 배터리의 최대 가능 전력을 초과하면, 전력을 조정하고 최대 가능 전류 계산.
  • 그렇지 않은 경우, 요구 전력에 따른 전류를 계산.
        # the limitation of Batt_pwr
        inf_batt_one = (Batt_vol ** 2 < 4 * Batt_rint * Batt_pwr)    
        if Batt_vol ** 2 < 4 * Batt_rint * Batt_pwr:
    #        Eng_pwr = Eng_pwr + Batt_pwr - Batt_vol ** 2 / (4 * Batt_rint)    
    #        Eng_trq = Eng_pwr / Eng_spd       
            Batt_pwr = Mot_pwr - Batt_vol ** 2 / (4 * Batt_rint)          
            Batt_I = Batt_eta * Batt_vol / (2 * Batt_rint)
    #        print('battery power is out of bound')
        else:          
            Batt_I = Batt_eta * (Batt_vol - np.sqrt(Batt_vol ** 2 - 4 * Batt_rint * Batt_pwr)) / 0.8
  • inf_batt_one: 배터리 전력이 제한 조건을 초과하는지 여부
  • Batt_I: 배터리 전류 (A)

 

6. 최종 배터리 제한 조건 확인

전력 제한 조건과 최대 전류 제한 조건을 모두 고려하여 배터리 동작의 유효성을 판단

        inf_batt = inf_batt_one + (np.abs(Batt_I) > Batt_I_max)
  
  • inf_batt: 최종적으로 배터리 동작이 유효한지 여부

 

하이브리드 차량 배터리 충전 상태 업데이트 및 시스템 제한 조건 확인 코드 설명

1. 새로운 배터리 충전 상태(SOC) 계산

  • 배터리의 새로운 충전 상태를 계산합니다. 전류의 적분(시간에 대한)이 충전 상태의 변화를 나타냄
  • 음의 부호는 방전 시 SOC가 감소하고, 충전 시 증가함을 의미
        # New battery state of charge
        SOC_new = - Batt_I / self.Batt_Q + SOC
  • SOC_new: 새로운 배터리 충전 상태
  • Batt_I: 배터리 전류 (A)
  • Batt_Q: 배터리 용량 (Ah 또는 Coulomb)
  • SOC: 현재 배터리 충전 상태

 

2. 복소수 처리

  • 계산 과정에서 발생할 수 있는 복소수 값을 처리
  • 복소수의 실수부만을 취하는 방법으로, 수치적 안정성을 향상함
        # Set new state of charge to real values
        SOC_new = (np.conjugate(SOC_new) + SOC_new) / 2

 

3. SOC 상한 제한

배터리의 충전 상태가 100%(1.0)를 초과하지 않도록 제한

        if SOC_new > 1:
            SOC_new = 1.0

 

4. 시스템 제한 조건 확인

  • 시스템의 여러 구성 요소(배터리, 엔진, 모터, 발전기)에 대한 제한 조건 위반 여부를 종합적으로 확인
  • 하나라도 제한 조건을 위반하면 I는 True가 됨.
        I = (inf_batt + inf_eng + inf_mot + inf_gen != 0)
  • I: 시스템 제한 조건 위반 여부를 나타내는 지표
  • inf_batt: 배터리 관련 제한 조건 위반 여부
  • inf_eng: 엔진 관련 제한 조건 위반 여부
  • inf_mot: 모터 관련 제한 조건 위반 여부
  • inf_gen: 발전기 관련 제한 조건 위반 여부

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST
성장중 •͈ᴗ•͈