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