高翔视觉SLAM十四讲第二版已经开始使用模板类的sophus,但是具体程序基本没有改动,只是把头文件修改了一番,编译的时候会遇到一些问题。

具体修改如下:

1.头文件.h 修改为 .hpp

.hpp 是将头文件 源文件写在一起的文件。

2.新本是模板类,定义时需要指定类型

将下面代码

Sophus::SO3 SO3_R(R);

换成:

Sophus::SO3<double> SO3_R(R); 或者  Sophus::SO3d SO3_R(R);

3.打印需要log()函数:

将下面代码

cout<<"SO(3) from matrix: "<<SO3_R<<endl;

修改为:

cout<<"SO(3) from matrix: "<<SO3_R.log()<<endl;

最后附一下ch4中useSophus代码

#include <iostream>
#include <cmath>
using namespace std; #include <Eigen/Core>
#include <Eigen/Geometry>#include "sophus/so3.hpp"
#include "sophus/se3.hpp"int main( int argc, char** argv )
{// 沿Z轴转90度的旋转矩阵Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/2, Eigen::Vector3d(0,0,1)).toRotationMatrix();Sophus::SO3<double> SO3_R(R);               // Sophus::SO(3)可以直接从旋转矩阵构造
//  Sophus::SO3 SO3_v( 0, 0, M_PI/2 );  // 亦可从旋转向量构造Eigen::Quaterniond q(R);            // 或者四元数Sophus::SO3<double> SO3_q( q );// 上述表达方式都是等价的// 输出SO(3)时,以so(3)形式输出cout<<"SO(3) from matrix: "<<SO3_R.log()<<endl;
//  cout<<"SO(3) from vector: "<<SO3_v<<endl;cout<<"SO(3) from quaternion :"<<SO3_q.log()<<endl;// 使用对数映射获得它的李代数Eigen::Vector3d so3 = SO3_R.log();cout<<"so3 = "<<so3.transpose()<<endl;// hat 为向量到反对称矩阵cout<<"so3 hat=\n"<<Sophus::SO3<double>::hat(so3)<<endl;// 相对的,vee为反对称到向量cout<<"so3 hat vee= "<<Sophus::SO3<double>::vee( Sophus::SO3<double>::hat(so3) ).transpose()<<endl; // transpose纯粹是为了输出美观一些// 增量扰动模型的更新Eigen::Vector3d update_so3(1e-4, 0, 0); //假设更新量为这么多Sophus::SO3<double> SO3_updated = Sophus::SO3<double>::exp(update_so3)*SO3_R;cout<<"SO3 updated = "<<SO3_updated.log()<<endl;/********************萌萌的分割线*****************************/cout<<"************我是分割线*************"<<endl;// 对SE(3)操作大同小异Eigen::Vector3d t(1,0,0);           // 沿X轴平移1Sophus::SE3<double> SE3_Rt(R, t);           // 从R,t构造SE(3)Sophus::SE3<double> SE3_qt(q,t);            // 从q,t构造SE(3)cout<<"SE3 from R,t= "<<endl<<SE3_Rt.log()<<endl;cout<<"SE3 from q,t= "<<endl<<SE3_qt.log()<<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 = "<<endl<<Sophus::SE3<double>::hat(se3)<<endl;cout<<"se3 hat vee = "<<Sophus::SE3<double>::vee( Sophus::SE3<double>::hat(se3) ).transpose()<<endl;// 最后,演示一下更新Vector6d update_se3; //更新量update_se3.setZero();update_se3(0,0) = 1e-4d;Sophus::SE3<double> SE3_updated = Sophus::SE3<double>::exp(update_se3)*SE3_Rt;cout<<"SE3 updated = "<<endl<<SE3_updated.matrix()<<endl;return 0;
}

ref: https://blog.csdn.net/weixin_38275649/article/details/80869340

