Guiando um quadrotor em direção a um alvo


9

Eu estou trabalhando em um quadrotor. Conheço sua posição - , para onde gostaria de ir - posição alvo b e, a partir disso, calculo um vetor c - um vetor unitário que me levará ao meu objetivo:abc

c = b - a
c = normalize(c)

Como um quadrotor pode se mover em qualquer direção sem rotação, o que tentei fazer é

  1. gire pelo ângulo de guinada dos robôsc
  2. dividi-lo em seus componentes x,y
  3. passe-os para o robô como ângulos de rotação e inclinação.

O problema é que, se a guinada for de 0 ° ± 5, isso funcionará, mas se a guinada estiver próxima de +90 ou -90, ela falhará e seguirá em direções erradas. Minha pergunta é: estou perdendo algo óbvio aqui?


11
Como você está calculando o ângulo de guinada? Além disso, qual controlador você está usando e como envia dados?
DaemonMaker 24/12/12

Pergunta interessante @Hamza, bem-vindo à Robótica .
Mark Booth

@ Hamza, que idioma e sistema você está usando? Também estou trabalhando em um quadcopter com a linguagem de programação Atmega328 e Ada. Se você tem um blog sobre o projeto, compartilhe.

Você está correto @MarkBooth, eu tinha duas guias abertas e pretendia marcar a outra postagem como duplicada. Marquei este por engano e não vi como desfazê-lo. Dado que são necessários mais de um voto para fechá-lo, achei que isso não seria um problema. No entanto, não percebi que ele postou um comentário em meu nome.
DaemonMaker

Sem problemas @DaemonMaker, essas coisas acontecem. Fechar como votos duplicados agora publica automaticamente comentários, o que eu acho que é um recurso útil, pois solicita que as pessoas analisem a outra pergunta antes de fazerem uma votação fechada.
Mark Booth

Respostas:


6

Reimplementando sua solução, recebo o seguinte:

Ângulo entre vetores

Primeiro, você deseja o ângulo entre os pontos A e B - não especificamente o vetor unitário. Ângulo entre 2 pontos

θ=math.atan2(BxAx,ByAy)

Ângulo de guinada do veículo

ψθ

Heading vs Yaw

y

Rosa dos Ventos

x

Gráfico polar

A sobreposição de 90 graus entre essas medições, combinada com a adição (em vez de subtração) da guinada do veículo da guinada desejada, pode ser o motivo pelo qual as coisas funcionaram quando seu alvo estava dentro de ± 5 ° e se comportou mal em ± 90 °.

Conversão para o componente X e Y

(θψ)xy

Controle PID

Você pode ser melhor atendido usando loops de controle PID para a rotação e a inclinação do veículo. Ou seja, depois de corrigir seu código e conseguir atingir seu objetivo, meu palpite é que você começará a superá-lo - oscilando para frente e para trás. Um PID ajustado corretamente impedirá que isso aconteça enquanto ainda permite que você se aproxime do alvo rapidamente.

xy


Isso é uma edição lá, mais de 90% e muda totalmente a resposta (de PID para ATAN2). Mas suas habilidades de fórmula gráfica chamativas são bestas!
Spiked3

Eu ainda recomendo o PID (está lá na parte inferior), apenas trabalhei na parte inicial da pergunta para garantir que minhas suposições estavam corretas. As fórmulas gráficas fazem parte da formatação de látex, que vale a pena conferir.
31412 Ian

"A direção da bússola começa no eixo y positivo e aumenta no sentido horário, enquanto a guinada começa no eixo x positivo e aumenta no sentido anti-horário"? "convertendo o componente x de (θ − ψ) para rolar e o componente y para lançar" Eu não entendo isso - mais explicações, por favor (estou perdendo alguma coisa).
Spiked3

A pergunta original mencionava "passar [os componentes xey] para o robô como ângulos de inclinação e inclinação", o que para mim indica que o quadcopter se move de um lado para o outro alterando o ângulo de rotação e para frente e para trás alterando o ângulo de inclinação. Vou acrescentar um pouco de clareza.
31712 Ian

arrumado. Eu nunca vi isso assim. Eu vi, e faço a mim mesmo, apenas virar cos / sin para obter os mesmos resultados. Vou ter que pensar um pouco mais no rolo. Sim, isso causaria movimento, mas não sei ao certo como isso tem a ver com onde você está e para onde vai, além da velocidade com que você chega lá. Obrigado.
Spiked3

5

Suponho que você esteja falando de um vetor 3D aqui. Você pode simplesmente generalizar normalize()assim? É tão comum (eu nunca vi isso, se for, então novidades para mim). Caso contrário, problemas óbvios de quebra da bússola se aplicam a cada um dos componentes X e Y. Por que não chamá-los de rolar e / ou lançar e / ou guinar? (misturar nomenclatura 3D e 2D confunde a pergunta).

Minha normalização 2D se parece com isso;

int Pilot_QuickestTurnTo(int hdgNow, int hdgNew)
{
    hdgNow = Pilot_Hdg360(hdgNow);
    hdgNew = Pilot_Hdg360(hdgNew);
    if (hdgNow < hdgNew)
        hdgNow += 360;
    int left = hdgNow - hdgNew;
        return (left < 181 ? -left : 360 - left);
}

Se é realmente um quad, presumo que seus componentes X e Y sejam realmente YAW, Altitude ((X, Y) e Z). Você precisará lidar com o YAW(X, Y)2D e simplesmente largar ou ganhar altitude para Z (e, novamente, é por isso que suspeito que normalizar é mais do que você tem).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.