SLAM算法与工程实践——SLAM基本库的安装与使用(4):Sophus库

news2024/11/17 6:28:48

SLAM算法与工程实践系列文章

下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此

SLAM算法与工程实践系列文章链接


下面是专栏地址:

SLAM算法与工程实践系列专栏


文章目录

  • SLAM算法与工程实践系列文章
    • SLAM算法与工程实践系列文章链接
    • SLAM算法与工程实践系列专栏
  • 前言
  • SLAM算法与工程实践——SLAM基本库的安装与使用(4):Sophus库
  • Sophus
    • 安装
    • 使用
      • Lie Gropus
      • 基本用法
      • 出现的错误
        • 错误1
        • 错误2
        • 错误3
        • 错误3
        • 错误4
        • 错误5


前言

这个系列的文章是分享SLAM相关技术算法的学习和工程实践


SLAM算法与工程实践——SLAM基本库的安装与使用(4):Sophus库

Sophus

参考:

Sophus库:对SO(3)和SE(3)的构建及扰动模型搭建

【一起读书】视觉SLAM十四讲 第4讲(下)这期干货满满!补充了很多Cmake进阶语法 分析了Sophus库相比于其他库的特殊之处 Pangolin配置见论区

Sophus库安装和使用

【7天搞定视觉SLAM】番外3——李代数库Sophus的使用

Sophus库官网链接:https://github.com/strasdat/Sophus

官网文档:

https://strasdat.github.io/Sophus/latest/

https://github.com/strasdat/Sophus/tree/fix-core-logging-performance-regression#lie-groups

https://farm-ng.github.io/docs/namespacesophus.html

Sophus库支持本章主要讨论的 SO(3) 和 SE(3),此外,还含有二维运动SO(2),SE(2)及相似变换Sim(3)的内容。

它是直接在Eigen基础上开发的,我们不需要安装额外的依赖库。可以直接从GitHub上获取Sophus,在本书的代码目录slambook/3 rdparty下也提供了Sophus源代码。

https://github.com/gaoxiang12/slambook

由于历史原因,Sophus早期版本只提供了双精度的李群/李代数类。后续版本改写成了模板类。

模板类的Sophus中可以使用不同精度的李群/李代数,但同时增加了使用难度。在本书中,我们使用带模板的Sophus库。本书的3 rdparty中提供的Sophus是模板版本,它应该在你下载本书代码的时候就已经复制下来了。

安装

参考:

SLAM第四讲实践:李代数Sophus库的安装和使用

SLAM十四讲ch4代码调整

查看自己Eigen的版本号,因为Sophus依赖于Eigen,所以如果版本过低需要卸载重装(最低2.91.0)

cat /usr/include/eigen3/Eigen/src/Core/util/Macros.h | more

在这里插入图片描述

我的版本为3.3.7, 满足要求

Sophus相关库链接如下:

(1)Eigen3.3.7版本:https://gitlab.com/libeigen/eigen/-/releases

(3)fmt(这个很重要,没有就会一直报错):https://github.com/fmtlib/fmt

(2)Sophus:https://github.com/strasdat/Sophus

安装fmt

git clone  https://github.com/fmtlib/fmt.git
cd fmt
mkdir build
cd build
cmake ..
make
sudo make install

如果不安装,在编译 Sophus 时会提示没有安装 fmt 库

在这里插入图片描述

安装完成

在这里插入图片描述

Sophus包的原作者不是高翔,你就载github上打开slambook2master包,点到sopuhs里去,找到原作者,直接从他那下载zip

因为高翔也是调用别人的包,所以下载后解压出来是空的,直接点到原始作者发布sophus包的地方,再下载就行了

在这里插入图片描述

进入原作者的github下载 Sophus

git clone https://github.com/strasdat/Sophus.git

进入Spohus下载的文件夹

mkdir build
cd build
cmake ..
make
sudo make install

安装 fmt 后再编译就不会报错了

在这里插入图片描述

安装

在这里插入图片描述

都安装好后,源码中的 #include 就没有红线了

在这里插入图片描述

我这里使用的是slambook2的代码

有关于

同样因为时模板类的Sophus,源码中的所有Sophus::SO3都需要声明为Sophus::SO3d 或者
Sophus::SO3.这个问题好像不存在,貌似只存在于slambook1

如果你是slambook1的代码,请去源码修改

编译运行slambook2 中ch4的代码后,得到输出的误差和下图

记得修改 groundtruth.txt 和 estimated.txt 的路径

