드론 쿼드콥터

클린플라이트 설정 - PID 튜닝 - PID Tuning

하늘이푸른오늘 2016. 9. 20. 17:15

PID 튜닝 (PID Tuning)

비행역학의 모든 면은 선택된 "PID 제어기(controller)"에 의해 제어됩니다. PID 제어기란 조종간 입력에 대한 반응과, 자이로/가속도계(비행모드에 따라 달라짐)를 사용하여 공중에서 기체를 안정화시키는데 책임을 맡고있는 알고리듬입니다.

"PIDs"란 PID제어기의 작동을 제어하는 여러가지 튜닝 변수의 집합입니다. 최적의 PID 설정은 매 기체에 따라 다르므로, 정확한 세팅값을 공유해줄수 있는 사람이 없다면 최고의 성능을 발휘하는 PID 설정을 찾으려면 시행착오를 겪어야 합니다. 

아래의 비디오는 PID 설정에 의해 야기될 수 있는 여러가지 비행 문제를 인식하고 바로잡는 방법을 다루고 있습니다.

https://www.youtube.com/watch?v=YNzqTGEl2xQ

기본적으로 PID 제어기의 목표는 세개의 축에 따른 기체의 회전률을 조종간으로 입력하는 명령의 비율로 가져오자는 것입니다. ?? 목표 회전률과 자이로스코프로 측정한 실제 회전률의 차가 오류가 되며, 제어기는 이 에러를 0으로 만드는 게 목표입니다.

PID 변수(PIDs)

P 항(P Term)은 기체를 목표각 또는 목표 회전각 방향으로 향하도록하는 보정량의 강도를 제어합니다. P 항이 너무 낮으면 기체를 제어하기 힘듧니다. 안정을 유지할 만큼 빠르게 반응할 수 없기 때문입니다. P 항이 너무 높으면 기체는 빠르게 진동 또는 흔들립니다. 끊임없이 목표를 넘어서게(Overshoot) 되기 때문입니다.

I 항(I Term)은 크기가 작지만 오래 지속되는 오류를 보정합니다. 너무 낮게 설정되면 기체의 자세가 천천히 흐르게 됩니다. 너무 높게 설정되면 기체가 진동합니다. (하지만, P를 높게 설정한 것에 비해 진동 속도는 떨어집니다.)

The D term attempts to increase system stability by monitoring the rate of change in the error. If the error is rapidly converging to zero, the D term causes the strength of the correction to be backed off in order to avoid overshooting the target.

D 항(D Term)은 오류의 변화율을 감시함으로써 시스템의 안성성을 높이고자 시도합니다. 오류가 급격하게 0에 수렴하면, D 항은 목표에 Overhoot 가 발생하지 않도록 교정 강도를 낮추게 됩니다.

TPA 와 TPA 중단점

TPA stands for Throttle PID Attenuation and according to AlexYork.net:

TPA는 Throttle PID 감쇠(Throttle PID Attenuation)의 약자로서 AlexYork.net 에 따르면 

"TPA basically allows an aggressively tuned multi-rotor (one that feels very locked in) to reduce its PID gains when throttle is applied beyond the TPA threshold/breakpoint in order to eliminate fast oscillations.."

"TPA는 기본적으로 공격적으로 튜닝된 멀티로터(locked in 된 것처럼 느껴지는 것)에 throttle이 TPA 한계/중단점 이상으로 적용될 때 빠른 진동을 막고자 PID 이득(gain)을 낮추도록 한다..." 

참고로 TPA는 CLI 나, GUI의 PID 튜닝 탭에서 설정할 수 있습니다. [tpa_breakpoint]는 CLI를 통해 설정됩니다.

아울러 TPA와 tpa_breakpoint 는 어떤 PID 제어기에는 사용할 수 없을 수 있습니다. 이에 대해서는 개별 제어기에 대한 설명을 확인해 보세요.

TPA는 throttle이 최대일 때와 관련하여 PID값 감소를 적용합니다. 이는 throttle이 최대에 가까와지면 PID 값을 약화시키는 데 사용됩니다.

TPA = throttle 최대시 발생하는 약화율 (%)

tpa_breakpoint = TPA가 적용되기 시작하는 throttle curve상의 지점

An Example: With TPA = 50 (or .5 in the GUI) and tpa_breakpoint = 1500 (assumed throttle range 1000 - 2000)

