【C++】sophus : rxso2.hpp 描述二维旋转和缩放的数学工具类 (二十)

206e7d856fe81012d56ad129e8ce762a.png

rxso2.hpp 文件主要实现了一个描述二维空间中旋转和缩放组合的数学对象RxSO2。这个对象结合了旋转群 SO(2) 和正实数缩放群 R+,可以用于表示和操作二维变换。以下是该文件的主要内容总结:

  1. 类模板定义

  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值