Robótica Prof. Reinaldo Bianchi Centro Universitário da FEI 2013 5a Aula Parte A - Cinemática Inversa Numérica Objetivos desta aula Modelo cinemático inverso: – Métodos analíticos (ou soluções fechadas): • Geométrico (por Trigonometria). • Algébrico. – Métodos numéricos: • Modelo recursivo utilizando a matriz Jacobiana. Matlab. Exercícios. Objetivos desta aula Já visto na aula passada. Modelo cinemático inverso: – Métodos analíticos (ou soluções fechadas): • Geométrico (por Trigonometria). • Algébrico. – Métodos numéricos: • Modelo recursivo utilizando a matriz Jacobiana. Matlab. Relembrando a aula passada Cinemática Inversa K-1 ( 1 … n) (x, y, z, x, y, z) Cinemática Inversa Como o próprio nome diz: – Como encontrar as posições das juntas dadas a posição e a orientação da ferramenta. Problema complexo: – Planejamento de trajetória – Dinâmica. Cinemática Inversa Enquanto a função f() é relativamente fácil de computar, f-1() geralmente não o é. Pode ser solucionado de diversas maneiras: – Geometricamente. – Algebricamente. – Numericamente. Maior problema é que podem existir: – Nenhuma solução. – Uma solução. – Múltiplas soluções. Soluções analíticas x numéricas Soluções do problema da cinemática inversa podem ser classificadas em: – Analíticas (ou soluções fechadas): • Encontram uma solução exata através da inversão das equações de cinemática direta. • É possível apenas para problemas simples. – Numéricas: • Utilizam aproximação e diversas iterações para tentar convergir para a solução. • Tendem a ser mais genéricos e computacionalmente mais custosos. Soluções de forma fechada “Forma fechada” significa: – um método de solução baseado em expressões analíticas ou na solução de um polinômio de grau 4 ou menor. – Apenas cálculos não iterativos são suficientes para chegar a uma solução. Exemplo 3: Manipulador 3R Como trabalhamos com um manipulador planar, a especificação desses pontos alvos pode ser obtida com mais facilidade especificando-se três números: x, y e ϕ, sendo ϕ a orientação do elo 3 no plano. Solução Geométrica 3R ϕ Solução analítica 3R Igualando as duas matrizes, chegamos a um conjunto de quatro equações não lineares que devem ser resolvidas para θ1, θ2 e θ3: cϕ = c123, (4.8) sϕ = s123, (4.9) x = l1c1 + l2c12, (4.10) y = l1s1 + l2s12. (4.11) Cinemática Inversa 3R Os ângulos são encontrados utilizando as seguintes equações: æ x 2 + y2 + l 2 - l 2 ö 1 2 ÷ q1 = atan 2(y, x) ± arccos çç ÷ 2 2 è 2l1 x + y ø æ x 2 + y 2 - l12 - l22 ö q 2 = arccos ç ÷ 2l1l2 è ø q3 = f - (q1 + q2 ) Métodos Numéricos Por sua natureza iterativa, as soluções numéricas em geral são muito mais lentas do que suas correspondentes de forma fechada: – Para a maioria das aplicações não estamos interessados na abordagem numérica para as soluções cinemáticas. Métodos de solução numérica iterativos serão vistos na próxima aula. Revisão de cálculo Antes de entrar nos métodos analíticos, precisamos nos lembrar da matemática… Derivada de uma função escalar Se tivermos uma função escalar f com uma única variável x, podemos escrevêla como f(x). A derivada da função em respeito a x é df/dx. A derivada é definida como: Derivada de uma função escalar f-axis Slope=df/dx x-axis f(x) x Derivada de 2 f(x)=x Gradientes Gradiente é uma derivada de primeira ordem de uma função em relação suas variáveis: Dá informações sobre a taxa de variação de uma função em relação a variáveis independentes. Gradiente Gradiente é a normal à superfície Gradiente é a normal à superfície Derivadas vetoriais Sabemos como: – Derivar um escalar por outro escalar. – Derivar um vetor por um escalar. Mas como podemos: – Derivar um escalar por um vetor? – Derivar um vetor por outro? Derivadas vetoriais Derivadas de valores escalares por valores vetoriais são comuns nos campos de: – Dinâmica dos fluidos, – Equações de teoria de campos potenciais. – etc Mas o importante hoje é como calcular a derivada de um vetor por outro...o Jacobiano. Jacobianos Um Jacobiano é a derivada de um vetor por outro. Se tivermos uma função f(x), o Jacobiano é a matriz de derivadas parciais para cada componente dos vetores O Jacobiano contém toda a informação necessária para relacionar uma mudança em um componente de x a uma mudança em um componente de f O Jacobiano é geralmente escrito como J(f,x): – Mas na prática, equivale conceitualmente a df/dx Jacobiano é ¶f1 ê ¶x ê 1 ¶f df ê 2 J (f,x ) = = ê ¶x1 dx ê ... ê ¶f M ê ¶x ë 1 ¶f1 ¶x 2 ¶f 2 ¶x 2 ... ... ... ... ... ... ¶f1 ù ú ¶x N ú ... ú ú ... ú ¶f M ú ú ¶x N û Exemplo: Robô 2R é x ù é f1 (q1, q 2 ) ê ú=ê êë y úû êë f2 (q1, q 2 ) ù é l cosq + l cos(q + q ) 1 2 1 2 ú=ê 1 úû êë l1 sinq1 + l2 sin(q1 + q 2 ) ù ú úû (x , y) 2 l2 1 l1 é ¶f1 ê ¶q J ( f ,q ) = ê 1 ê ¶f 2 êë ¶q1 ¶f1 ù ¶q 2 ú é-l1 sin q1 - l2 sin(q1 + q 2 ) -l2 sin(q1 + q 2 ) ù ú= ¶f 2 ú êë l1 cos q1 + l2 cos(q1 + q 2 ) l2 cos(q1 + q 2 ) úû ¶q 2 úû Derivadas parciais O uso do símbolo “∂” em vez de “d” para derivadas parciais indica que é um componente em um vetor de derivadas. Para propósitos práticos, as derivadas parciais se comportam como uma derivada de um escalar por outro. (Re)visão de Cálculo Numérico Exato x Aproximado Muitos algoritmos necessitam da computação da derivada. Em alguns casos é possível computar analiticamente a derivada. – Por exemplo: f ( x) = x 2 df = 2x dx Exato x Aproximado Em outros casos a função a ser derivada é muito complexa, impossibilitando o cálculo exato. Mas, desde que possamos computar a função, podemos aproximar a derivada: df f ( x + Dx ) - f ( x ) » dx Dx para valores pequenos de Dx Derivada aproximada f-axis Slope=Δf/Δx x-axis f(x) f(x+Δx) Δx Valores próximos Se sabemos o valor da função em algum ponto x, podemos estimar o valor da função em pontos próximos a ele. Método de Descida de Gradiente Existem diversas maneiras de computar aproximadamente as raízes de uma função: – valores de x que torna f(x) = 0. Uma maneira é o “Método de descida de Gradiente”. É um método de otimização bem conhecido. Idéia central Se pudermos computar f(x) e df/dx para qualquer valor de x, podemos sempre seguir o gradiente na direção do valor zero. Idéia central Se pudermos computar f(x) e df/dx para qualquer valor de x, podemos sempre seguir o gradiente na direção do valor zero. Método de Descida de Gradiente Iniciaremos em um valor x0 e tomaremos pequenos passos: xi+1 = xi + Δx até encontrarmos um valor xN onde f(xN)=0 Para cada passo, tentamos encontrar um valor de Δx que nos colocará mais próximos ao valor desejado. Podemos utilizar a derivada como uma aproximação da inclinação da função. Descida de Gradiente df/dx f(xi) f-axis xi x-axis Escolhendo Δx Se a função utilizada variar muito: – É mais prudente andar em passos pequenos. Se a função que se deseja minimizar é bem comportada: – Pode-se tentar aproximações lineares que passam por zero. Escolhendo Δx Se desejarmos aproximar linearmente Δx para nos levar ao valor de x onde f(x) = 0 podemos usar: Descida de gradiente df/dx f(xi) f-axis xi+1 xi x-axis Utilizando passos menores Se a função não for bem comportada, não podemos aproximar linearmente Δx. Uma modificação possível adiciona o parâmetro β para diminuir o passo, onde 0≤ β ≤1: β é a “taxa de aprendizado”. Descida de gradiente df/dx f(xi) f-axis xi+1 xi x-axis Exemplo de descida de gradiente Minimização Se o f(x) desejado não for 0, o valor desejado pode ser considerado um erro. O objetivo do método de descida de gradiente é minimizar este erro. Cada passo nos leva mais próximos da solução, e paramos quando estivermos perto o suficiente da resposta desejada. Este processo iterativo é comum na maioria dos algoritmos numéricos. Minimizando f(x)=g Se desejamos encontrar o valor de x para quando a função f(x) seja igual a um valor qualquer g diferente de zero, basta minimizar para f(x)-g e tentar chegar em g: Descida de gradiente para f(x)=g df/dx f(xi) f-axis g xi+1 xi x-axis Algoritmo Descida de Gradiente Parando a descida É necessário parar a descida em algum ponto. Idealmente, paramos quando chagamos no objetivo, levando em conta alguma tolerância. Porém, existem casos onde podemos ficar presos em uma determinada região: – Problemas de mínimo local. Cinemática e o Jacobiano Objetivo final do atuador “Θ” representa o vetor de estado atual das posições das juntas: Q = éë q1 q 2 ... q M ùû “e” representa os valores atuais de posição e orientação do efetuador: e = éë e1 e2 ... eN ùû “g” representa o valor desejado para o atuador (goal). Exemplo 4: manipulador 2R Imagine um robô 2D com 2 juntas rotacionais: • e=[ex ey] θ2 θ1 Exemplo 4: Jacobiano 2R A matriz Jacobiana J(e, Θ) mostra como cada componente do vetor e varia, com respeito a cada junta: é ê ê J ( e, Q) = ê ê êë ¶ex ¶q1 ¶ey ¶q1 ¶ex ù ú ¶q 2 ú ¶ey ú ú ¶q 2 úû • θ2 θ1 Exemplo 4: variação em θ 1 O que acontece ao vetor e se variarmos θ1 um pouco? é ¶e ê ¶ex = ¶q1 êë ¶q1 ù ¶ey ú ¶q1 úû θ1 • Exemplo 4: variação em θ 2 O que acontece ao vetor e se variarmos θ2 um pouco? é ¶e ê ¶ex = ¶q 2 êë ¶q 2 ¶ey ¶q 2 ù ú úû • θ2 Jacobiano x domínio Da mesma maneira que uma derivada escalar df/dx de uma função f(x) pode variar sobre o domínio de valores de x, o Jacobiano J(e,Θ) varia sobre o domínio de poses de Θ. Para cada valor de pose de Θ, pode-se calcular os componentes individuais do Jacobiano. Mudanças incrementais de pose Se tivermos uma mudança ΔΘ que representa uma pequena mudança nos valores das juntas, a mudança em e pode ser aproximada por: De » J ( e,Q) × DQ = J× DQ Utilização do jacobiano Se desejarmos mudar a posição final do atuador em Δe, que mudança em ΔΘ devemos realizar? A matriz Jacobiana J(e,Θ) mostra como cada componente do vetor e varia, com respeito a cada junta: De » J× DQ Para se obter a posição a partir da pose, basta usar: -1 DQ » J × De Mudanças na posição do atuador Δe • θ2 -1 DQ » J × De θ1 Mudanças na posição do atuador Podemos utilizar o Jacobiano para calcular valores próximos da posição atual. Lembre-se que a cinemática direta envolve funções não lineares. Assim, temos que repetir o cálculo do Jacobiano a cada passo, até chegarmos na posição desejada... Escolhendo Δe Queremos um valor de Δe que vai deixar o atuador mais próximo de g. Um chute inicial pode ser: Δe = g - e Infelizmente, devido a não linearidade, devemos tomar passos menores na direção desejada: Δe = β(g - e), onde 0≤ β ≤1 Algoritmo de Cinemática Inversa usando o Jacobiano while (e estiver longe demais de g) { Compute J(e, Θ) para a pose atual Θ Compute J-1 // inverta a matriz Jacobiana Δe = β(g - e) // escolha um passo apropriado ΔΘ = J-1 · Δe // compute as mudanças nas juntas Θ = Θ + ΔΘ // aplique as mudanças nas juntas Compute o novo e // utilize cinemática direta // para ver onde você // foi parar.. } Algumas questões… Como computar o Jacobiano J ? Como inverter J para computar J -1 ? Como escolher β (step size) Como determinar quando parar de realizar iterações (ou seja, qual o erro permitido)? Calculando o Jacobiano Calculando o Jacobiano Para calcular a matriz jacobiana completa, é necessário calcular f/x para cada junta existente. É possível para qualquer tipo de junta: – Prismática – Rotacional, – Esféricas ... Caso seja impossível calcular o Jacobiano analiticamente, este valor pode ser encontrado geometricamente ou aproximado por um método numérico... Jacobiano é ¶f1 ê ¶x ê 1 ¶f df ê 2 J (f,x ) = = ê ¶x1 dx ê ... ê ¶f M ê ¶x ë 1 ¶f1 ¶x 2 ¶f 2 ¶x 2 ... ... ... ... ... ... ¶f1 ù ú ¶x N ú ... ú ú ... ú ¶f M ú ú ¶x N û Exemplo: Robô 2R é x ù é f1 (q1, q 2 ) ê ú=ê êë y úû êë f2 (q1, q 2 ) ù é l cosq + l cos(q + q ) 1 2 1 2 ú=ê 1 úû êë l1 sinq1 + l2 sin(q1 + q 2 ) ù ú úû (x , y) 2 l2 1 l1 é ¶f1 ê ¶q J ( f ,q ) = ê 1 ê ¶f 2 êë ¶q1 ¶f1 ù ¶q 2 ú é-l1 sin q1 - l2 sin(q1 + q 2 ) -l2 sin(q1 + q 2 ) ù ú= ¶f 2 ú êë l1 cos q1 + l2 cos(q1 + q 2 ) l2 cos(q1 + q 2 ) úû ¶q 2 úû Encontrando o Jacobiano usando geometria Pode-se calcular o Jacobiano geometricamente. e é um vetor 3D representando a posição do atuador no espaço real. – O Jacobiano será uma matriz 3 x N, onde N é o número de juntas. Para cada junta i, devemos analisar como e modifica o valor de θi. Juntas rotacionais (1R) É necessário fixar um eixo e um ponto de rotação no espaço do mundo. A partir dos dados da configuração do manipulador, temos: – o offset ri da junta relativa ao seu elo. – o eixo de rotação ai relativo a seu elo. Podemos encontrar o eixo de rotação e o ponto de rotação (pivo) em coordenadas do mundo através das transformações homogêneas... Juntas rotacionais (1R) Os valores em coordenadas do mundo são dados por: a¢i = a i × Wi- parent ri¢ = ri × Wi- parent Juntas rotacionais (1R) Agora que temos o eixo e o ponto de apoio em coordenadas do mundo, podemos calcular como e modifica θ se rotacionarmos a junta: ¶e = a¢i ´ ( e - ri¢) ¶qi Este é o valor de uma coluna do jacobiano Juntas rotacionais (1R) ¶e ¶q i ¶e = a¢i ´ ( e - ri¢) ¶qi a’i: unit length rotation axis in world space r’i: position of joint pivot in world space e: end effector position in world space • e e - ri¢ ri¢ • a¢i Juntas rotacionais 3R em 3D Complica um pouco ser em 3D... Devemos considerar translações 3D e diversas rotações, para encontrar os valores no espaço do mundo. Juntas rotacionais 3R em 3D x - dof : y - dof : z - dof : ( ) a¢i = [1 0 0 0]× Ry q y × Rz (q z )× Wparent a¢i = [0 1 0 0]× Rz (q z )× Wparent a¢i = [0 0 1 0]× Wparent Onde Rx(θx), Ry(θy), e Rz(θz) são rotações em x, y, e z e T(r) é uma translação de um offset. A coordenada do mundo fica: ( ) W = Rx (q x )× Ry q y × Rz (q z )× T(r )× Wparent Juntas rotacionais 3R em 3D Para cada eixo no espaço do mundo criamos uma coluna no jacobiano: – Essencialmente funciona como 3 juntas 1R no espaço 3D. Podemos utilizar a mesma fórmula: ¶e = a¢i ´ ( e - ri¢) ¶qi Repetimos este cálculo para os 3 eixos x, y e z. Juntas prismáticas em 3D Funciona da mesma maneira, porém não existe rotação. Basta realizar uma translação ao longo de um eixo arbitrário ai definido no espaço do elo anterior. Podemos usar: a¢i = a i × Wi- parent Juntas prismáticas em 3D Como na 1R em 3D, é necessário computar cada coluna do Jacobiano: ¶e = a¢i ¶qi Uma mudança translacional resulta simplesmente em uma translação no espaço do mundo. – Computação trivial. Juntas prismáticas em 3D • • a¢i ¶e ¶q i Invertendo o Jacobiano Sistemas inversíveis Se o número de graus de liberdade no atuador for igual ao número de graus de liberdade das juntas, o sistema é chamado de inversível, ou bemcomportado. As juntas devem estar arrumadas de maneira que seus eixos não sejam redundantes. Jacobiano é uma matriz quadrada. Sistemas redundantes (underconstrained) Se o sistema tiver mais graus de liberdades nas juntas do que no atuador, existirá um contínuo de soluções redundantes para uma determinada posição desejada. Este sistemas são chamados redundantes ou underconstrained. Jacobiano tem mais colunas do que linhas. Sistemas overconstrained Se existirem mais graus de liberdade no atuador do que nas juntas o sistema é chamado overconstrained: – pode não existir soluções para um determionado problema. – Sistemas pouco comuns. Jacobiano possui mais linhas do que colunas. Invertendo o Jacobiano Se o Jacobiano é quadrado, como no caso de um sistema invertível, “basta” inverter a matriz: -1 -1 J J = JJ = I Para obter a inversa, calcula-se a matriz dos cofatores… Invertendo uma matriz... Método geral: Exemplo para uma matriz 2x2: Pseudo-Inversa Se tivermos uma matriz jacobiana que representa um sistema overconstrained ou underconstrained, podemos utilizar a pseudo-inversa do Jacobiano: + -1 J = (J J) J T T A vantagem, é que a pseudo-inversa é uma matriz quadrada. http://en.wikipedia.org/wiki/Moore–Penrose_pseudoinverse Quando parar? Três condições de parada: – Encontrou-se uma solução desejada (dentro de certa tolerância). – O sistema ficou parado em um mínimo local. – Ele levou tempo demais (número máximo de iterações). Basta monitorar o progresso nos valores de Θ Estas regras devem ser codificadas em um comando while() e serem verificadas sempre. Outros métodos possíveis Existem dezenas de técnicas de cálculo numérico que podem ser usadas: – Foi mostrada apenas uma. Outros métodos usados: – Método de Newton-Raphson – Algoritmo de Levenberg–Marquardt – Método dos Mínimos quadrados –… Método de Newton A comparison of gradient descent (green) and Newton's method (red) for minimizing a function. Newton's method uses curvature information to take a more direct route. E no Matlab? A função ikine no Matlab A solução é encontrada iterativamente utilizando a pseudo-inversa do Jacobiano: – – A solução é geral (válida para qualquer robô). – Utiliza o método de descida de gradiente. – Mais lenta que soluções específicas. ikine.m – só o que importa while true % update the count and test against iteration limit count = count + 1; if count > opt.ilimit error('ikine: iteration limit %d exceeded (row %d), i, nm); e = tr2delta( robot.fkine(q'), T); % compute the error J = jacob0(robot, q); % compute the Jacobian % compute change in joint angles to reduce the error, dq = opt.alpha * pinv( J(m,:) ) * e(m); end q = q + dq'; % update the estimated solution if norm(e(m))<= opt.tol break % stopping condition Usando ikine r.ikine(T, Q, M), onde: – R = robô; – T = transformada com a posição desejada – Q = situação atual do robô – M = matriz máscara: – If the manipulator has fewer than 6 DOF then this method of solution will fail, since the solution space has more dimensions than can be spanned by the manipulator joint coordinates. In such a case it is necessary to provide a mask matrix, M, which specifies the Cartesian DOF (in the wrist coordinate frame) that will be ignored in reaching a solution. The mask matrix has six elements that correspond to translation in X, Y and Z, and rotation about X, Y and Z respectively. The value should be 0 (for ignore) or 1. The number of non-zero elements should equal the number of manipulator DOF. Dados gerados para a solução Modificando ikine.m, podemos pedir que se imprima diversos gráficos: – Posição – Derivada da Posição – Erro Modificar false para true na linha abaixo em ikine.m: opt.plot = false; Comandos para criar um 3R Criando os links: L1 = Link([0 0 1 0]) L2 = Link([0 0 1 0]) L3 = Link([0 0 1 0]) Criando o robô: r = SerialLink([L1 L2 L3]) r.ikine(T, Q, M) Definindo T: T = [1 0 0 1; 0 1 0 1; 0 0 1 0; 0 0 0 1] Definindo Q: Q = [ 2* pi/3 2*pi/3 2*pi/3] Definindo M: M = [ 1 1 0 0 0 1] Usando ikine(): r.ikine (T, Q, M) ans = 1.8235 2.6362 1.8235 Posicão [ 2π/3 2π/3 2π/3] Resultado Evolução dos ângulos Θ 4 3.5 3 q 2.5 2 1.5 1 0.5 0 20 40 60 80 iteration 100 120 140 160 Evolução das derivadas dΘ Evolução do erro (e – g) Evolução do |erro| em monolog Usando plot Eu modifiquei o ikine para gravar os pontos por onde passou. Assim, podemos ver o robô se movendo: [a,b,pontos] =r.ikine (T, Q, M) r.plot(pontos,'delay',0.2) Conclusão Técnicas analíticas são restritas. – Mas resolvem diversos problemas práticos (PUMA, Stanford-Arm, 1R, 2R, 3R) Existem dezenas de técnicas de cálculo numérico que podem ser usadas: – Foi mostrada apenas uma. Quando usar cada um: – depende do problema! Bibliografia Capítulos 4 e 5 do Craig. Robot Manipulators: Mathematics, Programming, and Control – Paul, R. P. - 1982 - MIT Press. Robot Analysis: The Mechanics of Serial and Parallel Manipulators – Lung-Wen TSAI - 1999 - John Wiley. Links Introduction to Inverse Kinematics with Jacobian Transpose, Pseudoinverse and Damped Least Squares methods – http://math.ucsd.edu/~sbuss/ResearchWeb /ikmethods/iksurvey.pdf Intervalo Continuação no Lab com Matlab Exercícios.