关于sophus模板类需要注意的情况(error: missing template arguments before ‘SO3_R’)相关推荐

  1. 【转】C++学习三 模板类出错总结(Missing template arguments before ‘L‘)

    一.模板类的说明 模板类有一个好处是可以放宽你输入的数据类型. 比如有这样的一个函数: int add(int x, int y) {return x+y; } 这个函数对于int类型的x,y才适合, ...

  2. 【c++】因模板类导致的 LNK2019 错误:“ 无法解析的外部符号 ” 详解

    最近在做项目的时候用到了模板类 果不其然出现了那个错误 LNK2019:无法解析的外部符号 网上百度到的结果繁花怒放,大多数不符合我的需求,故自己研究了下C++的模板类规则,试图找出问题所在 ---- ...

  3. C++模板类声明和定义几种写法

    为什么模板类的实现放在cpp会出错 在编译用到了模板类的编译单元时,编译器需要访问方法或者类的实现,以实例化它们. 如果这些实现不在头文件中,则它们将不可访问,因此编译器将无法实例化模板,进而会导致编 ...

  4. 模板类中使用友元函数的方式,派生类友元函数对基类的成员使用情况

    在一般友元函数的前面加上 template<typename T),注意在函数的声明和定义处都要加这个模板 例如: //模板类,长方体类 template <typename Elemen ...

  5. Sophus库(Linux下)的安装(模板类.hpp,非模板类.h)

    都不在home目录下,如果你在home下请把sudo去掉 模板类安装 这通常不会有什么问题,如果有一般是缺依赖->传送门 sudo git clone https://github.com/st ...

  6. C++编程进阶7(何时使用成员函数模板,模板类的实参推断与类型转换、继承与数组)

    二十六.何时使用成员函数模板 关于成员函数模板见https://blog.csdn.net/Master_Cui/article/details/111824152 成员函数模板主要用来兼容不同类型的 ...

  7. C++知识点56——类模板(1、模板类的介绍)

    一.类模板 和函数模板一样,类模板也得通过template关键字来声明和定义,C++标准库中有很多容器都是类模板 示例 template <typename T> class mystac ...

  8. C++多线程中互斥量std::mutex与模板类std::lock_guard

    一. 互斥量std::mutex C++中通过实例化std::mutex创建互斥量实例,通过成员函数lock()对互斥量上锁,unlock()进行解锁.C++中与std::mutex相关的类(包括锁类 ...

  9. “模板类与友元”那些事(C++)

    2019独角兽企业重金招聘Python工程师标准>>> 模版类就是类模版实例化之后的类,友元就是一种对函数访问权限的控制,通过将函数设为友元函数让其能够访问其他外部函数不能访问的&q ...

  10. Java高级语法笔记-模板类

    模板类 模板类用与表示通用的数据结构和算法. 例如,定义一个类List,表示通用链表(适用于任意对象的类型) 定义模板类: class List<T>{ } 使用模板类:创建List对象时 ...

最新文章

  1. 类和JSON的序列化与反序列化
  2. 如何使用shell脚本快速排序和去重文件数据
  3. 2011年吉林大学计算机研究生机试真题
  4. SAP IBASE father component的创建
  5. c语言基础学python_D11——C语言基础学PYTHON
  6. SGU 248. Integer Linear Programming( 背包dp )
  7. Jersey注解详解
  8. 开源备份web_13个开源备份解决方案
  9. 更新wordpress遇到prepare警告问题的解决
  10. 【java】java的Jaas授权与鉴权
  11. 基于BAE微信公众账号管理系统答辩PPT免费下载
  12. Hive中文件存储格式及大小比较测试
  13. 如何修改游戏服务器数据包,游戏数据包的定义
  14. 服务器刷新率和显示器刷新率,什么是屏幕刷新率
  15. 高可用架构演进之单元化
  16. uni-app 常用内容
  17. pandas基础用法详解
  18. PPT文件转换成PDF格式
  19. 如何创建NEO轻客户端
  20. mysql netcdf_NetCDF官方读写终端ncdump和ncgen的用法

热门文章

  1. 一个简单的 SQLite 的示例
  2. Elasticsearch: 配置文件详解
  3. Android RxJava
  4. Think PHP url的四种访问方法。
  5. 计算剪贴板里仿制的代码行数
  6. 评分预测会不会大于满分5.0的情况?
  7. ICLR'17 | 在特征空间增强数据集
  8. 【Linux】查询 OS、CPU、内存、硬盘信息
  9. 【NLP必读】2019年深度学习自然语言处理最新十大发展趋势
  10. 【北大知识图谱】知识图谱的关键技术及其智能应用