当前位置: 首页 > news >正文

机器人中的李代数是什么

目的

  很多机器人的初学者在第一次接触到李群和李代数时通常会感到困惑,它们到底有什么物理意义?有没有通俗易懂的、直观的解释。本文尝试从几个角度对李代数进行解读。

1 “角速度”解释

  我们先考虑简单的直线运动。已知一个物体在当前时刻的位置是 ppp ,而速度是 vvv。如果我们想知道经过一个很小的时间间隔 dtdtdt 之后物体到达的位置,应该如何计算呢?我们可以用当前时刻的速度进行估计,dtdtdt 之后物体到达的位置(我们用p′p^\primep表示)是:
p′=p+v⋅dt(1) \begin{aligned}\tag{1} p^\prime=p+v \cdot dt\\ \end{aligned} p=p+vdt(1)

  现在考虑物体做旋转运动。同样的,已知物体在当前时刻的姿态是 III ,而旋转速度是 XXX。如果我们想知道经过一个很小的时间间隔 dtdtdt 之后物体的姿态,应该如何计算呢?思路是一样的,我们利用当前时刻的旋转速度进行估计(我们用R′R^\primeR表示),计算方式如下式。

R′=I+X⋅dt(2) \begin{aligned}\tag{2} R^\prime=I+X \cdot dt\\ \end{aligned} R=I+Xdt(2)

  在数学中,一般用大写字母表示矩阵,小写字母表示矢量。位置是一个矢量,所以一般用小写字母来表示(例如前面的ppp)。在机器人领域,通常用一个被称为旋转矩阵的东西表示物体的姿态,所以用大写字母表示物体的姿态(例如前面的IIIR′R^\primeR)。
  这个旋转速度XXX就是一个李代数,它也是一个矩阵。
  李代数经常被描述为李群的切空间,这是为什么呢?通过上面的例子就容易猜到了。物体在做直线运动时,速度就是位置曲线的切线斜率,这个切线所在的空间就是位置的切空间。旋转运动类似,旋转速度也位于切空间。由于李群SO(3)SO(3)SO(3)是一个四维空间中的三维弯曲球面,我们无法在三维空间中展示出来,因此这里使用三维空间中的二维弯曲球面进行示意。

2 “无穷小旋转矩阵”解释

  李群的创立者索菲斯·李为了研究无穷小变换发明了李代数这个概念,所以李代数就是无穷小旋转矩阵。对于一个很小的李代数XXX,我们想用它构造一个很小的旋转RRR,可以这样做(III是个单位矩阵):

R=I+X(3) \begin{aligned}\tag{3} R=I+X\\ \end{aligned} R=I+X(3)

  在使用旋转矩阵的时候,我们很少看到矩阵之间的加法。旋转矩阵之间不能相加,因为没有意义。但是这里确实可以,因为这里李代数是个无穷小量。而无穷小量的计算似乎遵守另一套逻辑。暂时不管这么多了,往下算就是了。
  举个具体的例子,对于很小的李代数XXX

X=[0−0.030.020.030−0.01−0.020.010](4) \begin{aligned}\tag{4} X= \begin{bmatrix} 0 & -0.03 &0.02 \\ 0.03 & 0 & -0.01\\ -0.02 &0.01 & 0 \end{bmatrix}\\ \end{aligned} X=00.030.020.0300.010.020.010(4)
  我们计算RRTRR^\textup{T}RRT,如下。可以发现,乘积RRTRR^\textup{T}RRT很接近单位矩阵。所以,RRR确实可以近似看成是一个旋转矩阵。

RRT=(I+X)(I+X)T=[1−0.030.020.031−0.01−0.020.011]⋅[1−0.030.020.031−0.01−0.020.011]T=[1.0013−0.0002−0.0003−0.00021.001−0.0006−0.0003−0.00061.0005]≈[100010001](5) \begin{aligned}\tag{5} & RR^{\mathrm{T}}\\ = & (I+X)(I+X)^{\mathrm{T}} \\ = &\left[\begin{array}{ccc} 1 & -0.03 &0.02 \\ 0.03 & 1 & -0.01\\ -0.02 &0.01 & 1 \end{array}\right] \cdot \left[\begin{array}{ccc} 1 & -0.03 &0.02 \\ 0.03 & 1 & -0.01\\ -0.02 &0.01 & 1 \end{array}\right]^\textup{T} \\ =& \left[\begin{array}{ccc} 1.0013 & -0.0002&-0.0003 \\ -0.0002&1.001&-0.0006\\ -0.0003&-0.0006&1.0005 \end{array}\right] \\ \approx &\left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right] \end{aligned} ===RRT(I+X)(I+X)T10.030.020.0310.010.020.01110.030.020.0310.010.020.011T1.00130.00020.00030.00021.0010.00060.00030.00061.0005100010001(5)

  我们说“近似”是,那什么时候才真正是呢?这就要用到指数映射了。假如我们用I+X+X22I+X+\frac{X^2}{2}I+X+2X2表示RRR,会发现得到结果比上面的更接近单位矩阵了。所以,好朋友——指数映射登场了。

