Capítulo 11
PID: Consertando Tudo
Como eliminamos o desvio residual e paramos a oscilação?
Capítulo 11: PID: Consertando Tudo ↗
O desvio residual que não morre
Theo: Lembra do Capítulo 2? Nosso controlador P deixava o drone parado abaixo de 2 m, e nenhum conseguia consertar isso. Hora de descobrir o que consegue.
Para manter o drone no ar, os motores precisam empurrar N, para sempre. Um controlador P só empurra quando há erro: . Então, para empurrar 4,9 N, ele precisa de um erro de . Com = 20 N/m, isso dá = 4,9/20 ≈ 24,5 cm, para sempre. O desvio residual não é um defeito da nossa sintonia. É o preço que o P cobra para segurar qualquer coisa no alto.
June: Então precisamos de uma parte do controlador que consiga empurrar 4,9 N com erro zero. Algo com memória.
I: uma pilha de erros passados
A ideia é esta. Mantenha um total acumulado do erro, a área sob a curva do erro, exatamente a "área que se acumula" do Capítulo 3. Empurre proporcionalmente a essa pilha:
Enquanto o drone estiver abaixo de 2 m, o erro é positivo e a pilha continua crescendo, então o empurrão continua crescendo. A pilha só para de crescer quando o erro é exatamente zero. Nesse ponto ela simplesmente fica, segurando o empuxo que tiver acumulado. É essa a memória que a June queria.
Theo: Ah, isso é manhoso. O drone não consegue se estabilizar em nenhum outro lugar além de 2 m, porque em qualquer outro lugar a pilha ainda estaria mudando.
Capítulo 11: PID: Consertando Tudo ↗
Preveja primeiro! Mika quer que o desvio residual desapareça rápido, então planeja aumentar bem alto. O que vai acontecer?
O widget começa com = 10 N/(m·s). Observe três coisas: a área sombreada em vermelho (o erro sendo empilhado), a parte integral do empuxo, tracejada em laranja, subindo até a linha roxa da gravidade, e a leitura do desvio residual. Arraste até 0 para ter de volta o desvio residual do Capítulo 2 e depois teste valores maiores. fica fixo em 20 N/m.
Capítulo 11: PID: Consertando Tudo ↗
Capítulo 11: PID: Consertando Tudo ↗
Mika: Aumenta logo! ! Acaba com isso de uma vez!
Mika: …por que não para? Os quiques foram crescendo, crescendo, e agora ele fica subindo e descendo meio metro, para sempre!
Theo: Com 50 você passou de algum tipo de limite. Testei alguns valores: abaixo de uns 40 ele se estabiliza, acima não (e o ioiô leva cerca de um segundo por balanço). Já vamos ver por quê. A pilha está sempre um pouco atrasada: continua empurrando para cima depois que o drone já passou de 2 m.
Esse é o erro da Mika, e é muito comum: o integral corrige o desvio residual, mas adiciona atraso, e atraso faz as coisas oscilarem (a manopla do chuveiro nos ensinou isso). Precisamos de algo que reaja contra a velocidade. (Pela matemática, os balanços dela deveriam crescer para sempre. Eles param em cerca de meio metro só porque o empuxo bate em 0 N a cada balanço: hélices não conseguem puxar para baixo, o limite do Capítulo 10.)
D: um amortecedor virtual
June: No Capítulo 7, o amortecedor era o que acalmava a mola. E se o controlador fingisse ser um amortecedor?
Um amortecedor empurra contra a velocidade. Então adicione um termo que empurra contra a rapidez com que o drone está se movendo:
Veja a equação do drone: o arrasto já dá . O termo D adiciona por cima, então o drone se comporta como se seu arrasto fosse . Estamos adicionando resistência do ar em software.
Capítulo 11: PID: Consertando Tudo ↗
Capítulo 11: PID: Consertando Tudo ↗
Ligue o grande ganho I da Mika e depois adicione amortecimento. Até N·s/m já o traz de volta à estabilidade (empurra o limite para ): o ioiô sem fim vira um quique que vai morrendo. Mas ele ainda passa do alvo em pelo menos um quarto, por mais D que você coloque. Essa pilha enorme simplesmente lembra demais. Agora desligue o da Mika (de volta a 10) e teste –5: calmo. I e D se compensam: o D abre espaço para o I, mas não espaço infinito.
June: Se 4 é bom, 10 deve ser melhor. Amortecedor no máximo!
Mika: Ele sobe tããão devagar… e mesmo assim passa de 2 m? Atrasado?
Theo: June, é o seu drone no mel do Capítulo 7 de novo! Acima de , o par rápido fica superamortecido. Mas agora também tem uma pilha, e um drone lento dá tempo para a pilha transbordar.
O amortecimento crítico é onde ζ = 1: N·s/m com = 20. Com = 10, ir de = 4 para 10 leva o sobressinal de 0 para cerca de 8 %, e o tempo de acomodação de menos de um segundo para cerca de 5 s. Mais D nem sempre é melhor; agora o widget avisa quando você exagera.
Mika: Então D prevê o futuro! Ele vê para onde o drone está indo e chega lá primeiro.
Theo: Não exatamente. Ele só conhece a inclinação agora. É como adivinhar onde uma bola vai cair assumindo que continua em linha reta. Geralmente é um palpite razoável, mas não é mágica. Espere até alimentarmos isso com um sensor instável.
O que cada botão faz com os polos
Hora de usar o mapa do Capítulo 10. Escreva toda a malha, com :
A integral atrapalha, então tire a inclinação dos dois lados. Inclinação e área se desfazem (Capítulo 3), então a inclinação de é simplesmente . A gravidade é constante, então sua inclinação é zero: ela simplesmente cai fora. Com um valor de referência fixo, . Termo a termo:
Junte tudo de novo e passe tudo o que tem para a esquerda. Os três pontos em significam a inclinação da inclinação da inclinação:
Theo: A gravidade desapareceu da equação. Esse é o matador do desvio residual na forma algébrica: a altura final não se importa com de forma alguma. Isto é, desde que ele se acomode. O drone de da Mika nunca se acomodou.
Chute de novo. Com o I ativo, a equação é cúbica, então há três polos. Se , não há integrador: tirar a inclinação acrescentou uma raiz falsa em , o fator comum se cancela, e o drone PD tem dois polos.
Para uma cúbica com todos os coeficientes positivos , existe um teste clássico (o critério de Routh–Hurwitz) que diz que os três polos estão no semiplano esquerdo exatamente quando . Para o nosso drone, essa é a beira do precipício:
Mika: Uma regra com o nome de duas pessoas. A gente tem que simplesmente acreditar?
Theo: Nada disso. A gente mesmo consegue achar o limite.
No instante em que um par oscilante chega ao eixo vertical, sua parte real é zero, então teste na cúbica. Como e , as partes reais e as partes laterais têm que somar zero, cada uma:
A segunda diz que . Coloque isso na primeira:
Capítulo 11: PID: Consertando Tudo ↗
Nos valores iniciais ( = 20, sem D), o limite é 40. Foi exatamente aí que o drone da Mika enlouqueceu, e seu ioiô levava cerca de um segundo por balanço: 6,32 rad/s é o próprio ωn do drone P, do Capítulo 7. Colocar empurra o limite para 200. Não confie na gente: mude os números acima, ou os controles deslizantes abaixo, e observe os polos, o minimapa e a resposta ao degrau.
Capítulo 11: PID: Consertando Tudo ↗
- O botão do I () traz um terceiro polo para a malha e pode empurrar um par para a direita. Demais, e ele cruza a linha.
- O botão do D () eleva o limite de estabilidade do ganho I ao adicionar amortecimento. Os caminhos dos polos podem virar: mais D não move todo polo para a esquerda.
- O botão do P () principalmente espalha o par oscilante para cima e para baixo: mais rápido, mas mais oscilante, a menos que o D acompanhe.
O playground de sintonia
Agora a coisa de verdade: decole do chão até 2 m com motores reais (0–20 N). Conquiste as quatro estrelas. Toda vez que você muda um ganho, o último voo permanece como um fantasma tênue.
Capítulo 11: PID: Consertando Tudo ↗
June: Desliguei o anti-windup, coloquei = 30, = 60, = 2… e o drone disparou até 4 m, direto para fora da sua figura!
Theo: A pilha continuou crescendo o tempo todo em que os motores estavam no máximo. Com o anti-windup ligado, os mesmos ganhos chegam a um pico de 2,8 m. Mesmos botões, memória bem diferente.
Dois avisos sobre D
Aviso 1: o chute derivativo
O drone paira a 1 m. Em s, mudamos o valor de referência para 1,5 m. Se o D usa a inclinação do erro, então o erro salta meio metro num instante. Sua inclinação é enorme, e o empurrão também.
Capítulo 11: PID: Consertando Tudo ↗
Capítulo 11: PID: Consertando Tudo ↗
Mika: Sobre o erro, ele pede mais de 200 N? De motores que chegam no máximo a 20?
June: E eles não sabem dizer não com educação. Vão com tudo por um instante, e o drone leva um chute no traseiro.
Usar a inclinação da altura medida em vez disso resolve: o drone não pode se teletransportar, então sua altura não tem saltos. Mesmo amortecimento, sem chute. Quase todo PID real faz isso.
Aviso 2: ruído
Sensores de altura reais oscilam alguns centímetros. Alguns centímetros de oscilação, mil vezes por segundo, têm uma inclinação enorme. D amplifica isso direto para os motores. A solução é suavizar a medição antes de calcular sua inclinação (um filtro com constante de tempo ), ao custo de reagir um pouco mais tarde.
Capítulo 11: PID: Consertando Tudo ↗
Capítulo 11: PID: Consertando Tudo ↗
Mika: Certo, D não prevê o futuro. Ele prevê o que o ruído sentiu um milissegundo atrás.
O que consertamos
O que descobrimos
- P empurra em proporção ao erro, mas precisa deixar um desvio residual para manter o drone no ar.
- I empilha o erro passado; o único ponto de repouso é erro zero, então ele elimina o desvio residual, que morre com uma constante de tempo de cerca de . Ele acrescenta atraso, então demais faz as coisas balançarem.
- D empurra contra a velocidade: um amortecedor virtual que se soma ao arrasto , então . Mais D nem sempre é melhor: superamortecido, o drone se arrasta e a pilha transborda.
- A malha fechada é ; ela é estável exatamente quando .
- Tire o D da medição (sem chute) e filtre-o (menos ruído).
June testou nosso PID estilo drone no chuveiro… e ele oscilou exatamente como fizemos no Capítulo 0. O que há com o atraso?