Problema/duda Matlab matriz de transformación homogenea

Hola a todos, he estado intentando multiplicar una serie de matrices, algunas con variables simbólicas creando funciones propias y demás. Comparto todo abajo.

Creo que el problema reside en el uso de esas variables simbólicas porque al multiplicar alguna matriz que las contiene es cuando el problema aparece. A ver...

Las funciones que uso son estas:

Rotación theta enx eje X.

function RX = MRX(theta)

RX=[1 0 0 0;0 cos(theta) -sin(theta) 0;0 sin(theta) cos(theta) 0;0 0 0 1];

end

Rotación theta en eje Y.

function RY = MRY(theta)

RY=[cos(theta) 0 sin(theta) 0;0 1 0 0;-sin(theta) 0 cos(theta) 0;0 0 0 1];

end

Rotación theta en eje Z.

function RZ = MRZ(theta)

RZ=[cos(theta) -sin(theta) 0 0;sin(theta) cos(theta) 0 0;0 0 1 0;0 0 0 1];

end

Traslación vector r.

function TP = MTP(r)

TP=[1 0 0;0 1 0;0 0 1];

TP(1,4)=r(1);
TP(2,4)=r(2);
TP(3,4)=r(3);
TP(4,4)=1;

end

Como podéis veer son funciones fáciles que lo único que hacen es generar matrices de 4x4.

El "código" de Matlab es el siguiente:

>> p0=[1.5 1 1.5];
>> r1=[0 0 1];
>> r2=[0 1 0];
>> r3=[0 0 -0.1];
>> syms t1 t2 t3

>> M1=MTP(p0);
>> M2=MRY(-pi/2);
>> M3=MRZ(pi/2);
>> M4=MRX(-t1);
>> M5=MTP(r1);
>> M6=MRX(-t2);
>> M7=MTP(r2);
>> M8=MRX(-t3);
>> M9=MTP(r3);
>> T=M1*M2*M2*M3*M4*M5*M6*M7*M8*M9;

Básicamente creo 4 vectores (p0, r1, r2 y r3) y tres variables simbólicas (t1, t2, t3). Las variables simbólicas son ángulos de giro theta1 (t1), theta2 (t2), theta3 (t3). Creo nueve matrices y las multiplico.

A continuación pongo el resultado que se genera solo para, por ejemplo, la multiplicación de M3 (que es una rotación en el eje z de 90º) y M4 (que es una rotación en el eje x un ángulo t1).

>> M3

M3 =

0.0000 -1.0000 0 0
1.0000 0.0000 0 0
0 0 1.0000 0
0 0 0 1.0000

//nota*( sin corchetes, no se porqué???)

M4 =

[ 1, 0, 0, 0]
[ 0, cos(t1), sin(t1), 0]
[ 0, -sin(t1), cos(t1), 0]
[ 0, 0, 0, 1]

//nota*( con corchetes, no se porqué???)

>> M3*M4

ans =

[ 4967757600021511/81129638414606681695789005144064, -cos(t1), -sin(t1), 0]
[ 1, (4967757600021511*cos(t1))/81129638414606681695789005144064, (4967757600021511*sin(t1))/81129638414606681695789005144064, 0]
[ 0, -sin(t1), cos(t1), 0]
[ 0, 0, 0, 1]

Puede verse claramente que esa retahíla de números no es la solución correcta.

En fin, no se que hago mal.

//nota* Algo que tampoco se porque ocurre es que las matrices con variables simbólicas aparecen como cuatro vectores entre corchetes y las otras no.

Si alguien me pudiese ayudar se lo agradeceré enormemente.

En cualquier caso, gracias de antemano y un saludo a todos.
 
.....
Básicamente creo 4 vectores (p0, r1, r2 y r3) y tres variables simbólicas (t1, t2, t3). Las variables simbólicas son ángulos de giro theta1 (t1), theta2 (t2), theta3 (t3). Creo nueve matrices y las multiplico.

..........

En fin, no se que hago mal.
...........

Básicamente porque lo que escribiste no tiene sentido.

En una rotación las coordenadas originales se multiplican por la matriz de rotación, pero en una traslación se suman (o restan) de las coordenadas del nuevo origen.

Por otro lado, usás matrices de 4x4 para la rotación, salvo que sea una exigencia del software, no se por qué no usás de 3x3.
Y la matriz de traslación de ser de 4x1 (o 3x1) no de 3x3. (o de 1x4 o 1x3 según multipliques por derecha o izquierda)
 
Sale sin corchetes porque sale sin corchetes.
Para meter una matriz se mete con corchetes pero el resultado sale tabulado, más visible
 
Básicamente porque lo que escribiste no tiene sentido.

En una rotación las coordenadas originales se multiplican por la matriz de rotación, pero en una traslación se suman (o restan) de las coordenadas del nuevo origen.

