寫在前面
我在CSDN上寫了一套關(guān)于ros基礎(chǔ)的圖文教程,歡迎關(guān)注!!!
第一部分、 c++編譯基礎(chǔ)
一、hello slam
- 編寫對應(yīng)的c++代碼
#include <iostream>
using namespace std;
int main( int argc, char** argv )
{
cout<<"Hello SLAM!"<<endl;
return 0;
}
- 打開終端,進(jìn)入對應(yīng)文件目錄開始編譯
# 直接編譯輸出名為a.out
g++ helloSlam.cpp
# 指定輸出名字
g++ helloSlam.cpp -o helloSlam
二、使用cmake
- 編寫CMakeLists.txt
# 聲明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )
# 聲明一個 cmake 工程
project( HelloSLAM )
# 設(shè)置編譯模式
set( CMAKE_BUILD_TYPE "Debug" )
# 添加一個可執(zhí)行程序
# 語法:add_executable( 程序名 源代碼文件 )
add_executable( helloSLAM helloSLAM.cpp )
- 調(diào)用cmake對工程分析
cmake .
操作之后會在對應(yīng)文件夾下生成一些中間文件,其中最重要的是makefile
- 調(diào)用make對工程進(jìn)行編譯
make
輸出可執(zhí)行文件helloSLAM(與cmakelist中的名稱對應(yīng))
- 新建build文件管理生成的大量中間文件
mkdir build
cd build
cmake ..
make
三、 使用庫
只有帶main函數(shù)才可以生成可執(zhí)行文件,對于某些只想直接使用其函數(shù)功能的文件,我們通常用庫形式調(diào)用使用。
一個庫往往是許多算法和程序的集合。
- 編寫庫函數(shù)
#include <iostream>
using namespace std;
void printHello(){
cout << "this is shared library function!" << endl;
}
- 編寫對應(yīng)的頭文件
#ifndef TESTLIB_SHAREDLIB_H
#define TESTLIB_SHAREDLIB_H
void printHello();
#endif //TESTLIB_SHAREDLIB_H
- 編寫cmakelist.txt
其中關(guān)鍵步驟分三步:
- 添加可執(zhí)行庫:
add_library(庫名:Lib <SHARED> 庫函數(shù)名:useLib.cpp)
執(zhí)行完成上述步驟后,會在對應(yīng)build文件夾下生成庫文件。庫文件分兩種,分別是中間加shared關(guān)鍵字的.so后綴的共享庫文件和不加shared關(guān)鍵字的.a后綴的靜態(tài)庫文件。
兩者的區(qū)別是:靜態(tài)庫每次調(diào)用都會生成一個副本,共享庫只有一個副本。
- 鏈接庫:
target_link_libraries(可執(zhí)行文件的名稱:main 生成可執(zhí)行庫的名稱:Lib)
- 在可執(zhí)行文件main.cpp 中include庫文件的頭文件
#include <iostream>
#include "sharedLib.h"
int main() {
printHello();
std::cout << "Hello, World!" << std::endl;
return 0;
}
最終輸出:
this is shared library function!
Hello, World!
第二部分
附上對應(yīng)的作業(yè)地址:
https://github.com/allenhsu6/Odom_Calibration
這個所謂的里程計(jì)標(biāo)定,其實(shí)就是利用激光雷達(dá)的信息,矯正里程計(jì)的系統(tǒng)誤差。默認(rèn)認(rèn)為兩者之間存在某種線性關(guān)系。通過線性最小二乘法求解!
在這個作業(yè)中我們學(xué)習(xí)了eigen庫的基本操作。