作者: 边城量子 ( shihezichen@live.cn )
简介
本文主要介绍非模板方式的Sophus库在Ubuntu18.04下的安装
Sophus的安装
# g++ : C++编译环境
sudo apt-get install g++
# Eigen : 线性代数库
sudo apt install libeigen3-dev
# git: git 客户端命令行
sudo apt install git
# Sophus: 回滚到 a621ff 非模板版本
git clone https://github.com/strasdat/Sophus.git
cd Sophus
git checkout a621ff
mkdir build
cd build
cmake ..
make
sudo make install
在 ubuntu 18.04 下回遇到如下问题:
unit_complex_.real() = 1.; unit_complex_.imag() = 0. ;
解决办法: sophus/so2.cpp文件中, 将:
unit_complex_.real() = 1. ;
unit_complex_.imag() = 0. ;
改为:
unit_complex_.real(1.) ;
unit_complex_.imag(0.) = ;
然后重新 make 编译即可
或者把 gcc/g++ 恢复为以前的版本: 卸载 gcc,g++, 安装gcc5, g++5
Sophus库的引用
在 CmakeLists.txt 文件中添加
cmake_minimum_required(VERSION 3.4)
project(useSophus)
#find_package(Sophus REQUIRED)
set(CMAKE_BUILD_TYPE "Debug")
set(Sophus_INCLUDE_DIRS /usr/local/include/sophus)
set(SOPHUS_LIBRARIES /usr/local/lib/libSophus.so)
set(ALL_CODE_LIST Sophus.cpp)
MESSAGE(STATUS "sophus include: " ${Sophus_INCLUDE_DIRS})
MESSAGE(STATUS "sophus lib: " ${SOPHUS_LIBRARIES})
include_directories(${Sophus_INCLUDE_DIRS})
add_executable(useSophus useSophus.cpp)
target_link_libraries(useSophus ${SOPHUS_LIBRARIES}) ## 连接工程与依赖
Sophus库的使用
useSophus.cpp 文件:
#include <iostream>
#include <cmath>
#include <Eigen/Core>
#include <Eigen/Geometry>
#include "sophus/se3.h"
using namespace std;
using namespace Eigen;
int main(int argc, char** argv) {
// 沿z轴选装90°的旋转矩阵
Matrix3d R = AngleAxisd(M_PI/2, Vector3d(0,0,1)).toRotationMatrix();
// 转成四元数
Quaterniond q(R);
Sophus::SO3 SO3_R(R); // 旋转矩阵转SO3
Sophus::SO3 SO3_q(q); // 四元数转SO3
//
cout << "SO(3) from atrix:\n" << SO3_R.matrix() << endl;
cout << "SO(3) from quaternion:\n" << SO3_q.matrix() << endl;
}
需注意如下几点:
- 包含头文件为
#include "sophus/se3.h"而不是模板类的#include "sophus/se3.hpp". 若需要so3.hpp改为相同处理方式 - 代码中为
Sophus ::SO3而不是Sophus::SO3d