1. 程式人生 > >高翔老師SLAM十四講

高翔老師SLAM十四講

1. 虛擬機器下安裝ubuntu

中科大ubuntu映象連結

第一步: 安裝VMware,並自己找個註冊號啟用
第二步: 建立虛擬機器,安裝Ubuntu。一篇安裝教程 【注意安裝時斷網以防止安裝中更新】
第三步: 設定軟體源——圖形介面配置方法【系統工具>軟體更新】基本完成,可以看下面操作了
第四步: 安裝open-vm-tools,一方面可以全屏顯示(無黑邊),另一方面可以和windows直接進行檔案拷貝!
sudo apt-get open-vm-tools-desktop 14.04未成功,16.04成功
第五步 安裝中文搜狗輸入法
ubuntu(Linux)基本操作 對應指令(Ubuntu指令總結)
開啟一個terminal ubuntu16.04可以在當前目錄下右鍵開啟(快捷鍵 Ctrl+Alt+T
terminal預設位置 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) )