RMSE = 2.20728
Framebuffer with requested attributes not available. Using available framebuffer. You may see visual artifacts.

在这里插入图片描述

运行 useSophus 文件如下所示

在这里插入图片描述

使用

Lie Gropus

c++ typeLie group nameDescriptionminimal representation#DoFMatrix representationcompact internal manifold representation#params
Rotation2<T>Special Orthogonal Group in 2D, SO(2)rotations in 2d, also called Circle Group, or just “angle”rotation angle12x2 matrixunit complex number2
Rotation3<T>Special Orthogonal Group in 3D, SO(3)rotations in 3d, 3D orientationsrotation vector33x3 matrixunit quaternion number4
Isometry2<T>Special Euclidean Group in 2D, SE(3)rotations and translations in 2D, also called 2D rigid body transformations, 2d poses, plane isometriestangent vector of SE(2)33x3 matrixunit complex number + translation vector2+2 = 4
Isometry3<T>Special Euclidean Group in 3D, SE(3)rotations and translations in 3D, also called rigid body transformations,6 DoF poses, Euclidean isometriestangent vector of R x SE(3)64x4 matrixunit quaternion number + translation vector4+3 = 7
RxSo2<T>Direct product of SO(3) and scalar matrix, R x SO(2)scaling and rotations in 2Dtangent vector of R x SO(2)32x2 matrixnon-zero complex number2
RxSo3<T>Direct product of SO(3) and scalar matrix R x SO(3)scaling and rotations in 3Dtangent vector of R x SO(3)43x3 matrixnon-zero quaternion number4
Similarity2<T>Similarity Group in 2D, Sim(2)scaling, rotations and translation in 2Dtangent vector of Sim(2)43x3 matrixnon-zero complex number+ translation vector2+2 = 4
Similarity3<T>Similarity Group in 3D, Sim(3)scaling, rotations and translation in 3Dtangent vector of Sim(3)44x4 matrixnon-zero complex number+ translation vector4+3 = 7
Cartesian2<T>2D Euclidean Vector Space, R^2all vector spaces are trivial Lie groups, also called 2d translation group, the translation part of SE(2)2-vector23x3 matrix2-vector2
Cartesian3<T>3D Euclidean Vector Space, R^3all vector spaces are trivial Lie groups, also called 3d translation group, the translation part of SE(2)3-vector34x4 matrix3-vector3

基本用法

包含头文件

#include "sophus/se3.hpp"

关于se3的官网文档:https://farm-ng.github.io/docs/namespacesophus_1_1se3.html

李群旋转表示

// 沿Z轴转90度的旋转矩阵
Matrix3d R = AngleAxisd(M_PI / 2, Vector3d(0, 0, 1)).toRotationMatrix();	//注意, AngleAxisd()中的旋转轴必须写成单位向量,如果不是单位向量,要先除以其模
  
// 或者四元数
Quaterniond q(R);
Sophus::SO3d SO3_R(R);              // Sophus::SO3d可以直接从旋转矩阵构造
Sophus::SO3d SO3_q(q);              // 也可以通过四元数构造
 // 二者是等价的
cout << "SO(3) from matrix:\n" << SO3_R.matrix() << endl;
cout << "SO(3) from quaternion:\n" << SO3_q.matrix() << endl;
cout << "they are equal" << endl;

SO3上还是表示矩阵,我们初始化的矩阵需要 .matrix() 方法输出矩阵

结果如下

在这里插入图片描述

这里R也可以表示旋转,为什么需要转换成SO3的形式? 因为SO3有很多其他的方法可以调用,如常用的 hat() 和 vee()

在这里插入图片描述

转换成李代数

// 使用对数映射获得它的李代数,使用SO3.log()可以实现大SO3->小so3的转换。
Vector3d so3 = SO3_R.log();
cout << "so3 = " << so3.transpose() << endl;
// 李代数so3 -> 李群SO3,使用SO3d::exp()可以实现小so3->大SO3的转换:
Sophus::SO3d SO3_so3 = Sophus::SO3d::exp(so3);
std::cout << "李代数so3 -> 李群SO3\n" << SO3_so3.matrix() <<std::endl;
// hat 为向量到反对称矩阵,
cout << "so3 hat=\n" << Sophus::SO3d::hat(so3) << endl;
// 相对的,vee为反对称到向量
cout << "so3 hat vee= " << Sophus::SO3d::vee(Sophus::SO3d::hat(so3)).transpose() << endl;

结果如下:

在这里插入图片描述

