언리얼 5 부터 자동차 다이나믹스에 활용되는 카오스 비히클이 적용 할 수 있는 조작 수단끼리 비교해보고자 한다.
일단 스포츠카 샘플 (기본)을 사용하고자 한다.
먼저 자동 기어 (왜냐면 SportsCar_Pawn 의 Default 상태이기 때문이다)

save data에 대해서는 이전 글을 참고바란다.
로깅을 남기려고 getgametimesincecreation 으로 시계열 x 축 값을 얻고 forward speed x 0.036 (언리얼은 cm/s 이라 100cm= 1m, 1000m= 1km 니 100000 cm = 1km, 3600s = 1h 니까 3600/100000 = 0.036 으로 cm/s 를 km/h 로 변환한다)
을 연결한다음 현 기어 상태를 보기위해 get current gear 까지 같이 보는 걸로 data array 를 만들고
이걸 custom event > set time by event 에서 (0.1초 간격) 으로 SaveData 에서 값을 쓰도록 하고 이를
Event Begin play 에서 실행하도록 하면 원하는 주기로 데이터를 찍을 수 있다.
쭉 직진하다가 악셀을 (W키를) 떼고 가만히 냅두면 감속이 알아서 된다.

위에가 속도고 밑에가 기어 값인데 가속함에 따라 기어가 0 > 1 > 2 > 3 으로 올라가고 101 값이 10초인데
10초 쯤에 악셀을 떼고, 냅뒀더니 일단은 3단을 유지한채로 throttle 값이 들어오지 않으니 감속하고
20초 쯤에 속도가 80정도로 내려가면서 2단, 24초 쯤에 1단으로 내려가는데 결국은 34초 쯤에 1단인 상태로 속도가 0이
된 것을 볼 수 있다.
이번에는 수동 기어모드로 이 부분을 보겠다.

먼저 SportsCar_Pawn 의 VehicleMovementComponent 를 클릭하여 오른쪽의 Transmission Setup 에서
Automatic Transmission 이랑 Automatic Reverse 에 체크되어 있던거를 언체크 해준다.

Blueprint 에서 키보드 인풋에 SetTargetGear를 매칭시켜준다.Gear값은 int값인데
-1은 R (후진) 기어
0 은 N(중립) 기어
1이상의 숫자는 각각 D(전진) 기어인데 1단 2단 3단 으로 올라간다.
본 실험에서는 그냥 무지성으로 3단 먹이고 쭉 가다가 놓아보도록 하겠다.

3단을 기어로 고정된 상태로 쭉 가속하다가 엑셀을 띠고 속도가 0이 될때까지 기다렸다.
자동이랑 수동을 일단 비교해보자면
자동은 160km/h 에서 0이 될때가지 24초가 걸린 반면,
수동은 160km/h 에서 0이 될때까지 30초가 걸렸다.
자동에서 기어가 바뀌면서 감속 시간에 영향을 미친다는 것을 알 수 있다.
이번에는 토크 제어로 해보겠다.

먼저 SportsCar_WheelsRear 와 SportsCar_WheelsFront 두 바퀴 블루프린트에 들어가서
External Torque Combine Method 를 Override 로 바꿔준다.

Drive Torque 라는 Function 을 만들어주고 여기에 SetDriveTorque 를 바퀴 인덱스별로 Throttle 값이 전달되도록 한다.
함수 Input 에 float 값 하나 추가해주고 찍찍 그으면 된다.
다시 EventGraph 로 가서

Throttle Input에 Set Throttle Input 을 없애고 위에서 만들어놓은 Drive Torque 를 붙인다.
그리고 Action Value 에 *600 을 해서 실제 각 휠에 600 Torque정도 가하게 한다.

토크를 바퀴에다가 직접 주는 전기차 방식이다보니 막상 기어가 안들어가도 걍 깡 토크 가 들어가는 거라 기어는 계속 0이다.
그래도 잘만 굴러가게 됐다 ㅎㅎ
일단 160 찍고 악셀을 뗐는데 위에거보다 속도가 현저하게 낮게 줄어들었다. 결국 맵 끝까지 가는 동안에도 감속이 느려서
떨어지고 말았다는....
현재까지 평균 기울기로 감속 비율을 차례대로 비교해보자면
1) 자동기어: -6.917km/s 2) 수동기어: -5.078km/s 3) 토크 제어: -2.055 km/s
이다. 감속 비율이 두배 넘게 차이난다. 음....
근데 더 킹받는 요소가 있다. 저속 주행이면 토크 제어의 경우 더 개판으로 감속되는 것 같다.
아니 자동 크루즈 모드냐고....
36 km/h 정도 달렸다가 놨을때 -0.238 km/h 가 나온다.