예 : TPA=50 (GUI에서는 0.5)이고 tpa_breakpoint = 1500일 때(throttle 범위가 1000-2000이라고 가정)

  • throttle 채널이 1500이 되면, PID 변수가 약화되기 시작합니다.
  • At 3/4 throttle (1750), PIDs are reduced by approximately 25% (half way between 1500 and 2000 the dampening will be 50% of the total TPA value of 50% in this example)
  • 3/4 throttle(1750)에서 PID 변수는 약 25% 정도 줄어듭니다. (이 예에서 1750은 1500과 2000의 중간이므로, 약화율이 50%가 되는데, 총 TPA 값이 50%이므로 25%가 됨)
  • 최대 throttle (2000)이 되면, 총 약화율은 TPA 값으로 적용됩니다. (이 예에서는 50%)
  • TPA can lead into increase of rotation rate when more throttle applied. You can get faster flips and rolls when more throttle applied due to coupling of PID's and rates. Only the PID controllers MWREWRITE and LUX are using a linear TPA implementation, where no rotation rates are affected when TPA is being used.
  • TPA는 throttle이 더 많이 적용되면 회전률의 증가로 이어질 수 있습니다. PID 변수와 비율의 결합으로 인하여 throttle의 저 많이 적용되면 filp 과 roll이 빨라질 수 있습니다. PID 제어기 중에서MWREWRTE 및 LUX 만이 선형 TPA 구현을 사용하므로, TPA가 사용되면 rotation rates는 더이상 적용되지 않습니다.???

TPA를 어떻게, 왜 사용하는가?

예를 들어 3/4 throttle에서 진동이 발생하기 시작했다면, [tpa_breakpoint = 1750] 혹은 이보다 낮은 값으로 설정합니다. (이 것은 throttle 범위가 1000-2000이라는 가정입니다.), 그리고 진동이 사라질 때까지 TPA 값을 높여주면 됩니다. 일반적으로 [tpa_breakpoint]를 진동이 발생하는 시점보다 약간 빠르게 설정함으로써, 진동을 낮추거나 제거할 수 있는 값으로 실험해보고 싶을 것입니다. ??? 

PID 제어기(PID Controller)

클린플라이트에는 3개의 PID 제어기가 내장되어 있으며, 각각 비행특성이 다릅니다. 각 제어기는 최적의 성능을 내기 위한 PID 설정값이 다르므로, 기체를 어떤 PID 제어기를 사용하여 튜닝했다면, 이 값들은 다른 제어기에는 올바르게 먹히지 않을 가능성이 높습니다. 클린플라이트 v1.13.0에서 MWREWRITE 와 LUX PID 콘트롤러는 (약간의 오차는 있지만,) 동일한 PID 설정을 공통으로 사용할 수 있도록 평활화되어 있었습니다. 

PID 제어기를 변경하려면 설정프로그램(Configurator)의 CLI 탭에서 [set pid_controller=x] 를 입력하면 됩니다. 여기에서 x는 사용하고자하는 제어기입니다. 먼저 여기에 있는 내용을 읽고 나서 시험해보시기 바랍니다.

참고로 오래전 버전의 클린플라이트는 6개의 PID 제어기가 있었습니다. 실험적인 혹은 오래된 제어기는 클린플라이트 버전 1.11.0 (API 버전 1.14.0) 부터 제거되었습니다.

PID 제어기 "MW23"

이 PID 제어기는 MultiWii 2.3(및 이후) 에 들어있던 PID 제어기를 직접 포팅한 것입니다.

이 알고리듬은 roll/pitch 와 yaw를 별도로 취급합니다. yaw 에 문제가 있는 사용자라면 이 제어기를 사용해 보시기 바랍니다.

HORIZON 모드와 ANGLE 모드에서 이 제어기는 LEVEL "P"와 "I" 설정을 사용하여, ACRO 비행모드에서 P와 I 설정이 roll 및 yaw 축에 적용되는 방법과 유사한 방법으로 자동레벨링 보정을 시행합니다. LEVEL "D" 항은 LEVEL "P"항에 의해 적용되는 최대 보정량을 제한하는 용도로 사용됩니다.

클린플라이트 1.12.0 부터 P_Level의 기본값을 90에서 20으로 변경하였습니다. MWREWRITE 가 기본 PID 제어기가 되었기 때문입니다. MW23을 사용한다면, P_Level 값을 90으로 변경한 뒤 날리기 바랍니다.

PID 제어기 "MWREWRITE"

