高翔老師SLAM十四講
阿新 • • 發佈:2018-12-18
1. 虛擬機器下安裝ubuntu
第一步: | 安裝VMware,並自己找個註冊號啟用 |
---|---|
第二步: | 建立虛擬機器,安裝Ubuntu。一篇安裝教程 【注意安裝時斷網以防止安裝中更新】 |
第三步: | 設定軟體源——圖形介面配置方法【系統工具>軟體更新】基本完成,可以看下面操作了 |
第四步: | 安裝open-vm-tools,一方面可以全屏顯示(無黑邊),另一方面可以和windows直接進行檔案拷貝! |
– | sudo apt-get open-vm-tools-desktop 14.04未成功,16.04成功 |
第五步 | 安裝中文搜狗輸入法 |
ubuntu(Linux)基本操作 | 對應指令(Ubuntu指令總結) |
---|---|
開啟一個terminal | ubuntu16.04可以在當前目錄下右鍵開啟( |
home/changshen |
|
修改 桌面 資料夾名為 desktop | 使用右鍵-重新命名 |
建立新資料夾 | mkdir newfolder |
Vim | Vim命令總結 |
---|
cmake | CMake命令總結 |
---|---|
cmake_minimum_required( VERSION 2.8 ) |
– |
project( useSophus ) |
- |
find_package( Sophus REQUIRED ) |
提供標頭檔案和庫檔案所在的目錄變數 |
include_directories( ${Sophus_INCLUDE_DIRS} ) |
- |
add_executable( useSophus useSophus.cpp ) |
- |
target_link_libraries( useSophus ${Sophus_LIBRARIES} ) |
- |
ch2 初識SLAM
操作 | 對應指令 |
---|---|
0.1安裝git | sudo apt-get install git |
0.2從github上下載slam程式碼 | git clone https://github.com/gaoxiang12/slambook |
1.1安裝g++(它是一個編譯器) | sudo apt-get install g++ (16.04自帶無需安裝) |
1.2編寫原始檔hellSLAM.cpp、編譯、執行 | vim文字編輯器 + g++ helloSLAM.cpp + ./a.out |
2.1安裝cmake | sudo apt-get install cmake |
2.2在slambook/ch2/ 下呼叫cmake分析該工程 |
cmake . 【現在主要工作量落在CMakeList.txt上】 |
2.3編譯該工程 | make (本質上仍呼叫了g++來編譯) |
2.4執行生成的可執行檔案 | ./helloSLAM |
3.1中間檔案的處理 | mkdir build + cd build + cmake .. + make |
4.1安裝IDE Kdevelop | sudo apt-get install kdevelop (注意名字是小寫,否則提示無法定位包)【常用把它固定到啟動欄】 |
cmake替代的主要是g++的功能;
每個CMakeList.txt檔案,都是在告訴cmake,要對這個目錄下的檔案做什麼事情。然後,呼叫cmake會自動生成MakeFile指令碼,其內包含了一系列編譯命令!(無需自己使用g++一項一項編譯了)
kdevelop IDE的使用 | 連結 |
---|---|
新建、開啟、註釋 | Ctrl+D及Ctrl+Shift+D |
調整字型 | Settings>Fonts |
– | 【注意】:有些 font 不支援中文,會出現下一行遮擋上一行的情況;建議選一個字尾帶有CN的字型,如名為 AR PL UKai CN 的字型。 |
3步輸出helloSLAM | 1.先build;2.新建一個啟動器;3.debug或execute |
設定斷點,以及繼續執行 | breakpoint 、 continue |
– | 2018-12-12 |
ch3 三維空間剛體轉動(使用Eigen庫)
操作 | 指令 |
---|---|
安裝Eigen庫 | sudo apt-get install libeigen3-dev 記不全庫名時,按tab檢視可用庫 |
更新資料庫+查詢檔案所在目錄 | sudo updatedb + locate eigen3 |
開啟useEigen Project,編譯 | 【注意!】每次修改之後,要1.儲存-2.編譯-3.執行 |
– | Eigen庫使用詳見文末庫彙總 |
【疑問】:kdevelop一次只能開啟一個project嗎?不能像VS開啟好多個資料夾?
直接將slambook加入不好用,只能是新增useEigen,並且colse上次的helloSLAM project。
ch4 李群與李代數(使用Sophus庫)
安裝Sophus | 指令 |
---|---|
複製檔案到當前位置 | cp slambook/3rdparty/Sophus.tar.gz ./ 當前在desktop |
解壓該壓縮包 | tar -xxvf Sophus.tar.gz |
進入Sophus |
vim CMakeLists.txt 檢視+Esc :q 不儲存退出 |
編譯、(安裝) | mkdir build + cd build + cmake .. + make (make clean重新make) |
使用Sophus | 指令 |
---|---|
除了使用kdevelop,指令也可以 | cd desktop/slambook/ch4/useSophus/ |
編譯 | mkdir build + cd build + cmake .. + make |
執行 | ./sophus |
庫彙總及庫操作
庫名 | 功能 |
---|---|
OpenCV | 提供計算機視覺相關的演算法 |
Eigen | 提供矩陣代數計算 |
Sophus | 可看作Eigen的拓展,支援李群和李代數 |
Eigen/core及Eigen/Dense | 指令(逆和解方程) |
---|---|
定義2行3列double行矩陣 | Eigen::Matrix<double, 2, 3> matrix_23; |
輸入 | matrix_23 << 1, 2, 3, 4, 5, 6; |
輸出及引用 | cout << matrix_23 << endl; 及 cout<<matrix_23(i,j); 括號過載 |
顯示(隱式)型別轉換 | matrix_23.cast<double>() |
加、減、乘 | + 、- 、* |
轉置、求和、跡 | M.transpose() 、M.sum() 、M.trace() |
逆、行列式 | M.inverse() 、M.determinant() |
– | – |
*初始化(賦值)0 | Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero(); |
初始化為單位陣 | Eigen::Matrix3d::Identity(); |
初始化為隨機數 | Eigen::Matrix3d::Random(); |
– | – |
求特徵值 | Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver ( matrix_33.transpose()*matrix_33 ); |
特徵值與特徵向量 | eigen_solver.eigenvalues() 、eigen_solver.eigenvectors() |
– | – |
解方程 | – |
求逆直接解 | x = matrix_NN.inverse()*v_Nd; 用時 4.149ms |
QR分解解方程 | x = matrix_NN.colPivHouseholderQr().solve(v_Nd); 用時0.117ms |
Eigen/Core及Eigen/Geometry | 指令(提供各種旋轉平移) |
---|---|
旋轉矩陣(統一double) | Eigen::Matrix3d rotation_matrix (本質是矩陣cout<< 檢視) |
旋轉向量 | Eigen::AngleAxisd (無法直接使用cout 輸出) |
Eigen::AngleAxisd rotation_vector ( M_PI/4, Eigen::Vector3d ( 0,0,1 ) ); //指定一個轉角和一根轉軸, Z 軸、45 度 |
|
尤拉角 | Eigen::Vector3d euler_angles (本質是矩陣) |
四元數 | Eigen::Quaterniond q (檢視使用cout<<q.coeffs() ) |
歐式變換矩陣 | Eigen::Isometry3d T = Eigen::Isometry3d::Identity(); 4*4矩陣 |
– | T.rotate ( rotation_vector ); 變換矩陣賦值–旋轉部分 |
– | T.pretranslate ( Eigen::Vector3d ( 1,3,4 ) ); 變換矩陣賦值–平移部分 |
仿射變換矩陣 | – |
射影變換矩陣 | – |
– | – |
幾種表示間轉換: | |
旋轉矩陣 to 尤拉角 | euler_angles = rotation_matrix.eulerAngles ( 2,1,0 ); // ZYX順序,即roll pitch yaw順序 |
旋轉矩陣 to 四元數 | q = Eigen::Quaterniond ( rotation_matrix ); |
旋轉向量to旋轉矩陣 | rotation_matrix = rotation_vector.toRotationMatrix(); |
旋轉向量 to 四元數 | q = Eigen::Quaterniond ( rotation_vector ); |
– | – |
對某向量的座標v 進行變換: |
|
利用旋轉向量 | v_rotated = rotation_vector * v; |
利用旋轉矩陣 | v_rotated = rotation_matrix * v; |
利用四元數 | v_rotated = q*v; *過載,相當於qvq^{-1} |
使用變換矩陣 | v_transformed = T*v; 相當於R*v+t |
Sophus | 指令 |
---|---|
特殊正交群SO(3) | Sophus::SO3 (輸出cout<< ) |
so(3)李代數 | Eigen::Vector3d so3 (本質是矩陣) |
– | SO(3)賦值方式 |
從旋轉矩陣 | Sophus::SO3 SO3_R(rotation_matrix) |
從旋轉向量 | Sophus::SO3 SO3_v(rotation_vector) |
從四元數 | Sophus::SO3 SO3_q(q) |
– | 對數對映與指數對映 |
SO(3)到so(3) | so3 = SO3_R.log(); |
so(3)到SO(3) | Sophus::SO3::exp(update_so3); |
左擾動模型 | SO3_updated = Sophus::SO3::exp(update_so3)*SO3_R |
– | so(3) |
so(3)到反對稱矩陣 | Sophus::SO3::hat(so3) |
反對稱矩陣到so(3) | Sophus::SO3::vee( Sophus::SO3::hat(so3) ) |