slam14讲 第四讲例程遇到的问题

在尝试按照《slam14讲》安装3rdparty的Sophus库时,遇到系统不兼容导致无法切换到指定分支。在18.04系统上,安装后编译过程中碰到SE3d和SO3d类名问题以及Sophus::SE3构造函数错误。通过修改CMakeLists.txt,去掉类名中的'd'并调整构造函数调用,最终成功编译。参考了相关博客文章解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

书中提高的3rdparty里没有相应的安装文件,需要网上下载,安装Sophus时,要求切换到a621ff分支,但无法切换,可能是因为我的系统是18.04的原因。因此无法完全按照书中方法进行安装。
安装成功后编译过程遇到了很多问题。
首先是,SE3d和SO3d类,需要去掉d,改成SE3和SO3.
其次编译时提示
trajectoryError.cpp:(.text.startup+0x15e): undefined reference toSophus::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;
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值