MWREWRITE 제어기는 클린플라이트 v1.12.0 부터 기본 PID 제어기가 되었습니다.

이 제어기는 MultiWill 2.3에 있던 제어기보다 새로운 제어기입니다. 많은 사람들에 따르면 MWREWRITE는 성능이 더 좋으며, 예전 버전에 따라다녔던 문제를 수정하였습니다. 아울러 튜닝이 훨씬 쉬워졌고, 좀더 넓은 범위의 PID 값에도 관용을 보입니다.

ANGLE 모드에서 이 제어기는 LEVLE "P" PID 설정을 사용하여, 자동레벨 교정이 어느정도 강해야 하는지를 결정합니다.

클린플라이트 1.12.0 에서 [p_level]의 기본값이 20으로 변경되었습니다. 이는 MWREWRITE PID제어기에서 추천되는 값으로서, ANGLE 모드에서 안정적인 비행을 제공합니다. 예전의 기본값인 90 을 사용할 경우, 일부 사용자들은 매우 불안정한 비행을 경험했었습니다.

HORIZON 모드에서 이 제어기는 LEVEL "I" PID 설정을 사용하여, 자동레벨 교정을 얼마나 많이 적용해야 하는지 결정합니다. LEVEL "I" 항 : horizon 자동레벨의 강도. 설정프로그램에서 값 0.030은 [i_level]에서 3.0 과 동일합니다. LEVEL "D" 항 : horizon 천이의 강도. 이 값을 올리면 자동레벨링이 더 잘되고, 0로 설정하면 자동레벨링이 하나도 적용되지 않습니다. 아래의 HORIZON 모드 명령에 대한 설명을 확인하세요.

PID 제어기 "LUX"

LUX는 새로운, 부동소숫점 기반의 PID 제어기입니다. MW23 과 MWREWRITE는 정수 산술연산을 사용합니다. 정수로 연산할 경우, 8비트 기반의 MultiWii 콘트롤러에서도 빠르게 수행할 수 있었으나, 정확도는 떨어집니다.

클린플라이트 v1.13에서 PID 제어기 LUX 는 MWREWRITE와 동일한 PID 설정을 사용하도록 변경되었습니다.

이 제어기는 looptime의 차이를 보상하도록 시도하는 코드가 있어서, looptime 설정이 변경되었을 때 PID를 되돌릴 필요가 없습니다.

처음에는 HORIZON 모드에 약간의 문제가 있었고, ACRO 모드에서 느린 문제가 있었지만, nebbian 님이 v1.6.0에서 수정하였습니다.

LUX는 32비트 프로세서에 맞도록 설계되고, MultiWii에서 유래되지 않은 최초의 PID 제어기입니다.

ANGLE 모드동안 적용되는 자동레벨 보정 강도는 LEVEL "P" PID 항에 의해 제어됩니다. "P"항은 GUI에서 "LEVEL Proportional"로 표시되어 있습니다.(v1.13.0 이전에는 [level_angle]로 표시되어 있었습니다.) 이 항은 HORIZON 모드와 비교하여 ANGLE 모드에서 자동레벨 강도를 튜닝하는데 사용될 수 있습니다. 기본값은 5.0입니다.

HORIZON 모드동안 적용되는 자동레벨 보정강도는 LEVEL "I" PID 항에 의해 제어됩니다. "I" 항은 GUI에서 "LEVEL Integral"로 표시되어 있습니다.(v1.13.0 이전에는 [level_horizon]으로 표시되어 있었습니다.) 기본값은 3.0으로, HORIZON 모드는 ANGLE 모드에 비해 자동레벨을 약하게 적용합니다. 참고 : 현재 설정프로그램(Configurator)에는 버그가 있어서, 이들 변수를 100으로 나눈 값으로 표시합니다. 즉, 3.0 대신 0.03으로 보입니다.

Horizon 모드에서 자동레벨과 ACRO 행태간의 전이는 LEVEL "D" 항에 의해 제어됩니다. 이 항은 GUI에서 "LEVEL Derivative"로 표시되어 있습니다. (v1.13.0 이전에는 [sensitivity_horizon] 변수가 사용되었습니다.) 이것은 자동레벨이 적용되는 조종간 범위의 비율을 설정합니다. 작게 설정하면 더 넓은 범위를 자이로만 사용하여 비행하게 됩니다. 기본값은 75%입니다.

