12강 Car Traj optimization - shooting

일전 살펴본 collocation method는 시스템의 dynamics를 알고 있는 상황에서만 사용할 수 있는 방법이었습니다. dynamics를 통해 각 step 사이 상태 변환을 최적화할 수 있는 기법이었지요.

하지만 실제 로봇을 개발함에 있서 시스템의 모든 것을 수식화하는 것은 사실상 불가능에 가깝습니다.

따라서 이번 시간에는 dynamics를 black box로 간주하고 simulation을 통해 최적화하는 "shooting method"에 대해 배워보고자 합니다.


Shooting method

현재 state 기준 control u를 적용하면 일련의 output을 내뱉는 simulator가 있다고 해봅시다.

  • 우리가 최적화해야 하는 것은 최종 state를 만족하는 즉, 시간 T뒤 목적지에 도달하는 control input u들을 찾아내는 것입니다.
  • 일전 collocation method 처럼 전체 경로를 N step으로 나누었기 때문에 control input u 또한 N step list 형태를 취할 것입니다.

💡참고로 shooting method는 simulator 방식에 따라 모든 step을 시뮬레이션하는 multiple shootingsingle shooting으로 나뉘는데요. 이번 시간에는 single shooting에 집중해보겠습니다.


single shooting을 위해 우리가 설정해야 할 초기 조건과 constraint들은 다음과 같습니다.
  • N step control signal에 해당하는 u를 random하게 초기화합니다.

  • constraint들을 설정합니다.
    • 시간 T, control u의 upper/lower bound, final state들이 모두 constraint가 될 것입니다.
    • 일전 collocation method와 차이점에 주목해보면, 훨씬 적은 constraint를 사용한다는 점과, shooting method는 simulator를 사용하기 때문에 initial condition 또한 simulator에서 보장된다는 점입니다.


  • 따라서 최종 필요한 constraint들을 정리해보면 다음과 같습니다.

Description
cost function 목적지까지 도달하기 위한 시간 T - 1개
boundary condition control signal의 upper, lower bound - N개
final condition 최종 state에 대한 조건 ex) 최종 state의 위치는 D, 속도는 0이어야 한다. - 2개

결국 최종 N + 3개의 constraint와 cost function이 필요한 것이며, 일전 collocation method에서는 모든 state들에서의 위치, 속도, control signal이 constraint가 되었던 것에 비교하면 훨씬 가벼운 조건을 가진다 말할 수 있습니다.

  • collocation의 constraint들 복기

State index Description
0, 1, 2, 3 initial pos, vel / final pos, vel
4 ~ N+3 pos & vel dynamics
N+4 ~ 2N+3 vel & control dynamics

이렇게 shooting method는 collocation과는 달리 state에 대한 식을 몰라도 최적화를 할 수 있고, constraint가 적고(최종 result와 control input만 최적화하면 되므로), 따라서 복잡한 문제도 최적화할 수 있다는 장점을 갖지만, 시간이 많이 걸립니다.


코드 실행을 통해 직접 실습해봅시다.

코드 구현

shooting method는 구조가 다소 복잡하기 때문에 코드 개요를 먼저 살피고 들어가겠습니다.

opt.minimize

  1. cost
  2. constraints
  • nonlinear_fn
  • simulator
    • odeint - car


  • main 함수에서 최적화해야 할 state를 정의하고 있습니다. 일전 collocation method에서는 모든 step의 position, velocity, control signal을 state로 정의해야 하지만, shooting method에서는 simulator에게 state 변환을 위임하기 때문에 목적인 control input만 state로 설정합니다.

  • state와 더불어 Bound와 Constraint를 설정한 다음 opt.minimize에게 전달하여 최적 state를 계산합니다.

  • constraint가 되는 함수 nonlinear_fun를 살펴봅시다. 아까 이야기한 바와 같이 step간 변환은 모두 simulator에서 처리되며 constraint는 final state만 정의하고 있습니다.

  • 이제 simulator를 살펴볼까요?

inpit parameter x에는 시간 T와 control input들이 섞여 있으므로 우선 분리를 시킵니다. 다음으로 모든 step을 순회하면서 해당 시점 control input이 주어졌을 때 위치와 속도에는 어한 변화가 생기는지 시뮬레이션을 합니다. ( 이를 위해 odeint를 사용하고 있습니다.) 모든 step을 순회하면서 position과 velocity를 수집한 다음 최종 return 합니다.

  • odeint의 input인 car function을 살펴봅시다. control signal과 time step을 사용하여 간단한 1차 함수를 구현하여 새로운 제어 값을 계산하고 있습니다. 현재는 step size와 control signal의 size가 같지만, step size가 커질것을 대비한 코드입니다.

코드를 모두 살펴보았는데요. 다시 한발자국 멀리서 큰 그림을 살펴봅시다.
  • random한 control signal을 정의하고 simulator를 통해 이 제어 신호에 대한 position velocity를 계산합니다.
  • simulator 결과 final state를 만족시키는 조건과 cost function을 정의하고 이를 optimize하였습니다.


코드의 실행 결과는 아래와 같습니다. (사실 결과 자체는 collocation method와 동일합니다.)

python sw_shooting_slsqp.py


  • shooting method가 동작하는 방식을 직관적으로 이해해보겠습니다. simulator 코드의 print 부분을 주석 해제하고 예제를 다시 실행해보세요.

  • SLSQP를 사용하여 열실히 u_sim이 최적화되고 있습니다. final state D를 만족하면서 cost function을 최소화하는 최적 control을 수치적으로 반복계산하고 있는 것이지요.

  • 이번에는 Parameter의 N을 늘려봅시다. ⇒ 이전보다 훨씬 많은 시간이 걸리는 것을 확인할 수 있습니다.

  • 마지막으로 optimize method를 trust-constr로 바꿔보겠습니다. 결과는 비슷하겠지만 걸리는 시간에서 차이를 가질 것입니다.


지금 우리가 실습한 method를 shooting method 중에서도 single shooting method에 해당합니다. control signal을 모조리 전달하고 simulator를 연달아 실행하는 방식입니다.


이는 적은 constraint를 사용한다는 이점이 있지만 dynamics가 복잡해지면 실패할 확률이 큽니다. 이러한 상황을 해결하기 위해 control signal을 여러개로 나누고, 중간 state를 두어 여러번 simulation하는 해결책이 있겠지요. 이는 multiple shooting method라고 한답니다.

Complete and Continue