欧拉角转旋转矩阵

在和机器人相关或者3D图像相关的领域经常会碰到欧拉角到旋转矩阵的变换。基本的原理本文不做介绍,仅仅提供两种实现方法

方法一:a,b,c为绕着xyz三个轴转动的角度,代码中的x,y,z为平移量,你可以全部置为0.程序中会先转换为弧度,最后计算出4x4的变换矩阵

float a=20,b=30,c=40;
double angle2radian=M_PI/180.0;
double sin_a = sin(a*angle2radian),sin_b=sin(b*angle2radian),sin_c=sin(c*angle2radian);
double cos_a= cos(a*angle2radian),cos_b = cos(b*angle2radian),cos_c = cos(c*angle2radian);

// the 4x4 transform mat T_l2h(transform mat from local tool coord to home tool coord)
double T_l2h[4][4] = 
{{cos_b*cos_c,    cos_c*sin_a*sin_b-cos_a*sin_c,  sin_a*sin_c+ cos_a*cos_c*sin_b, x},
 { cos_b*sin_c,    cos_a*cos_c+sin_a*sin_b*sin_c,  cos_a*sin_b*sin_c-cos_c*sin_a, y}, 
 { -sin_b,         cos_b*sin_a,                    cos_a*cos_b,                   z},
 {0,              0,                              0,                              1}};

方法二:eigen实现更为简单(下面的代码将旋转和平移统一做)

void xyzabc2Mat4f(const Eigen::Vector3f& abc,const Eigen::Vector3f& xyz,Eigen::Matrix4f& transform_mat){
    float angle2radian=M_PI/180.0;
    Eigen::AngleAxisf r_x ( abc[0]*angle2radian, Eigen::Vector3f::UnitX() );
    Eigen::AngleAxisf r_y ( abc[1]*angle2radian, Eigen::Vector3f::UnitY() );
    Eigen::AngleAxisf r_z ( abc[2]*angle2radian, Eigen::Vector3f::UnitZ() );

    Eigen::Matrix3f rot_mat;
    rot_mat = r_z*r_y*r_x;
    transform_mat.block(0,0,3,3) = rot_mat;
    transform_mat(0,3) = xyz[0];
    transform_mat(1,3) = xyz[1];
    transform_mat(2,3) = xyz[2];
    return;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
欧拉角旋转矩阵的ZYX顺序表示先绕Z轴旋转、再绕Y轴旋转、最后绕X轴旋转。下面是一个示例代码,可以实现欧拉角旋转矩阵的ZYX顺序: ```c #include <stdio.h> #include <math.h> typedef struct { float m[3][3]; } Matrix3x3; void euler_to_matrix_zyx(float roll, float pitch, float yaw, Matrix3x3* matrix) { float cy = cos(yaw); float sy = sin(yaw); float cp = cos(pitch); float sp = sin(pitch); float cr = cos(roll); float sr = sin(roll); matrix->m[0][0] = cy * cp; matrix->m[0][1] = cy * sp * sr - sy * cr; matrix->m[0][2] = cy * sp * cr + sy * sr; matrix->m[1][0] = sy * cp; matrix->m[1][1] = sy * sp * sr + cy * cr; matrix->m[1][2] = sy * sp * cr - cy * sr; matrix->m[2][0] = -sp; matrix->m[2][1] = cp * sr; matrix->m[2][2] = cp * cr; } int main() { float roll = 0.1; // 横滚角 float pitch = 0.2; // 俯仰角 float yaw = 0.3; // 偏航角 Matrix3x3 matrix; euler_to_matrix_zyx(roll, pitch, yaw, &matrix); printf("Rotation Matrix (ZYX):\n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%.4f\t", matrix.m[i][j]); } printf("\n"); } return 0; } ``` 在示例代码中,定义了一个Matrix3x3结构体用于存储旋转矩阵。然后,使用`euler_to_matrix_zyx`函数来实现欧拉角旋转矩阵换。最后,在main函数中给定欧拉角的值,将其换为旋转矩阵,并打印输出结果。 请注意,示例中的欧拉角单位是弧度。如果需要使用角度作为输入,可以在换前将角度换为弧度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值