Hopf coordinates parametrizes SO(3) locally as the Cartesian product of a one-sphere and a two-sphere S¹ x S².
Computationally, each rotation in the Hopf coordinates can be written as (θ, φ, ψ), in which ψ parametrizes the circle S¹ and has a range of 2π, and θ, φ represent the spherical coordinates for S², with the range of π and 2π respectively.
#include <cmath>
#include <Eigen/Dense>
#include <Eigen/Geometry>
#include "drake/common/drake_assert.h"
#include "drake/common/eigen_types.h"
Namespaces | |
drake | |
drake::math | |
Functions | |
template<typename T > | |
const Eigen::Quaternion< T > | HopfCoordinateToQuaternion (const T &theta, const T &phi, const T &psi) |
Transforms Hopf coordinates to a quaternion w, x, y, z as w = cos(θ/2)cos(ψ/2) x = cos(θ/2)sin(ψ/2) y = sin(θ/2)cos(φ+ψ/2) z = sin(θ/2)sin(φ+ψ/2) The user can refer to equation 5 of Generating Uniform Incremental Grids on SO(3) Using the Hopf Fibration by Anna Yershova, Steven LaValle and Julie Mitchell, 2008. More... | |
template<typename T > | |
Vector3< T > | QuaternionToHopfCoordinate (const Eigen::Quaternion< T > &quaternion) |
Convert a unit-length quaternion (w, x, y, z) (with the requirement w >= 0) to Hopf coordinate as ψ = 2*atan2(x, w) φ = mod(atan2(z, y) - ψ/2, 2pi) θ = 2*atan2(√(y²+z²), √(w²+x²)) ψ is in the range of [-pi, pi]. More... | |