<commit_before>---
layout: post
title: 旋转矩阵、欧拉角、四元数和角轴
categories: [blog ]
tags: [数学, ]
description: 旋转矩阵、欧拉角、四元数和角轴的关系及推导
---

最近对三维空间的旋转表达方式做了整理。
三维空间中常用的表征旋转的方式有：
**[旋转矩阵(rotation matrix)](https://en.wikipedia.org/wiki/Rotation_matrix)**、
**[欧拉角(euler angles)](https://en.wikipedia.org/wiki/Euler_angles)**、
**[四元数(quaternion)](https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation)**和
**[角轴(axis angle)](https://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation)**。  

自己的一些理解：
1. 欧拉角中的 **(x, y, z)**，**(roll, pitch, yaw)**，**(heading, elevation(attitude), bank)**是一回事，名称不同
1. 四元数和角轴近似
1. 角轴（**Axis Angle**）和**exponential twist**、罗德里格斯（**Rodrigues**）旋转向量是一回事，叫法不同，公式上有微小不同  
1. 欧拉角、四元数和角轴是更符合人类思维的表达方式，这三种旋转方式都可以转换为旋转矩阵，旋转矩阵更利于计算机计算——将空间旋转（spatial rotation）变为矩阵运算。  

后文分享了欧拉角、四元数、角轴与旋转矩阵相互转换公式。数学原理和代码实现将会在后续的blog中Po出。

## 相互转换

旋转矩阵：
\$R=\begin{bmatrix}x_{11} & x_{12} & x_{13} \\\\ x_{21} & x_{22} & x_{23} \\\\ x_{31} & x_{32} & x_{33}\end{bmatrix}\$，
欧拉角：
\$\begin{bmatrix}\theta_x \\\\ \theta_y \\\\ \theta_z \end{bmatrix}\$，
四元数：
\$q=\begin{bmatrix}x \\\\ y \\\\ z \\\\ \omega \end{bmatrix}\$，
角轴：
\$r=\begin{pmatrix}\begin{bmatrix}k_x \\\\ k_y \\\\ k_z \end{bmatrix},& \theta\end{pmatrix}\$

### 欧拉角\$\longleftrightarrow\$旋转矩阵
1. 欧拉角\$\longrightarrow\$旋转矩阵  
绕\$x\$(*roll*)、\$y\$(*pitch*)、\$z\$(*yaw*)轴分别旋转\$\theta_x\$、\$\theta_y\$、\$\theta_z\$的各旋转矩阵\$R_x\$、\$R_y\$、\$R_z\$
\$$\left\lbrace\begin{aligned}R_x &=& \begin{bmatrix}1 & 0 & 0 \\\\ 0 & \cos\theta_x & -\sin\theta_x \\\\ 0 & \sin\theta_x & \cos\theta_x \end{bmatrix} \\\\ R_y &=& \begin{bmatrix} \cos\theta_y & 0 & \sin\theta_y \\\\ 0 & 1 & 0 \\\\ -\sin\theta_y & 0 & \cos\theta_y \end{bmatrix} \\\\ R_z &=& \begin{bmatrix} \cos\theta_z & -\sin\theta_z & 0 \\\\ \sin\theta_z & \cos\theta_z & 0 \\\\ 0 & 0 & 1 \end{bmatrix}\end{aligned}\right.\$$
则
\$$\left\lbrace\begin{array}{cc}R=R_x \cdot R_y \cdot R_z & or \\\\ R=R_x \cdot R_z \cdot R_y & or \\\\ R=R_y \cdot R_x \cdot R_z & or \\\\ \vdots & \\\\ R=R_z \cdot R_y \cdot R_x & \end{array}\right.\$$
通常是按照*roll*\$\rightarrow\$*pitch*$\rightarrow\$*yaw*的顺序进行旋转的，即<commit_msg>fix error<commit_after>---
layout: post
title: 旋转矩阵、欧拉角、四元数和角轴
categories: [blog ]
tags: [数学, ]
description: 旋转矩阵、欧拉角、四元数和角轴的关系及推导
---

最近对三维空间的旋转表达方式做了整理。
三维空间中常用的表征旋转的方式有：
**[旋转矩阵(rotation matrix)](https://en.wikipedia.org/wiki/Rotation_matrix)**、
**[欧拉角(euler angles)](https://en.wikipedia.org/wiki/Euler_angles)**、
**[四元数(quaternion)](https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation)**和
**[角轴(axis angle)](https://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation)**。  

自己的一些理解：

1. 欧拉角中的 **(x, y, z)**，**(roll, pitch, yaw)**，**(heading, elevation(attitude), bank)**是一回事，名称不同
1. 四元数和角轴近似
1. 角轴（**Axis Angle**）和**exponential twist**、罗德里格斯（**Rodrigues**）旋转向量是一回事，叫法不同，公式上有微小不同  
1. 欧拉角、四元数和角轴是更符合人类思维的表达方式，这三种旋转方式都可以转换为旋转矩阵，旋转矩阵更利于计算机计算——将空间旋转（spatial rotation）变为矩阵运算。  

后文分享了欧拉角、四元数、角轴与旋转矩阵相互转换公式。数学原理和代码实现将会在后续的blog中Po出。

## 相互转换

旋转矩阵：
\$R=\begin{bmatrix}x_{11} & x_{12} & x_{13} \\\\ x_{21} & x_{22} & x_{23} \\\\ x_{31} & x_{32} & x_{33}\end{bmatrix}\$，
欧拉角：
\$\begin{bmatrix}\theta_x \\\\ \theta_y \\\\ \theta_z \end{bmatrix}\$，
四元数：
\$q=\begin{bmatrix}x \\\\ y \\\\ z \\\\ \omega \end{bmatrix}\$，
角轴：
\$r=\begin{pmatrix}\begin{bmatrix}k_x \\\\ k_y \\\\ k_z \end{bmatrix},& \theta\end{pmatrix}\$

### 欧拉角\$\longleftrightarrow\$旋转矩阵
1. 欧拉角\$\longrightarrow\$旋转矩阵  
绕\$x\$(*roll*)、\$y\$(*pitch*)、\$z\$(*yaw*)轴分别旋转\$\theta_x\$、\$\theta_y\$、\$\theta_z\$的各旋转矩阵\$R_x\$、\$R_y\$、\$R_z\$
\$$\left\lbrace\begin{aligned}R_x &=& \begin{bmatrix}1 & 0 & 0 \\\\ 0 & \cos\theta_x & -\sin\theta_x \\\\ 0 & \sin\theta_x & \cos\theta_x \end{bmatrix} \\\\ R_y &=& \begin{bmatrix} \cos\theta_y & 0 & \sin\theta_y \\\\ 0 & 1 & 0 \\\\ -\sin\theta_y & 0 & \cos\theta_y \end{bmatrix} \\\\ R_z &=& \begin{bmatrix} \cos\theta_z & -\sin\theta_z & 0 \\\\ \sin\theta_z & \cos\theta_z & 0 \\\\ 0 & 0 & 1 \end{bmatrix}\end{aligned}\right.\$$
则
\$$\left\lbrace\begin{array}{cc}R=R_x \cdot R_y \cdot R_z & or \\\\ R=R_x \cdot R_z \cdot R_y & or \\\\ R=R_y \cdot R_x \cdot R_z & or \\\\ \vdots & \\\\ R=R_z \cdot R_y \cdot R_x & \end{array}\right.\$$
通常是按照*roll*\$\rightarrow\$*pitch*$\rightarrow\$*yaw*的顺序进行旋转的，即
{'fraction_non_alphanumeric': 0.25965411040037906, 'fraction_numerical': 0.020374318881781567, 'mean_word_length': 3.8141391106043327, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 8, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4149201', 'n_tokens_mistral': 2411, 'n_tokens_neox': 2466, 'n_words': 268}