본문 바로가기

프로젝트 (Project)/쿼드콥터 (Quadcopter)

[ZMR250] 7. 코드 최적화

지금까지 제어한 코드의 경우 loop()함수를 4ms 의 주기로 계산 및 제어하였다.

다음 목표인 플립을 구현하기 위해 조금 더 빠르고 높은 주기로 계산하기 위해 코드를 수정했다.

우선 드론에 전원을 넣으면 PWM 핀을 초기화하면서 최저 값을 넣어주지 않아 가끔식 ESC 세팅 모드로 진입하는 경우가 있었다. 그래서 초기화와 동시에 최저 PWM 제어를 추가하였다.

기존 double 데이터 타입의 rawVector 변수를 int16_t 의 정수형 타입으로 수정하여 더욱 빠른 계산을 할 수 있도록 수정하였다. 그리고 계산주기를 2.5ms 로 줄여 최대 250Hz -> 400Hz의 연산이 가능하도록 수정할 것이다.

플립을 구현하기 위해 -90도 ~ 90도의 인식 범위를 -180 ~ 180으로 360 인식이 가능하도록 수정하였다.

플립의 경우 제자리 회전을 하기 때문에 각가속도로 드론의 상태를 파악하는 것에 있어 무리가 없다.

90도 이상으로 뒤집어진 경우 0도 -> 90도 -> 180도 -> 90도 (270도)

반대방향의 경우 0도 -> -90도 -> -180도 -> -90도 (-270도)로

진입한 회전 각도의 부호에 맞게 제어하기 편하도록 제작하였다.

I 제어는 기존에 doble형 타입을 사용하여 세밀한 조작을 하였다. 하지만 소수점 계산이 많아서 아두이노에 무리한 연산이 요구되고, 그 결과 처리속도가 느려진 것이다.

그래서 rcData와 ITerm을 정수형 타입으로 바꾸고, 제어 수식 또한 수정하였다.

rcData가 정수형 타입으로 수정되었기 때문에 그에 맞게 로직을 수정하였다.

ITerm이 기존에 0.01, 0.001 등의 값으로 게인값을 설정하였다. 그래서 그 비율에 맞춰 7칸 만큼 쉬프트 연산을 통해 계산하였다. (변수 >> 7) = (변수 / 128) 과 같은 결과이다.

최저최고 컷은 변수를 사용하여 더욱 간결하게 수정하였다.

 

이후 DT 값을 출력하면 기존 4ms -> 2.5ms로 줄어든 것을 확인할 수 있을 것이다.

기존 코드의 경우 소수점 계산이 많아 4ms 제한을 해제하더라도 3.5ms를 넘기기 힘들었다.

하지만 수정된 코드의 경우 2.1ms~ 의 계산주기를 가지므로 더욱 많은 연산을 할 수 있어 정밀한 제어에 유리할 것이다.

 

다음은 플립 플롭을 위한 로직 설계와 비행테스트를 진행할 예정이다.

ZMR250.zip
0.00MB