Sophus库使用笔记

这篇具有很好参考价值的文章主要介绍了Sophus库使用笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 李群李代数简介

sophus,# C++开源库,线性代数,矩阵

2. Sophus库简介

Eigen库是一个开源的C++线性代数库,它提供了快速的有关矩阵的线性代数运算,还包括解方程等功能。但是Eigen库提供了集合模块,但没有提供李代数的支持。一个较好的李群和李代数的库是Sophus库,它很好的支持了SO(3),so(3),SE(3)和se(3)。Sophus库是基于Eigen基础上开发的,继承了Eigen库中的定义的各个类。因此在使用Eigen库中的类时,既可以使用Eigen命名空间,也可以使用Sophus命名空间。

using Transformation = Matrix<Scalar, N, N>;
using Point = Vector3<Scalar>;
using HomogeneousPoint = Vector4<Scalar>;
using Line = ParametrizedLine3<Scalar>;
using Hyperplane = Hyperplane3<Scalar>;
using Tangent = Vector<Scalar, DoF>;
using Adjoint = Matrix<Scalar, DoF, DoF>;

此外,为了方便说明SE(4)和se(4),Sophus库还typedef了Vector4d、Matrix4d、Vector6d和Matrix6d等,即:

Sophus::Vector4d
Sophus::Matrix4d
Sophus::Vector6d
Sophus::Matrix6d

3. 安装方式

git clone https://github.com/strasdat/Sophus.git
cd Sophus
mkdir build 
cd build
cmake ..
make -j

4. CMake编写

CMAKE_MINIMUM_REQUIRED( VERSION 2.8)
PROJECT(useSophus)
FIND_PACKAGE(Sophus REQUIRED)
INCLUDE_DIRECTORIES(${Sophus_INCLUDE_DIRS})
add_executable(useSophus useSophus.cpp)
TARGET_LINK_LIBRARIES(useSophus ${Sophus_LIBRARIES})

5. 头文件

#include <Eigen/Core> //导入eigen库的核心组件
#include <Eigen/Geometry> //导入eigen库的几何组件

#include "sophus/so2.hpp" //导入sophus库的so2头文件
#include "sophus/se2.hpp" //导入sophus库的se2头文件
#include "sophus/sim2.hpp" //导入sophus库的sim2头文件
 
#include "sophus/so3.hpp" //导入sophus库的so3头文件
#include "sophus/se3.hpp" //导入sophus库的se3头文件
#include "sophus/sim3.hpp" //导入sophus库的sim3头文件

6. SO3,so3,SE3和se3初始化以及相互转换关系

sophus,# C++开源库,线性代数,矩阵

7. 李代数so3

Sophus::Vector3d //因为so(3)仅仅只是一个普通的3维向量

8. 李群SO3的构造函数

SO3();
SO3(const SO3& other);
explicit SO3(const Matrix3d& _R); // 使用旋转矩阵初始化
explicit SO3(const Quaterniond& unit_quaternion); // 使用四元数初始化
SO3(double rot_x, double rot_y, double rot_z); // 使用轴角初始化

9. SO3与so3的相互转换

Eigen::Vector3d so3_V1 = SO3_V1.log();//so(3) // 在Sophus(Eigen)中用vector3d表示,使用对数映射获得李群对应的李代数

Sophus::SO3 SO3_V2 = Sophus::SO3::exp(so3_V1); //使用指数映射将李代数转化为李群

Eigen::Matrix3d M_so3_V1 = Sophus::SO3::hat(so3_V1);//hat为向量到其对应的反对称矩阵

Eigen::Vector3d V_M = Sophus::SO3::vee(M_so3_V1);//vee为反对称矩阵对应的向量

10. SO3增量扰动模型

Eigen::Vector3d update_so3(1e-4,0,0);//假设更新量为这么多
Eigen::Matrix3d update_matrix=Sophus::SO3::exp(update_so3).matrix();//将李群转换为旋转矩阵
cout<<"SO3 update Matrix=\n"<<update_matrix<<endl<<endl;

