Source code for jaxsim.math.inertia

import jax.numpy as jnp

import jaxsim.typing as jtp

from .skew import Skew


[docs] class Inertia:
[docs] @staticmethod def to_sixd(mass: jtp.Float, com: jtp.Vector, I: jtp.Matrix) -> jtp.Matrix: """ Convert mass, center of mass, and inertia matrix to a 6x6 inertia matrix. Args: mass (jtp.Float): The mass of the body. com (jtp.Vector): The center of mass position (3D). I (jtp.Matrix): The 3x3 inertia matrix. Returns: jtp.Matrix: The 6x6 inertia matrix. Raises: ValueError: If the shape of the inertia matrix I is not (3, 3). """ if I.shape != (3, 3): raise ValueError(I, I.shape) c = Skew.wedge(vector=com) M = jnp.vstack( [ jnp.block([mass * jnp.eye(3), mass * c.T]), jnp.block([mass * c, I + mass * c @ c.T]), ] ) return M
[docs] @staticmethod def to_params(M: jtp.Matrix) -> tuple[jtp.Float, jtp.Vector, jtp.Matrix]: """ Convert a 6x6 inertia matrix to mass, center of mass, and inertia matrix. Args: M (jtp.Matrix): The 6x6 inertia matrix. Returns: tuple[jtp.Float, jtp.Vector, jtp.Matrix]: A tuple containing mass, center of mass (3D), and inertia matrix (3x3). Raises: ValueError: If the input matrix M has an unexpected shape. """ m = jnp.diag(M[0:3, 0:3]).sum() / 3 mC = M[3:6, 0:3] c = Skew.vee(mC) / m I = M[3:6, 3:6] - (mC @ mC.T / m) return m, c, I