Traducción del original en coreano escrito por el autor. Leer el original (한국어)
FEM para la dinámica de cuerpos rígidos: Manejo de rotaciones basado en cuaterniones y tensores de inercia
El tetraedro lineal tiene 12 grados nodales y la restricción rígida los deja en 6. El paso estable cumple dt por debajo de 2/omega_max, y la pose intermedia se queda en la esfera con SLERP.
Ecuaciones Básicas de la Dinámica de Cuerpos Rígidos#
En un cálculo de FSI o en un montón de DEM, un cuerpo rígido solo tiene que mantener fijas las distancias entre puntos. No hay deformación. Lo que suele romperse primero es la representación de la rotación.
La velocidad de la partícula es traslación del centro de masa más una rotación.
es la velocidad del centro de masa, la velocidad angular y el desplazamiento desde el centro de masa.
El control de eje y el de ω cambian el eje de giro y el tiempo de una vuelta, aunque la magnitud de la velocidad angular se quede igual.
주황 화살표가 회전축. 사원수 q를 직접 곱해 매 프레임 큐브를 회전시킨다 — 짐벌락 없이 안정.
Al subir ω el cuerpo cierra la vuelta antes. Con el eje sobre una diagonal del cuerpo, se observa si algún ángulo queda trabado en un solo eje de coordenadas.
Momento Lineal y Momento Angular#
El momento lineal total a partir de la segunda ley de Newton es:
Donde es la masa total. La aceleración del centro de masa es:
El momento angular total es:
Donde es el tensor de inercia (inertia tensor) y es el par motor o torque total.
Tensor de Inercia#
El tensor de inercia con respecto al centro de masa es:
Extendiéndolo a un continuo:
Donde es el tensor identidad y es el producto externo (outer product).
Cuando un objeto gira, el tensor de inercia se transforma mediante la matriz de orientación .
Donde es el tensor de inercia inicial en el sistema de referencia del cuerpo (body frame), el cual solo necesita calcularse una vez al inicio de la simulación.
Representación de la Rotación mediante Cuaterniones#
Representar la rotación con ángulos de Euler provoca el problema del bloqueo del cardán (gimbal lock). Para evitar esto, se utilizan cuaterniones (quaternions).
Un cuaternión consta de una parte escalar y una parte vectorial.
Una rotación de un ángulo sobre un eje unitario es:
La rotación compuesta de dos cuaterniones y se expresa como un producto.
Utilizando esto, la matriz de orientación se expresa explícitamente en términos de los componentes del cuaternión.
La derivada temporal de un cuaternión está vinculada a la velocidad angular .
La diagonal de es . Fuera de la diagonal queda . Si toda la masa está sobre el eje , entonces , y . Alrededor de ese eje no hay brazo de palanca. es esa suma, guardada una vez en el marco del cuerpo. En el marco del mundo solo hay que rehacer . Multiplicar un tensor del cuerpo por una velocidad angular del mundo inclina el eje del torque. La misma congruencia aparece al cambiar de coordenadas un tensor de rigidez, que es lo que sigue la transformación del tensor constitutivo dentro del elemento.
En , y , así que . Es el cuaternión con el que arranca el código. En , y : el escalar se apaga y la parte vectorial es solo el eje . En , y . La rotación coincide con la identidad. Solo cambió el signo. Un cuaternión cubre una vuelta completa dos veces. La entrada de es , que vale 1 para esa identidad, y las entradas fuera de la diagonal valen 0. El delante de es el mismo factor que en la fórmula del ángulo. Integrarlo tal cual aleja de 1. Un tetraedro lineal tiene 4 nodos y 3 desplazamientos por nodo, 12 grados de libertad. La restricción rígida los deja en 3 traslaciones más 3 rotaciones, 6 en total. solo mantiene cerradas las coordenadas. No fabrica esos 6 por su cuenta.
Discretización FEM y Funciones de Forma Tetraédricas#
Al discretizar el campo de desplazamiento de un cuerpo rígido en FEM, las funciones de forma (shape functions) de un elemento tetraédrico son:
Donde son coordenadas baricéntricas adimensionales y satisfacen la condición .
En elementos tetraédricos lineales, la interpolación del desplazamiento es:
Al aplicar las restricciones de cuerpo rígido, los grados de libertad se reducen a 6 (3 lineales + 3 rotacionales).
Ejemplo de Implementación en Python#
import numpy as np
class RigidBody:
def __init__(self, mass, I_body):
self.M = mass
self.I0 = I_body # Tensor de inercia en el body frame (3x3)
self.x_cm = np.zeros(3) # Posición del centro de masa
self.v_cm = np.zeros(3) # Velocidad del centro de masa
self.q = np.array([1., 0., 0., 0.]) # Cuaternión (w, x, y, z)
self.omega = np.zeros(3) # Velocidad angular
def quaternion_to_rotation(self):
w, x, y, z = self.q
return np.array([
[1-2*(y**2+z**2), 2*(x*y - w*z), 2*(x*z + w*y)],
[2*(x*y + w*z), 1-2*(x**2+z**2), 2*(y*z - w*x)],
[2*(x*z - w*y), 2*(y*z + w*x), 1-2*(x**2+y**2)]
])
def inertia_world(self):
R = self.quaternion_to_rotation()
return R @ self.I0 @ R.T
def step(self, F_ext, tau_ext, dt):
# Integración del movimiento lineal
a_cm = F_ext / self.M
self.v_cm += a_cm * dt
self.x_cm += self.v_cm * dt
# Integración del movimiento rotacional
I_world = self.inertia_world()
alpha = np.linalg.solve(I_world, tau_ext - np.cross(self.omega, I_world @ self.omega))
self.omega += alpha * dt
# Actualización del cuaternión
omega_q = np.concatenate([[0.], self.omega])
q_dot = 0.5 * quaternion_multiply(omega_q, self.q)
self.q += q_dot * dt
self.q /= np.linalg.norm(self.q) # Normalización del cuaternión unitario
def quaternion_multiply(q1, q2):
w1, x1, y1, z1 = q1
w2, x2, y2, z2 = q2
return np.array([
w1*w2 - x1*x2 - y1*y2 - z1*z2,
w1*x2 + x1*w2 + y1*z2 - z1*y2,
w1*y2 - x1*z2 + y1*w2 + z1*x2,
w1*z2 + x1*y2 - y1*x2 + z1*w2
])Sin la normalización, R deja de ser una rotación#
Si no vuelve a 1 en cada paso, las columnas de pierden longitud unidad. La línea q /= norm(q) es esa división. Un torque calculado en el marco del mundo y multiplicado por tal cual manda por otro eje. El tensor del mundo es antes de que cuadre. El techo explícito es . Si crece, el paso se acorta primero.
Una mezcla recta entre dos orientaciones se hunde dentro de la esfera unidad. SLERP es la curva que vale en y en .
La interpolación lineal no se queda en esa esfera. Contar la libertad de rotación junto con la deformación del elemento hace que la restricción se coma el movimiento, del mismo modo que el bloqueo por cortante en una cáscara delgada endurece una placa que debería flexionarse. Un cuerpo rígido tiene 6 grados de libertad, no 12.
Relacionados
Comparte si te resultó útil.