Por otro lado, usás matrices de 4x4 para la rotación, salvo que sea una exigencia del software, no se por qué no usás de 3x3.
Y la matriz de traslación de ser de 4x1 (o 3x1) no de 3x3. (o de 1x4 o 1x3 según multipliques por derecha o izquierda)

A ver..., cuando usas matrices de rotación y traslación es posible representar posición y orientación. Como creo que dije al principio, yo utilizo matrices de transformación homogenea porque éstas permiten la representación de la posición y orientación conjunta, es decir, la "localización". Las matrices de transformación homogenea estan formadas por la matriz de rotación y la de traslación conjuntamente, además es posible cambiar la perspectiva y el escalado. En este caso las perspectiva no varía y el escalado tampoco por eso la ultima fila es siempre (0 0 0 1). Mira en cualquier libro de robótica porque seguramente lo expliquen mejor que yo.

Mi problema, que porcierto ninguna de las respuestas resuelve, es que matlab me muestra fracciones en vez de números decimales y esto sólo ocurre cuando sustituyo las variables simbólicas por el valor que corresponde en cada caso. Tengo el programa con formato short de salida por lo que eso no es lo que pasa.

Sin nada más que añadir, un saludo.
Sale sin corchetes porque sale sin corchetes.
Para meter una matriz se mete con corchetes pero el resultado sale tabulado, más visible

Vale, gracias.

Un saludo.
Voy a poner otro ejemplo, no se si el anterior fue adecuado o simplemente yo no me exprese bien.

>> syms t1 t2
>> J=[cos(t1+t2)/sin(t2) (cos(t1+t2)+cos(t1))/sin(t2);-sin(t1+t2)/sin(t2) -(sin(t1+t2)+sin(t1))/sin(t2)]

J =

[ cos(t1 + t2)/sin(t2), (cos(t1 + t2) + cos(t1))/sin(t2)]
[ -sin(t1 + t2)/sin(t2), -(sin(t1 + t2) + sin(t1))/sin(t2)]

>> subs(J,{t1,t2},{0.251244,1.79133})

ans =

[ cos(1149866938159583/562949953421312)/sin(8067433120497591/4503599627370496), (cos(1149866938159583/562949953421312) + cos(1131502384779073/4503599627370496))/sin(8067433120497591/4503599627370496)]
[ -sin(1149866938159583/562949953421312)/sin(8067433120497591/4503599627370496), -(sin(1149866938159583/562949953421312) + sin(1131502384779073/4503599627370496))/sin(8067433120497591/4503599627370496)]

La matriz J es la Jacobiana inversa que relaciona las velocidades de giro del extremo del robot con las de las articulaciones. Dicho esto, que la verdad no tiene más importancia que saber lo que es, el problema sigue siendo el mismo, matlab me muestra por pantalla estas retahílas de números en fracciones en vez de un número decimal.

Gracias de antemano y un saludo.
 
Última edición:
Me parece que sencillamente no los opera, me parece que es problema.a de formato, que te falten espacios entre el número y la coma y cosas así.
Es decir
cos(a+b) no lo opera
cos ( a + b) sí que lo opera

Eso o algo por el estilo.
 
....
Mi problema, que porcierto ninguna de las respuestas resuelve, es que matlab me muestra fracciones en vez de números decimales y esto sólo ocurre cuando sustituyo las variables simbólicas por el valor que corresponde en cada caso. Tengo el programa con formato short de salida por lo que eso no es lo que pasa.

:unsure: cuando copypego el ejemplo que diste recién no me sale con ese formato:

>> syms t1 t2 J=[cos(t1+t2)/sin(t2) (cos(t1+t2)+cos(t1))/sin(t2);-sin(t1+t2)/sin(t2) -(sin(t1+t2)+sin(t1))/sin(t2)] J = [ cos(t1+t2)/sin(t2), (cos(t1+t2)+cos(t1))/sin(t2)] [ -sin(t1+t2)/sin(t2), (-sin(t1+t2)-sin(t1))/sin(t2)] >> subs(J,{t1,t2},{0.251244,1.79133}) ans = -0.46575 0.52689 -0.91287 -1.1677 >>


Y lo mismo con la rotación de antes

>> p0=[1.5 1 1.5]; r1=[0 0 1]; r2=[0 1 0]; r3=[0 0 -0.1]; syms t1 t2 t3 ; M1=MTP(p0); M2=MRY(-pi/2); M3=MRZ(pi/2); M4=MRX(-t1); M5=MTP(r1); M6=MRX(-t2); M7=MTP(r2); M8=MRX(-t3); M9=MTP(r3); T=M1*M2*M2*M3*M4*M5*M6*M7*M8*M9; subs(T,{t1,t2,t3},{0.251244,1.79133,.78}) ans = -6.1232e-017 -0.94954 0.31363 1.2628 1 -5.8143e-017 1.9205e-017 1 7.4988e-033 0.31363 0.94954 1.3272 0 0 0 1 >>
 
Atrás
Arriba