제작 중인 드론은 모터가 4개인 쿼드콥터로 두 개의 모터가 한쌍으로 서로 다른 회전 방향으로 반발력을 상쇄하여 기체를 안정적으로 상승시킬 수 있는 구조이다.
하지만 모든 모터를 같은 속도로 제어한다고 기체가 안정적으로 날 수 있는 것은 아니다. 기체의 현재 상태를 무시하고 모터를 작동하면 주변 환경으로부터 드론에 주는 영향을 피드백받아 제어할 수가 없기 때문에 많은 드론 제어시스템이 PID 제어를 사용한다.
PID 제어는 주어진 목표와 현재 상태의 오차를 [ 비례 + 적분 + 미분 ] 계산으로 피드백하여 장치를 제어하는 이론이다.
제어 수식값은 위와 같이 나타나는데, 목표값과 현재의 값의 차이를 오차값 e(t)로 두고 각각 비례, 적분, 미분의 값을 모두 더하여 제어 값에 반영한다.
PID 제어기는 위와 같이 표준식을 형태로 사용하기도 하지만, 경우에 따라서는 조금 변형된 형태로 사용하는 경우가 많다.
예를 들어, 비례항만을 가지고 제어하거나, 비례-적분, 비례-미분항 만을 사용하는 제어기가 있다.
이들은 각각 P, PI, PD 제어기라고 부른다.
표준식의 Kp, Ki, Kd 값을 이득값 or 게인 값이라고 부르며 적절한 게인 값을 찾아 기체를 효과적으로 안정적이게 제어할 수 있는 값을 찾아야 한다.
비례항 제어는 오차값에 비례적인 값으로 출력에 피드백하는 제어 값이다.
드론의 경우 [ Error = 목표 각도 - 현재 각도 ] 와 같이 나타낼 수 있다.
즉, P = Kp x Error 로 수식을 정하여 제어하면 되는 것이다.
적분항 제어는 비례 제어 시스템만으로도 목표값에 수렴하지 않는 경우가 있다. 이때 오차값을 누적하여 목표값에 수렴할 수 있도록 피드백하는 제어 값이다. I = I + Ki x Error 로 작성할 수 있다.
미분한 제어는 오차의 변화율을 계산해 그 결과를 피드백 출력 결과값에 반영한다. 오차의 변화가 크게 작용할 때 피드백 제어의 출력 값이 시스템의 움직임에 진동 등의 물리적 현상으로 이어지는 것을 막기 위해 주로 사용한다.
D = Kd x (Error - LastError) 로 수식을 정하여 작성할 수 있다.
따라서 최종적으로 출력에 반영되는 피드백 제어 값은 다음과 같이 나타낼 수 있는 것이다.
하지만 드론은 표준 PID 제어 수식으로는 안정적인 비행이 힘들다.
기체가 비행하는 동안 수많은 외란에 의해 기체는 계속해서 피드백 제어를 할 것인데 드론이 다시 목표값에 제자리로 돌아기 위해서는 각가속도의 추가적인 피드백이 필요하다. 즉, 표준 PID + 각가속도 PID의 제어로 2중 루프의 PID 피드백 구조가 나온다.
그러면 현재 진행 중인 드론에 적용시켜보자
PID 탭을 추가하여 PID 제어 함수를 작성하자, 탭이 순서대로 배치가 되지 않는다면 위처럼 탭 이름에 번호를 작성하면 관리하기가 쉽다.
그리고 위와 같이 매크로 값과 변수값들을 선언하자.
ITerm은 총 6개의 배열 데이터를 가지는데 ITerm[ROLL, PITCH, YAW][Angle, Gyro] 의 데이터 형식으로 분배하였다.
제작 중인 드론은 구동 시 안전사고의 우려가 있는 드론이다. 따라서 조종기로 시동/비상정지 역할을 할 수 있도록 제어 스위치 값을 만들어 줄 것이다.
rcData[0 ~ 2] 는 Roll, Pitch, Yaw의 목표값이고, rcData[3]은 Throttle, rcData[4 ~ 5] 는 조종기의 SW A, D 이다.
스위치 두 개를 이용해 시동과 비상정지 등의 역할로 사용할 것이다.
이후 *ANGLE 배열과 *RATE 배열에 취향에 맞는(?) 축 기준을 잡아서 코드화 하면 된다.
나는 Roll [ - 0 +] , Pitch [ +(앞) 0 -(뒤) ], Yaw [ 시계방향으로 + ] 가 되도록 기준을 두었다.
이후 Roll, Pitch, Yaw 축에 각각 이중 PID 구조를 해석해 코드화하면 된다.
조종기의 Yaw 값을 조종하면 그 값에 반영하여 드론이 Yaw 축으로 회전할 것이다. 목표 회전 값을 정하여 피드백한 것이라고 보면 된다.
조종기의 SW D를 작동하면 드론의 시동이 켜지게 되고, 50 출력이 기본값으로 들어간다.
이후 PID 업데이트 함수를 loop에서 호출한다.
이후 드론에 연결하여 테스트하면 다음과 같은 동작을 볼 수 있다.
ZMR250 기체를 사용한 영상은 아니지만 같은 동작을 수행하니 참고바란다.
기체의 기울어진 각도와 각가속도의 값에 따라 자세를 보정하기 위해 실시간으로 모터를 보정하는 모습을 볼 수 있다.
이제 제어기를 기체에 고정하고 기체에 알맞는 게인 값들을 찾아 수정하면 기본적으로 비행이 가능한 드론을 볼 수 있을 것이다.
'프로젝트 (Project) > 쿼드콥터 (Quadcopter)' 카테고리의 다른 글
[ZMR250] 7. 코드 최적화 (0) | 2021.08.22 |
---|---|
[ZMR250] 6. PID 튜닝 및 비행 (0) | 2021.08.21 |
[ZMR250] 4. MPU6050 센싱 + 변속기 제어하기 (0) | 2021.08.18 |
[ZMR250] 3. 인터럽트 수신 및 송수신기 세팅, 바인딩 (0) | 2021.08.18 |
[ZMR250] 2. 프레임과 부품 조립 및 제어기 제작 (0) | 2021.08.17 |