RRT=(I+X+X22)(I+X+X22)T=[10.000000070.0000001050.0000000710.000000210.0000001050.000000211](6) \begin{aligned}\tag{6} & RR^{\mathrm{T}}\\ = & (I+X+\frac{X^2}{2})(I+X+\frac{X^2}{2})^{\mathrm{T}} \\ =& \left[\begin{array}{ccc} 1 &0.00000007&0.000000105 \\ 0.00000007&1&0.00000021\\ 0.000000105&0.00000021&1 \end{array}\right] \\ \end{aligned} ==RRT(I+X+2X2)(I+X+2X2)T10.000000070.0000001050.0000000710.000000210.0000001050.000000211(6)

  指数映射就是指数函数exe^xex,其中的xxx就是个实数。如果把实数xxx换成一个矩阵也是有意义的,为了便于区分就叫eXe^XeX指数映射了。学过一点高等数学的同学可能还记得,指数函数有两种定义方法,一种是无穷级数:

ex=1+x1!+x22!+x33!+x44!+⋯(7)\tag{7} e^x = 1 + \frac{x}{1!} + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + \cdots ex=1+1!x+2!x2+3!x3+4!x4+(7)

  另一种是二项式的极限:

ex=lim⁡n→∞(1+xn)n(8)\tag{8} e^{x} = \lim_{n \rightarrow \infty} \left(1 + \frac{x}{n}\right)^{n} ex=nlim(1+nx)n(8)

  这两种方式都可以逼近指数函数,但是级数形式更快(实际上级数形式比极限形式要快得多)。下图左侧是级数形式,右侧是极限形式。红色点表示指数函数上实际的点,蓝色的点是取有限项计算得到的近似点。

    

  欧拉发现,如果把实数扩展到复数,也就是把复数带入指数函数的定义,可以得到下面的公式(9)(9)(9),这就是大名鼎鼎的欧拉公式。上面的动画就是将iθi \thetaiθ带入指数函数的定义式后,把结果的实部和虚部分别作为(x,y)(x,y)(x,y)坐标画在坐标系中的图像。其中,nnn表示级数或者二项式中的项数,θ\thetaθ是一个实数。

eiθ=cos⁡(θ)+isin⁡(θ)(9)\tag{9} e^{i\theta} = \cos(\theta) + i \sin(\theta) eiθ=cos(θ)+isin(θ)(9)

3 “轴-角度”解释

  可以看到,欧拉公式描述了二维平面中的旋转。那么三维空间如何表示旋转呢?可能是受到欧拉公式的启发,一个名为罗德里格斯的年轻人得到了三维旋转的表达形式(10)(10)(10),这个公式没有欧拉公式那么家喻户晓,但是搞不好可能会偶尔用到,它被称为罗德里格斯公式。将李代数XXX写成向量的形式,X=θu^X=\theta \widehat{u}X=θu,其中uuu是一个单位向量,θ\thetaθ是李代数向量的“长度”(范数)。