예를 들어, [sensitivity horizon]을 "100"으로 설정하면, 조종간이 중앙에 있을 때 자동레벨 강도가 100%가 적용되며, 조종간이 50%일때 자동레벨 강도가 50%가 적용되고, 조종간이 100%일때는 자동레벨이 0, 즉 적용되지 않습니다. sensitivity를 75로 내리면 조종간이 중앙에 있을 때 100% 자동레벨, 조종간 63%일때 50% 자동레벨, 조종간 74%부터는 자동레벨이 적용되지 않게됩니다.

자세한 사항은 HORIZON 모드 명령 부분의 설명을 보세요.

RC 비율, Pitch/Roll 비율(분리전에는 P/R rate),  Yaw 비율

RC 비율(RC rate)

Roll/Pitch/Yaw RC 조종간 입력에 대한 전반적인 승수(multiplier)d입니다.

PID 제어기 MW23의 경우, 조종간이 중앙 부근에 있을 때, 약간씩 움직일 때의 "느낌"을 설정하는 데 사용되었습니다. (RC Expo도 영향을 미칩니다.) PID 제어기 MWREWRITE와 LUX의 경우, 기본적으로 기본 조종간 민감도(baseline stick sensitivity)를 설정하는데 사용됩니다.

Pitch/Roll 비율 (Pitch and Roll rates)

PID 제어기 MW23의 경우, P/D 부분의 PID 오류항의 영향을 조종간이 중앙에서 멀어질수록 점차 감소합니다. 즉, Pitch 비율 혹은 Roll 비율을 0.3으로 두면, 조종간을 100%밀었을때 P/D항을 30%감소시킴으로서, 조종간이 90%이하일 경우 PID 제어기의 안정화효과를 가져오게 됩니다. 그 결과 회전 속도가 빨라집니다. 따라서 위에서 설명한 RC 비율로 조종간이 중앙부분에 있으 때의 제어 움직임 민감도를 설정하고, 스틱이 멀어질수록 회전속도를 훨씬 뻘리할 수 있습니다. 

PID 제어기 MWREWRITE와 LUX의 경우, Pitch/Roll 비율은 RC 비율과 마찬가지로 전반적인 조종간 민감도에 대한 승수(multiplier)이지만, roll과 pitch에 독립적으로 작용합니다. (난기류와 같은 외뷰효과에 대한) 안정성은 조종간이 양끝으로 가도 줄어들지 않습니다. 0로 설정하면 위의 RC비율로 설정한 조종간 민감도(stick sensitivity)를 증가시키지 않습니다. 높은 값으로 설정하면 전체 조종간 범위를 걸쳐 조종간 민감도를 증가시킵니다. 

Yaw 비율(Yaw rate)

PID 제어기 MWREWRITE와 LUX에서 Yaw 비율은 위와 같이 조종간 민감도 승수로 작용합니다.

필터(Filters)

[gyro_ldf]는 하드웨어 자이로 저대역 통과 필터(low pass filter)를 설정합니다. 0 또는 256으로 두면 gyro는 하드웨어 필터링을 최소한으로 사용하며, 지연이 최소화되어 내부 샘플속도가 최대한 빠르게(8kHz)됩니다. 숫자가 낮을 수록 필터링이 강해집니다. 필터링을 강하게 하면 자이로 신호의 노이즈를 감쇠시켜서 데이터를 PID 계손에 보내게 됩니다. 하지만 강한 필터링은 지연을 초래하여, 불안정과 반응성 저하로 이어질 수 있습니다. 필터링은 필요합니다. 특히 부피가 작고 빠르게 제동되는 ESC를 부착한 쿼드의 경우 "D" 항이 모터/프레임 노이즈가 모터의 과열을 가져올 수 있기 때문입니다. 188 이하로 설정할 경우, 자이로 샘플링은 내부적으로 1kHz 로 되고 지연이 더욱 커집니다. 반응성이 높아지기 때문에 빠른 샘플링이 좋지만, aliasing 잡음을 초래할 수 있습니다. 188로 설정하면 FC와 자이로가 1 kHz에서 동기화되어 ([gyro_sync]를 활성화시키고 코드에서 존재할 경우), aliasing이 많이 줄어들게 됩니다. 

