如何将欧拉角转换为方向向量?

How to convert Euler angles to directional vector?(如何将欧拉角转换为方向向量?)
本文介绍了如何将欧拉角转换为方向向量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我有俯仰角、滚转角和偏航角.我如何将这些转换为方向向量?

如果你能向我展示这个的四元数和/或矩阵表示会特别酷!

解决方案

不幸的是,关于如何定义这些东西有不同的约定(并且滚转、俯仰、偏航与欧拉角并不完全相同),因此您将有小心点.

如果我们将pitch=0定义为水平(z=0),yaw定义为从x轴逆时针,那么方向向量将为

<前>x = cos(yaw)*cos(pitch)y = sin(yaw)*cos(pitch)z = sin(音高)

注意我没有用过roll;这是方向单位向量,它不指定姿态.编写一个旋转矩阵很容易,它可以将物体带入飞行物体的框架中(如果你想知道,比如说,左翼尖指向哪里),但首先指定约定确实是一个好主意.你能告诉我们更多关于这个问题的信息吗?

(两年半来我一直想回到这个问题.)

对于完整的旋转矩阵,如果我们使用上面的约定并且我们希望向量先偏航,然后是俯仰,然后是滚动,为了获得世界坐标系中的最终坐标,我们必须在世界坐标系中应用旋转矩阵逆序.

第一卷:

<代码>|1 0 0 ||0 cos(roll) -sin(roll) ||0 sin(roll) cos(roll) |

然后投球:

<代码>|cos(pitch) 0 -sin(pitch) ||0 1 0 ||sin(pitch) 0 cos(pitch) |

然后偏航:

<代码>|cos(yaw) -sin(yaw) 0 ||sin(yaw) cos(yaw) 0 ||0 0 1 |

将它们组合起来,总的旋转矩阵为:

<代码>|cos(yaw)cos(pitch) -cos(yaw)sin(pitch)sin(roll)-sin(yaw)cos(roll) -cos(yaw)sin(pitch)cos(roll)+sin(yaw)sin(卷)||sin(yaw)cos(pitch) -sin(yaw)sin(pitch)sin(roll)+cos(yaw)cos(roll) -sin(yaw)sin(pitch)cos(roll)-cos(yaw)sin(卷)||sin(pitch) cos(pitch)sin(roll) cos(pitch)sin(roll)|

因此对于从 x 轴开始的单位向量,最终坐标将为:

x = cos(yaw)cos(pitch)y = sin(yaw)cos(pitch)z = sin(音高)

对于从 y 轴(左翼尖)开始的单位向量,最终坐标将为:

x = -cos(yaw)sin(pitch)sin(roll)-sin(yaw)cos(roll)y = -sin(yaw)sin(pitch)sin(roll)+cos(yaw)cos(roll)z = cos(pitch)sin(roll)

I have pitch, roll, and yaw angles. How would I convert these to a directional vector?

It'd be especially cool if you can show me a quaternion and/or matrix representation of this!

解决方案

Unfortunately there are different conventions on how to define these things (and roll, pitch, yaw are not quite the same as Euler angles), so you'll have to be careful.

If we define pitch=0 as horizontal (z=0) and yaw as counter-clockwise from the x axis, then the direction vector will be

x = cos(yaw)*cos(pitch)
y = sin(yaw)*cos(pitch)
z = sin(pitch)

Note that I haven't used roll; this is direction unit vector, it doesn't specify attitude. It's easy enough to write a rotation matrix that will carry things into the frame of the flying object (if you want to know, say, where the left wing-tip is pointing), but it's really a good idea to specify the conventions first. Can you tell us more about the problem?

EDIT: (I've been meaning to get back to this question for two and a half years.)

For the full rotation matrix, if we use the convention above and we want the vector to yaw first, then pitch, then roll, in order to get the final coordinates in the world coordinate frame we must apply the rotation matrices in the reverse order.

First roll:

| 1    0          0      |
| 0 cos(roll) -sin(roll) |
| 0 sin(roll)  cos(roll) |

then pitch:

| cos(pitch) 0 -sin(pitch) |
|     0      1      0      |
| sin(pitch) 0  cos(pitch) |

then yaw:

| cos(yaw) -sin(yaw) 0 |
| sin(yaw)  cos(yaw) 0 |
|    0         0     1 |

Combine them, and the total rotation matrix is:

| cos(yaw)cos(pitch) -cos(yaw)sin(pitch)sin(roll)-sin(yaw)cos(roll) -cos(yaw)sin(pitch)cos(roll)+sin(yaw)sin(roll)|
| sin(yaw)cos(pitch) -sin(yaw)sin(pitch)sin(roll)+cos(yaw)cos(roll) -sin(yaw)sin(pitch)cos(roll)-cos(yaw)sin(roll)|
| sin(pitch)          cos(pitch)sin(roll)                            cos(pitch)sin(roll)|

So for a unit vector that starts at the x axis, the final coordinates will be:

x = cos(yaw)cos(pitch)
y = sin(yaw)cos(pitch)
z = sin(pitch)

And for the unit vector that starts at the y axis (the left wing-tip), the final coordinates will be:

x = -cos(yaw)sin(pitch)sin(roll)-sin(yaw)cos(roll)
y = -sin(yaw)sin(pitch)sin(roll)+cos(yaw)cos(roll)
z =  cos(pitch)sin(roll)

这篇关于如何将欧拉角转换为方向向量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How do compilers treat variable length arrays(编译器如何处理变长数组)
Deduce template argument from std::function call signature(从 std::function 调用签名推导出模板参数)
check if member exists using enable_if(使用 enable_if 检查成员是否存在)
Standard Library Containers with additional optional template parameters?(具有附加可选模板参数的标准库容器?)
Uses of a C++ Arithmetic Promotion Header(C++ 算术提升标头的使用)
Parameter pack must be at the end of the parameter list... When and why?(参数包必须位于参数列表的末尾...何时以及为什么?)