Vinicius Mariano Gonçalves
Um manipulador (ou um robô, no geral) pode ser visto como um conjunto de corpos rígidos (seus elos) que se movem (transladam e giram) à medida que os motores do robô são atuados.
É importante saber descrever como estará cada um dos elos – sua posição e orientação – à medida que o tempo varia. Isso é especialmente verdade para o efetuador.
Para isso temos que saber descrever esses corpos no espaço.
Começaremos a aprender como descrever rotações.
Temos a seguinte definição:
Definição: Uma matriz de rotação é uma matriz \(Q \in \mathbb{R}^{3 \times 3}\) com duas propriedades:
em que \(I_{3 \times 3}\) é a matriz identidade de ordem 3.
A primeira condição (\(Q^TQ=I_{3 \times 3}\)) tem uma interpretação geométrica. Suponha que ela
seja
escrita como:
$$ Q = \LARGE{\Big(}\normalsize{}\begin{array}{ccc}
Q_{xx} & Q_{xy} & Q_{xz} \\
Q_{yx} & Q_{yy} & Q_{yz} \\
Q_{zx} & Q_{zy} & Q_{zz}
\end{array}\LARGE{\Big)}\normalsize{} = \left(\begin{array}{ccc}
Q_{x} & Q_y & Q_z
\end{array}\right)$$
em que \(Q_x, Q_y\) e \(Q_z\) são os vetores colunas que formam a matriz.
Então, lendo a primeira condição em termos das colunas, deduzimos que elas são ortonormais, ou seja, descrevem vetores ortogonais entre si e de tamanho unitário:
$$\begin{eqnarray} && Q_x^TQ_y = Q_x^TQ_z = Q_y^TQ_z = 0 \nonumber \\ && Q_x^TQ_x = Q_y^TQ_y = Q_z^TQ_z = 1. \nonumber \end{eqnarray}$$
Ou seja, se escolhermos um referencial (conjunto de três vetores unitários ortogonais entre si)
\(\mathcal{F}_0\) e considerarmos cada coluna de \(Q\) como um vetor
escrito nesse referencial, teremos, ao terminar de desenhar os três vetores respectivos as três
colunas, um outro
conjunto de vetores ortogonais entre si e unitários, ou seja, outro
referencial, \(\mathcal{F}_1\).
A segunda condição, (\(\det(Q)=+1\)) implica que esse novo referencial \(\mathcal{F}_1\) é positivamente orientado de acordo com a regra da mão direita.
Isso significa que se você colocar, com a mão direita, o dedo polegar no eixo \(x\) e o dedo
indicador no eixo \(y\), então o eixo \(z\) estará na palma de sua mão.
Esse procedimento (interpretar as colunas de uma matriz de rotação \(Q\) como vetores em um referencial \(\mathcal{F}_0\), desenhá-los e obter um outro referencial \(\mathcal{F}_1\)) é muito relevante e será abordado em breve.
Temos então a primeira interpretação para uma matriz de rotação
\(Q\):
Note que os dois referenciais têm o mesmo centro!
Vamos agora para a segunda interpretação de uma matriz de rotação \(Q\):
Uma matriz de rotação \(Q\) implementa a
rotação, em torno de um eixo específico escrito em um referencial \(\mathcal{F}_0\) -
seguindo a regra da mão direita- e de um ângulo
específico, de um ponto!
Exemplo: Considere a matriz de rotação \(Q\): $$Q = \Large{\Bigg(}\normalsize{}\begin{array}{ccc} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} & 0 \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & 0 \\ 0 & 0 & 1 \end{array}\Large{\Bigg)}\normalsize{}.$$
Considere um referencial \(\mathcal{F}_0\), e um ponto que é escrito como um vetor coluna \(p\) em \(\mathcal{F}_0\). Então, o vetor \(p'=Qp\) representa, também escrito em \(\mathcal{F}_0\), o ponto \(p\) rodado de 45 graus no eixo \(z_0\).
Então, se: $$p = \Large{\Bigg(}\normalsize{}\begin{array}{c} \frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} \\ \frac{1}{2} \end{array}\Large{\Bigg)}\normalsize{} \ \ \ , \ \ \ p' = Qp = \Large{\Bigg(}\normalsize{}\begin{array}{c} 0 \\ 1 \\ \frac{1}{2} \end{array}\Large{\Bigg)}.$$
O ponto \(p'\) é o ponto \(p\) rodado de 45 graus no eixo \(z_0\).
No UAIBot é possível calcular o eixo e o ângulo (em radianos) de uma matriz de rotação usando a função Utils.axis_angle:
import numpy as np
import uaibot as ub
Q = np.array([[0,-1,0],[1,0,0],[0,0,1]])
axis, angle = ub.Utils.axis_angle(Q)
print(axis) #Imprime [0. 0. 1.]
print(angle) #Imprime 1.570 rad
Note que o eixo está escrito em um referencial \(\mathcal{F}_0\) genérico. O eixo é contextualizado quando aplicamos a matriz de rotação em um ponto \(p\) escrito em um referencial específico.
Duas rotações seguidas representadas por matrizes \(Q_1\) e \(Q_2\) (nessa ordem!) em um referencial \(\mathcal{F}_0\) formam uma outra rotação no referencial \(\mathcal{F}_0\) representada por uma matriz de rotação \(Q_3=Q_2Q_1\) (o produto das matrizes).
Note a ordem! A segunda rotação vem primeiro no produto! Rotações mais recentes vêm à esquerda!
Note também que os eixos de rotação sempre estão escritos no referencial \(\mathcal{F}_0\), que é fixo ao longo das rotações.
Atenção! rotações não comutam, no geral: $$Q_2Q_1 \not= Q_1Q_2.$$
Exemplo:
$$Q_1 = \large{\Bigg(}\normalsize{}\begin{array}{ccc} 1 & 0 & 0 \\ 0 & 0 & -1 \\ 0 & 1 & 0 \end{array}\large{\Bigg)}\normalsize{} \ \ , \ \ Q_2 = \large{\Bigg(}\normalsize{}\begin{array}{ccc} 0 & 0 & 1 \\ 0 & 1 & 0 \\ -1 & 0 & 0 \end{array}\large{\Bigg)}\normalsize{}.$$
A primeira matriz representa uma rotação de 90 graus em x, e a segunda 90 graus de y.
Então:
$$Q_1Q_2 = \large{\Bigg(}\normalsize{}\begin{array}{ccc} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{array} \large{\Bigg)}\normalsize{}\ \ , \ \ Q_2Q_1 = \large{\Bigg(}\normalsize{}\begin{array}{ccc} 0 & 1 & 0 \\ 0 & 0 & -1 \\ -1 & 0 & 0 \end{array} \large{\Bigg)}\normalsize{}.$$
A primeira matriz é uma rotação no eixo \(r=( \frac{\sqrt{3}}{3} \ \frac{\sqrt{3}}{3} \ \frac{\sqrt{3}}{3} )^T\) de um ângulo de 2,09 radianos.
A segunda matriz é uma rotação no eixo \(r=( \frac{\sqrt{3}}{3} \ \frac{\sqrt{3}}{3} \ -\frac{\sqrt{3}}{3} )^T\) de um ângulo de 2,09 radianos.
Temos as rotações elementares, rotações em x, y e z:
$$R_x(\theta) = \Large{\Bigg(}\normalsize{}\begin{array}{ccc} 1 & 0 & 0 \\ 0 & \cos(\theta) & -\sin(\theta) \\ 0 & \sin(\theta) & \ \ \cos(\theta) \end{array}\Large{\Bigg)}\normalsize{}.$$
$$R_y(\theta) = \Large{\Bigg(}\normalsize{}\begin{array}{ccc} \ \cos(\theta) & 0 & \sin(\theta) \\ 0 & 1 & 0 \\ -\sin(\theta) & 0 & \cos(\theta) \end{array}\Large{\Bigg)}\normalsize{}.$$
$$R_z(\theta) = \Large{\Bigg(}\normalsize{}\begin{array}{ccc} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \ \ \cos(\theta) & 0 \\ 0 & 0 & 1 \end{array}\Large{\Bigg)}\normalsize{}.$$
No UAIBot, as rotações elementares estão implementadas:
import uaibot as ub
theta=3.14/2
Rx = ub.Utils.rotx(theta)
Ry = ub.Utils.roty(theta)
Rz = ub.Utils.rotz(theta)
Nesse caso, as matrizes serão 4x4 em vez de 3x3, mas você pode recuperar as matrizes de rotação descartando a última linha e a última coluna. O porquê dessas matrizes estarem embutidas na matriz 4x4 ficará claro em breve.
Rotações em um eixo arbitrário \(r\) e um ângulo \(\theta\) também estão implementadas
import uaibot as ub
theta=3.14/2
r = [1,2,3]
R = ub.Utils.rot(r, theta)
O eixo \(r\), se não estiver normalizado, é normalizado internamente na função. O tamanho do vetor \(r\) não importa.
Assim como antes, as matrizes serão 4x4 em vez de 3x3, mas, novamente, você pode recuperar as matrizes de rotação descartando a última linha e a última coluna.
Teorema: toda matriz de rotação \(Q\) pode ser decomposta em:
$$Q = R_z(\alpha)R_y(\beta)R_x(\gamma).$$
Os ângulos \(\alpha, \beta, \gamma\) são chamados de ângulos de Euler da rotação.
Há outras convenções de ângulo de Euler (ex: \(R_x(\alpha)R_y(\beta)R_x(\gamma)\)).
Os ângulos \( \gamma, \beta, \alpha \) também são chamados de roll (rolagem), pitch (arfagem) e yaw (guinada). , respectivamente.
No UAIBot, os ângulos de Euler podem ser calculados usando a função Utils.euler_angles
import uaibot as ub
import numpy as np
Q = np.array([[0,0,1],[1,0,0],[0,1,0]])
alpha, beta, gamma = ub.Utils.euler_angles(Q)
print([alpha, beta, gamma])
Note que uma matriz de rotação tem 9 números.
Entretanto, esses 9 números não podem ser escolhidos arbitrariamente! Ou seja, nem toda matriz 3x3 é uma matriz de rotação.
Pode se mostrar que a restrição \(Q^TQ = I_{3 \times 3}\) impõe que há apenas 3 graus de liberdade para escolher os números.
Então 9 números parece ser uma representação pouco econômica de uma rotação. Há outras?
Sim! Por exemplo, os Ângulos de Euler podem ser usados para representar uma rotação com apenas 3 números (a quantidade mínima de informação).
Essa representação tem problemas, entretanto. Por exemplo: como compor duas rotações representadas por ângulos de Euler? Em matrizes de rotação, basta multiplicá-las.
A representação não é única! Por exemplo, as triplas \(\alpha = t, \beta = \frac{\pi}{2}, \gamma = t\) representam a mesma rotação para todo \(t\) .
É descontínua! Rotações que são próximas podem ter ângulos de Euler radicalmente diferentes. Isso atrapalha na hora de derivar.
Há outras. Por exemplo, os Quaternions representam uma rotação com 4 números.
Ela é quase única (apenas dois quatérnions para cada rotação), e é uma representação contínua.
Usaremos matrizes de transformação neste curso, entretanto, pois são mais comuns na literatura de robótica.
Vimos que temos duas interpretações para uma matriz de rotação:
(A): Ela representa uma referencial \(\mathcal{F}_1\) escrito em um referencial \(\mathcal{F}_0\)...
(B): Ela representa uma operação de rotação de um determinado eixo e ângulo escritos em um referencial \(\mathcal{F}_0\)...
O que conecta as duas?
Considere um referencial \(\mathcal{F}_0\). Nesse referencial, os eixos \(x_0\), \(y_0\) e \(z_0\) são escritos como os vetores \(x_0=(1 \ 0 \ 0)^T, y_0 = (0 \ 1 \ 0)^T\) e \(z_0 = (0 \ 0 \ 1)^T\).
Se aplicarmos a rotação especificada por \(Q\) (interpretação (B)) em cada um desses vetores, obteremos novos vetores \(x_1=Qx_0, y_1=Qy_0, z_1=Qz_0\)...
Esses três vetores, quando consideramos como escritos em \(\mathcal{F}_0\), formam um novo referencial positivamente orientado \(\mathcal{F}_1\), que é exatamente o mesmo que obteríamos usando a interpretação (A)!
Do ponto de vista da Física, corpo rígido é um objeto idealizado que não pode sofrer deformações, contrações, expansões ou quebras devido às forças que nele agem.
Obviamente é uma aproximação, e se o objeto é um corpo rígido ou não depende das forças que estamos considerando.
Para forças razoáveis, podemos dizer que um cilindro de aço é um corpo rígido, enquanto uma bola de praia não.
Do ponto de vista da Matemática, corpo rígido é um conjunto em que, para duas partículas quaisquer \(P_1\) e \(P_2\) dele, a distância entre elas permanece constante ao longo do movimento.
Ou seja, se \(p_1(t)\) e \(p_2(t)\) são as posições de duas partículas \(P_1\) e \(P_2\) ao longo do tempo, escritas com relação a um referêncial \(\mathcal{F}_0\), então para todos tempos \(t_A\) e \(t_B\) temos: $$\|p_1(t_A)-p_2(t_A)\| = \|p_1(t_B)-p_2(t_B)\|$$
em que \(\| \cdot \|\) é a norma Euclidiana do vetor.
Queremos agora fazer a descrição matemática do movimento de um corpo rígido.
Por isso, entenda-se descrever a trajetória de todas as partículas que formam um corpo rígido.
Note que isso seria extremamente difícil para um objeto genérico, como uma bola de praia. Afinal, a bola de praia pode transladar, rodar, contrair, distorcer, etc... de infinitas maneiras, extremamente complexas.
Felizmente, para um corpo rígido a movimentação das partículas está severamente limitada, o que nos permite uma descrição concisa do movimento.
Antes de entender como podemos fazer isso, precisamos entender o que é uma transformação rígida.
Definição: Uma transformação rígida é uma função
\(T: \mathbb{R}^3 \mapsto
\mathbb{R}^3\) com a seguinte
propriedade: para dois pontos \(p_1\) e \(p_2\) quaisquer:
$$\|T(p_1)-T(p_2)\|=\|p_1-p_2\|.$$
Em outras palavras, uma transformação rígida preserva a distância entre pontos!
Temos o seguinte teorema:
A interpretação desse teorema é que toda transformação rígida é composta por três sub-operações:
Note que, em tudo isso, está subentendido um referencial \(\mathcal{F}_0\).
Trabalharemos aqui com transformações rígidas próprias, sem reflexão:
$$T(p) = Qp+s$$
ou seja, uma rotação e uma translação.
Obviamente, há uma conexão entre o movimento de corpos rígidos e uma transformação rígida.
Sejam \(\mathcal{P}(t_A), \mathcal{P}(t_B) \subseteq \mathbb{R}^3\) conjuntos que representem as posições das partículas de um mesmo corpo rígido \(\mathcal{P}\) em dois tempos diferentes, \(t=t_A\) e \(t=t_B\).
Então existe uma única transformação rígida \(T_{AB}\) tal que todo ponto de \(\mathcal{P}(t_B)\) pode ser obtido a partir de um ponto de \(\mathcal{P}(t_A)\) através da aplicação de \(T_{AB}\). Matematicamente, existe uma transformação \(T_{AB}\) tal que: $$\forall p_B \in \mathcal{P}(t_B), \exists p_A \in \mathcal{P}(t_A) \ \mbox{tal que} \ p_B = T_{AB}(p_A).$$
Em outras palavras, o conjunto em um tempo \(t_B\) pode ser obtido a partir do conjunto no tempo \(t_A\) pela aplicação em todos os pontos de uma transformação rígida \(T_{AB}\).
No desenho ao lado, por exemplo, o conjunto no tempo \(t_B\) é o conjunto no tempo \(t_A\) aplicando a transformação rígida \(T_{AB}\) que representa o deslocamento de uma unidade no eixo \(y_0\).
Note que, novamente, temos a figura implícita de um referencial \(\mathcal{F}_0\).
Poderíamos então descrever o movimento do objeto fornecendo a todo instante de tempo a transformação rígida entre o tempo \(t=0\) e o tempo atual!
Há uma maneira mais conveniente...
Vamos grudar um referencial \(\mathcal{F}_{obj}\) no objeto!
Por grudar entenda-se que toda transformação rígida que o objeto sofrer, o referencial também irá.
Note que um referencial, se considerarmos como formado por três "setas" ortogonais rígidas, também é um corpo rígido. Então podemos pensar, sem problemas, em aplicar uma transformação rígida em um referencial.
Note também que se soubermos como o referencial grudado está em um instante \(t\), sabemos como o objeto inteiro estará nesse mesmo tempo \(t\).
Então, em vez de especificar a transformação do objeto no tempo \(t=0\) até um tempo \(t\) genérico, especificamos a transformação \(T_t\) entre o referencial base, \(\mathcal{F}_0\), e o do objeto, \(\mathcal{F}_{obj}\) naquele tempo \(t\)!
Isso é mais simples pois (i) não mais precisamos saber explicitamente como o objeto estava em \(t=0\) e (ii) é mais fácil especificar transformações rígidas entre objetos simples como referenciais do que entre objetos complexos, como um corpo rígido arbitrário.
Exemplo:
No tempo \(t\) mostrado ao lado a transformação \(T_t\) seria a de rotação de -30 graus no eixo \(x_0\) (note que ele está rodado 30 graus no sentido negativo), o deslocamento de 2 unidades em \(y_0\) e 1 unidade em \(z_0\).
Como o objeto estava em \(t=0\)? Não há como saber...
Para descrever o movimento de um corpo rígido, precisamos fornecer a todo tempo \(t\) a transformação \(T_t\).
Já que \(T_t(p) = Q(t)p+s(t)\), isso equivale a fornecer, a todo instante de tempo \(t\), a matriz de rotação \(Q(t)\) e o vetor de deslocamento \(s(t)\).
Podemos fornecer essas duas informações usando apenas uma matriz.
Definição: Uma matriz de transformação homogênea (MTH) é uma matriz \(H \in \mathbb{R}^{4 \times 4}\) montada da seguinte forma:
$$H = \left(\begin{array}{cc} Q & s \\ 0_{1 \times 3} & 1 \end{array}\right)$$em que \(Q \in \mathbb{R}^{3 \times 3}\) é uma matriz de rotação, \(s \in \mathbb{R}^{3 \times 1}\) é um vetor coluna, e \(0_{1 \times 3}\) é um vetor linha nulo de três elementos.
Uma matriz de transformação homogênea representa uma transformação rígida, e vice-e-versa.
MTHs têm várias utilidades ao representar transformações rígidas.
Por exemplo, a composição de transformações rígidas também é uma transformação rígida. Se \(T_1(p) = Q_1p+s_1\) e \(T_2(p) = Q_2p+s_2\). Então: $$T_2(T_1(p)) = (Q_2Q_1)p + (Q_2s_1+s_2).$$
Note que, assim como no caso de rotações, as transformações não necessariamente comutam: (\(T_2T_1 \not= T_1T_2\))
Sejam as respectivas MTH das transformações \(T_1\), \(T_2\) e \(T_3 = T_2T_1\):
$$H_1 = \left(\begin{array}{cc} Q_1 & s_1 \\ 0_{1 \times 3} & 1 \end{array}\right) \ , \ H_2 = \left(\begin{array}{cc} Q_2 & s_2 \\ 0_{1 \times 3} & 1 \end{array}\right),$$
$$H_3 = \left(\begin{array}{cc} Q_2Q_1 & Q_2s_1+s_2 \\ 0_{1 \times 3} & 1 \end{array}\right).$$
Não é difícil ver que \(H_3 = H_2H_1\), ou seja, se representarmos transformações rígidas por MTH, a composição de duas transformações é o produto matricial (na ordem correta) das respectivas MTHs!
Temos 4 MTHs básicas, representando rotações em \(x, y\) e \(z\) e uma translação de um vetor \(s \in \mathbb{R}^{3 \times 1}\)
$$\tilde{R}_x(\theta) = \left(\begin{array}{cc} R_x(\theta) & 0_{3 \times 1} \\ 0_{1 \times 3} & 1 \end{array}\right) \ , \ \tilde{R}_y(\theta) = \left(\begin{array}{cc} R_y(\theta) & 0_{3 \times 1} \\ 0_{1 \times 3} & 1 \end{array}\right), $$
$$\tilde{R}_z(\theta) = \left(\begin{array}{cc} R_z(\theta) & 0_{3 \times 1} \\ 0_{1 \times 3} & 1 \end{array}\right) \ , \ \tilde{D}(s) = \left(\begin{array}{cc} I_{3 \times 3} & s \\ 0_{1 \times 3} & 1 \end{array}\right). $$
Em que \(R_x(\theta), R_y(\theta)\) e \(R_z(\theta)\) são as matrizes de rotação 3x3.
No UAIBot, essas quatro matrizes são implementadas com as funções Utils.rotx, Utils.roty, Utils.rotz, Utils.trn
import numpy as np
import uaibot as ub
theta=3.14/2
s = [1,2,3]
Rx = ub.Utils.rotx(theta)
Ry = ub.Utils.roty(theta)
Rz = ub.Utils.rotz(theta)
D = ub.Utils.trn(s)
Agora está explicado o porquê das matrizes de rotação serem 4x4 (e não 3x3): elas estão na sua forma de MTH.
Vimos que uma matriz de rotação \(Q\) tem duas intepretações (como referencial e como operador).
Uma MTH também tem duas, analogamente. Já vimos uma:
Uma matriz de rotação representa uma operação de rotação, que é um caso especial de transformação rígida. Uma MTH representa uma transformação rígida mais geral.
Podemos imaginar qual é a segunda interpretação:
A diferença é que, enquanto uma matriz de rotação representa um referencial \(\mathcal{F}_1\) que tem o mesmo centro que \(\mathcal{F}_0\), uma MTH representa um referencial genérico cujos centros não necessariamente coincidem.
É muito simples ler o referencial.
Assim como no caso das matrizes de rotação, há uma conexão entre as duas interpretações.
Se aplicarmos a transformação descrita por \(H\) nos três vetores do referencial \(\mathcal{F}_0\), obtemos um referencial \(\mathcal{F}_1\) que é o mesmo que obteríamos pela interpretação que \(H\) representa um referencial.
Considere um corpo rígido em que, em um determinado de instante tempo \(t=10s\), tenha sua pose descrita pela MTH \(H\) no referencial \(\mathcal{F}_0\). Desenhe como o objeto estará no tempo \(t=10s\).
Muito importante: a informação dada nos permite apenas saber como está o corpo rígido no tempo \(t=10s\)! Sem mais informações, não é possível inferir mais nada. Por exemplo, não sabemos nada como ele estava no tempo \(t=0\) nem como ele se moveu de lá para o tempo \(t=10s\).
Para sabermos o movimento completo, precisaríamos saber, a todo instante de tempo \(t\), a matriz de transformação homogênea \(H(t)\).
Na animação ao lado, é fornecido, a todo instante de tempo, a matriz \(H(t)\). Desta forma, é possível fazer um rastreamento contínuo do movimento do objeto.
Para terminar, temos que falar um pouco mais sobre a composição de transformações rígidas, descritas como MTHs.
A partir de agora, vamos usar os símbolos \(R_x(\theta), R_y(\theta), R_z(\theta), D_x(d), D_y(d), D_z(d)\) para as MTHs de rotações e deslocamentos, respectivamente, em que \(\theta, d \in \mathbb{R}\).
Considere um referencial \(\mathcal{F}_0\). Aplicamos as transformações representadas pelas MTHs \(H_1, H_2, H_3\) e \(H_4\), nessa ordem.
Teremos então uma MTH final \(H_{F} = H_4 H_3 H_2 H_1\), em que as transformações mais recentes vêm à esquerda, multiplicando a matriz.
Note que todas as transformações são interpretadas em \(\mathcal{F}_0\). Portanto, se \(H_2\) é um deslocamento em \(z\) de 5 unidades, aplicaremos um deslocamento em \(z_0\) de 5 unidades.
Considere a sequência de transformações a seguir:
$$H = R_x(\pi/4) D_y(-0.25) R_z(\pi/2) D_x(1).$$
Note a ordem (\(D_x(1)\) primeiro, \(R_z(\pi/2)\) depois, etc...).
Lemos da direita para a esquerda!
Veja o vídeo ao lado com a sequência de transformações.
Note que todas as transformações são feitas com relação ao referencial \(\mathcal{F}_0\).
Há outra maneira de interpretar a mesma transformação!
Chegaremos no mesmo referencial final \(H\) se lermos da esquerda para direita, mas considerando que as transformações são interpretadas no referencial atual em vez de \(\mathcal{F}_0\)!
Veja o vídeo ao lado com a sequência de transformações.
Note que o referencial final é o mesmo! Só os referenciais intermediários mudam.
Assim, ao fazer uma composição de transformações, podemos multiplicar a matriz à esquerda ou a direita:
As duas aplicações são úteis. Em robótica, entretanto, é mais comum fazermos aplicações à direita (no referencial atual).
A ideia de multiplicações à direita (escritas no referencial atual) é frequentemente usada para fazer uma cadeia de transformações!
Considere três referenciais \(\mathcal{F}_A\), \(\mathcal{F}_B\) e \(\mathcal{F}_C\). Considere que temos a transformacão rígida \(T_A^B\) entre \(\mathcal{F}_A\) e \(\mathcal{F}_B\), e a transformacão rigida \(T_B^C\) entre \(\mathcal{F}_B\) e \(\mathcal{F}_C\). Como obter a transformacão entre \(\mathcal{F}_A\) e \(\mathcal{F}_C\)?
Primeiro transformamos do referêncial \(\mathcal{F}_A\) para \(\mathcal{F}_B\), que é a matriz \(T_A^B\). Depois, como a transformação \(T_B^C\) está escrita em \(\mathcal{F}_B\), multiplicamos à direita para obter \(T_A^C = T_A^B T_B^C\).
A mesma lógica seria válida se tivéssemos, por exemplo, um quarto referencial \(\mathcal{F}_D\) e a transformação \(T_C^D\). Teríamos \(T_A^D = T_A^B T_B^C T_C^D\)...
Vamos, de agora em diante, usar a notação \(T_A^B\) para representar a transformação de \(\mathcal{F}_A\) para \(\mathcal{F}_B\). Pela outra interpretação de MTHs, essa matriz também dá o referencial \(\mathcal{F}_B\) escrito em em \(\mathcal{F}_A\).
Podemos descrever o movimento de um corpo rígido se (1) escolhermos um referencial base \(\mathcal{F}_0\) e (2) grudarmos um referencial \(\mathcal{F}_{obj}\) nele.
A partir disso, basta fornecer a todo instante de tempo \(t\) a MTH que representa a transformação rígida entre o referencial \(\mathcal{F}_0\) (fixo) e o do objeto \(\mathcal{F}_{obj}\) (móvel) naquele instante de tempo \(t\).
Tendo como está o referencial \(\mathcal{F}_{obj}\) naquele tempo, conseguimos dizer exatamente como estão todas as partículas do corpo rígido naquele instante de tempo, cumprindo nosso objetivo de fazer a descrição de movimento do objeto.