Projects/자율주차 강화학습

[AirSim / Unity] CarClient의 brake 관련 문제 해결

Alex An 2021. 3. 18. 15:34
# connect to the AirSim simulator
client = airsim.CarClient()
client.confirmConnection()
client.enableApiControl(True)
print("API Control enabled: %s" % client.isApiControlEnabled())
car_controls = airsim.CarControls()

print("Reset")
client.reset()

print("Go Forward")
car_controls.throttle = 1
car_controls.brake = 0
client.setCarControls(car_controls)
time.sleep(8)

print("Apply brakes")
car_controls.throttle = 0
car_controls.brake = 1
client.setCarControls(car_controls)
time.sleep(15)

CarClient의 차량 제어와 관련된 car_controls 클래스의 brake 값이 제대로 적용되지 않는 문제를 겪었습니다.

 

위 코드처럼 throttle 값을 1에서 0으로, brake 값은 0에서 1로 변경하여 적용한 결과와

 

throttle 값은 1에서 0으로 변경하고, brake 값은 0을 유지한 상태를 적용한 결과를 비교해본 결과,

 

같은 속도 변화를 보이는 것을 관찰했습니다.

 

 

위는 파이썬 API를 이용해 차량을 제어하는 상황이었고,

 

직접 키보드를 사용해 차량을 제어할 때는 브레이크가 제대로 동작하는 것을 확인하고나서

 

유니티에서 실행되는 스크립트 중 파이썬 API를 이용한 차량 제어 코드를

 

키보드를 이용한 차량 제어 코드에 맞춰 수정하는 데 초점을 맞춰 문제 해결을 진행하게 되었습니다.

 

 

// 파이썬 API 제어 코드
if (isApiEnabled)
{
  throttle = carControls.throttle;
  handBrake = carControls.handbrake ? 1 : 0;
  footBreak = carControls.brake;
  steering = carControls.steering;
}
// 키보드 제어 코드
else
{
  steering = Input.GetAxis("Horizontal");
  throttle = Input.GetAxis("Vertical");
  handBrake = Input.GetAxis("Jump");
  footBreak = throttle;
}

carController.Move(steering, throttle, footBreak, handBrake);
carController.UpdateCarData(ref carData);
carData.throttle = throttle;
carData.brake = footBreak;
carData.steering = steering;

 

( 스크립트 경로 : AisSim/Unity/UnityDemo/Assets/AirSimAssets/Scripts/Vehicles/Car/Car.cs )

 

위 스크립트에서 보이는것 처럼 키보드 제어를 할 때는 브레이크 변수(footBreak)에 throttle 값을 할당하는 모습을 확인할 수가 있었습니다.

 

// 파이썬 API 제어 코드
if (isApiEnabled)
{
  throttle = carControls.throttle;
  handBrake = carControls.handbrake ? 1 : 0;
  footBreak = carControls.throttle; // carControls.brake에서 수정
  steering = carControls.steering;
}
// 키보드 제어 코드
else
{
  steering = Input.GetAxis("Horizontal");
  throttle = Input.GetAxis("Vertical");
  handBrake = Input.GetAxis("Jump");
  footBreak = throttle;
}

carController.Move(steering, throttle, footBreak, handBrake);
carController.UpdateCarData(ref carData);
carData.throttle = throttle;
carData.brake = footBreak;
carData.steering = steering;

 

따라서 다음처럼 파이썬 API 제어 코드에서도 브레이크 변수에 throttle 값을 할당하도록 코드를 수정했습니다.

 

 

이후 키보드를 통해 차량 제어를 할 때 throttle, footbreak, handBrake의 값들의 변화를 관찰해 보았습니다.

 

전진
브레이크 사용
브레이크 해제

  전진 브레이크 사용 브레이크 해제
throttle 1 0 0
footBreak 1 0 0
handBrake 0 1 0

 

코드에서 확인할 수 있었던 것 처럼 throttle과 footBreak 값은 동일하게 바뀌었고,

 

handBrake가 실제 브레이크 역할을 하고 있다는 것을 확인할 수 있었습니다.

 

이후 파이썬 코드에서 car_controls.brake가 아닌 car_controls.handbrake를 사용하니 브레이크가 정상적으로 작동했습니다.

 

 

AirSim을 개발한 Microsoft가 실수를 한건지 아니면 다른 의도가 있었는지는 모르겠지만,

 

아직 유니티 환경에서는 실험 단계라고 하니 당분간 이러한 문제에 대해서는 감수해야할 것으로 보입니다.