Cae*_*sar 21
看到我怎么找不到这样做的预建功能,我建了一个,这是为了防止将来有人发现这个问题
Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitZ());
Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::UnitY());
Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitX());
Eigen::Quaternion<double> q = rollAngle * yawAngle * pitchAngle;
Eigen::Matrix3d rotationMatrix = q.matrix();
Run Code Online (Sandbox Code Playgroud)
如何使用具有特征库的俯仰,偏航,滚动创建旋转矩阵?
有48种方法可以做到这一点.你想要哪一个?以下是因素:
凯撒的回答还可以,但正如大卫·哈门所说,这取决于你的申请.对于我(水下或飞行器领域),获胜组合是:
Eigen::Quaterniond
euler2Quaternion( const double roll,
const double pitch,
const double yaw )
{
Eigen::AngleAxisd rollAngle(roll, Eigen::Vector3d::UnitX());
Eigen::AngleAxisd pitchAngle(pitch, Eigen::Vector3d::UnitY());
Eigen::AngleAxisd yawAngle(yaw, Eigen::Vector3d::UnitZ());
Eigen::Quaterniond q = yawAngle * pitchAngle * rollAngle;
return q;
}
Run Code Online (Sandbox Code Playgroud)
创建旋转矩阵所需要的只是俯仰,偏航,滚动以及执行矩阵乘法的能力.
首先,创建三个旋转矩阵,一个用于每个旋转轴(即一个用于俯仰,一个用于偏航,一个用于滚动).这些矩阵将具有以下值:
间距矩阵:
1, 0, 0, 0,
0, cos(pitch), sin(pitch), 0,
0, -sin(pitch), cos(pitch), 0,
0, 0, 0, 1
Run Code Online (Sandbox Code Playgroud)
偏航矩阵:
cos(yaw), 0, -sin(yaw), 0,
0, 1, 0, 0,
sin(yaw), 0, cos(yaw), 0,
0, 0, 0, 1
Run Code Online (Sandbox Code Playgroud)
滚动矩阵:
cos(roll), sin(roll), 0, 0,
-sin(roll), cos(roll), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
Run Code Online (Sandbox Code Playgroud)
接下来,将所有这些相乘.这里的顺序很重要.对于正常旋转,您需要先将"滚动矩阵"乘以"偏航矩阵",然后将乘积乘以"俯仰矩阵".但是,如果您试图通过向后"撤消"旋转,则需要以相反的顺序执行乘法(除了具有相反值的角度之外).
| 归档时间: |
|
| 查看次数: |
23696 次 |
| 最近记录: |