본문 바로가기

자율주행자동차/Vehicle AI in Unreal Engine 5

Vehicle AI in UE5 1/6

https://www.youtube.com/watch?v=_RQuv0_pWFs

비히클 프로젝트를 만들고

컨텐츠밑에 AI 폴더를 만들자

AIController를 부모로하는 블루프린트를 만들자 이름은 AIC_VehicleAI

GetControlledPawn을 추가하고 ReturnValue를 변수로 승격해주고 이름을 ControlledVehicle로 바꿔준다.

Blueprint Interface를 만들고 이름을 BPI_isVehicle로 한다.

다음 4개의 펑션을 만들어 놓는다. 인터페이스는 이름만 들어어놓고 구현은  해당 클래스에서 한다.

컨텐츠브라우저의 VehicleAdvPawn을 연다.

인터페이스를 사용하기 위해 ClassSettings로 가 BPI_isVehicle을 추가해준다.

그럼 왼쪽  MyBlueprint에 BPI_isVehicle의  Function들이 보인다. 그중 Set Throttle위 우클릭해 implement event를 만든다

Event Set Throttle을 Steering and Throttle controls오른쪽에 놓고 SetThrottleInput을 카피해서

다음과 같이 연결해 인터페이스를 구현해준다.

비슷한방법으로 Steering도 구현해준다.

Breke도 구현해준다.

이제 AIC_Vehicle로 이동해서 EventTick뒤에 Controlled Vehicle를 Get노드로 추가하고 SetThrottle메세지를 추가하고 Throttle을 1로 설정하자.

AIC_Vehicle 로 움직일 SportsCar_Pawn 을 레벨에 끌어다 놓고

AIC_VehicleAI를 지정해준다

플레이 해보면 Throttle이 1 이므로 앞으로 갈것이다.

BP_AIPath라는 액터 블루프린터를 만들고 컴포넌트에 Spline을 추가해주고

드라이브 코스를 따라 Spline을 만들어주고 CloseLoop를 체크해주고 Location을 50정도 높혀준

BPI_IsAPath 블루프린트 인터페이스를 만들어주고 

BP_AIPath블루프린트의 Class Settings의 InplementedInterfaces에 BPIIsaAIPath를 등록해주

GetClosestLocationtoSpline을 더블클릭해

함수를 구현해준다. 주어진 지점에서 Spline과의 거리를 찾아 스플라인상의 위치를 찾는데 500정도 앞을 찾아준다 이걸 안하면 자동차의 커브가 좀 이상하다. CoordinateSpace는 World로 해준다.


SportsCar_Pawn에 Scene컴포넌트를 추가해주고  이름을 FrontOfCar로 바꿔주고 차앞에 옮긴다. 자동차의 회전이 자연스러워진다.

AIC_Vehicle에서 CalculateSteering함수를 만들자

차 앞의 위치와 근처 Spline의 위치와의 각도와 차의 각도의 차이를 리턴해준다

EventGraph에 다음과 같이 EventTick뒤에 노드를 추가한다.

이제 플레이 해보면 자동차가 Spline을 잘 따라다닌다.

 

좀더 나은 개선을 위해

BPI_isAIPath를 열고 GetClosestLocationToSpline의 Input을 추가하자. Boolean Type의 AdditionalDistance라고 하

BP_AIPath 블루프린트로 이동해서 Add pin의 500에 Additional Distance를 추가후 연결해주자

GetClosestLocationtoSpline을 사용하는 AIC_VehicleAI로 이동해서 추가된 Additional Distance에 500을 넣어준다.

AIC_VehicleAI블루프린트의 CalculateStreeing을 복사해서 이름을 CalculateTopSpeed로 해준다.

더블클릭후 Additional Distance를 1500으로 변경하고

Delta Return Value Z(Yaw)뒤에 ABS를 추가해준다. Map Range Clamped값을 지정해주

Return Node Out을 TopSpeed로 이름 바꿔준다

CalculateThrottleBrake함수를 만들고 TopSpeed(Float)입력을 만들어주자.

BPI_IsVehicle로 이동해 GetCurrentSpeed함수를 추가해주고 CurrentSpeed(Float) Output을 만들어준다

VehicleAdvPawn으로 이동 Interface에서 GetCurrentSpeed를 더블클릭해서 GetForwardSpeed를 추가해주고

0.036을 곱해 km로 변환후 Return해준다.

AIC_VehicleAI로 이동해서 CalculateThrottleBrake함수에 GetCurrentSpeed를 추가하고 TopSpeed의 조건에 따

Return Node를 추가하고 Output으로 Throttle과 Brake를 추가하고 Branch의 조건에 따라 다음과 같이 설정한다.

AIC_VehicleAI EventGraph의 SetThrottle을 지우고 SetSteering 뒤에 지금까지 만든 함수를 연결해서 Throttle과 Brake값을 지정한다. 

풀레이 해보면  Streering이 Overshooting이 된다.

AIC_VehicleAI CalulateSteering의 AdditionalDistance를 자동차의 속도에 비례하기 수정해주고

AIC_VehicleAI CalulateTopSpeed의 Additional Distance는 CalculateSteering의 3배정도로 해준다.