2024年2月

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

此函数的实现基于自撰《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、查看当前所有的docker镜像** docker image list **2、选择具体的镜像并启动容器** docker run -it --privileged <镜像ID> 例如: docker run -it --privileged 96e6a08e8573 **3、查看当前所有的docker容器** docker container list **4、从主机拷贝文件、文件夹到容器** docker cp <主机文件、文件夹> <容器ID>:<容器内部目录> 例如: docker cp SD22_ver/CMakeLists.txt 56c83ed40cf6:/home/ **5、从容器拷贝文件、文件夹到主机** docker cp <容器ID>:<容器内部文件或文件夹> <主机目录> 例如: docker cp 56c83ed40cf6:/home/build/SD22_Car_Lidar_Tool /home/host/ ![Screenshot at 2024-02-20 11-06-39.png][1] [1]: /usr/uploads/2024/02/91842040.png

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