这里 s o 3 = ( 0 , 0 , 1.5708 ) so3=(0,0,1.5708) so3=(0,0,1.5708) 表示的是旋转向量,即

M_PI / 2 * Vector3d(0, 0, 1) 

注意,这里so3->SO3 不是简单的直接代入指数函数,而是指数映射!数值计算的话需要泰勒展开来进行计算

增量扰动

 // 增量扰动模型的更新
  Vector3d update_so3(1e-4, 0, 0); //假设更新量为这么多
  Sophus::SO3d SO3_updated = Sophus::SO3d::exp(update_so3) * SO3_R;
  cout << "SO3 updated = \n" << SO3_updated.matrix() << endl;

结果如下

在这里插入图片描述

这个操作是定义了一个 θ n \theta n θn,然后将其作为 Δ R \Delta R ΔR,再与 R R R 相乘

S E ( 3 ) SE(3) SE(3) 的操作

 // 对SE(3)操作大同小异
  Vector3d t(1, 0, 0);           // 沿X轴平移1
  Sophus::SE3d SE3_Rt(R, t);           // 从R,t构造SE(3)
  Sophus::SE3d SE3_qt(q, t);            // 从q,t构造SE(3)
  cout << "SE3 from R,t= \n" << SE3_Rt.matrix() << endl;
  cout << "SE3 from q,t= \n" << SE3_qt.matrix() << endl;
  // 李代数se(3) 是一个六维向量,方便起见先typedef一下
  typedef Eigen::Matrix<double, 6, 1> Vector6d;
  Vector6d se3 = SE3_Rt.log();
  cout << "se3 = " << se3.transpose() << endl;
  // 观察输出,会发现在Sophus中,se(3)的平移在前,旋转在后.
  // 同样的,有hat和vee两个算符
  cout << "se3 hat = \n" << Sophus::SE3d::hat(se3) << endl;
  cout << "se3 hat vee = " << Sophus::SE3d::vee(Sophus::SE3d::hat(se3)).transpose() << endl;
// 最后,演示一下更新
  Vector6d update_se3; //更新量
  update_se3.setZero();
  update_se3(0, 0) = 1e-4;
  Sophus::SE3d SE3_updated = Sophus::SE3d::exp(update_se3) * SE3_Rt;
  cout << "SE3 updated = " << endl << SE3_updated.matrix() << endl;

使用总结

在这里插入图片描述

出现的错误

错误1

报错说找不到Sophus

在这里插入图片描述

-- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
-- Could NOT find Sophus (missing: Sophus_DIR)
-- Could not find the required component 'Sophus'. The following CMake error indicates that you either need to install the package with the same name or change your environment so that it can be found.
CMake Error at /opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
  Could not find a package configuration file provided by "Sophus" with any
  of the following names:

    SophusConfig.cmake
    sophus-config.cmake

  Add the installation prefix of "Sophus" to CMAKE_PREFIX_PATH or set
  "Sophus_DIR" to a directory containing one of the above files.  If "Sophus"
  provides a separate development package or SDK, be sure it has been
  installed.
Call Stack (most recent call first):
  CMakeLists.txt:4 (find_package)

原因是使用了ROS,在find_package时,要将 Sophus 分开写

# 这样写会报错
find_package(catkin REQUIRED COMPONENTS
        roscpp
        pcl_ros
        std_msgs
        Sophus REQUIRED
)


# 这样写不会报这次提到的错误
find_package(Sophus REQUIRED)

find_package(catkin REQUIRED COMPONENTS
        roscpp
        pcl_ros
        std_msgs
)
错误2

参考:

fatal error: sophus/so3.h: No such file or directory

提示找不到 "sophus/so3.h 头文件

在这里插入图片描述

由于 sophus 安装到了 /usr/local/include/sophus 文件夹中,打开后显示文件如下

在这里插入图片描述

只有 so3.hppse3.hpp,没有 so3.h

将代码由 #include "sophus/so3.h" 改为

#include "sophus/so3.hpp"

即可

错误3

报错 没有参数列表的模板名称 “Sophus::SO3”

在这里插入图片描述

 error: invalid use of template-name ‘Sophus::SO3’ without an argument list
    6 | Sophus::SO3     rot = Sophus::SO3(Eigen::Matrix3d::Identity());
      | ^~~~~~

报错行代码为

在这里插入图片描述

Sophus::SO3     rot = Sophus::SO3(Eigen::Matrix3d::Identity());

要使用类 Sophus::SO3d ,将其改为

Sophus::SO3d     rot = Sophus::SO3d(Eigen::Matrix3d::Identity());

