注:本文基於視覺SLAM中的歷程進行實踐操作,在上一篇(Linux下cmake編譯流程實踐–初學篇)完成了外部庫Sophus的引用。Sophus庫是Eigen庫的擴展,可以完成李代數,李羣的操作。
首先從gitee上下載代碼包 https://gitee.com/gchasing/sophus.git,我這邊從https://gitee.com/gchasing/slambook.git下載。後者爲高翔視覺SLAM教材對應的所有代碼包。下載解壓後如下圖所示:
在Sophus目錄下有CMakeLists.txt文件,所以建立對應的build
文件夾,然後再
cmake ..
make
這個地方有個坑,源碼編譯報錯
解決方法是修改so2.cpp
中的代碼如下
namespace Sophus
{
SO2::SO2()
{
unit_complex_.real(1.);
unit_complex_.imag(0.);
}
以下是操作步驟:
添加CMakeLists.txt文件如下:
find_package(Sophus REQUIRED )
message("Sophus dir ${Sophus_INCLUDE_DIRS}")
message("Sophus lib ${Sophus_LIBRARIES}")
add_executable(useSophus useSophus.cpp)
include_directories(${Sophus_INCLUDE_DIRS})
target_link_libraries(useSophus ${Sophus_LIBRARIES})
其中find_package
表示查找Sophus的庫文件,隨後通過message
打印到終端上進行查看。include_directories
和target_link_libraries
表示添加頭文件。useSophus.cpp文件如下:
#include <iostream>
#include <cmath>
using namespace std;
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Geometry>
#include "sophus/so3.h"
#include "sophus/se3.h"
int main(int argc, char** argv)
{
Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/2,Eigen::Vector3d(0,0,1)).toRotationMatrix();
Sophus::SO3 SO3_R(R);
cout<<"SO3_R="<<SO3_R<<endl;
Sophus::SO3 SO3_V(0,0,M_PI/2);
cout<<"SO3_V="<<SO3_V<<endl;
}
此處在源文件cpp中由於存在外部鏈接庫,所以採用#include "sophus/so3.h"
的形式。但是VSCode並未查找到外部庫文件,所以下面的程序無法自動補齊。
添加VScode外部庫鏈接
在vscode中使用ctrl+shift+P
,然後輸入edit,找到 C/C++:edit configurations(JSON)
修改其中的includePath
選項,由於源代碼中添加的是"sophus/so3.h"
,我們需要找到對應的so3和se3頭文件所在位置。如下圖所示:
所以,添加頭文件路徑爲"/home/chasing/slambook/3rdparty/Sophus/sophus"
,然後保存關閉VScode,再次打開就可以發現已經關聯找到對應的頭文件了。
代碼運行效果
至此,就可以採用VScode的自動補齊功能完成代碼的編寫和編譯了,在此不再贅述。最後運行結果如下圖: