Movimento servo suave para um robô de rastreamento


11

Eu criei um pequeno robô rastreador há pouco tempo, que tinha duas pernas com dois graus de liberdade cada, totalizando 4 servos RC. Enquanto programava o movimento das pernas, notei que elas se moviam com rigidez. Faz sentido que o controlador interno do servo RC tenha uma resposta muito rápida aos comandos de posição, mas eu queria que meu rastreador se movesse de uma maneira que parecesse um pouco mais suave e realista.

Minha solução foi criar uma função cúbica do tempo que descreve o caminho dos servos e, em seguida, definir sua posição em pequenos incrementos de tempo, resultando em movimentos mais suaves. Essencialmente, o que fiz foi resolver os coeficientes em uma equação cúbica usando o intervalo de tempo, a posição inicial e final do servo e as taxas inicial e final que o servo deve mover (que é apenas a derivada da posição):ai

Resolva para , , e :a 1 a 2 a 3a0a1a2a3

r uma t e ( t ) = p o s i t i o n ' ( t ) = um 1 + 2 a 2 t + 3 a 3 t

position(t)=a0+a1t+a2t2+a3t3
rate(t)=position(t)=a1+2a2t+3a3t2

Dado: , , ,p o s i t i o n ( T f ) r uma t e ( 0 ) r uma t e ( t F )position(0)posEutEuon(tf)rumate(0 0)rumate(tf)

Defino a taxa do servo entre um par de movimentos como zero se os movimentos estiverem em direções opostas e positivo ou negativo se os movimentos estiverem na direção positiva ou negativa, respectivamente.

Isso funcionou muito bem, mas essa solução é limitada de algumas maneiras. Por um lado, é difícil decidir quais devem ser exatamente as taxas entre os movimentos que seguem na mesma direção. Usei a média das pistas à frente e atrás de uma posição específica entre os movimentos, mas não está claro para mim que é o ideal. Segundo, as curvas cúbicas podem levar o servo para uma posição fora do intervalo das posições no início e no final de um movimento, o que pode ser indesejável. Por exemplo, em algum momento durante o intervalo de tempo, a curva pode fazer com que o servo ultrapasse a segunda posição ou abaixo da primeira posição. Terceiro, a geração de curvas aqui não considera a taxa máxima que o servo pode girar; portanto, uma curva pode fazer com que o servo se mova a uma velocidade irrealista. Com isso,

Negligenciando essa última preocupação, esses problemas podem ser resolvidos aumentando o grau do polinômio e adicionando restrições para resolver os coeficientes, mas agora estou começando a me perguntar ...

Existe uma maneira melhor do que isso para suavizar o movimento do servo e parecer mais realista?


O código deveria ter sido relativamente direto. Você pode falar mais sobre o motivo do envolvimento?
DaemonMaker

1
Você está certo, o código foi bastante direto, embora o método resultante para controlar os servos fosse mais complexo do que antes. Editei minha pergunta para incluir uma descrição das limitações desse método.
Robz 31/07

NURBS , não uniformes B-splines racionais, pode fazer o trabalho
James Waldby - jwpat7

@ jwpat7 obrigado pela sua entrada, mas eu não acho que NURBS iria funcionar porque essas curvas não são garantidos para acertar os pontos fornecidos
Robz

É tão simples quanto diminuir o seu coeficiente ? Kp
31413 Ian

Respostas:


6

Geração de perfis de movimento

No passado, eu usei um gerador de perfil de movimento para resolver esse problema. Para usá-lo, você precisaria da posição desejada (ponto de ajuste), velocidade máxima e valores de aceleração associados aos seus motores. Ele funciona integrando uma curva de velocidade trapezoidal para obter um perfil de posição suave. Uma curva S pode ser usada se o movimento tiver que ser ainda mais suave. Referência ao artigo que explica o perfil de movimento .

Pré-filtragem do ponto de ajuste

Além da rota de criação de perfil de movimento, você pode tentar simplesmente passar baixo filtrando o comando para os servos. Esse tipo de filtragem de ponto de ajuste desacelerará sua resposta, mas também a suavizará e é fácil de implementar. A frequência de corte deverá ser escolhida para suportar a largura de banda do seu sistema (para não filtrar o movimento desejado). Implementação simples de filtro passa-baixo em C


+1: definitivamente geração de perfil de movimento.
Guy Sirton

2

Eu acho que a pergunta se refere a esse tipo de dispositivo: servo RC

Esses geralmente não têm um desempenho muito alto, portanto não poderão rastrear muito bem um perfil de movimento gerado. A maioria dos sistemas comerciais de controle de motores usa uma curva S para um movimento ponto a ponto (consulte a resposta de @ddevaz), que faz um perfil por partes em que cada segmento usa uma equação diferente. Seu problema será que, para que seu motor rastreie o perfil gerado, você provavelmente terá um perfil muito "lento". Caso contrário, o perfil que você tentar comandar o dispositivo seguirá com um erro de posição grande versus a posição real do dispositivo.

Idealmente, você desejará algum tipo de feedback que possa observar enquanto estiver executando o movimento, para ver como o dispositivo está rastreando o comando. De uma perspectiva mais prática, se você quiser um movimento significativamente melhor, poderá precisar de motores diferentes e de controle de motor diferente.

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.