即可

错误3

在求 单位向量a 的反对称矩阵时,报如下错误

在这里插入图片描述

在这里插入图片描述

 error: ‘template<class Scalar_, int Options> class Sophus::SO3’ used without template arguments
   27 |     Eigen::Matrix3d a_hat = Sophus::SO3::hat(a);
      |                                     ^~~

解决办法:

SO3:: 中的定义是模板类,要声明变量类型

在这里插入图片描述

Sophus::SO3<double> 要加上 double 类型声明

Eigen::Matrix3d a_hat = Sophus::SO3<double>::hat(a);

// 或者使用 SO3d
 Eigen::Matrix3d a_hat = Sophus::SO3d::hat(a);
错误4

在这里插入图片描述

将两个 Eigen::Vector3d 的向量相加,然后转换成SO3对象,加上上面红框的代码后,报如下错误

BCH_verify.cpp:(.text._ZN3fmt3v1019basic_memory_bufferIcLm500ESaIcEE4growEm[_ZN3fmt3v1019basic_memory_bufferIcLm500ESaIcEE4growEm]+0xf4): undefined reference to `fmt::v10::detail::assert_fail(char const*, int, char const*)'
collect2: error: ld returned 1 exit status

在这里插入图片描述

解决办法:

参考:

undefined reference to `vtable for fmt::v7::format_error‘

没有链接fmt库,链接上fmt 库即可。

target_link_libraries(BCH_verify ${Sophus_LIBRARIES} fmt)
错误5

参考:

使用cmake进行编译安装时指定安装位置

找不到 fmt

在这里插入图片描述

找到 sudo make install 时的目录

在这里插入图片描述

设置对应的路径

