分类 算法与数学基础 下的文章

/*-----------------------------------------------------------------------------------------------------------------------------------

此函数的实现基于自撰《SVD与刚体变换》文档 dst_mat = R*src_mat +t

------------------------------------------------------------------------------------------------------------------------------------*/

bool Estimate_3D_Absolute_Orientation_By_SVD(Eigen::MatrixXd &src_mat,\ Eigen::MatrixXd &dst_mat,\ Eigen::Matrix3d &R, Eigen::Vector3d &t){

 if(src_mat.rows() != dst_mat.rows() || src_mat.cols()!=dst_mat.cols()){

 return false;

 }

 //将原点移至3D点集的中心点

 Eigen::Vector3d center_xyz_tgt = dst_mat.rowwise().mean();

 //按列求均值:x'=x/N, y'=y/N, z'=z/N, 3D点的中心点, 

xxx.colwise().mean() Eigen::Vector3d center_xyz_src = src_mat.rowwise().mean();

 for(uint32_t i=0; i svd(H, Eigen::ComputeFullU | Eigen::ComputeFullV); 

//ComputeThinU | ComputeThinV Eigen::Matrix3d U = svd.matrixU();

 Eigen::Matrix3d V = svd.matrixV();

 Eigen::Matrix3d S = Eigen::Matrix3d::Identity();

 Eigen::Matrix3d tmp_R = V*U.transpose();

 // R = V*U^T if(tmp_R.determinant()<0){ S(2,2) = -1; } R = V*S*U.transpose(

);

 t = center_xyz_tgt - R*center_xyz_src; return true;

}

/*---------------------------------------------------------------------------------------------------*/

bool Estimate_3D_Absolute_Orientation(const pcl::PointCloud::Ptr &src_cld, 

\ const pcl::PointCloud::Ptr &dst_cld,

 \ Eigen::Matrix3d &R, Eigen::Vector3d &t)

{

 if(src_cld->points.size() != dst_cld->points.size()){

 std::cout<<"Err: points num mismatch! "<points.size()<<" != "<points.size()<points.size());

 dst_mat.resize(3, dst_cld->points.size());

 for(uint32_t i=0; ipoints.size(); i++){

 src_mat.block<3,1>(0, i)<points[i].x,src_cld->points[i].y,src_cld->points[i].z;

 dst_mat.block<3,1>(0, i)<points[i].x,dst_cld->points[i].y,dst_cld->points[i].z;

 } 

return Estimate_3D_Absolute_Orientation_By_SVD(src_mat, dst_mat, R, t);

}

1、单位矩阵

       Eigen::Matrix3d A = Eigen::Matrix3d::Identity();


2、零矩阵

      Eigen::Vector3d T = Eigen::Vector3d::Zero();

      Eigen::Matrix3d A = Eigen::Matrix3d::Zero();


3、所有元素清零

     Eigen::Matrix3d A;

     A.setZero();


     Eigen::Vector3d T;

     T.setZero();


4、逆矩阵

      Eigen::Matrix3d A = Eigen::Matrix3d::Identity();

      Eigen::Matrix3d B = A.inverse();


5、转置

      Eigen::Matrix3d A = Eigen::Matrix3d::Identity();

      Eigen::Matrix3d B = A.transpose();


6、行列式

     Eigen::Matrix3d A = Eigen::Matrix3d::Identity(); 

     double v = A.determinant();


7、按行或列计算均值

     Eigen::MatrixXd A(100, 3);

     Eigen::Vector3d mean_row = A.rowwise().mean();

     Eigen::Vector3d mean_col = A.colwise().mean();


8、按行或列计算标准偏差

      Eigen::MatrixXd A(100, 3);

      Eigen::Vector3d mean_row = A.rowwise().std();

      Eigen::Vector3d mean_col = A.colwise().std();


9、四元数的归一化

      Eigen::Quaterniond   Quat;

      Quat.normalize();  或

      Eigen::Quaterniond  new_quat = Quat.normalized();



10、norm, normalize, normalized中的区别

       norm: 表示向量的二范数,即向量的模

       normalize: 向量归一化,是in-place修改,即对向量自身归一化, vec.normalize()

       normalized: 不修改向量自身值,只是返回一个归一化之后的新的向量, Eigen::Vector3d new_vec = vec.normalized()






**Finding MRPT from CMake** MRPT defines exported projects that can be imported as usual in modern CMake: \# Find all MRPT libraries: find_package(MRPT 2.0 COMPONENTS poses gui OPTIONAL_COMPONENTS vision) message(STATUS "MRPT_VERSION: ${MRPT_VERSION}") message(STATUS "MRPT_LIBRARIES: ${MRPT_LIBRARIES}") \# Define your own targets: add_executable(myapp main.cpp) \# Link against MRPT: this will also add all required flags, \# include directories, etc. target_link_libraries(myapp ${MRPT_LIBRARIES}) or individually like: \# Find MRPT libraries, one by one: find_package(mrpt-poses) find_package(mrpt-gui) \# Define your own targets: add_executable(myapp main.cpp) \# Link against MRPT: this will also add all required flags, \# include directories, etc. target_link_libraries(myapp mrpt::poses mrpt::gui ) C++例子程序: https://docs.mrpt.org/reference/latest/examples.html

![Screenshot at 2024-02-04 17-05-52.png][1]

1、Python

 import numpy as np

coeff = [3, -2, -4]

 np.roots(coeff)array([1.53518376, -0.86851709 ])


2、Matlab

 p = [3 -2 -4]; r = roots(p) r = 2×1 1.5352 -0.8685


3、Eigen

Eigen::Vector3d coeff(-4, -2, 3);

 Eigen::PolynomialSolver solver;

 solver.compute(coeff);

 const Eigen::PolynomialSolver::RootsType &root = solver.roots();


注意: Python、Matlab与Eigen求根时多项式的系数顺序是相反的,Python,Matlab数组索引越小对应次数越高,而Eigen反之 [1]: /usr/uploads/2024/02/4073295995.png

主页: https://docs.mrpt.org/reference/latest/ github: https://github.com/MRPT/mrpt 包换了完整的移动机器人所需的软件、工具、算法,主要有: (1): SLAM (2): 2D-3D空间转换 (3): 李群、李代数 (4): 概率密度函数 (5): 标记 (6): 位姿 (7): 建图 (8): 贝叶斯推理(卡尔曼滤波、粒子滤波) (9): 图像处理 (10): 避障 (11): 相机标定 (12): 数据集检查 其中的vision包中实现了多个PnP算法的实现:POSIT、DLS、EPnP、OI(LHM)、P3P、PPnP、RPnP、UPnP。 **编译方法(源码安装)(Ubuntu 20.04):** 1、安装一个依赖库 sudo apt-get install libxxf86vm-dev 2、Cmake编译 mkdir build cd build cmake ../ make -j8 **apt直接安装(Ubuntu 20.04)(推荐):** sudo add-apt-repository ppa:joseluisblancoc/mrpt-stable sudo apt install libmrpt-dev mrpt-apps sudo apt install python3-pymrpt ![Screenshot at 2024-01-31 17-29-17.png][1] [1]: /usr/uploads/2024/01/1042440390.png