今天就先到這裡,明天繼續!
1.把第三講的實踐部分單獨拿出來進行記錄。
1.安裝eigen庫
2.我們執行一遍這個eigen的cpp程式直接:
執行結果如下:
3.這裡我們需要詳細記錄一下其中執行時的乙個錯誤:fatal error: eigen/core: no such file or directory
解決方案如下:
先找到eigen3的目錄位置,然後進行軟鏈結。
這樣既可編譯通過,否則需要花費很長時間,具體的**如下,注釋的很清晰,大家親自敲一遍就很清楚了,不多廢話:
#include
using namespace std;
#include
// eigen 部分
#include
// 稠密矩陣的代數運算(逆,特徵值等)
#include
#define matrix_size 50
int main( int argc, char** ar** )
{// eigen 中所有向量和矩陣都是eigen::matrix,它是乙個模板類。它的前三個引數為:資料型別,行,列
// 宣告乙個2*3的float矩陣
eigen::matrixmatrix_23;
// 同時,eigen 通過 typedef 提供了許多內建型別,不過底層仍是eigen::matrix
// 例如 vector3d 實質上是 eigen::matrix,即三維向量
eigen::vector3d v_3d;
// 這是一樣的
eigen::matrixvd_3d;
// matrix3d 實質上是 eigen::matrixeigen::matrix3d matrix_33 = eigen::matrix3d::zero(); //初始化為零
// 如果不確定矩陣大小,可以使用動態大小的矩陣
eigen::matrix< double, eigen::dynamic, eigen::dynamic > matrix_dynamic;
// 更簡單的
eigen::matrixxd matrix_x;
// 這種型別還有很多,我們不一一枚舉
// 下面是對eigen陣的操作
// 輸入資料(初始化)
matrix_23 << 1, 2, 3, 4, 5, 6;
// 輸出
cout << matrix_23 << endl;
// 用()訪問矩陣中的元素
for (int i=0; i<2; i++) {
for (int j=0; j<3; j++)
cout
// 應該顯式轉換
eigen::matrixresult = matrix_23.cast() * v_3d;
cout << result << endl;
eigen::matrixresult2 = matrix_23 * vd_3d;
cout << result2 << endl;
// 同樣你不能搞錯矩陣的維度
// 試著取消下面的注釋,看看eigen會報什麼錯
// eigen::matrixresult_wrong_dimension = matrix_23.cast() * v_3d;
// 一些矩陣運算
// 四則運算就不演示了,直接用+-*/即可。
matrix_33 = eigen::matrix3d::random(); // 隨機數矩陣
cout << matrix_33 << endl << endl;
cout << matrix_33.transpose() << endl; // 轉置
cout << matrix_33.sum() << endl; // 各元素和
cout << matrix_33.trace() << endl; // 跡
cout << 10*matrix_33 << endl; // 數乘
cout << matrix_33.inverse() << endl; // 逆
cout << matrix_33.determinant() << endl; // 行列式
// 特徵值
// 實對稱矩陣可以保證對角化成功
eigen::selfadjointeigensolvereigen_solver ( matrix_33.transpose()*matrix_33 );
cout << "eigen values = \n" << eigen_solver.eigenvalues() << endl;
cout << "eigen vectors = \n" << eigen_solver.eigenvectors() << endl;
// 解方程
// 我們求解 matrix_nn * x = v_nd 這個方程
// n的大小在前邊的巨集裡定義,它由隨機數生成
// 直接求逆自然是最直接的,但是求逆運算量大
eigen::matrix< double, matrix_size, matrix_size > matrix_nn;
matrix_nn = eigen::matrixxd::random( matrix_size, matrix_size );
eigen::matrix< double, matrix_size, 1> v_nd;
v_nd = eigen::matrixxd::random( matrix_size,1 );
clock_t time_stt = clock(); // 計時
// 直接求逆
eigen::matrixx = matrix_nn.inverse()*v_nd;
cout <
// 通常用矩陣分解來求,例如qr分解,速度會快很多
time_stt = clock();
x = matrix_nn.colpivhouseholderqr().solve(v_nd);
cout <
return 0;
2019 0405視覺SLAM的學習第四講
指數與對數對映 李代數求導與擾動模型 實踐 sophus 總結及資源獲取 特殊正交群so 3 三維旋轉矩陣構成的集合 特殊歐式群se 3 三維變換矩陣構成的集合 由於他們之間的運算只支援乘法,準確點說,就是只有他們自身之間的乘積才仍然屬於這個so,或者se,即 我們把這種只有一種閉合運算的集合稱為群...
視覺SLAM(一) 視覺SLAM框架
主要參考書目是高翔博士的 視覺slam十四講 中間會記錄一些個人實踐經驗和思考。slam伴隨著機器視覺發展和機械人導航已經相對成熟,形成了合理高效的基本框架。主要包含 感測器資料 前端視覺里程計 後端優化 回環檢測 建圖。採集根據不同應用場景和需求進行選擇,主要有如下幾種感測器 也就是單獨乙個攝像機...
雷射slam 雷射SLAM與視覺SLAM的特點
雷射slam與視覺slam的特點 目前,slam技術被廣泛運用於機械人 無人機 無人駕駛 ar vr等領域,依靠感測器可實現機器的自主定位 建圖 路徑規劃等功能。由於感測器不同,slam的實現方式也有所不同,按感測器來分,slam主要包括雷射slam和視覺slam兩大類。其中,雷射slam比視覺sl...