rxso2.hpp 文件主要实现了一个描述二维空间中旋转和缩放组合的数学对象RxSO2
。这个对象结合了旋转群 SO(2) 和正实数缩放群 R+,可以用于表示和操作二维变换。以下是该文件的主要内容总结:
类模板定义:
template <class Scalar_, int Options = 0> class RxSO2
:定义了RxSO2
模板类,用于描述带缩放的旋转矩阵。using RxSO2d = RxSO2<double>
和using RxSO2f = RxSO2<float>
:分别定义了double
和float
类型的RxSO2
。
类和方法实现:
RxSO2Base
:一个模板基类,实现了大部分RxSO2
的功能,包括旋转矩阵和缩放因子的计算、读取和设置。RxSO2
:派生类,继承自RxSO2Base
,提供了具体的数据存储和操作。
辅助函数和操作:
复数访问器:提供了对内部复数表示的读写访问,如
complex()
、data()
。矩阵变换和旋转:实现了旋转矩阵和缩放因子的计算,如
rotationMatrix()
、scale()
。指数和对数映射:实现了李群和李代数之间的转换,如
exp()
和log()
。群操作:实现了对点、直线和超平面的群操作,如
operator*()
。
特化和映射:
Eigen::Map
特化:实现了对RxSO2
和RxSO2 const
的特化,使其可以与Eigen
库的其他部分配合使用。
保护机制:
确保缩放因子在合理范围内,以避免数值不稳定。
总体来说,rxso2.hpp
文件实现了一个用于描述二维旋转和缩放的数学工具类,可以广泛用于计算机图形学、机器人学等领域。文件通过模板和特化的方式实现了灵活且高效的数值计算功能。
/// R X SO(2) 直积 - 在二维空间中的旋转和缩放。
#pragma once
#include "so2.hpp" // 包含定义 SO2 类的头文件
namespace Sophus { template <class Scalar_, int Options = 0> class RxSO2; // 定义模板类 RxSO2 using RxSO2d = RxSO2<double>; // RxSO2 类的 double 类型特化 using RxSO2f = RxSO2<float>; // RxSO2 类的 float 类型特化} // namespace Sophus
namespace Eigen { namespace internal { template <class Scalar_, int Options_> struct traits<Sophus::RxSO2<Scalar_, Options_>> { static constexpr int Options = Options_; // 定义 Options 常量 using Scalar = Scalar_; // 定义标量类型 using ComplexType = Sophus::Vector2<Scalar, Options>; // 定义复数类型 };
template <class Scalar_, int Options_> struct traits<Map<Sophus::RxSO2<Scalar_>, Options_>> : traits<Sophus::RxSO2<Scalar_, Options_>> { static constexpr int Options = Options_; // 定义 Options 常量 using Scalar = Scalar_; // 定义标量类型 using ComplexType = Map<Sophus::Vector2<Scalar>, Options>; // 定义复数类型 };
template <class Scalar_, int Options_> struct traits<Map<Sophus::RxSO2<Scalar_> const, Options_>> : traits<Sophus::RxSO2<Scalar_, Options_> const> { static constexpr int Options = Options_; // 定义 Options 常量 using Scalar = Scalar_; // 定义标量类型 using ComplexType = Map<Sophus::Vector2<Scalar> const, Options>; // 定义复数类型 }; } // namespace internal} // namespace Eigen
namespace Sophus { /// RxSO2 基类型 - 实现了 RxSO2 类但不包含存储特定信息 /// /// 这个类实现了群 ``R+ x SO(2)``, 即正实数群与二维特殊正交群 SO(2) 的直积。 /// 从几何上看,它是二维空间中的旋转和缩放的群。 /// 作为矩阵群,R+ x SO(2) 由形如 ``s * R`` 的矩阵组成,其中 ``R`` 是行列式为 1 的正交矩阵,``s > 0`` 是正实数。 /// 特别是,它具有如下形式: /// /// | s * cos(theta) s * -sin(theta) | /// | s * sin(theta) s * cos(theta) | /// /// 其中 ``theta`` 是旋转角度。在内部,它由旋转矩阵的第一列表示,或者说由一个非零的复数表示。 /// /// R+ x SO(2) 不是紧群,但它是交换群。首先,它不是紧群,因为缩放因子不受限。其次,它是交换群,因为 /// ``sR(alpha, s1) * sR(beta, s2) = sR(beta, s2) * sR(alpha, s1)``, 只是因为 ``alpha + beta = beta + alpha`` 和 ``s1 * s2 = s2 * s1`` /// 其中 ``alpha`` 和 ``beta`` 是旋转角度,``s1`` 和 ``s2`` 是缩放因子。 /// /// 这个类有一个显式的类不变性,即缩放 ``s`` 不会过于接近零或无穷大。严格来说,必须满足以下条件: /// /// ``complex().norm() >= Constants::epsilon()`` 并且 /// ``1. / complex().norm() >= Constants::epsilon()``。 /// /// 为了遵守这个条件,群乘法通过饱和实现,使得乘积始终具有不小于这个阈值的缩放比例。
template <class Derived> class RxSO2Base { public: static constexpr int Options = Eigen::internal::traits<Derived>::Options; // 定义 Options 常量 using Scalar = typename Eigen::internal::traits<Derived>::Scalar; // 定义标量类型 using ComplexType = typename Eigen::internal::traits<Derived>::ComplexType; // 定义复数类型 using ComplexTemporaryType = Sophus::Vector2<Scalar, Options>; // 定义临时复数类型
/// 流形的自由度,即切空间的维数 (一个用于旋转,一个用于缩放)。 static int constexpr DoF = 2;
/// 使用的内部参数数量 (复数是一个元组)。 static int constexpr num