Sophus::SO3 SO3_updated=Sophus::SO3::exp(update_so3)*SO3_R;
cout<<"SO3 updated = \n"<<SO3_updated<<endl;

Eigen::Matrix3d SO3_updated_matrix=SO3_updated.matrix();//将李群转换为旋转矩阵
cout<<"SO3 updated Matrix = \n"<<SO3_updated_matrix<<endl<<endl;

11. 李代数se3 

Sophus::Vector6d //因为se(3)仅仅只是一个普通的6维向量

12. 李群SE3的构造函数

SE3();
SE3(const SO3& so3, const Vector3d& translation);
SE3(const Matrix3d& rotation_matrix, const Vector3d& translation);
SE3(const Quaterniond& unit_quaternion, const Vector3d& translation_);
SE3(const SE3& other);

13. SE3与se3的相互转换

Sophus::Vector6d se3_Rt=SE_Rt.log(); //se(3)在Sophus中用Vector6d表示,使用对数映射获得李群对应的李代数

Sophus::SE3 SE3_Rt2=Sophus::SE3::exp(se3_Rt); //使用指数映射将李代数转化为李群

Sophus::Matrix4d M_se3_Rt=Sophus::SE3::hat(se3_Rt);

Sophus::Vector6d V_M_se3=Sophus::SE3::vee(M_se3_Rt);

14. SE3增量扰动模型

Sophus::Vector6d update_se3=Sophus::Vector6d::Zero();
update_se3(0)=1e-4d;

cout<<"update_se3\n"<<update_se3.transpose()<<endl<<endl;

Eigen::Matrix4d update_matrix2=Sophus::SE3::exp(update_se3).matrix();//将李群转换为旋转矩阵
cout<<"update matrix=\n"<<update_matrix2<<endl<<endl;

Sophus::SE3 SE3_updated=Sophus::SE3::exp(update_se3)*SE3_Rt2;
cout<<"SE3 updated=\n"<<SE3_updated<<endl<<endl;

Eigen::Matrix4d SE3_updated_matrix=SE3_updated.matrix();//将李群转换为旋转矩阵
cout<<"SE3 updated Matrix=\n"<<SE3_updated_matrix<<endl<<endl;

15. SO3, SE3和se3的输出说明

尽管SO3对应于矩阵群,但是SO3在使用cout时是以so3形式输出的,输出的是一个3维向量;

SE3在使用cout输出时输出的是一个6维向量,其中前3维为对应的so3的值,后3维为实际的平移向量t;

se3在使用cout输出时输出的也是一个6维向量,但是其前3维为平移值ρρ(注意此时的ρρ与SE3输出的t是不同的,t=Jρρ,其中J是雅克比矩阵),后3维为其对应的so3.

16. 插值

#include "sophus/interpolate.hpp"

Sophus::SE3f c = Sophus::interpolate(a, b, 0.5);

17. 转化为Eigen

Sophus::SE3f mTrl;
Eigen::Matrix3f mRrl = mTrl.rotationMatrix();
Eigen::Vector3d mtrl = mTrl.translation();

参考文献

Sophus库的安装和使用教程(转载)_山城盛夏的博客-程序员ITS401_sophus库 - 程序员ITS401

Sophus源码逐行解读 ( 结合视觉SLAM十四讲的概念 ) - 掘金文章来源地址https://www.toymoban.com/news/detail-599519.html

