Paper : [PAMPC: Perception-Aware Model Predictive Control for Quadrotors] (https://arxiv.org/abs/1804.04811 (Davide Falanga, Philipp Foehn, Peng Lu, Davide Scaramuzza / IEEE IROS 2018)
code: https://github.com/uzh-rpg/rpg_mpc
video : https://www.youtube.com/watch?v=9vaj829vE18
Highlights
- Perception-Aware Model Predictive Controller를 제안
- Action과 Perception objectives에 관한 control과 planning을 unify → 즉, MPC에 camera sensing에 관련된 objective를 추가했다고 볼 수 있겠음 → 여기서 objectives라 함은
- Quadrotor system dynamics and input limits를 고려
- Image plane에서 point of interest의 visibility를 향상
- Point of interest의 projected velocity를 감소 (이미지 상에서 POI의 속도를 최소화)
→ 이를 통해 생성된 trajectory는 POI를 image centre에 잘 유지할 수 있음
- Onboard low-power ARM computer에서 real-time으로 잘 작동
Introduction
- Perception algorithm의 발전으로, 카메라를 활용한 vision-based 조종이 빠르게 발전
- 하지만 vision-based perception은 몇 가지 한계가 있음
- texture distribution이나 light condition과 같은 환경에 크게 영향을 받음
- robot motion에도 영향을 많이 받음 (motion blur, camera pointing direction, 등)
→ perception과 action이 항상 함께 고려되어야만 함.
- 예를 들어, 어떤 좁은 통로를 지나기 위해 camera sensor로 localization하기 위해서는 이 통로가 계속해서 보일 수 있도록 action을 취해줘야 함.
MPC 간단 정리
- MPC는 미래의 short time horizon에 대한 vehicle dynamics를 예측 → 이를 통해 MPC는 expected motion을 알고 있기 때문에 iterative하게 reference (reference pose or dynamic trajectory)에 fitting
-
이를 위해 MPC는 quadrotor의 dynamic model과 optimization process를 필요로 함
-
일반적인 full iteration에서 MPC는 다음과 같은 process를 진행
- Initial state (last estimated state)로부터 future movement를 예측
- Optimization process에서 사용되는 cost gradient를 계산 (the Hessian Matrix)
- Optimization process를 시작 : reference, cost, last prediction, constraints, gradients를 이용
- Solution을 계산 : 이는 optimum으로의 converge되는 값들. 하지만 이는 non-linear system의 linearization으로 인해서 아직 optimal한 값은 아님
- 위 과정을 반복.
-
optimization이 constraints들을 다룰 수 있기 때문에, actuator limitation과 같은 외부 요인들을 다룰 수 있게 됌 → classical controller에 비해서 갖는 장점
-
또한 vehicle의 미래 움직임을 예측할 수 있기 때문에 여러 cost function을 design하는 것이 편리함
Contributions
- Action과 Perception objective를 동시에 최적화하는 MPC 알고리즘 제안 → 이를 통해 생성된 trajectory는 robot dynamic을 만족시키면서 POI의 visibility를 보장
-
Action objective와 Perception objective의 potential conflict를 numerical optimization으로 해결
- perception objective를 constraint가 아닌 optimization component로 여김
- perception을 cost function으로 합치는 것이 computational complexity를 줄여줌
-
또한, 이러한 방법을 통해 vision-based localization, target tracking 등의 성능을 높일 수 있다.
- land mark visibility가 높아지고, image plane velocity가 낮아지기 때문
-
자율로봇항법을 위해서는 두 가지 요소가 필수적
- Perception : ego-motion과 surrounding environment
- Action : combination of motion planning and control algorithm
-
이때 perception과 action의 coupling은 상당히 중요함
- 안전한 비행을 위해서 정확하고 robust한 perception이 필수적인데, vision-based perception의 quality는 camera motion에 많이 영향을 받음
- 또한 image로부터 충분한 정보를 추출할 수 있도록 해줘야 적절한 action을 취할 수 있음
-
시스템은 아래와 같이 정의할 수 있음
- x와 u는 robot의 state와 input vector라고 하자.
- 로봇의 dynamic은 미분방정식으로 표현 x˙=f(x,u)
- z는 perception system의 state vector (e.g., image plane으로의 3D point projection)
- σ는 perception 특성 parameter의 vector (e.g., camera의 focal length나 FOV)
-
perception state와 robot state는 robot dynamic를 통해 coupled
z=fp(x,u,σ)
- 특정 action objective가 주어진 상황에서 action cost La(x,u)와 perception cost Lp(z)를 정의할 수 있고, 이를 통해 최적화 문제로 이 coupling을 공식화할 수 있음
minu∫t0tfLa(x,u)+Lp(z)dtsubjectedtor(x,u,z)=0,h(x,u,z)≤0
- r과 h는 perception, action이 동시에 만족해야하는 제약 조건을 의미
Methodology
- robot의 navigation을 위한 computer vision 알고리즘은 두 가지 기본적인 requirements가 존재
-
알고리즘에 사용될 Point of interest가 이미지에 항상 보여야한다. 예를 들어 visual odometry알고리즘의 pose estimation을 위해서 landmark와 같은 point들이 필요
-
그런 point of interest들이 image에서 명확하게 recognizable해야함. camera의 motion이나 scene까지의 거리로 인해 motion blur 등이 생길 수 있음
→ 그러므로 camera의 motion은 robust한 visual perception을 보장할 수 있도록 계획되어야 함
-
이러한 고려를 바탕으로 이 연구에서는 perception object로써 다음의 두 가지를 고려
- visibility of point of interest
- minimization of the velocity of their projection onto the image plane
-
이를 위해 quadrotor에 장착된 카메라의 motion과 3d 공간의 point의 image plane으로 projection 사이의 관계를 파악해야함
→ quadrotor의 state와 input vector의 함수를 통해 image plane으로의 projection dynamic을 표현하여, perception과 action을 하나의 optimization으로 couple
Nomenclature
-
먼저, world frame W, quadrotor frame B, camera frame C를 정의
-
벡터의 표현의 경우, WPWB는 body frame B를 world frame에 대한 position을 world frame에서 표현한 것
-
강체의 orientation을 표현하기 위해서는 quaternion 사용
-
쿼터니언 q=(qw,qx,qy,qz)T의 시간 미분은 아래와 같이 정의
q˙=21Λ(w)⋅q
- 벡터 w=(wx,wy,wz)T의 skew-symmetric matrix Λ(w)는 아래와 같이 표현
Λ(ω)=⎣⎢⎢⎢⎡0ωxωyωz−ωx0−ωzωy−ωyωz0−ωx−ωz−ωyωx0⎦⎥⎥⎥⎤
- operator ⊙은 quaternion과 vector의 곱으로 사용. → 이는 벡터 v를 quaternion q만큼 회전시키는 것을 의미 즉, 회전한 새 벡터 v′는 아래와 같이 구할 수 있음
v′=v⊙q=Qv
Q=⎣⎢⎡1−2qy2−2qz22(qxqy−qwqz)2(qxqz+qwqy)2(qxqy+qwqz)1−2qx2−2qz22(qyqz−qwqx)2(qxqz−qwqy)2(qyqz+qwqx)1−2qx2−2qy2⎦⎥⎤
Quadrotor Dynamics
- world frame에서 표현된 body의 position과 orientation
pWB=(px,py,pz),qWB=(qw,qx,qy,qz)T
- world frame에서 표현된 body의 linear velocity
vWB=(vx,vy,vz)T
- body frame에서 표현된 angular velocity
ΩB=(wx,wy,wz)T
- mass-normalized thrust vector (fi는 i번째 모터의 출력)
c=(0,0,c)Tc=(f1+f2+f3+f4)/m
- 그러면 아래와 같이 quadrotor의 dynamic model을 정의할 수 있음
p˙WB=vWBv˙WB=wg+qWB⊙cq˙WB=21Λ(ΩB)⋅qWB
- state vector와 input vector는 다음과 같음
x=[pWB,vWB,qWB]T,u=[c,ΩBT]T
Perception Objectives
- Point of interest (landmark)의 3D 위치를 world frame에서 표현한 점
Wpf=(Wpfx,Wpfy,Wpfz)
- constant rigid body transformation (camera의 extrinsic parameter)
TBC=[pBC,qBC]
- Wpf는 camera frame에서 표현할 수 있다.
Cpf=(qWBqBC)−1⊙(Wpf−(qWB⊙pBC+pWB))
- camera frame에서의 점 Cpf은 pinhole camera model에 의해 image coordinate s=(u,v)T로 projection 가능
u=fxCpfzCpfx,v=fyCpfxCpfy
-
Robust한 vision-based perception을 위해서는 POI wpf의 projection s가 최대한 이미지의 center에 위치해야한다.
- 외란에 대해 높은 safety margin을 가질 수 있기 때문
- 이미지의 외각에서 보통 많은 왜곡이 발생
-
POI가 이미지에서 계속 보이게 하기 위해서, 이들의 image plane으로의 projection들의 velocity가 줄어야 한다.
-
POI가 정적이라고 가정했을 때, projection들의 속도를 quadrotor의 state와 input vector로 표현할 수 있다. 이를 위해서 s를 시간에 대해 미분한다.
u˙=fxCpfz2Cp˙fxCpfz−CpfxCp˙fz
v˙=fyCpfz2Cp˙fyCpfz−CpfyCp˙fz
s˙=⎣⎢⎡u˙v˙0⎦⎥⎤=⎣⎢⎢⎡0Cpfz2fy0−Cpfz2fx00000⎦⎥⎥⎤(Cpf×Cp˙f)
- Cp˙f를 계산하기 위해서는 Cpf를 시간에 대해 미분
Cp˙f=−21Λ(ΩC)Cpf−CvWC
CvWC=(qWBqBC)−1⊙[21Λ(ΩB)qWB⊙pBC+vWB],ΩC=qBC−1⊙ΩB.
Action Objectives
- Quadrotor가 3d space에서 원하는 위치에 도달하게 하기 위해서는 적절한 trajectory 계획이 필요한데, 이를 위해서 두 가지의 objective가 고려되어야 함
- System의 available bounded inputs : motor의 thrust가 upper & lower bound를 지켜야 한다. → limited input vector u
- Underactuated nature of a quadrotor : control inputs (thrust, roll, pitch, yaw)가 독립적으로 모든 degree of freedom을 가지고 control할 수 없다.
Challenges
-
Perception과 Action을 동시에 고려하는 것은 conflict가 발생할 수 있기 때문에 challenging.
-
예를 들어, quadrotor가 reference trajectory를 track하기 위해서는 원하는 acceleration의 방향으로의 추력을 주기 위해 rotate해야하지만, perception objective가 POI의 visibility를 최대화하기 위해 그러한 rotation을 minimize해야할 수도 있다.
-
그러므로 system dynamics를 통해 이 둘을 coupling시켜 둘 다 고려할 수 있는 model-based optimization framework가 필요하다.
Model Predictive Control
-
Perception과 action의 coupled된 문제를 optimization 문제로 푸는 것은 기존의 classical control (PID)에 비해서 몇 가지 장점을 가진다.
- System dynamics를 고려할 수 있다. (underactuated dynamics)
- Input constraint를 고려할 수 있다. (Input bound)
- Dynamic한 trajectory를 생성할 수 있다.
- Future cost prediction을 고려하여 최소화할 수 있다.
-
이러한 optimization의 기본적인 공식은 위에서 언급했듯이 아래와 같으며,
minu∫t0tfLa(x,u)+Lp(z)dtsubjectedtor(x,u,z)=0,h(x,u,z)≤0
xi∀i∈[1,N],ui∀i∈[1,N−1]
-
time-varying state cost matrix Qx,i∀i∈[1,N] 과 time-varying perception, input cost matrixs를 정의 Qp,i,Ri∀i∈[1,N−1]. 최종적으로 perception function z=[s,s˙]를 정의
- 여기서 z는 quadrotor의 state와 input variable의 함수
-
그러면 cost function은 아래와 같이 쓸 수 있다.
L=xˉN⊤Qx,NxˉN+i=1∑N−1(xˉi⊤Qx,ixˉi+zˉi⊤Qp,izˉi+uˉi⊤Riuˉi),
-
여기서 xˉ,zˉ,uˉ는 reference와의 차이를 의미.
- 우리의 경우에는 z의 reference는 null vector (keep POI center of image와 zero velocity)
- x와 u의 경우에는 precomputed trajectory나 target pose로부터 정해지는 값 (이것이 꼭 필요한 것 같지는 않다.)
-
input u와 velocty vWB는 아래와 같은 제약조건을 만족해야함
cmin≤c≤cmaxΩmin≤ΩB≤Ωmaxvmin≤vWB≤vmax
- 최적화 문제를 풀 때에는 매 control loop마다 하나의 SQP iteration을 수행하여 최적화 문제의 solution을 approximate하는 식이며, 초기 state로는 onboard에서 따로 돌아가는 Visual-Inertial Odometry pipeline에서 제공되는 가장 최근의 estimate xest를 활용한다.
- 즉, SQP가 full optimization을 수행하지 않고, 적절한 예상치 (외부 알고리즘으로 부터 구한 real state)로부터 최적화를 수행하기 때문에, 훨씬 더 빠르고 정확한 최적화를 수행
Experiments
Code 구현
https://github.com/uzh-rpg/rpg_quadrotor_control
https://github.com/uzh-rpg/rpg_mpc
- controller의 run()함수를 통해 command input을 얻어낸다.
const quadrotor_common::ControlCommand command = base_controller_.run(
state_estimate, reference_trajectory_, base_controller_params_);
Control에 필요한 variables
- State (kStateSize = 10):
- Position: x,y,z
- Orientation: Quaternion components (w,x,y,z)
- Velocity: vx,vy,vz
- Input (kInputSize = 4):
- Thrust: T
- Body rates: p,q,r (angular velocities around the axes)
- Online data
- Point of Interest position: (px,py,pz)
- Camera-Body translation: (tx,ty,tz)
- Camera-Body rotation : (qw,qx,qy,qz)
Quadrotor dynamics
- 페이퍼에 정의
p˙WB=vWBv˙WB=wg+qWB⊙cq˙WB=21Λ(ΩB)⋅qWB
- 코드 구현
- ⊙ 공식에 따라 thrust vector c를 qWB만큼 회전 시키는 것 확인
- Λ 식도 공식대로
- << : system에 미분방정식 추가
// Position derivatives
f << dot(p_x) == v_x;
f << dot(p_y) == v_y;
f << dot(p_z) == v_z;
// Quaternion derivatives
f << dot(q_w) == 0.5 * ( - w_x * q_x - w_y * q_y - w_z * q_z);
f << dot(q_x) == 0.5 * ( w_x * q_w + w_z * q_y - w_y * q_z);
f << dot(q_y) == 0.5 * ( w_y * q_w - w_z * q_x + w_x * q_z);
f << dot(q_z) == 0.5 * ( w_z * q_w + w_y * q_x - w_x * q_y);
// Velocity derivatives (Acceleration)
f << dot(v_x) == 2 * ( q_w * q_y + q_x * q_z ) * T;
f << dot(v_y) == 2 * ( q_y * q_z - q_w * q_x ) * T;
f << dot(v_z) == ( 1 - 2 * q_x * q_x - 2 * q_y * q_y ) * T - g_z;
Perception Objectives
-
페이퍼에 따르면 perception objectives에서는 POI의 image로의 projection이 center에 위치해야함
-
하지만 POI는 world frame에서 정의된 3D 좌표이므로, 아래의 과정이 필요
- Camera frame에서의 POI 좌표를 계산
- POI를 image plane으로 projection → 이 projection을 cost function으로 사용해야 함
-
코드 구현 : 엄청 복잡한 식으로 intermediate state를 정의
// Intermediate states to calculate point of interest projection!
IntermediateState intSx = ((((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)+((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)*(-(-q_x)*q_B_C_z-q_B_C_w*q_y-q_B_C_x*q_z-q_B_C_y*q_w)+((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w)*(-(-q_y)*q_B_C_x-q_B_C_w*q_z-q_B_C_y*q_x-q_B_C_z*q_w)+((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y)*((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y))*(p_F_x-p_x)+(((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w)+((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w)+((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)*((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y)+(-(-q_x)*q_B_C_z-q_B_C_w*q_y-q_B_C_x*q_z-q_B_C_y*q_w)*(-(-q_z)*q_B_C_y-q_B_C_w*q_x-q_B_C_x*q_w-q_B_C_z*q_y))*(p_F_y-p_y)+(((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*(-(-q_x)*q_B_C_z-q_B_C_w*q_y-q_B_C_x*q_z-q_B_C_y*q_w)+((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*(-(-q_x)*q_B_C_z-q_B_C_w*q_y-q_B_C_x*q_z-q_B_C_y*q_w)+((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w)*((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y)+((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w)*((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y))*(p_F_z-p_z));
IntermediateState intSy = ((((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)+((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)*((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)+((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w)*(-(-q_y)*q_B_C_x-q_B_C_w*q_z-q_B_C_y*q_x-q_B_C_z*q_w)+((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y)*(-(-q_z)*q_B_C_y-q_B_C_w*q_x-q_B_C_x*q_w-q_B_C_z*q_y))*(p_F_y-p_y)+(((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y)+((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y)+((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)*((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w)+(-(-q_x)*q_B_C_z-q_B_C_w*q_y-q_B_C_x*q_z-q_B_C_y*q_w)*(-(-q_y)*q_B_C_x-q_B_C_w*q_z-q_B_C_y*q_x-q_B_C_z*q_w))*(p_F_z-p_z)+(((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*(-(-q_y)*q_B_C_x-q_B_C_w*q_z-q_B_C_y*q_x-q_B_C_z*q_w)+((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*(-(-q_y)*q_B_C_x-q_B_C_w*q_z-q_B_C_y*q_x-q_B_C_z*q_w)+((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)*((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y)+((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)*((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y))*(p_F_x-p_x));
IntermediateState intSz = ((((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)+((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)*(-(-q_x)*q_B_C_z-q_B_C_w*q_y-q_B_C_x*q_z-q_B_C_y*q_w)+((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w)*((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w)+((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y)*(-(-q_z)*q_B_C_y-q_B_C_w*q_x-q_B_C_x*q_w-q_B_C_z*q_y))*(p_F_z-p_z)+(((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)+((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)+((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w)*((-q_z)*q_B_C_y+q_B_C_w*q_x+q_B_C_x*q_w+q_B_C_z*q_y)+(-(-q_y)*q_B_C_x-q_B_C_w*q_z-q_B_C_y*q_x-q_B_C_z*q_w)*(-(-q_z)*q_B_C_y-q_B_C_w*q_x-q_B_C_x*q_w-q_B_C_z*q_y))*(p_F_x-p_x)+(((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*(-(-q_z)*q_B_C_y-q_B_C_w*q_x-q_B_C_x*q_w-q_B_C_z*q_y)+((-q_x)*q_B_C_x+(-q_y)*q_B_C_y+(-q_z)*q_B_C_z+q_B_C_w*q_w)*(-(-q_z)*q_B_C_y-q_B_C_w*q_x-q_B_C_x*q_w-q_B_C_z*q_y)+((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)*((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w)+((-q_x)*q_B_C_z+q_B_C_w*q_y+q_B_C_x*q_z+q_B_C_y*q_w)*((-q_y)*q_B_C_x+q_B_C_w*q_z+q_B_C_y*q_x+q_B_C_z*q_w))*(p_F_y-p_y));
- 실제로는 아래의 내용을 길게 늘어쓴 것
-
World → Camera frame rotation을 계산 : (qWBqBC)−1
-
World → Camera frame translation을 계산 : qWB⊙pBC+pWB
-
Camera frame에서의 POI
Cpf=(qWBqBC)−1⊙(Wpf−(qWB⊙pBC+pWB))
→ 즉, intermediate state는 POI의 camera frame 좌표
- 다음 image plane으로 projection (normalized image plane)
u=fxCpfzCpfx,v=fyCpfxCpfy
u = intSx / (intSz + epsilon);
v = intSy / (intSz + epsilon);
Cost function and weights
- Column cost vector h에 여러 variable 삽입
h << p_x << p_y << p_z
<< q_w << q_x << q_y << q_z
<< v_x << v_y << v_z
<< intSx/(intSz + epsilon) << intSy/(intSz + epsilon)
<< T << w_x << w_y << w_z;
- 마지막 cost vector에는 control input은 없음 (time horizon 이후 control 정의 x)
hN << p_x << p_y << p_z
<< q_w << q_x << q_y << q_z
<< v_x << v_y << v_z
<< intSx/(intSz + epsilon) << intSy/(intSz + epsilon);
- 각 cost element의 weight도 정의
DMatrix Q(h.getDim(), h.getDim());
Q.setIdentity();
Q(0,0) = 100; // x
Q(1,1) = 100; // y
Q(2,2) = 100; // z
Q(3,3) = 100; // qw
Q(4,4) = 100; // qx
Q(5,5) = 100; // qy
Q(6,6) = 100; // qz
Q(7,7) = 10; // vx
Q(8,8) = 10; // vy
Q(9,9) = 10; // vz
Q(10,10) = 0; // Cost on perception
Q(11,11) = 0; // Cost on perception
Q(12,12) = 1; // T
Q(13,13) = 1; // wx
Q(14,14) = 1; // wy
Q(15,15) = 1; // wz
// Set a reference for the analysis (if CODE_GEN is false).
// Reference is at x = 2.0m in hover (qw = 1).
DVector r(h.getDim()); // Running cost reference
r.setZero();
r(0) = 2.0;
r(3) = 1.0;
r(10) = g_z;
DVector rN(hN.getDim()); // End cost reference
rN.setZero();
rN(0) = r(0);
rN(3) = r(3);
- Cost function 정의 → Least Squared method 사용 : cost vector와 reference vector 사이 차이를 최소화할 수 있도록 cost function을 정의
Cost=k=0∑N−1(hk−rk)TQ(hk−rk)+(hN−rN)TQN(hN−rN)
- 페이퍼에서 cost function 정의 → xˉ,zˉ,uˉ 는 reference와의 차이를 의미하므로, 위와 같은 식이고, 단지 cost vector component를 나눠서 써놓은 것
L=xˉN⊤Qx,NxˉN+i=1∑N−1(xˉi⊤Qx,ixˉi+zˉi⊤Qp,izˉi+uˉi⊤Riuˉi),
ocp.minimizeLSQ( Q, h, r );
ocp.minimizeLSQEndTerm( QN, hN, rN );
Discussion
- UAV control을 위해 PID를 사용하다가 더 많은 constraint를 다루고 싶어서 MPC를 공부
- MPC 구현을 위해 코드가 함께 있는 study를 알게 되어 리뷰