#include <TransForms3d/TransForms.h>
/*---------------------------------------角度弧度转换----------------------------------------*/
/**
* @description: 角度转为弧度
* @param {double} angle 角度值
* @return 返回对应弧度值,一般在-3.14~3.14之间
*/
double TransForms::Degrees(double angle)
{
return angle / 180 * M_PI;
}
/**
* @description: 弧度转为角度
* @param {double} degrees 弧度值
* @return 返回对应的角度值,一般在-180~180之间
*/
double TransForms::Angle(double degrees)
{
return degrees / M_PI * 180;
}
/*---------------------------------------欧拉角部分---------------------------*/
/**
* @description: 角度制欧拉角转旋转矩阵,此函数默认的旋转顺序是x-y-z.
* @param {double} rx 绕x轴的旋转.
* @param {double} ry 绕y轴的旋转.
* @param {double} rz 绕z轴的旋转.
* @return {Matrix3d} 返回3✖3的旋转矩阵.
*/
Matrix3d TransForms::EulerAngle2Mat(double rx, double ry, double rz)
{
rx = Degrees(rx);
ry = Degrees(ry);
rz = Degrees(rz);
AngleAxisd rollAngle(AngleAxisd(rx, Vector3d::UnitX()));
AngleAxisd pitchAngle(AngleAxisd(ry, Vector3d::UnitY()));
AngleAxisd yawAngle(AngleAxisd(rz, Vector3d::UnitZ()));
Matrix3d rotation_matrix;
rotation_matrix = yawAngle * pitchAngle * rollAngle;
return rotation_matrix;
}
/**
* @description: 欧拉角转旋转矩阵
* @param {Vector3d} eular 欧拉角rx,ry,rz
* @return {Matrix3d} 返回3✖3的旋转矩阵.
*/
Matrix3d TransForms::Euler2Mat(double rx, double ry, double rz)
{
AngleAxisd rollAngle(AngleAxisd(rx, Vector3d::UnitX()));
AngleAxisd pitchAngle(AngleAxisd(ry, Vector3d::UnitY()));
AngleAxisd yawAngle(AngleAxisd(rz, Vector3d::UnitZ()));
Matrix3d rotation_matrix;
rotation_matrix = yawAngle * pitchAngle * rollAngle;
return rotation_matrix;
}
/**
* @description:欧拉角转四元数
* @param {double} rx 绕x轴的旋转
* @param {double} ry 绕y轴的旋转
* @param {double} rz 绕z轴的旋转
* @return {Quaterniond} 返回对应的四元数
*/
Quaterniond TransForms::Euler2Quat(double rx, double ry, double rz)
{
return Eigen::AngleAxisd(rx, ::Eigen::Vector3d::UnitX()) *
Eigen::AngleAxisd(ry, ::Eigen::Vector3d::UnitY()) *
Eigen::AngleAxisd(rz, ::Eigen::Vector3d::UnitZ());
}
/**
* @description: 角度制欧拉角转四元数
* @param {double} rx 绕x轴的旋转
* @param {double} ry 绕y轴的旋转
* @param {double} rz 绕z轴的旋转
* @return {Quaterniond} 返回对应的四元数
*/
Quaterniond TransForms::EulerAngle2Quat(double rx, double ry, double rz)
{
rx = Degrees(rx);
ry = Degrees(ry);
rz = Degrees(rz);
return Eigen::AngleAxisd(rx, ::Eigen::Vector3d::UnitX()) *
Eigen::AngleAxisd(ry, ::Eigen::Vector3d::UnitY()) *
Eigen::AngleAxisd(rz, ::Eigen::Vector3d::UnitZ());
}
/**
* @description: 旋转矩阵转欧拉角(弧度制)
* @param {Matrix3d} 3✖3的旋转矩阵
* @return {Vector3d} 欧拉角
*/
Vector3d TransForms::Mat2Euler(Matrix3d mat)
{
return mat.eulerAngles(2, 1, 0);
}
/**
* @description: 欧拉角转旋转矩阵
* @param {double} rx 绕x轴的旋转
* @param {double} ry 绕y轴的旋转
* @param {double} rz 绕z轴的旋转
* @return {*}
*/
Matrix3d TransForms::EulerAngle2Mat(Vector3d eular)
{
return EulerAngle2Mat(eular.x(), eular.y(), eular.z());
}
/**
* @description: 旋转矩阵转角度制欧拉角(角度制)
* @param {Matrix3d} 3✖3的旋转矩阵
* @return {Vector3d} 欧拉角
*/
Vector3d TransForms::Mat2EulerAngle(Matrix3d mat)
{
Vector3d rot = mat.eulerAngles(0, 1, 2);
rot = rot / M_PI * 180;
return rot;
}
/*---------------------------------------四元数部分----------------------------------------*/
/**
* @description: 四元数转旋转矩阵
* @param {Quaterniond} 四元数
* @return {Matrix3d} 对应的旋转矩阵
*/
Matrix3d TransForms::Quat2Mat(Quaterniond quat)
{
return quat.matrix();
}
/**
* @description: 四元数转欧拉角
* @param {Quaterniond} 四元数
* @return {Vector3d} 对应的欧拉角
*/
Vector3d TransForms::Quat2Eular(Quaterniond quat)
{
return Mat2Euler(quat.matrix());
}
/**
* @description: 四元数转弧度制欧拉角(角度制)
* @param {Quaterniond} 四元数
* @return {Vector3d} 对应的欧拉角
*/
Vector3d TransForms::Quat2EularAngle(Quaterniond quat)
{
return Mat2EulerAngle(quat.matrix());
}
/**
* @description: 旋转矩阵转四元数
* @param {Matrix3d} 3✖3的旋转矩阵
* @return {Quaterniond} 对应的四元数
*/
Quaterniond TransForms::Mat2Quat(Matrix3d mat)
{
return Quaterniond(mat);
}
/*---------------------------------------齐次矩阵部分----------------------------------------*/
/**
* @description: 通过位置和欧拉角合成一个齐次矩阵
* @param {Vector3d} positon 平移位置
* @param {Vector3d} rotEular 旋转变换(欧拉角形式)
* @return {*}
*/
Matrix4d TransForms::Compose(Vector3d positon, Vector3d rotEular)
{
Matrix3d rot = TransForms::EulerAngle2Mat(rotEular);
// std::cout<<Mat2EulerAngle(rot);
Matrix4d t;
t.setIdentity();
t.block<3, 3>(0, 0) = rot;
t.block<3, 1>(0, 3) = positon;
return t;
}
/**
* @description: 通过位置和四元数合成一个齐次矩阵
* @param {Vector3d} positon 平移位置
* @param {Quaterniond} quat 四元数
* @return {Matrix4d} 齐次矩阵
*/
Matrix4d TransForms::Compose(Vector3d positon, Quaterniond quat)
{
return Compose(positon, Quat2Eular(quat));
}
/**
* @description: 通过三个位置和三个欧拉角合成一个齐次矩阵
* @param {double} x 沿x轴的平移
* @param {double} y 沿y轴的平移
* @param {double} z 沿z轴的平移
* @param {double} rx 绕x轴的旋转
* @param {double} ry 绕y轴的旋转
* @param {double} rz 绕z轴的旋转
* @return {Matrix4d} 返回4✖4的齐次变换矩阵
*/
Matrix4d TransForms::ComposeEuler(const double x, const double y, const double z, const double rx, const double ry, const double rz)
{
Eigen::Vector3d rot(rx, ry, rz);
Eigen::Vector3d pos(x, y, z);
return TransForms::Compose(pos, rot);
}
/**
* @description: 将齐次矩阵转换成平移和欧拉角形式,方便理解
* @param {Matrix4d} 4✖4的齐次变换矩阵
* @return {VectorXd} x,y,z,rx,ry,rz
*/
VectorXd TransForms::H2EulerAngle(Matrix4d t)
{
VectorXd pose = VectorXd(6);
Matrix3d mt = t.block<3, 3>(0, 0);
Vector3d p3 = t.block<3, 1>(0, 3).col(0);
pose(0, 0) = p3.x();
pose(1, 0) = p3.y();
pose(2, 0) = p3.z();
Vector3d eular = Mat2EulerAngle(mt);
pose(3, 0) = eular.x();
pose(4, 0) = eular.y();
pose(5, 0) = eular.z();
return pose;
}