到了这里,关于Sophus库使用笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性代数笔记整理

    2024年02月11日
    浏览(32)
  • 【线性代数】快速复习笔记

    本文图片均参考自猴博士的视频https://www.bilibili.com/video/BV1fv411y7YY,侵联删 某行(列加上或减去另一行(列的几倍,行列式不变 某行列乘k,等于k乘此行列式 互换两行列,行列式变号 计算的书写步骤和规范 1 主对角线是X,其余是其他常数a 2 范德蒙德行列式 3 行列式加减法 例

    2024年02月11日
    浏览(46)
  • 线性代数的本质笔记

    课程来自b站发现的《线性代数的本质》,可以帮助从直觉层面理解线性代数的一些基础概念,以及把一些看似不同的数学概念解释之后,发现其实有内在的关联。 这里只对部分内容做一个记录,完整内容请自行观看视频~ 数字在线性代数中起到的主要作用就是缩放向量 线性

    2024年02月08日
    浏览(44)
  • 线性代数笔记

    1、性质一:D= 注:是把D的行转为了列。 2、性质二:任意 两行或两列 互换,D=-D1         推论: 若行列式有 两行或两列 相同,则该行列式的值为0。 3、性质三: 行列式的某 一行或一列 的公因子可提到外面。         推论:若行列式 有两行 成比例  ,则行列式的值为

    2024年02月04日
    浏览(33)
  • 线性代数相关笔记

    线性基,顾名思义,就是一个包含数字最少的集合,使得原集合中的任何数都能用线性基中的元素表示。 集合中的元素满足一些性质: 原集合中的任意元素都可以用线性基中的若干元素的异或和表示 线性基中任意数异或和不为 0 0 0 ,否则不满足集合大小最小 以任意顺序枚

    2024年02月06日
    浏览(40)
  • 线性代数:正交变换学习笔记

    在线性代数中,如果一个矩阵 A A A 满足 A T A = A A T = I A^T A = A A^T = I A T A = A A T = I ,则称其为正交矩阵。正交矩阵也常被称为正交变换。 正交变换是线性变换的一种特殊形式,它不改变向量的长度和夹角。因此,它可以用来描述旋转、镜像等几何变换。 正交矩阵有以下性质:

    2024年02月03日
    浏览(57)
  • 深度学习笔记之线性代数

    一、向量 在数学表示法中,向量通常记为粗体小写的符号(例如, x , y , z )当向量表示数据集中的样本时,它们的值具有一定的现实意义。例如研究医院患者可能面临的心脏病发作风险,用一个向量表示一个患者,其分量为最近的生命特征、胆固醇水平、每天运动时间等

    2024年02月08日
    浏览(46)
  • 线性代数:增广矩阵学习笔记

    定义 对于一个 n × m ntimes m n × m 的矩阵 A = [ a i j ] A=[a_{ij}] A = [ a ij ​ ] ,我们可以在它的右边加上一个 n × 1 ntimes1 n × 1 的列向量 b b b ,得到一个 n × ( m + 1 ) ntimes(m+1) n × ( m + 1 ) 的矩阵 [ A ∣ b ] begin{bmatrix} A bigl| bend{bmatrix} [ A ​ ​ ​ b ​ ] ,这个矩阵被称为 A A A 的

    2024年02月05日
    浏览(58)
  • 【线性代数|C++】克拉默法则

    设含有 n n n 个未知数 x 1 , x 2 , ⋯   , x n x_1,x_2,cdots ,x_n x 1 ​ , x 2 ​ , ⋯ , x n ​ 的 n n n 个线性方程的方程组 { a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2 ⋯ ⋯ ⋯ a n 1 x 1 + a n 2 x 2 + ⋯ + a n n x n = b n , (1) begin{cases} a_{11}x_1+a_{12}x_2+cdots +a_{1n}x_n=b_1 \\\\

    2024年04月16日
    浏览(48)
  • 线性代数笔记2--矩阵消元

    0. 简介 矩阵消元 1. 消元过程 实例方程组 { x + 2 y + z = 2 3 x + 8 y + z = 12 4 y + z = 2 begin{cases} x+2y+z=2\\\\ 3x+8y+z=12\\\\ 4y+z=2 end{cases} ⎩ ⎨ ⎧ ​ x + 2 y + z = 2 3 x + 8 y + z = 12 4 y + z = 2 ​ 矩阵化 A = [ 1 2 1 3 8 1 0 4 1 ] X = [ x y z ] A= begin{bmatrix} 1 2 1 \\\\ 3 8 1 \\\\ 0 4 1 end{bmatrix} \\\\ X= begin{bmatrix} x\\\\

    2024年02月22日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包