快速入门Eigen

demo.cpp

#include<iostream>
using namespace std;

#include<Eigen\Core>
#include<Eigen\Dense>

#include<Eigen/Geometry>

const double M_PI = 3.1415926535;

void Test1()
{
    Eigen::Matrix<float, 2, 3> matrix_23 = Eigen::Matrix<float, 2, 3>::Ones();
    Eigen::Vector3d v_3d = Eigen::Vector3d::Zero();// 3x1
    Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero();//3x3
    // 动态size矩阵
    Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix_dynamic;
    // 更简单的表达形式
    Eigen::MatrixXd matrix_x;

    // operate

    matrix_23 << 1, 2, 3, 4, 5, 6;
    v_3d << 3, 2, 1;
    cout << matrix_23 << endl;
    cout << endl;
    cout << v_3d << endl;
    cout << endl;
    // 乘法 float -> double
    Eigen::Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;
    cout << result << endl;
    cout << endl;

    matrix_33 = Eigen::Matrix3d::Random();//  伪随机
    cout << matrix_33 << endl;
    cout << endl;

    cout << matrix_23.transpose() << endl;  cout << endl;
    cout << matrix_23.sum() << endl;        cout << endl;
    cout << matrix_33.trace() << endl;      cout << endl;
    cout << 10 * matrix_33 << endl;         cout << endl;
    cout << matrix_33.inverse() << endl;    cout << endl;
    cout << matrix_33.determinant() << endl; cout << endl;

    // 特征值
    Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);
    cout << "values = " << eigen_solver.eigenvalues() << endl;   cout << endl;
    cout << "vectors = " << eigen_solver.eigenvectors() << endl; cout << endl;

    // 解方程 A * x = b
    Eigen::Matrix<double, 50, 50> A = Eigen::Matrix<double, 50, 50>::Random();
    Eigen::Matrix<double, 50, 1 > b = Eigen::Matrix<double, 50, 1 >::Random();

    // 如果无解, eigen 是怎么解决这个问题的??????
    // 法一、x = inv(A)*b
    cout << A.inverse() * b << endl;  cout << endl;

    // 法二、QR分解
    cout << A.colPivHouseholderQr().solve(b) << endl;  cout << endl;
}

void Test2()
{
    Eigen::Matrix3d R_mat = Eigen::Matrix3d::Identity();
    Eigen::AngleAxisd R_vec(M_PI / 4, Eigen::Vector3d(0, 0, 1)); // 绕Z轴旋转Π/4
    // AngleAxisd -> Matrix3d
    R_mat = R_vec.matrix();
    cout << R_vec.toRotationMatrix() << endl; cout << endl;
    cout << R_vec.matrix() << endl;           cout << endl;

    // 坐标旋转:point2 = R_vec * point1
    Eigen::Vector3d point1(1, 0, 0);
    Eigen::Vector3d point2 = R_vec * point1; // point2 = R_mat * point1
    cout << point2 << endl; cout << endl;

    // 旋转矩阵 -> 欧拉角
    Eigen::Vector3d ZYX_angle = R_mat.eulerAngles(2, 1, 0);// Z Y X 顺序;
    cout << ZYX_angle << endl; cout << endl;

    // 初始化一个T = (R|t)
    Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
    T.rotate(R_vec);
    T.pretranslate(Eigen::Vector3d(1, 3, 4));
    cout << "T = " << endl;
    cout << T.matrix() << endl; cout << endl;

    // point3 = T * point1
    Eigen::Vector3d point3 = T * point1;
    cout << point3 << endl; cout << endl;

    // 初始化一个四元数
    Eigen::Quaterniond q = Eigen::Quaterniond(R_vec);
    cout << "q = " << endl;
    cout << q.coeffs() << endl; cout << endl;

    // point4 = q * point1
    Eigen::Vector3d point4 = q * point1;
    cout << point4 << endl; cout << endl;
}

/**********************************************************************************************************

 功能:创建一个齐次变换矩阵 T = (R|t);

 输入:roll(X轴)、pitch(Y轴)、yaw(Z轴):欧拉角;
        (x, y, z):位移;

 输出:齐次变换矩阵 T

 返回:...

**********************************************************************************************************/
Eigen::Isometry3d CreateT(const double& roll, const double& pitch, const double& yaw,
    const double& x, const double& y, const double& z)
{
    // <1> 初始化R
    Eigen::Matrix3d R;
    // 按照 ZYX 顺序旋转
    R = Eigen::AngleAxisd(roll, Eigen::Vector3d::UnitX()) *
        Eigen::AngleAxisd(pitch, Eigen::Vector3d::UnitY()) *
        Eigen::AngleAxisd(yaw, Eigen::Vector3d::UnitZ());

    // <2> 初始化t
    Eigen::Vector3d t(x, y, z);

    // <3> 构建T = (R|t)
    Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
    T.rotate(R);
    T.pretranslate(t);
    return T;
}



int main()
{
    // <1> 由欧拉角 + 位姿 初始化姿态; Pose1 -> 齐次变换矩阵 T1
    Eigen::Isometry3d T1 = CreateT((30.0 / 180.0) * M_PI, (25.0 / 180.0) * M_PI, (27.0 / 180.0) * M_PI, 1.2, 0.234, 2.3);
    Eigen::Isometry3d T2 = CreateT((23.0 / 180.0) * M_PI, (33.0 / 180.0) * M_PI, (89.0 / 180.0) * M_PI, 0.1, 0.4, 0.1);

    cout << "<1> 由欧拉角 + 位姿 初始化姿态; Pose1 -> 齐次变换矩阵 T1" << endl;
    cout << "T1 = " << endl; cout << T1.matrix() << endl;
    cout << "T2 = " << endl; cout << T2.matrix() << endl;
    cout << endl;

    // <2> Pose1求逆(等价于T1求逆)
    Eigen::Isometry3d T1Invert = T1.inverse();
    Eigen::Isometry3d T2Invert = T2.inverse();

    cout << "<2> Pose1求逆(等价于T1求逆)" << endl;
    cout << "T1Invert = " << endl; cout << T1Invert.matrix() << endl;
    cout << "T2Invert = " << endl; cout << T2Invert.matrix() << endl;
    cout << endl;

    // <3> 齐次变换矩阵 T1 -> 欧拉角 + 位姿 Pose1
    cout << "<3> 齐次变换矩阵 T1 -> 欧拉角 + 位姿 Pose1" << endl;
    cout << "Pose1 = ";
    cout << T1.translation().transpose() << " " << T1.rotation().eulerAngles(0, 1, 2).transpose() * (180 / M_PI) << endl;
    cout << endl;

    // <4> Pose12 = Pose1 * Pose2 等价于 T12 = T1 * T2
    Eigen::Isometry3d T12 = T1 * T2;

    cout << "<4> Pose12 = Pose1 * Pose2 等价于 T12 = T1 * T2" << endl;
    cout << "T12 = " << endl; cout << T12.matrix() << endl;
    cout << endl;

    // <5> Pose1(旋转部分) -> 四元数
    Eigen::Quaterniond q = Eigen::Quaterniond(T1.rotation());

    cout << " <5> Pose1(旋转部分) -> 四元数" << endl;
    cout << "q = " << endl; cout << q.coeffs().transpose() << endl; // coeffs 中实部在最后

    // <6> 四元数 -> Pose1__
    cout << " <6> 四元数 -> Pose1__(旋转部分)" << endl;
    cout << "Pose1__ = " << endl; cout << q.toRotationMatrix().eulerAngles(0, 1, 2).transpose() * (180 / M_PI) << endl;

    return 1;
}

运行结果:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄家驹beyond

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值