问题描述
书中提高的3rdparty里没有相应的安装文件,需要网上下载,安装Sophus时,要求切换到a621ff分支,但无法切换,可能是因为我的系统是18.04的原因。因此无法完全按照书中方法进行安装。
安装成功后编译过程遇到了很多问题。
首先是,SE3d和SO3d类,需要去掉d,改成SE3和SO3.
其次编译时提示
trajectoryError.cpp:(.text.startup+0x15e): undefined reference to
Sophus::SE3::SE3(Sophus::SE3 const&)’`
CmakeLists中,需要改成如下, 参考了很多文章才总算通过。
在CmakeLists中添加以下编译指令。
find_package(Sophus REQUIRED)
target_link_libraries( useSophus ${Sophus_LIBRARIES} )#重要,没有这一句会出现找不到库
cmake_minimum_required(VERSION 3.0)
project(useSophus)
set(CMAKE_BUILD_TYPE "Release")
# 为使用 sophus,需要使用find_package命令找到它
find_package(Sophus REQUIRED) #重要,没有这一句会出现找不到库
#set(Sophus_LIBRARIES libSophus.so)
# Eigen
include_directories("/usr/include/eigen3")
include_directories( ${
Sophus_INCLUDE_DIRS})
add_executable(useSophus useSophus.cpp)
target_link_libraries( useSophus ${
Sophus_LIBRARIES} )
add_subdirectory(example)
example中的CmakeLists.txt需要改成如下:
option(USE_UBUNTU_20 "Set to ON if you are using Ubuntu 20.04" OFF)
find_package(Pangolin REQUIRED)
find_package(Sophus REQUIRED)
if(USE_UBUNTU_20)
message("You are using Ubuntu 20.04, fmt::fmt will be linked")
find_package(fmt REQUIRED)
set(FMT_LIBRARIES fmt::fmt)
endif()
include_directories(${
Pangolin_INCLUDE_DIRS})
add_executable(trajectoryError trajectoryError.cpp)
target_link_libraries(trajectoryError ${
Pangolin_LIBRARIES} ${
FMT_LIBRARIES})
target_link_libraries(trajectoryError ${
Sophus_LIBRARIES} ${
FMT_LIBRARIES})
附上更改后可以编译通过的代码:
useSophus.cpp
#include <iostream>
#include <cmath>
#include <Eigen/Core>
#include <Eigen/Geometry>
#include "sophus/se3.h"
#include "sophus/so3.h"
using namespace std;
using namespace Eigen;
/// 本程序演示sophus的基本用法
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); // Sophus::SO3d可以直接从旋转矩阵构造
Sophus::SO3 SO3_q(q); // 也可以通过四元数构造
// 二者是等价的
cout << "SO(3) from matrix:\n" << SO3_R.matrix() << endl;