35class RBY1_SDK_API
SO3 {
37 using MatrixType = Eigen::Matrix3d;
39 static MatrixType Identity();
41 static MatrixType Inverse(
const MatrixType& R);
43 static MatrixType Exp(so3v::MatrixType w,
double angle = 1.0);
45 static so3v::MatrixType
Log(
const MatrixType& R);
47 static MatrixType RotX(
double angle);
49 static MatrixType RotY(
double angle);
51 static MatrixType RotZ(
double angle);
53 static MatrixType FromEulerAngle(
const Eigen::Vector3d& angles, EulerAngleType type);
55 static Eigen::Vector3d ToEulerAngle(
const MatrixType& R, EulerAngleType type);
57 static MatrixType FromQuaternion(
const Eigen::Quaterniond& q);
59 static Eigen::Quaterniond ToQuaternion(
const MatrixType& R);
66 static MatrixType
FromRPY(
const Eigen::Vector3d& angles);
73 static Eigen::Vector3d
ToRPY(
const MatrixType& R);
75 static MatrixType Projection(
const MatrixType& m);
77 template <
typename Container,
typename = std::enable_if_t<std::is_same_v<
typename Container::value_type, MatrixType>>>
78 static std::optional<MatrixType> Average(
const Container& matrices,
double eps,
int max_iter = -1) {
79 if (matrices.size() == 0) {
83 SO3::MatrixType avg = *matrices.begin();
84 for (
int i = 0; max_iter < 0 || i < max_iter; i++) {
85 Eigen::Vector3d w = Eigen::Vector3d::Zero();
87 for (
const auto& m : matrices) {
88 w +=
Log(m * avg.inverse());
91 avg = SO3::Exp(w) * avg;
100 static Eigen::Vector3d GetX(
const MatrixType& R);
102 static Eigen::Vector3d GetY(
const MatrixType& R);
104 static Eigen::Vector3d GetZ(
const MatrixType& R);
106 static so3v::MatrixType Vec(
const so3::MatrixType& r);
108 static so3::MatrixType Hat(
const so3v::MatrixType& w);