Construindo um robô de balanceamento com acionamento diferencial

8

Eu já construí um robô de balanceamento de duas rodas usando alguns servos de rotação contínua e um acelerômetro / giroscópio. Atualizei os servos para alguns motores DC de engrenagens com codificadores de 8 bits, com o objetivo de fazer com que o robô dirigisse durante o equilíbrio.

Estou meio preso em como programá-lo para dirigir enquanto ainda estou equilibrando. Eu acho que uma maneira seria apenas fazer com que a entrada de controle dos motores funcionasse como se fosse pressioná-lo. Portanto, o robô ficaria momentaneamente desequilibrado na direção em que eu quero que ele viajasse. Isso parece meio desajeitado para mim. Deve haver uma maneira melhor de fazer? Eu acho que preciso combinar o modelo dinâmico para o balanceador com a unidade diferencial, mas isso está um pouco além da teoria de controle que eu conheço.

Atualização da resposta de Anorton Eu tenho uma matriz de estado bem parecida agora.

Agora, sobre a colocação dos pólos: A matriz A terá que ser 4x4 com base no novo vetor de estado. E B terá que ser uma matriz 4x2, pois só posso controlar o torque da roda esquerda / direita (vetor u = 2x1).

Talvez eu precise ler mais sobre isso, mas existe uma maneira sistemática de determinar a matriz A pela colocação de pólos? Parece-me para este exemplo e exemplos ainda mais complicados, determinar A por palpite e verificação seria muito difícil.

Atualização # 2 Depois de ler um pouco, acho que entendo agora. Eu ainda preciso da dinâmica do robô para determinar a matriz A. Quando tiver, posso fazer a colocação do poste usando matlab ou oitava.

JDD
fonte
11
Que tipo de abordagem você está usando / que teoria de controle você conhece? Eu posso escrever-se uma abordagem, mas poderia ser super básico ou super-avançado, dependendo do seu plano ... :)
apnorton
Obrigado! para o projeto antigo com os servos, eu estava calculando o ângulo de inclinação usando dados do giroscópio / acelerômetro. Enviando isso para um filtro Kalman e, em seguida, um PID para a posição servo. Sou bom com equações diferenciais e com álgebra linear. Eu ainda sou muito novo em controles, então talvez o básico? Ou ambos, se você estiver disposto. Estou sempre interessado em aprender mais :)
JDD
11
Eu só tenho uma abordagem, então meu comentário anterior estava realmente dizendo que poderia ser adotado nos dois sentidos (ou super avançado se você estava começando com robôs ou super básico se você tem algum conhecimento de controles) ... comentário, tenho a sensação de que sou superado. :) Meu controles conhecimento é muito magro, mas eu vou jogar o meu $ 0,02 vale a pena lá ...
apnorton
Bem-vindo ao Robotics JDD, é melhor editar informações adicionais em sua pergunta, em vez de adicioná-las como um comentário, para que os comentários possam ser arrumados (excluídos) mais tarde e eles deixarão de distrair os leitores da própria pergunta.
Mark Booth

Respostas:

8

Isenção de responsabilidade: Eu nunca fiz isso sozinho, mas só vi uma descrição disso sendo feita no "Control of Mobile Robotics" da Georgia Tech no Coursera. Meu conhecimento de controles também é irregular. Assim ... leve isso com um grão de sal.:)

Para manter o robô na vertical (e imóvel), você está tentando estabilizar (envie para 0) o Estado x, Onde:

x=[leftVelocityrightVelocityangle from vertical]

No entanto, quando este sistema é estável, as velocidades das rodas esquerda e direita serão 0. Então, queremos um deslocamento para a velocidade alvo:

xnew=[leftVelocityδLrightVelocityδRangle from vertical]
Onde δ é a velocidade alvo para ambos os lados.

Quando esse sistema é estabilizado, o robô fica na vertical e cada roda gira na velocidade desejada.

Esta é a abordagem / descrição básica. Editarei isso com mais alguns detalhes amanhã (e matemática real etc.), mas eu queria pelo menos postar a idéia geral agora. (É tarde no meu fuso horário, e eu tenho uma aula cedo para chegar.)

EDITADO: Oh, Deus. Então, acabei de olhar para os slides relacionados a isso no curso Coursera (Seção 4, slide 29). Você pode se matricular nessa turma apenas para baixar o conjunto de slides ...:)

A parte difícil é calcular o A e Bmatrizes (é uma grande confusão de linearização). De qualquer forma, você deseja criar sua matriz de estados da seguinte forma (não como acima - minha memória não estava exatamente correta):

x=[vωϕϕ˙]

Onde v é a velocidade do segway, ω é a velocidade de rotação (a velocidade com que o robô gira) e ϕ é o ângulo da vertical.

Queremos ter a velocidade desejada, então vamos definir um novo vetor de estado:

x~=x[vdωd00]=xδ

Onde δ é a velocidade desejada e a quantidade rotacional (como visto acima).

Diferenciando:

x~˙=x˙δ˙=δ is constantx˙

Assim, temos

x~˙=Ax+Bu

Onde A é a matriz coeficiente padrão B é a matriz de entrada e ué o vetor de controle. Podemos então dizer:

x~˙=UMA(x-δ)+Bvocê+UMAδ
Mas, com base na solução para UMA (de Coursera), UMAδ=0 0. Portanto:
x~˙=UMAx~+Bvocê

Agora você pode usar a colocação de pólos para determinar os autovalores corretos etc.

apnorton
fonte
Awesome thanks! Também fiz a mesma aula do Coursera e provavelmente não estamos muito distantes no conhecimento de controles. Este está se tornando um projeto muito mais difícil do que eu pensava. Eu gosto da sua matriz de estados até agora.
JDD 11/03
Eek! Parece que não vou responder esta noite! Eu estava nas férias da primavera na semana passada e esqueci algo que era devido, e isso me manteve ocupado hoje. Vou editá-lo amanhã ...
apnorton 12/03/2013
Sem problemas. Eu estraguei minha última ponte h ontem tentando montá-la, então terei que esperar por uma substituição.
JDD 13/03
Muito obrigado Anorton pela ajuda. Acho que estou entendendo como fazer isso muito mais agora. Eu atualizei minha pergunta original. Como determinar as matrizes A e B ainda está me confundindo.
JDD 13/03