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

2021-12-17 00:00:00 math game-physics c++

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

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

解决方案

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

如果我们将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)

相关文章