Quadcopter PID tuning

13

Na continuação da pergunta que fiz aqui: Instabilidade do Quadrotor com decolagem simples no modo autônomo ... Gostaria de fazer algumas perguntas sobre a implementação de um PID básico para um quadrotor controlado por um módulo APM 2.6. (Estou usando um quadro da 3DRobotics)

Eu reduzi todo o sistema de controle para apenas dois blocos PID, um para controlar o rolamento e outro para controlar o passo (guinada e tudo mais ... eu pensaria neles mais tarde).

Estou testando essa configuração em uma plataforma que consiste em um feixe de rotação livre, onde amarrei dois braços do quadrotor. Os outros dois estão livres para se mudar. Então, estou testando um grau de liberdade (rotação ou inclinação) de cada vez.

Verifique a imagem abaixo: aqui A, B marca o feixe de rotação livre no qual a instalação está montada. insira a descrição da imagem aqui

Com o ajuste cuidadoso dos parâmetros P e D, consegui obter um vôo sustentado de cerca de 30 segundos.

Mas por 'sustentado', quero dizer simplesmente um teste em que o drone não está caindo para o lado. O vôo estável em rocha ainda não está à vista e mais de 30 segundos de vôo também parecem bastante difíceis. Ele oscila desde o começo. Quando atinge 20 - 25 segundos, começa a inclinar para um lado. Dentro de 30 segundos, ele se inclinou para um lado por uma margem inaceitável. Em breve, acho que está de cabeça para baixo

Quanto ao próprio código PID, estou calculando o erro proporcional a partir de um 'filtro complementar' de dados do giroscópio + acelerômetro. O termo integral é definido como zero. O termo P chega a cerca de 0,39 e o termo D é 0,0012. (Não estou usando a biblioteca PID do Arduino de propósito, apenas quero que um dos meus PIDs seja implementado aqui.)

Confira este vídeo, se você quiser ver como ele funciona.

http://www.youtube.com/watch?v=LpsNBL8ydBA&feature=youtu.be [Sim, a configuração é bem antiga! Concordo. :)]

Informe-me o que eu poderia fazer para melhorar a estabilidade nesta fase.

@Ian: Dos muitos testes que fiz com minha configuração, fiz gráficos de plotagem para alguns dos testes usando a leitura do monitor serial. Aqui está uma amostra de leitura do rolo versus 'entrada Motor1 e Motor2 - PWM' (os dois motores que controlam o rolo):

Entrada PWM Rolo vs Motor

Quanto à entrada / saída:

Entrada: valores de rotação e inclinação (em graus), obtidos por uma combinação de acelerômetro + giroscópio

Saída: valores PWM para os motores, entregues usando a função motor.write () da biblioteca da servo


Resolução

Eu resolvi o problema. Aqui está como:

  1. O cerne da questão estava na maneira como implementei o programa Arduino. Eu estava usando a função write () para atualizar os ângulos do servo, que aceita apenas etapas inteiras no argumento (ou de alguma forma responde apenas à entrada inteira, 100 e 100.2 produz o mesmo resultado). Alterei para writeMicroseconds () e isso tornou o helicóptero consideravelmente mais estável.

  2. Eu estava adicionando RPM em um motor, mantendo o outro em um valor constante. Alterei isso para aumentar a RPM em um motor enquanto diminuía o motor oposto. Isso meio que mantém o impulso horizontal total inalterado, o que pode me ajudar quando estou tentando manter a altitude vertical sobre essa coisa.

  3. Eu estava aumentando a rotação até o limite máximo, e é por isso que o quadcopter continuava perdendo o controle a toda velocidade. Não havia espaço para o RPM aumentar quando sentiu uma inclinação.

  4. Observei que um dos motores era inerentemente mais fraco que o outro, não sei por quê. Eu codifiquei um deslocamento na entrada PWM dos motores.

Obrigado por todo o apoio.


Código fonte:

Se você estiver interessado, aqui está o código-fonte da minha implementação básica do PID : Código-fonte do PID

Por favor, sinta-se livre para testá-lo em seu hardware. Quaisquer contribuições para o projeto serão bem-vindas.

Metsburg
fonte
1
Qual é a entrada e qual é a saída do loop?
Guy Sirton
@GuySirton: Atualizei minha pergunta
metsburg
Quais são essas seções planas nos comandos do seu motor? Parece que algo está saturando. Você executa alterações como uma função contínua, mas seus comandos parecem muito abruptos. Além disso, por que os dois comandos PWM do motor estão subindo enquanto a entrada do rolo permanece na mesma faixa? Qual é o prazo aproximado a propósito?
Guy Sirton
1
A razão pela qual você está perdendo o controle após 30 segundos provavelmente está relacionada a ambos os comandos que estão surgindo. Eu acho que você está tentando controlar a diferença entre os comandos, mas não pode permitir que eles continuem à deriva.
Guy Sirton
@GuySirton: Eles não estão à deriva, estou aumentando para zero a partir do zero, para que atinja um estado estacionário específico dentro de 3/4 segundos. No entanto, acho que você está certo quando diz "o motivo de perder o controle após 30 segundos provavelmente está relacionado a ambos os seus comandos". Se eu não usar esse incremento gradual, se eu corrigir minha entrada do PWM em um determinado nível (abaixo da entrada máxima mostrada acima), o problema de perder o controle após 30 segundos desaparecerá.
metsburg

