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.
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):
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:
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.
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.
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.
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.