<长期更新>
Notion 公式对齐
参考:
|
|
SLERP 球面插值
参考:https://zhuanlan.zhihu.com/p/538653027,由于参考文章的方法不容易想,这里用正交的思路来记忆。
四元数球面插值的核心,就是通过角度比例插值的方法来实现插值的保范性。如下图所示,我们的目标是寻找到一组合适的插值参数 \([a, b]^T\),使得 \(r = a \cdot p + b \cdot q \)。

对于这类向量计算,可以通过找正交的角度来简化思考,考虑 \(p\) 的正交单位向量(这里我们假设两个向量之间的角度小于 90 度,图里面大于 90 度的情况放后面讨论):
\[p_{\perp} = \frac{q-p \cdot \cos\theta}{\sin\theta}\]由此,我们可以得到 \(r\) 关于 \(p\) 和 \(p_{\perp}\)的关系:
\[r = p \cdot \cos(t\theta) + p_{\perp} \cdot \sin(t\theta)\]将 \(p_{\perp}\) 的定义带入上述公式可以得到:
\[r = \frac{p \cdot \cos(t\theta) \cdot \sin \theta + q \cdot \sin(t\theta)-p \cdot \cos(\theta) \sin(t\theta)}{\sin\theta}\]由于 \(\sin(a+b)=\sin a\cos b + \cos a \sin b\),我们有:
\[r = \frac{p \cdot \sin [(1-t)\theta]+q \cdot \sin(t\theta)}{\sin \theta}\]由此可以得到插值系数:
\[\begin{bmatrix} a \\ b \end{bmatrix} = \begin{bmatrix} \frac{\sin[(1-t)\theta]}{\sin \theta} \\ \frac{\sin (t\theta)}{\sin \theta} \end{bmatrix} \]当然,这里有两点需要注意:
- 如果夹角极小,此时涉及到除零,需要使用 NLERP (即正规线性插值,在线性插值后通过除以范数来确保长度为 1)来代替 SLERP
- 如果夹角大于 90 度,插值会跑到较长的圆弧上。这个时候,我们只需把其中一个向量取反(因为四元数 \(-q\) 和 \(q\) 代表同一个旋转),就可以得到结果了。
四元数
这个参考文献太神了,推导非常详细,完全不需要我增加多余的内容:
https://github.com/Krasjet/quaternion
李代数 SO(3)的伴随性质
1. 基本定义和记号
1.1 SO(3) 和 so(3)
- SO(3):3×3 正交矩阵群,满足 \(R^T R = I\) 和 \(\det(R) = 1\)
- so(3):SO(3) 的李代数,由反对称矩阵组成,\(\text{so}(3) = {X \in \mathbb{R}^{3×3} : X^T = -X}\)
1.2 伴随映射(Adjoint Map)的定义
对于 \(R \in \text{SO}(3)\),伴随映射 \(\text{Ad}_R: \text{so}(3) \to \text{so}(3)\) 定义为:
\[ \text{Ad}_R(X) = RXR^{-1} = RXR^T\]其中 \(X \in \text{so}(3)\)。
2. 伴随性质
性质 2.1:伴随映射保持反对称性
命题:如果 \(X \in \text{so}(3)\),那么 \(\text{Ad}_R(X) \in \text{so}(3)\)
证明: 设 \(Y = \text{Ad}_R(X) = RXR^T\),需要证明 \(Y^T = -Y\)。
\[Y^T = (RXR^T)^T = (R^T)^T X^T R^T = RX^T R^T\]由于 \(X \in \text{so}(3)\),所以 \(X^T = -X\),因此:
\[ Y^T = R(-X)R^T = -RXR^T = -Y \quad \checkmark\]这证明了 \(\text{Ad}_R(X) \) 仍然是反对称矩阵,即 \(\text{Ad}_R(X) \in \text{so}(3)\)。
性质 2.2:伴随映射是线性映射
命题:对任意 \(X, Y \in \text{so}(3)\) 和标量 \(\alpha, \beta \in \mathbb{R}\),有 \(\text{Ad}_R(\alpha X + \beta Y) = \alpha\text{Ad}_R(X) + \beta\text{Ad}_R(Y)\)
证明:
\[ \begin{aligned} \text{Ad}_R(\alpha X + \beta Y) &= R(\alpha X + \beta Y)R^T \\ &= \alpha RXR^T + \beta RYR^T \\ &= \alpha\text{Ad}_R(X) + \beta\text{Ad}_R(Y) \quad \checkmark \end{aligned}\]性质 2.3:伴随映射保持李括号结构
命题:对任意 \(X, Y \in \text{so}(3)\),有 \(\text{Ad}_R([X,Y]) = [\text{Ad}_R(X), \text{Ad}_R(Y)]\),其中 \([X,Y] = XY - YX\) 是李括号。
证明:
\[ \begin{aligned} \text{Ad}_R([X,Y]) &= R[X,Y]R^T \\ &= R(XY - YX)R^T \\ &= RXR^T RYR^T - RYR^T RXR^T \\ &= \text{Ad}_R(X)\text{Ad}_R(Y) - \text{Ad}_R(Y)\text{Ad}_R(X) \\ &= [\text{Ad}_R(X), \text{Ad}_R(Y)] \quad \checkmark \end{aligned}\]这表明伴随映射是李代数同态。
性质 2.4:伴随映射是同构
命题:对任意 \(R \in \text{SO}(3)\),映射 \(\text{Ad}_R \)是 \(\text{so}(3)\) 上的线性同构。
证明: 对于 \(Y \in \text{so}(3)\),定义 \(X = R^T Y R\),则
\[\text{Ad}_R(X) = R(R^T YR)R^T = (RR^T)Y(RR^T) = Y\]这表明 \(\text{Ad}_R\) 是满射。
对于单射性,假设\( \text{Ad}_R(X) = 0\),即 \(RXR^T = 0\),则 \(X = R^T(RXR^T)R = 0\)
因此 \(\text{Ad}_R\) 是单射。
所以 \(\text{Ad}_R \) 是双射,且其逆映射为_ _\(\text{Ad}_{R^T} = \text{Ad}_{R^{-1}} \checkmark\)
性质 2.5:伴随映射的群同态性
命题:对任意 \(R_1, R_2 \in \text{SO}(3)\),有\( \text{Ad}_{R_1 R_2} = \text{Ad}_{R_1} \circ \text{Ad}_{R_2}\)
证明: 对任意 \(X \in \text{so}(3)\):
\[ \begin{aligned} \text{Ad}_{R_1 R_2}(X) &= (R_1 R_2)X(R_1 R_2)^T \\ &= (R_1 R_2)X(R_2^T R_1^T) \\ &= R_1(R_2 X R_2^T)R_1^T \\ &= R_1[\text{Ad}{R_2}(X)]R_1^T \\ &= \text{Ad}{R_1}(\text{Ad}{R_2}(X)) \quad \checkmark \end{aligned}\]性质 2.6:向量表示的伴随性质
【重要特例!】:对反对称矩阵 \([v]_×\)(由向量 \(v \in \mathbb{R}^3\) 生成),有 \(\text{Ad}_R([v]_×) = [Rv]_×\),即 \(R[v]_×R^T = [Rv]_×\)
证明: 设 \([v]_× = \begin{pmatrix} 0 & -v_3 & v_2 \\ v_3 & 0 & -v_1 \\ -v_2 & v_1 & 0 \end{pmatrix}\)
对任意向量 \(u \in \mathbb{R}^3\),有 \([v]_× u = v \times u\)(叉积)。
因此:
\[\begin{aligned} \text{Ad}_R([v]_×) u &= R[v]_× R^T u \\ &= R(v \times (R^T u)) \end{aligned}\]利用 \(R(a \times b) = (Ra) \times (Rb)\)(旋转保持叉积结构),得:
\[\begin{aligned}R(v \times (R^T u)) &= (Rv) \times (R(R^T u)) \\ &= (Rv) \times u \\ &= [Rv]_× u \end{aligned}\]对所有 u 成立,所以: \(\text{Ad}_R([v]_×) = [Rv]_× \quad \checkmark\)
- 矩阵表示
3.1 伴随表示矩阵
在 so(3) 的标准基 E_1 = \begin{pmatrix} 0 & 0 & 0 \ 0 & 0 & -1 \ 0 & 1 & 0 \end{pmatrix}, \quad E_2 = \begin{pmatrix} 0 & 0 & 1 \ 0 & 0 & 0 \ -1 & 0 & 0 \end{pmatrix}, \quad E_3 = \begin{pmatrix} 0 & -1 & 0 \ 1 & 0 & 0 \ 0 & 0 & 0 \end{pmatrix}
下,伴随映射可表示为 3×3 矩阵 \text{Ad}(R),满足: \text{Ad}(R) \begin{pmatrix} \omega_1 \ \omega_2 \ \omega_3 \end{pmatrix} = \begin{pmatrix} v_1 \ v_2 \ v_3 \end{pmatrix}
其中 X = \omega_1 E_1 + \omega_2 E_2 + \omega_3 E_3 映射到 \text{Ad}_R(X) = v_1 E_1 + v_2 E_2 + v_3 E_3。
3.2 重要结果
对于 R \in \text{SO}(3),有 \text{Ad}(R) = R(在相同的矩阵表示下)。
这意味着: R \in \text{SO}(3) \Leftrightarrow \text{Ad}(R) \in \text{SO}(3)
- 指数映射与伴随
性质 4.1:伴随与指数的交换性
命题:对 R \in \text{SO}(3) 和 X \in \text{so}(3),有 R \exp(X) R^{-1} = \exp(\text{Ad}_R(X))
证明:
\begin{align}
R \exp(X) R^{-1} &= R \left(\sum_{n=0}^{\infty} \frac{X^n}{n!}\right) R^{-1}
&= \sum_{n=0}^{\infty} \frac{RX^nR^{-1}}{n!}
&= \sum_{n=0}^{\infty} \frac{(RXR^{-1})^n}{n!}
&= \sum_{n=0}^{\infty} \frac{(\text{Ad}_R(X))^n}{n!}
&= \exp(\text{Ad}_R(X)) \quad \checkmark
\end{align}
性质 2.2:伴随映射是线性映射
命题:对任意 $X, Y \in \text{so}(3)$ 和标量 $\alpha, \beta \in \mathbb{R}$,有
$$\text{Ad}_R(\alpha X + \beta Y) = \alpha\text{Ad}_R(X) + \beta\text{Ad}_R(Y)$$证明:
\[ \begin{aligned} \text{Ad}_R(\alpha X + \beta Y) &= R(\alpha X + \beta Y)R^T \\ &= \alpha RXR^T + \beta RYR^T \\ &= \alpha\text{Ad}_R(X) + \beta\text{Ad}_R(Y) \quad \checkmark \end{aligned}\]李代数求导,左扰动和右扰动
参考:https://zhuanlan.zhihu.com/p/75714471, 《视觉SLAM十四讲》P74-76
在 SLAM(如 SO(3) 和 SE(3))的优化问题中,由于群元素对常规加法运算不封闭,无法直接套用经典微积分中基于加法的极限来定义导数。以 SO(3) 上空间点 p 的旋转变换 Rp 为例,一般存在三种间接的求导方式:
李代数求导(不常见)
由于对于 \(R\) ,无法定义加法,我们转而计算 \(\phi\) ,其中 \(\exp(\phi^{\wedge})=R\)
[\begin{aligned} \frac{\partial (Rp)}{\partial \phi} &= \lim_{\phi \to 0}\frac{\partial [\exp(\phi ^{\wedge})p]}{\partial \phi} \&= \lim_{\phi \to 0}\frac{\exp((\phi+\Delta \phi)^{\wedge})p-\exp(\phi^{\wedge})p}{\partial \phi} \&= \lim_{\phi \to 0}\frac{\exp((J_l\Delta \phi)^{\wedge})\exp(\phi^{\wedge})p-\exp(\phi^{\wedge})p}{\partial \phi} \&= \lim_{\phi \to 0}\frac{(1+(J_l\Delta \phi)^{\wedge})\exp(\phi^{\wedge})p+\exp(\phi^{\wedge})p}{\partial \phi} \&= \lim_{\phi \to 0}\frac{(J_l\Delta \phi)^{\wedge}\exp(\phi^{\wedge})p}{\partial \phi} \&= \lim_{\phi \to 0}\frac{-(\exp(\phi^{\wedge})p)^{\wedge}(J_l\Delta \phi)}{\partial \phi} \&= -(\exp(\phi^{\wedge})p)^{\wedge}J_l
\end{aligned}]
左扰动模型(Left Perturbation)
将微小扰动映射到李群后,左乘于原李群元素。设李代数微小扰动为 \(\partial \xi\),则扰动后的状态为 \(\exp(\xi^{\wedge})Rp\)。 关于左扰动的导数定义为:
[\begin{aligned} \frac{\partial (Rp)}{\partial \xi} &= \lim_{\xi \to 0}\frac{\exp(\xi ^{\wedge})Rp-Rp}{\partial \xi}\&= \lim_{\xi \to 0}\frac{(I+\Delta \xi ^{\wedge})Rp-Rp}{\partial \xi} \&=\lim_{\xi \to 0}\frac{\Delta \xi^{\wedge}Rp}{\partial \xi} \&= \lim_{\xi \to 0}\frac{-(Rp)^{\wedge}\Delta \xi}{\partial \xi} \&=-(Rp)^{\wedge}
\end{aligned}]
在几何与物理意义上,左扰动等价于在全局坐标系(固定参考系)下对当前位姿施加一个微小的刚体变换。
右扰动模型(Right Perturbation)
将微小扰动映射到李群后,右乘于原李群元素,即扰动后的状态为 Texp(δξ∧)。此时目标函数关于右扰动的导数定义为:
\[\begin{aligned} \frac{\partial (Rp)}{\partial \xi} &= \lim_{\xi \to 0}\frac{R\exp(\xi ^{\wedge})p-Rp}{\partial \xi} \\&= \lim_{\xi \to 0}\frac{R(I+\Delta \xi ^{\wedge})p-Rp}{\partial \xi} \\&= \lim_{\xi \to 0}\frac{R\Delta \xi^{\wedge}p}{\partial \xi} \\&= \lim_{\xi \to 0}\frac{-Rp^{\wedge}\Delta \xi}{\partial \xi} \\&= -Rp^{\wedge} \end{aligned}\]几何意义上,右扰动等价于在局部坐标系(如机器人的当前载体坐标系)下对位姿施加微小变换。
explict
参考:https://www.reddit.com/r/cpp/comments/1hf4z7p/i_am_confused_as_to_when_to_use_explicit_in_a/
C++中的 explict关键字用于修饰类构造函数(或 C++11 起的转换运算符),它显式声明该构造函数不能用于隐式类型转换。
一般来说,对于任何单参数构造函数,只要开发者没有明确采用隐式转换的需求,就要使用 explict 关键字。
<未完待续>