Respostas:

6
  1. Parece que seu ganho proporcional é muito alto.
  2. Você parece aumentar constantemente as RPMs de um motor enquanto bloqueia o outro para fazer o sistema girar. Essa não é uma boa estratégia de controle, pois, eventualmente, elas vão saturar e você perderá o controle. Além disso, à medida que o tempo aumenta, sua capacidade de comandar o sistema diminui. Então você precisa de um modelo melhor do sistema.
  3. Se você lida com os números 1 e 2, terá um sistema mais estável, mas poderá não estar satisfeito com a largura de banda de controle. Para lidar com isso, você precisa tornar seu sistema mais rígido, o que inclui a eliminação de qualquer atraso no lado do sensor e no controle.
Guy Sirton
fonte
3

Eu começaria lendo esta pergunta: Quais são as boas estratégias para ajustar loops PID?

Se eu tivesse que adivinhar, diria que você tem um problema na maneira como seu filtro de cortesia é construído. Com os motores quadcopter desligados, incline o quadro para frente e para trás e verifique se os valores de rotação / inclinação relatados são realmente precisos.

Para mim, parece que há um atraso entre a entrada do acelerômetro e a saída do seu filtro - a oscilação pode ser explicada por reações tardias aos dados de entrada. A eventual reviravolta parece um possível erro de integração que se acumula ao longo do tempo - em outras palavras, enquanto seu quadcopter está do lado dele, na verdade, ele pensa que está pairando niveladamente.

(Atualização) Em relação ao gráfico, o fato de as velocidades do seu motor continuarem aumentando (em vez de permanecer equilibrado) significa que há um erro em algum lugar. Talvez seu termo Integral esteja ficando ilimitado, e você deve especificar um máximo razoável para ele.

Ian
fonte
Atualizei minha pergunta com os valores do rolo, ao inclinar para frente e para trás. Resolvi a eventual virada ao abaixar minha entrada PWM máxima. Parece que os valores de correção não funcionam com RPM muito alto. Eu posso girar o equipamento facilmente com a mão ao trabalhar em altas rotações. Em rotações mais baixas, sinto uma resistência considerável e o quadcopter parece oscilar de volta à sua posição original (o que é bom, eu acho). Portanto, o problema de 'virar' provavelmente é resolvido diminuindo o RPM (não sei se o drone decolará ou não, espero que sim). Problema de oscilação ainda permanece.
metsburg
-3-5±90
Bem, o gráfico não é exatamente para o teste mostrado no vídeo. Como mencionado acima, o gráfico é de um dos muitos testes que fiz com essa configuração e não me lembro exatamente como esse caso em particular era. O gráfico é apenas para lhe dar uma idéia de como a resposta entre entrada e saída se comporta, e eu também queria estabelecer que não há muito atraso entre a entrada e a saída (dado que o loop está funcionando a mais de 150 Hz). Combinar o vídeo com o gráfico pode não fazer muito sentido. Não tenho o conjunto de dados exato para o teste no vídeo.
metsburg
Percebi que o gráfico é meio enganoso, desculpe por isso. Vou tentar atualizar o gráfico com um mais preciso. Na verdade, desde que eu estava plotando dados da porta serial, quando criei esse gráfico, a placa Arduino estava presa ao laptop. Após uma certa oscilação, tive que intervir e desacelerar a oscilação manualmente. É por isso que você o vê se acomodando a - 5 graus, enquanto na realidade é em torno de 90 graus. Tentarei atualizar um gráfico mais preciso posteriormente.
metsburg
Outra coisa que vejo no gráfico é que seu impulso combinado está sempre aumentando. Isso parece errado.
Ian
1

Bem, pode haver várias coisas acontecendo aqui ...

1) Seus ângulos relatados estão corretos? barulhento? Você pode facilmente verificar isso inclinando manualmente o seu quadrilátero e monitorando os valores que saem.

2) sua própria implementação de PID possui um bug. Você pode usar a implementação confiável disponível para verificar seu código.

3) Suportes, motores montados na direção errada.

4) ...

dm76
fonte
1) Inclinei e verifiquei os ângulos relatados, quase corretos, mas definitivamente barulhentos. 2) muito provável ... na verdade, acho que resume tudo: P 3) não muito provável, dois no sentido horário, dois no sentido anti-horário ... verifiquei os adereços várias vezes + acho que esse tipo de erro resultaram em erros selvagens, muito além do controle. 4) ...
metsburg 15/01
4) ... um ajuste errado do PID pode piorar as coisas do que se você não tivesse um PID!
dm76
Sim, eu vejo isso agora. Vou trabalhar nisso amanhã. Meu primeiro plano é usar a biblioteca PID confiável e o segundo é alterar a saída do PID dos sinais PWM para a correção roll.pitch.
metsburg