eX=∑n=0∞(θu^)nn!=I+θu^1!+θ2u^22!+θ3u^33!+θ4u^44!+θ5u^55!+⋯=(uuT−u^u^)+θu^+12!θ2u^2+13!θ3(−u^)+14!θ4(−u^u^)+15!θ5u^+⋯=uuT+(θ−13!θ3+15!θ5−⋯ )⏟sin⁡(θ)u^−(1−12!θ2+14!θ4−⋯ )⏟cos⁡(θ)u^u^=(u^u^+I)+sin⁡(θ)u^−cos⁡(θ)u^u^=I+sin⁡(θ)u^+(1−cos⁡(θ))u^u^(10) \begin{aligned} & e^{X}\tag{10} \\ = &\sum_{n=0}^{\infty}\frac{(\theta \widehat{u})^{n}}{n!} \\ = &I + \frac{\theta \widehat{u}}{1!} + \frac{\theta^{2} \widehat{u}^{2}}{2!} + \frac{\theta^{3} \widehat{u}^{3}}{3!} + \frac{\theta^{4} \widehat{u}^{4}}{4!} + \frac{\theta^{5} \widehat{u}^{5}}{5!} + \cdots \\ = &(uu^{\mathrm{T}} - \widehat{u}\widehat{u}) + \theta \widehat{u} + \frac{1}{2!}\theta^{2} \widehat{u}^{2} + \frac{1}{3!}\theta^{3} (-\widehat{u}) + \frac{1}{4!}\theta^{4} (-\widehat{u}\widehat{u}) + \frac{1}{5!}\theta^{5} \widehat{u} + \cdots \\ = &uu^{\mathrm{T}} + \underbrace{\left(\theta - \frac{1}{3!}\theta^{3} + \frac{1}{5!}\theta^{5} - \cdots\right)}_{\sin(\theta)} \widehat{u} - \underbrace{\left(1 - \frac{1}{2!}\theta^{2} + \frac{1}{4!}\theta^{4} - \cdots\right)}_{\cos(\theta)} \widehat{u}\widehat{u} \\ = &(\widehat{u}\widehat{u} + I) + \sin(\theta)\widehat{u} - \cos(\theta)\widehat{u}\widehat{u} \\ = &I + \sin(\theta)\widehat{u} + (1 - \cos(\theta))\widehat{u}\widehat{u} \end{aligned} ======eXn=0n!(θu)nI+1!θu+2!θ2u2+3!θ3u3+4!θ4u4+5!θ5u5+(uuTuu)+θu+2!1θ2u2+3!1θ3(u)+4!1θ4(uu)+5!1θ5u+uuT+sin(θ)(θ3!1θ3+5!1θ5)ucos(θ)(12!1θ2+4!1θ4)uu(uu+I)+sin(θ)ucos(θ)uuI+sin(θ)u+(1cos(θ))uu(10)

  向量uuu可以视为旋转轴,θ\thetaθ是绕这根轴旋转的角度,所以李代数可以视为绕某根轴旋转一个角度。
  李代数XXX作用到向量的结果可以用叉积表示,例如我们将XXX记为:

X=[0−zyz0−x−yx0](11)X=\left[\begin{array}{ccc}\tag{11} 0 & -z & y \\ z & 0 & -x \\ -y & x & 0 \end{array}\right] X=0zyz0xyx0(11)

  那么,将XXX作用到一个三维向量v=(a,b,c)v=(a,b,c)v=(a,b,c)(也就是矩阵向量相乘)将得到:

Xv=[0−zyz0−x−yx0]⋅[abc]=[cy−bzaz−cxbx−ay](12)Xv=\left[\begin{array}{ccc}\tag{12} 0 & -z & y \\ z & 0 & -x \\ -y & x & 0 \end{array}\right] \cdot \left[\begin{array}{ccc} a\\ b\\c \end{array}\right] = \left[\begin{array}{ccc} c y - b z\\ a z-c x \\ b x-a y \end{array}\right] Xv=0zyz0xyx0abc=cybzazcxbxay(12)

  而两个向量叉积的定义如下。可以看到(12)(12)(12)(13)(13)(13)结果相同。

