본문 바로가기
유도항법제어/비행제어

[PX4] 멀티콥터 자세 명령

by 깊은대학 2023. 2. 25.

PX4의 위치 제어기에서는 원하는 궤적(desired trajectory) 정보를 이용하여 추력 벡터를 계산한다.

 

 

관성 좌표계 {i} 로 표현된 추력 벡터는 별도로 주어지는 방위각(azimuth angle) 명령 ψcmd 와 함께 자세 명령(attitude command) 계산 모듈로 보내져서 쿼터니언 qcmd 로 파라미터화된 자세 명령을 생성하게 된다.

 

 

쿼터니언 qcmd 를 계산하기 위해서는 먼저 관성 좌표계 {i} 에 대해서 동체 좌표계 {b} 가 취해야 할 목표 좌표계를 구해야 하는데 이 좌표계를 {d} 라고 하자. 그러면 qcmd=qdi 가 되며 자세 제어기의 목적은 {b}={d} 가 되도록 하는 것이다.

쿼터니언 qdi 는 방향코사인행렬(DCM) Cdi 를 계산한 후 변환하는 방법을 통해서 구하도록 한다. 먼저 좌표계 {d}d^3 축은 추력 벡터 Fcmd 의 반대 방향이어야 하므로 d^3 를 다음과 같이 정한다.

 

(1)d^3=FcmdFcmd2  d3i=FcmdiFcmdi2

 

만약 추력이 0 이라면 d^3=i^3 로 놓는다. 또는 d3i=[0  0  1]T 로 놓는다. 방위각 명령 ψcmd 는 3-2-1 오일러각 좌표변환 방법에 의해서 주어지는 첫번째 각, 즉 관성 좌표계의 i^3 축을 중심으로 한 회전각이므로 이를 반영하기 위해서 i^3 축을 중심으로 ψcmd 만큼 좌표계 {i} 를 회전시킨다. 이 때 변환된 임시 좌표계 {c} 라고 하자.

 

 

좌표계 {c}c^2 축은 다음과 같이 계산할 수 있다.

 

(2)c2i=Ccic2c=[cosψcmdsinψcmd0sinψcmdcosψcmd0000][010]=[sinψcmdcosψcmd0]

 

그런 다음 d^1 축을 다음과 같이 정의한다.

 

(3)d^1=c^2×d^3  d1i=[c2i×]d3i

 

 

만약 d^3 축이 i^1i^2 평면에 있다면, 즉 d^3i^3=0 이면 d^1=i^3 으로 놓는다.

 

 

또한 만약 추력벡터가 아래 방향을 향하고 있으면, 즉 d^3i^3<0 이면 식 (1)에서 계산된 d^1 대신에 d^1d^1 를 사용한다. 이유는 멀티콥터가 배면 비행을 할 때도 d^1 축을 같은 방향으로 유지하기 위해서다.

 

 

마지막으로 d^2 축은 오른손 법칙에 의해서 다음과 같이 정해진다.

 

(4)d^2=d^3×d^1  d2i=[d3i×]d1i

 

식 (1), (3), (4)에서 구한 d1i, d2i, d3i 를 이용하면, 좌표계 {i} 에서 좌표계 {d} 로의 DCM Cdi 를 다음과 같이 계산할 수 있다.

 

(5)Cdi=[i^1d^1i^1d^2i^1d^3i^2d^1i^2d^2i^2d^3i^3d^1i^3d^2i^3d^3]=[d1id2id3i]

 

마지막으로 DCM과 쿼티니언 변환 관계식을 이용하여 다음과 같이 qcmd=qdi 를 계산할 수 있다.

 

(6)qcmd=qdi=[121+tr(Cdi)C32C234q0C13C314q0C21C124q0]

 

 

댓글