1 准备
处理器:Raspberry Pi 4B, 4GB内存
OS:Raspberry pi OS (Raspbian)- 32bit 无desktop版本 OS镜像:2021-05-07-raspios-buster-armhf-lite.img
2 安装CMake
CMake源码版本:cmake-3.20.5.tar.gz, 官方下载地址: https://cmake.org/download/
安装方法请参考:https://www.cnblogs.com/yanqingyang/p/12731855.html
# 检查是否已经安装了g++
g++ --version
# 若没有安装g++, 则执行下面指令,否则跳过
sudo apt-get install g++
# 安装依赖
sudo apt-get install libssl-dev
# 进入安装包目录,并解压:
tar -zxvf cmake-3.20.5.tar.gz
# 解压完成后,进入到解压后的cmake目录, 然后执行
cd cmake-3.20.5
./bootstrap
# 编译cmake源码
sudo make -j4
# 安装cmake
sudo make install
# 验证安装版本
cmake --version
3 安装Eigen3.4.0
(1) 安装过程
从官网下载Eigen源代码: eigen-3.4.0.tar.gz, 然后安装下面的指令顺序执行:
tar -zxvf eigen-3.4.0.tar.gz
cd eigen-3.4.0
mkdir build
cd build
cmake ..
sudo make install
注意:lib被安装到了 /usr/local/include/eigen3这个路径下了,一些开源代码通常用#include <Eigen/Dense>引用,所以将 /usr/local/include/eigen3这个路径下的Eigen目录递归拷贝到上一级目录中,执行下面指令:
cp -r /usr/local/include/eigen3/Eigen /usr/local/include
(2)测试demo
新建一个cpp文件:test_eigen.cpp, 然后把下面的代码贴进去。【代码来源:视觉SLAM14讲】
#include <iostream>
using namespace std;
#include <ctime>
//eigen核心部分
#include <Eigen/Core>
//稠密矩阵的代数运算(逆、特征值等)
#include <Eigen/Dense>
using namespace Eigen;
#define MATRIX_SEZE 50
int main(int argc, char **argv)
{
//声明一个2*3的矩阵,eigen中所有的向量矩阵均为Eigen::Matrix,是一个模板类。
//三个参数分别为数据类型、行数、列数
Matrix<float, 2, 3> matrix_23;
//声明一个三维向量,Vector_3d实际上是一个通过typedef定义的内置类型,本质上仍然是Eigen::Matrix模板类
Vector3d v_3d;
//Matrix<float, 2, 3> vd_3d;
//声明一个3*3的矩阵,并初始化为0矩阵
Matrix3d matrix_33 = Matrix3d::Zero();
//不确定矩阵大小时,可以使用动态大小的矩阵
Matrix<double, Dynamic, Dynamic> matrix_dynamic;
//或者更简单的方式
MatrixXd matrix_x;
//准备对Eigen矩阵初始化
//输入数据
matrix_23 << 1, 2, 3, 4, 5, 6;
//shuchu
cout << "matrix 2*3 from 1 to 6 : \n"<< matrix_23 << endl;
//使用()访问矩阵中的元素
cout << "print matirx 2*3 : "<< endl;
for (int i = 0; i < 2; ++i)
{
for (int j = 0; j < 3; ++j)
{
cout << matrix_23(i,j) << "\t";
}
cout << endl;
}
//初始化两个三维向量
v_3d << 3, 2, 1;
//vd_3d << 4, 5, 6;
//不能混乘两种类型的矩阵,因此需要显示转换类型:.cast<type>
Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;
cout << "[1,2,3;4,5,6]*[3,2,1] = "<< result.transpose() << endl;
//.transpose()是转置函数
cout << "not transpose [1,2,3;4,5,6]*[3,2,1] = "<< result << endl;
Matrix<float, 2, 1> result2 = matrix_23 * v_3d.cast<float>();
cout << "[1,2,3;4,5,6]*[3,2,1] = "<< result2.transpose() << endl;
//生成一个随机矩阵
matrix_33 = Matrix3d::Random();
cout << "random matrix: \n"<< matrix_33 << endl;
cout << "transpose : \n"<< matrix_33.transpose() << endl; //转置
cout << "sum :" << matrix_33.sum() << endl; //求和
cout << "trace : "<< matrix_33.trace() << endl; //求迹
cout << "time 10: \n"<< 10 * matrix_33 << endl; //数乘
cout << "inverse : \n"<< matrix_33.inverse() << endl; //求逆
cout << "det : \n"<< matrix_33.determinant() << endl; //求行列式
//求特征值
//实对称矩阵可以保证对角化成功
SelfAdjointEigenSolver<Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33); //SelfAdjointEigenSolver<Matrix3d>y用于求解特征值和特征向量
cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;
cout << "Eigen vectors = \n" << eigen_solver.eigenvectors() << endl;
//练习求解方程
//求解Matrix_NN * x = v_NN方程
Matrix<double, MATRIX_SEZE, MATRIX_SEZE> matrix_NN
= MatrixXd::Random(MATRIX_SEZE,MATRIX_SEZE); //MATRIX_SEZE在前面宏定义中
matrix_NN = matrix_NN *matrix_NN.transpose(); //此处理可以保证矩阵是半正定的
Matrix<double, MATRIX_SEZE, 1> v_Nd = MatrixXd::Random(MATRIX_SEZE, 1);
clock_t time_stt = clock(); //用于计时
//直接求逆
Matrix<double, MATRIX_SEZE, 1> x = matrix_NN.inverse() * v_Nd;
cout << "time of normal inverse is"
<< 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
cout << "x = "<< x.transpose() << endl;
//再用矩阵分解,例如QR分解求解,速度将会快很多
time_stt = clock();
x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
cout << "time of Qr decomposition is "
<< 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
cout << "x = " << x.transpose() << endl;
//对于正定矩阵,还可以用cholesky分解来分解方程
time_stt = clock();
x = matrix_NN.ldlt().solve(v_Nd);
cout << "time of ldlt decomposition is "
<< 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
cout << "x = " << x.transpose() << endl;
return 0;
}
使用下面的指令编译、链接、生成可执行文件、并运行:
g++ test_eigen.cpp -o test_eigen # 编译
ls -l #查看生成文件
./test_eigen #运行
4 安装opencv
从github上下载源码tar包, 也可以git clone。
安装步骤:
(1) 安装依赖
// build required
sudo apt-get install build-essential
// required
sudo apt-get install libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
// optional
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
(2) 编译、安装
tar -zxvf opencv-4.5.4.tar.gz
cd opencv-4.5.4
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make -j4
sudo make install