[gyro_soft_ldf]는 IIR(Infinte Impulse Response: 무한 충동 반응) 소프트웨어 저대역 통과필터로, 원하는 주파수에 맞춰 설정할 수 있습니다. 0 이상의 값으로 설정하면 활성화됩니다. 이는 하드웨어 필터 이후에 작동하여(FC 코드에서) 노이드를 더 줄여줍니다. 두개의 필터를 모두 사용하면 하나만 사용할 때보다 cut 비율이 2배가 됩니다. [gyro_soft_ldf]를 [gyro_ldf] 보다 높은 값으로 설정하는 것은 그다지 의미가 없습니다. 일반적으로 소프트웨어 필터는 하드웨어 필터 비율의 반정도로 설정하여, 보다 높은 주파수의 차단을 강화한 후 PID 계산으로 보냅니다. 100Hz 이상의 주파수는 비행 콘트롤의 관점에서 우리에게 관심이 없습니다. - 이러한 주파수는 반드시 신호에서 제거한 후 PID 계산에 보내야 합니다.

[dterm_cut_hz] 는 원하는 주파수에 맞춰 설정할 수 있는 IIR 소프트웨어 저대역 통과 필터입니다. 이 필터는 [gyro_cut] 필터 이후 작동하며 특히 "D" 항 데이터에만 필터링합니다. D 항 데이터는 주파수에 의존적으로 주파수가 높을 수록 계산되는 D 항 값이 커집니다. 이 필터는 자이로 필터링에도 불구하고 D 항 잡음이 많이 남을 경우에 필요합니다. 전형적으로 이 필터는 상당히 낮게 설정할 필요가 있습니다. D 항 잡음이 일반 IIR 필터의 주요 문제이기 때문입니다. 단 너무 낮게 설정하면, D 항의 위상 천이(phase shift)로 인해 제어에 있어 불안정을 막아주는 D항의 효과를 감소시키므로, 변경할 때 신중할 필요가 있습니다. 이 필터의 값을 적절하게 최적화 하려면 블랙박스 기록이 필요합니다.

HORIZON 모드 명령(Horizon Mode Commands)

CLI 명령 [horizon_tilt_effect]와 [horizon_tile_mode]는 Horizon 비행모드에서 현재의 기울기(current inclination)가 자동 레벨에 미치는 효화를 제어합니다. (현재의 기울기는 기체가 수평에서 벗어난 피치와 롤 각도입니다. ?? The current inclination is the number of degrees of pitch or roll that the vehicle is away from level, whichever is greater)

[horizon_tilt_effect] : 현재의 경사도(tilt)가 HORIZON 비행 모드에서 자동레벨에 미치는 효과를 제어합니다. 큰 값으로 설정하면 기체가 기울어질 수록 자동 레벨을 줄이는 결과(좀더 "ACRO"에 가깝게) 를 가져옵니다. 기본값은 75로서, 회전은 크게하고 빠리게 전진하는 비행에서 좋은 성능을 발휘합니다. 0으로 설정하면 자동레벨의 강도는 조종간의 위치와는 완전히 독립적으로 됩니다.

[horizon_tilt_mode] SAFE|EXPERT: "horizon_tilt_effect"의 성능 모드를 설정합니다.

SAFE = 조종간이 중앙에 오면 레벨링이 항상 활성화됩니다. 조종간을 놓으면 자동 레벨이 활성화되므로, "안전한" 범위입니다. 따라서 기체가 뒤집혔을 때 (180도 회전) 조종간이 중앙으로 오면, 기체는 그 죽시 자동레벨이 적용되어 똑바로 평형을 잡습니다. (참고로 : 이와 같이 매우 빠르게 180도 자동레벨이 수행된 후에는 기체의 방향이 예측하지 못하게 될 수 있습니다.)

EXPERT :  뒤집어지면 레벨링이 완전히 꺼질 수 있습니다. : 이 범위에 있으면 기체의 기울기가 자동레벨을 완전히 "덮어쓸" 수 있습니다. 이 모드에서 "horizon_tilt_effect' 변수를 약 75 정도로 설정하면 기체는 뒤집히고. 이때 조종간이 중앙으로 오면 기체는 자동레벨이 되지 않습니다. 좀더 ACRO에 가까운 기동을 수행할 경우 (3D 모드 비행도) 이쪽이 더 바람직합니다. 

"horizon_tilt_effect" 와 "horizon_tilt_mode" 값은 각각의 프로필별로 분리되어 있으며, LUX 및 MWREWRITE를 위해 구현되었습니다.

===

원문 : https://github.com/cleanflight/cleanflight/blob/master/docs/PID%20tuning.md