Skip to content
Snippets Groups Projects
utils.py 1.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • Facebook Community Bot's avatar
    Facebook Community Bot committed
    #!/usr/bin/env python3
    
    # Copyright (c) Facebook, Inc. and its affiliates.
    # This source code is licensed under the MIT license found in the
    # LICENSE file in the root directory of this source tree.
    
    import numpy as np
    
    import quaternion  # noqa # pylint: disable=unused-import
    
    Facebook Community Bot's avatar
    Facebook Community Bot committed
    
    
    def quaternion_to_rotation(q_r, q_i, q_j, q_k):
    
    Facebook Community Bot's avatar
    Facebook Community Bot committed
        ref: https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
        """
        s = 1  # unit quaternion
        rotation_mat = np.array(
            [
                [
                    1 - 2 * s * (q_j ** 2 + q_k ** 2),
                    2 * s * (q_i * q_j - q_k * q_r),
                    2 * s * (q_i * q_k + q_j * q_r),
                ],
                [
                    2 * s * (q_i * q_j + q_k * q_r),
                    1 - 2 * s * (q_i ** 2 + q_k ** 2),
                    2 * s * (q_j * q_k - q_i * q_r),
                ],
                [
                    2 * s * (q_i * q_k - q_j * q_r),
                    2 * s * (q_j * q_k + q_i * q_r),
                    1 - 2 * s * (q_i ** 2 + q_j ** 2),
                ],
            ],
            dtype=np.float32,
        )
        return rotation_mat
    
    
    
    def quaternion_rotate_vector(quat: np.quaternion, v: np.array) -> np.array:
        r"""Rotates a vector by a quaternion
    
        Args:
            quaternion: The quaternion to rotate by
            v: The vector to rotate
    
        Returns:
            np.array: The rotated vector
        """
        vq = np.quaternion(0, 0, 0, 0)
        vq.imag = v
        return (quat * vq * quat.inverse()).imag
    
    
    
    def quaternion_from_coeff(coeffs: np.ndarray) -> np.quaternion:
        r"""Creates a quaternions from coeffs in [x, y, z, w] format
        """
        quat = np.quaternion(0, 0, 0, 0)
        quat.real = coeffs[3]
        quat.imag = coeffs[0:3]
        return quat
    
    
    
    Facebook Community Bot's avatar
    Facebook Community Bot committed
    def cartesian_to_polar(x, y):
        rho = np.sqrt(x ** 2 + y ** 2)
        phi = np.arctan2(y, x)
        return rho, phi