(x,y,z)×(a,b,c)=(cy−bz,−cx+az,bx−ay)(13)\tag{13}(x,y,z)\times(a,b,c) = (c y - b z, -c x + a z, b x - a y)(x,y,z)×(a,b,c)=(cybz,cx+az,bxay)(13)

  两个向量做叉积的结果也是一个向量,这个向量与前两个向量都垂直。我们可以想象,李代数作用到空间中每一个点,都可以得到一个新的向量,它生成了一个向量场。假如我们把这个向量场画出来会是什么样的呢?下图所示就是李代数产生的向量场。我们改变李代数,相应的向量场也就发生了变化。由于生成的新向量总是与李代数(对应的向量)垂直,所以看上去这个向量场就是在围绕李代数旋转,李代数就是那个旋转轴。当然,旋转轴只需要单位向量就能确定,所以向量的长度表示了旋转的程度(即旋转角度)。

  旋转轴这个解释可比什么无穷小旋转矩阵、切空间那些解释直观多了。沿着这个方向思考,我们是否可以用李代数干点什么呢,比如插值?

  给定两个位置点,我们可以在二者中间连一条线段,这条线段上的点就是二者之间的一系列点。那么对于旋转来说,给定任意两个姿态,如何表示它们之间的一系列姿态或者旋转呢?
  一种思路是:
  (1)(1)(1) 计算差值旋转矩阵:假设从R1R_1R1经过旋转∆R∆RR到达R2R_2R2,如图所示。∆R∆RR可以由R1R_1R1R2R_2R2得到:∆R=R1−1R2∆R=R_1^{-1} R_2R=R11R2
  (2)(2)(2) 计算旋转轴和旋转角:旋转∆R∈SO(3)∆R∈SO(3)RSO(3)对应的旋转轴和旋转角可以由其李代数得到。我们知道从李代数得到李群可以借助指数映射。反之,从李群得到李代数需要使用对数映射(Logarithmic Map),即矩阵指数映射的逆运算。使用对数映射,我们可以将旋转矩阵变换为李代数空间中的元素(当然也就是个李代数了),即log:eX→Xlog:e^X→Xlog:eXX。将李代数的向量表示记为θuθuθu。其中,单位向量uuu表示从R1R_1R1R2R_2R2的旋转轴。而实数θθθ表示从R1R_1R1R2R_2R2旋转的角度。
  (3)(3)(3) 改变旋转角:使用指数映射,我们只需要让角度从000变化到θθθ即可得到一系列的中间旋转(期间并不改变旋转轴的朝向),如下图所示。
Rt=etu^,t∈(0,θ) R_t=e^{t\hat{u}}, t∈(0,θ) Rt=etu^,t(0,θ)

  除了以上插值方法外,还有一种更简单、直接的方法,步骤如下。
  (1)(1)(1) 转换为李代数:我们可以将每个旋转矩阵R1R_1R1R2R_2R2都视为李代数的指数映射。反过来,从旋转矩阵RRR也可以得到李代数,即:
X1=log(R1)X2=log(R2)X_1=log(R_1) \\ X_2=log(R_2)X1=log(R1)X2=log(R2)

  (2)(2)(2) 线性插值:既然李代数是一个线性空间,我们就在李代数这个线性空间中进行线性插值,再借助指数映射将中间结果(李代数)转换为李群中的旋转:
Rt=e(1−t)X1+tX2,t∈(0,1)R_t=e^{(1-t) X_1+tX_2}, t∈(0,1)Rt=e(1t)X1+tX2,t(0,1)

参考

[1] 封闭场景无人驾驶技术与应用.

http://www.dtcms.com/a/349500.html

相关文章:

  • 抖音多账号运营新范式:巨推AI如何解锁流量矩阵的商业密码
  • 量子计算驱动的Python医疗诊断编程前沿展望(下)
  • 数据结构:单向链表的逆置;双向循环链表;栈,输出栈,销毁栈;顺序表和链表的区别和优缺点;0825
  • 平安产险青海分公司启动2025年“乡风文明100行动” 首站落地海东市乐都区土官沟村
  • 【C++详解】哈希表概念与实现 开放定址法和链地址法、处理哈希冲突、哈希函数介绍
  • Redis缓存雪崩缓存击穿缓存穿透的处理方式
  • [React]Antd Upload组件上传多个文件
  • 阿里云安装postgre数据库
  • Vim 的 :term命令:终端集成的终极指南
  • 中介者模式及优化
  • Flink 状态 RocksDBListState(写入时的Merge优化)
  • 元宇宙与个人生活:重构日常体验的数字新维度
  • 技术攻坚与安全兜底——消防智能仓储立库管理系统的国产化硬核实力
  • ADB 调试工具的学习[特殊字符]
  • 性能优化:首屏加载速度的优化
  • Seaborn数据可视化实战:Seaborn高级使用与性能优化教程
  • C++编译链接与性能优化答案
  • 新手入门GEO优化指南:从0到1掌握生成式引擎优化
  • 我们为你连接网络,安装驱动程序
  • 构建AI智能体:十三、大数据下的“搭积木”:N-Gram 如何实现更智能的语义搜索
  • 60 C++ 现代C++编程艺术9-function用法
  • 29.深浅拷贝
  • 用DeepSeek实现实时语音翻译,我们在应用端需要做什么?
  • ssl笔记
  • Rust爬虫实战:用reqwest+select打造高效网页抓取工具
  • 通信中间件 Fast DDS(二) :详细介绍
  • 达梦 manager启动报错
  • COREDUMP
  • vsftp 传着传着速率变慢或者没有了
  • Django时区处理