혹시나 하는 마음에 나머지 모드도 적용해봤더니

자동은 -3.461 km/s

수동은 -2.4 km/s
감속 비율이 10배 이상 차이난다.....
토크제어 모드에서 기존 모드처럼 안되는거는 분명 문제점이 있어보인다.
확실한건 감속요인이되는 외력(주로 지면 마찰력과 공기저항력)이 유독 토크모드에서만 안 작용한다? 이러면
시뮬레이션 만든 언리얼 쪽에서의 문제일듯....
분명 오르막길에서는 속도감속이 딱딱 되는데....
페달놓으면 거의 항속 이동이다? 음.....
* 글을 쓰고나서 해결방법이 떠올라서 추가로 수정해본다.
우리가 보통 모는 자동차들이 D 기어에 놓으면 악셀을 밟지않아도 속도가 10km/h 내외로 슬슬 기어가지 않는가?
평지에서라면 말이다.
기존 카오스 비히클조차도 그부분이 구현되지는 않은듯하다 왜냐면 0 엔딩이니까...
토크제어로 바꾸면서 이부분을 보다 리얼리스틱하게 하도록 하겠다.
일단 제어 명령을 ch1 로 상정하고 제어명령에 따른 토크값, 브레이크값을 반환하도록 한다.

그리고 그 제어값에 대해서 Tick 에서도는 거로 compare float 을 이용하여 악셀을 밟을때, 악셀을 땠을때, 브레이크를 밟았을때를
>0, ==, <0 의 조건으로 각각 아래와같이 구성한다.

이 블루프린트를 보완하기 위한 2개의 함수도 추가로 첨부하도록 하겠다.
1. DriveTorque

2. BrakeTorque

이렇게 한 이유는 각 바퀴마다 토크를 제어하는 메커니즘 특성상 기존 기어 입력체계의 간단한 Set Throttle, Set Brake Input 과같이 하나로 끝낼수 없으면 Event Graph 가 밑도끝도없이 지저분해지기 때문에 위와같이 함수를 미리 만들어놓았다.
여튼 이 함수들을 기반으로 위의 == 구간에서 브레이크 = 브레이크+a (a의 크기에 따라 속도가 줄어드는 정도를 조절 가능) 를 적용해서 점점 감속이 되게끔했다. 저렇게 브레이크가 자기자신을 더하는게 틱에서 계속 돌면서 점점 브레이크가 가해지면서
겉으로 보기에는 자연스럽게 감속되는 것처럼 보여질 수 있다.
또한 마지막에 속도가 <=10 이 되면 브레이크값이 다시 0 이되도록 하고 약간의 Drive Torque 를 가하는 branch 문을 추가하여 D기어에서의 기본 주행이 가능하도록 하였다. 이렇게되면 고속으로 달리다가 악셀을 놓으면 10 km 까지는 좌라락 감속하고 10km 부터는 거의 등속운동으로 주행하여 현대에 주행하는 자동차 모델에 접근할 수 있게 된다.
감격스러운 시연영상을 보도록 하겠다.
조금은 현실감이 있는 것 같다.
일단은 요 방법으로 해결?! ㅋㅋㅋㅋ
| 모드에 따른 타겟 각도까지 카메라 틸팅 (0) | 2023.10.31 |
|---|---|
| SceneCaptureComponent 2D 의 가동 개수와 렌더링 퍼포먼스로 인한 언리얼 프레임 변화 비교 (0) | 2023.10.28 |
| 자동 감시 (구간 감시) 태스크 수행 (2) | 2023.10.23 |
| Unreal 에서 Array 값들 csv로 저장하여 데이터 로깅하기 (1) | 2023.10.07 |
| 장애물 배치 활성화/비활성화 (1) | 2023.10.04 |