set(fmt_DIR /path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1299069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之交换排序

目录 交换排序 冒泡排序 冒泡排序的时间复杂度 快速排序 快速排序单趟排序的时间复杂度 快速排序的时间复杂度 快速排序的优化 优化1&#xff1a;三数取中法 优化2&#xff1a;小区间优化法 交换排序 在日常生活中交换排序的使用场景是很多的&#xff0c;比如在学校做…

第76讲:MySQL数据库中常用的命令行工具的基本使用

文章目录 1.mysql客户端命令工具2.mysqladmin管理数据库的客户端工具3.mysqlbinlog查看数据库中的二进制日志4.mysqlshow统计数据库中的信息5.mysqldump数据库备份工具6.mysqllimport还原备份的数据7.source命令还原SQL类型的备份文件 MySQL数据库提供了很多的命令行工具&#…

Linux系统---简易伙伴系统

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、题目要求 1.采用C语言实现 2.伙伴系统采用free_area[11]数组来组织。要求伙伴内存最小为一个页面&#xff0c;页面大小为4KB…

2023年电工(初级)证模拟考试题库及电工(初级)理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年电工&#xff08;初级&#xff09;证模拟考试题库及电工&#xff08;初级&#xff09;理论考试试题是由安全生产模拟考试一点通提供&#xff0c;电工&#xff08;初级&#xff09;证模拟考试题库是根据电工&…

esxi全称“VMware ESXi

esxi全称“VMware ESXi”&#xff0c;是可直接安装在物理服务器上的强大的裸机管理系统&#xff0c;是一款虚拟软件&#xff1b;ESXi本身可以看做一个操作系统&#xff0c;采用Linux内核&#xff0c;安装方式为裸金属方式&#xff0c;可直接安装在物理服务器上&#xff0c;不需…

Kubernetes架构及核心部件

文章目录 1、Kubernetes集群概述1.1、概述1.2、通过声明式API即可 2、Kubernetes 集群架构2.1、Master 组件2.1.1、API Server2.1.2、集群状态存储2.1.3、控制器管理器2.1.4、调度器 2.2、Worker Node 组件2.2.1、kubelet2.2.2、容器运行时环境2.2.3、kube-proxy 2.3、图解架构…

大数据Doris(三十五):Unique模型(唯一主键)介绍

文章目录 Unique模型(唯一主键)介绍 一、创建doris表 二、插入数据

LANDSAT_7/02/T1/TOA的Landsat7_C2_TOA类数据集

Landsat7_C2_TOA数据集是将数据每个波段的辐射亮度值转换为大气层顶表观反射率TOA&#xff0c;是飞行在大气层之外的航天传感器量测的反射率&#xff0c;包括了云层、气溶胶和气体的贡献&#xff0c;可通过辐射亮度定标参数、太阳辐照度、太阳高度角和成像时间等几个参数计算得…

P9 LinuxC 进程概述 终端启动的程序父进程是终端

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f6f8;推荐专栏3: ​​​​​​《链表_ChenP…

Qt实现二维码生成和识别

一、简介 QZxing开源库: 生成和识别条码和二维码 下载地址&#xff1a;https://gitcode.com/mirrors/ftylitak/qzxing/tree/master 二、编译与使用 1.下载并解压&#xff0c;解压之后如图所示 2.编译 打开src目录下的QZXing.pro&#xff0c;选择合适的编译器进行编译 最后生…

Ansible中执行流控制

1.ansible中的迭代循环 创建目录和文件 vim createfile.yaml - name: create file playbook hosts: all tasks: - name: create file file: path: "/mnt/{{item[name]}}" state: …

华为ensp实验——基于全局地址池的DHCP组网实验

目录 前言实验目的实验内容实验结果 前言 该实验基于华为ensp&#xff0c;版本号是1.3.00.100 V100R003C00SPC100&#xff0c;只供学习和参考&#xff0c;不作任何商业用途。 具体的DHCP命令可以看系列文章链接&#xff0c;计算机网络实验&#xff08;华为eNSP模拟器&#xff…

机场信息集成系统系列介绍(2):机场航班报文处理系统

本文介绍机场航班报文处理系统。#机场##sita##AFTN##航空# 一、定义 机场航班报文处理系统是一种基于计算机技术的自动化处理系统&#xff0c;用于接收、解析、处理和传递与航班相关的报文信息。这些报文可能包括航班计划、航班状态更新、旅客信息等&#xff0c;通常来源于航…

UniGui使用CSSUniTreeMenu滚动条

有些人反应UniTreeMenu当菜单项目比较多的时候会超出但是没有出滚动条&#xff0c;只需要添加如下CSS 老规矩&#xff0c;unitreemeu的layout的componentcls里添加bbtreemenu&#xff0c;然后在css里添加 .bbtreemenu .x-box-item{ overflow-y: auto; } 然后当内容超出后就会…

AI 赋能 | 智能制造的 AI 算法开发和工程实现

谈到智能制造、智慧工厂&#xff0c;愿景是美好的&#xff0c;借助计算机视觉技术和 AI 算法&#xff0c;为自动化生产线赋予环境感知的能力&#xff0c;从而改善工艺流程&#xff0c;提高生产效率。但是&#xff0c;随着柔性化生产的需求增长&#xff0c;产线的布局调整和功能…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑源网荷效益的峰谷电价与峰谷时段双层优化模型》

这个标题涉及到电力定价和能源效益的优化模型。让我来分解一下&#xff1a; 峰谷电价&#xff1a;这是一种电力定价策略&#xff0c;即在一天内不同时间段设定不同的电价。通常&#xff0c;高峰时段&#xff08;需求高&#xff09;的电价相对较高&#xff0c;而低谷时段&#x…

Spring AOP面向切面编程

AOP将通用的、与业务无关的功能抽象封装为切面类。 切面可配置在目标方法的执行前、后运行&#xff0c;真正做到即插即用。实现了在不修改源码的情况下对程序行为进行扩展。 Spring AOP与AspectJ的关系&#xff1a; Eclipse AspectJ 是基于Java平台的面向切面编程的语言。 Sp…

DNSLog漏洞探测(二)之常用DNSLog平台

常用DNSLog平台 我们在上一篇文章中我们介绍了什么是DNSLog&#xff0c;如果我们自己要去搭建一个DNSLog的服务平台&#xff0c;还是比较复杂和麻烦的&#xff0c;所以我们可以直接去使用一些公开免费的DNSLog平台&#xff0c;DNSLog的平台非常的多&#xff0c;但是实际上大部…

Spring基于xml半注解开发

目录 Component的使用 依赖注解的使用 非自定义Bean的注解开发 Component的使用 基本Bean注解&#xff0c;主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置&#xff0c;使用Component注解替代<bean>标签中的id以及class属性&#xff0c;而对…

奥威亚教学视频应用云平台 VideoCover任意文件上传漏洞复现

0x01 产品简介 广州市奥威亚电子科技有限公司教学视频应用云平台是一个专门为教育机构和个人教师设计的在线学习平台。该平台提供丰富的教学资源和功能,旨在提升教学效果和学习体验。 0x02 漏洞概述 奥威亚教学视频应用云平台 VideoCover.aspx接口处存在任意文件上传漏洞,未…