旋转表达之Lie-Cartan坐标及欧拉角

旋转表达之Lie-Cartan坐标及欧拉角讲解

  指数坐标( e ω ^ t e^{\hat{\omega}t} eω^t)和单位四元数 q = q 0 + q 1 i + q 2 j + q 3 k {\rm q}=q_0+q_1i+q_2j+q_3k q=q0+q1i+q2j+q3k都可以被视为全局参数化旋转矩阵的方法,参数化几乎以相同的方式适用于每个旋转矩阵。

  另一方面,下面介绍的Lie-Cartan坐标属于局部参数化的范畴。 也就是说,这种参数化仅适用于 S O ( 3 ) SO(3) SO(3)的一部分,但不适用于整个空间。 这种局部参数化的优点是我们通常只需要三个参数来描述旋转矩阵,而不是两个指数坐标: ( ω , t ) ∈ R 4 (\omega,t)\in \mathbb{R}^4 (ω,t)R4和单位四元数: q ∈ S 3 ⊂ R 4 q\in \mathbb{S}^3\sub \mathbb{R}^4 qS3R4

  在斜对称矩阵的 S O ( 3 ) SO(3) SO(3)中,选择一个基 ( ω ^ 1 , ω ^ 2 , ω ^ 3 ) (\hat{\omega}_1,\hat{\omega}_2,\hat{\omega}_3) (ω^1,ω^2,ω^3),即三个向量 ω ^ 1 , ω ^ 2 , ω ^ 3 \hat{\omega}_1,\hat{\omega}_2,\hat{\omega}_3 ω^1,ω^2,ω^3是线性独立的。 从 R 3 \mathbb{R}^3 R3 S O ( 3 ) SO(3) SO(3)的映射(参数化)为

α : ( α 1 , α 2 , α 3 ) ↦ exp ⁡ ( α 1 w ^ 1 + α 2 w ^ 2 + α 3 w ^ 3 ) \alpha:(\alpha_1,\alpha_2,\alpha_3) \mapsto \exp(\alpha_1\hat{w}_1+\alpha_2\hat{w}_2+\alpha_3\hat{w}_3) α:(α1,α2,α3)exp(α1w^1+α2w^2+α3w^3)

  坐标 ( α 1 , α 2 , α 3 ) (\alpha_1,\alpha_2,\alpha_3) (α1,α2,α3)被称为第一类的Lie-Cartan坐标相对于基 ( ω ^ 1 , ω ^ 2 , ω ^ 3 ) (\hat{\omega}_1,\hat{\omega}_2,\hat{\omega}_3) (ω^1,ω^2,ω^3)。 使用相同基参数化群 S O ( 3 ) SO(3) SO(3)的另一种方式是确定从 R 3 \mathbb{R}^3 R3 S O ( 3 ) SO(3) SO(3)的另一个映射:

β : ( β 1 , β 2 , β 3 ) ↦ exp ⁡ ( β w ^ 1 ) exp ⁡ ( β w ^ 2 ) exp ⁡ ( β w ^ 3 ) \beta:(\beta_1,\beta_2,\beta_3)\mapsto \exp(\beta\hat{w}_1)\exp(\beta\hat{w}_2)\exp(\beta\hat{w}_3) β:(β1,β2,β3)exp(βw^1)exp(βw^2)exp(βw^3)

  然后将坐标 ( β 1 , β 2 , β 3 ) (\beta_1,\beta_2,\beta_3) (β1,β2,β3)称为第二类的Lie-Cartan坐标。

  在特殊情况下,我们选择的 w ^ 1 , w ^ 2 , w ^ 3 \hat{w}_1,\hat{w}_2,\hat{w}_3 w^1,w^2,w^3分别为轴 Z , Y , X Z,Y,X Z,Y,X

w 1 = [ 0 , 0 , 1 ] T = ˙ z , ω 2 = [ 0 , 1 , 0 ] T = ˙ y , ω 3 = [ 1 , 0 , 0 ] T = ˙ x w_1=[0,0,1]^T\dot={\rm z},\omega_2=[0,1,0]^T\dot={\rm y},\omega_3=[1,0,0]^T\dot={\rm x} w1=[0,0,1]T=˙z,ω2=[0,1,0]T=˙y,ω3=[1,0,0]T=˙x

  第二类Lie-Cartan坐标与众所周知的 Z Y X ZYX ZYX 欧拉角参数化一致, ( β 1 , β 2 , β 3 ) (\beta_1,\beta_2,\beta_3) (β1,β2,β3)是相应的欧拉角。 然后旋转矩阵表示为:

R ( β 1 , β 2 , β 3 ) = exp ⁡ ( β 1 z ^ ) exp ⁡ ( β 2 y ^ ) exp ⁡ ( β 3 x ^ ) R(\beta_1,\beta_2,\beta_3)=\exp(\beta_1\hat{\rm z})\exp(\beta_2\hat{\rm y})\exp(\beta_3\hat{\rm x}) R(β1,β2,β3)=exp(β1z^)exp(β2y^)exp(β3x^)

  更准确地说, R ( β 1 , β 2 . β 3 ) R(\beta_1,\beta_2.\beta_3) R(β1,β2.β3)是三个旋转矩阵的乘法,如下所示:

[ cos ⁡ ( β 1 ) − sin ⁡ ( β 1 ) 0 sin ⁡ ( β 1 ) cos ⁡ ( β 1 ) 0 0 0 1 ] \begin{bmatrix}\cos(\beta_1)&-\sin(\beta_1)&0\\\sin(\beta_1)&\cos(\beta_1)&0\\0&0&1\end{bmatrix} cos(β1)sin(β1)0sin(β1)cos(β1)0001

[ cos ⁡ ( β 2 ) 0 sin ⁡ ( β 2 ) 0 1 0 − sin ⁡ ( β 2 ) 0 cos ⁡ ( β 2 ) ] \begin{bmatrix}\cos(\beta_2)&0&\sin(\beta_2)\\0&1&0\\-\sin(\beta_2)&0&\cos(\beta_2)\end{bmatrix} cos(β2)0sin(β2)010sin(β2)0cos(β2)

[ 1 0 0 0 cos ⁡ ( β 3 ) − sin ⁡ ( β 3 ) 0 sin ⁡ ( β 3 ) cos ⁡ ( β 3 ) ] \begin{bmatrix}1&0&0\\0&\cos(\beta_3)&-\sin(\beta_3)\\0&\sin(\beta_3)&\cos(\beta_3)\end{bmatrix} 1000cos(β3)sin(β3)0sin(β3)cos(β3)

  类似地,我们可以定义 Y Z X YZX YZX欧拉角和 Z Y Z ZYZ ZYZ欧拉角。 有些情况下,这种表示变得奇异,对于某些旋转矩阵,它们相应的欧拉角不能无差别地确定。 例如,当 β 2 = − π / 2 \beta_2=-\pi/2 β2=π/2时, Z Y X ZYX ZYX欧拉角变为奇异。 由于空间 S O ( 3 ) SO(3) SO(3)的拓扑结构,非常期望存在这种奇点。 全局 S O ( 3 ) SO(3) SO(3)非常像 R 4 \mathbb{R}^4 R4中的球体,众所周知,任何为它找到全局(三维)坐标图的尝试都注定要失败。

欧拉角

预知

  刚刚我们知道,欧拉角是第二类Lie-Cartan坐标,这是描述旋转的方式。想想之前我们说过的四元数,还有之前说过的旋转矩阵和旋转向量。我们很难通过它们去想象这个旋转是怎么样的。

  当它们描述所谓的旋转的时候,我们不知道直观的知道物体是哪个方向在转动。而欧拉角则非常的直观和形象。它使用了三个分离的转角,把旋转分解为3次绕不同轴的旋转。因为分解的方式有许多种,所以分成了不同的欧拉角定义。

  举个例子,我们定义先从Z轴旋转,再绕着Y轴,再绕着X轴,就是ZYX轴的旋转。

  下面图给个欧拉角旋转的动态示意,感受感受。

欧拉角的动态示意

好了说了这么多,进入正题吧。

描述和定义

  欧拉角是由莱昂哈德·欧拉定义的,是的,你没看错,就是下面的图1的这个人。

图1:莱昂哈德·欧拉

  欧拉角引入了三个角用来描述相对于固定坐标系下的刚体的方向。它们还可以表示物理中移动参考坐标系的方向或三维线性代数中一般基的方向。

  对于任何参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。

  三个基本旋转可以是外在的(围绕原始坐标系的轴 x y z xyz xyz的旋转,假设保持静止),或内在的(围绕旋转坐标系 x y z xyz xyz的轴的旋转,与移动体一致,其改变每个基本旋转后的方向)。

  在不考虑使用两种不同约定来定义旋转轴(内在或外在)的可能性的情况下,存在十二种可能的旋转轴序列,分为两组:

  • Proper Euler angles ( z − x − z , x − y − x , z − y − z , x − z − x , y − x − y ) (z-x-z,x-y-x,z-y-z,x-z-x,y-x-y) (zxz,xyx,zyz,xzx,yxy)
  • Tait–Bryan angles : ( x − y − z , y − z − x , z − x − y , x − z − y , z − y − x , y − x − z ) (x-y-z,y-z-x,z-x-y,x-z-y,z-y-x,y-x-z) (xyz,yzx,zxy,xzy,zyx,yxz)

  Tait-Bryan角也称为Cardan角; 航海角度; 或偏航(yaw),俯仰(pitch)和滚动(roll)。 有时,两种序列都称为“欧拉角”。 在这种情况下,第一组的序列称为经典的欧拉角。

几何定义(静态定义)

  对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。

  参考图2,设定 x y z \rm xyz xyz-轴为参考(原始)系的轴, X Y Z \rm XYZ XYZ-轴是旋转坐标系的轴。几何定义(有时候被称为静态),是定义称 x y \rm xy xy-平面与 X Y \rm XY XY-平面的相交为轨道交点线(也可以定义为与轴 z \rm z z Z \rm Z Z的公共垂线,然后写为矢量积 N = z × Z N = z \times Z N=z×Z),用英文字母(N)代表。

zxz顺规的欧拉角可以静态地这样定义:

  • α \alpha α(或 φ \varphi φ)是 x \rm x x轴和 N \rm N N轴之间的角度(x-规约(convention) - 它也可以在 y \rm y y N \rm N N之间定义,称为y-规约)。范围在 [ 0 , 2 π ] [0,2\pi] [0,2π]
  • β \beta β(或 θ \theta θ)是 z \rm z z轴和 Z \rm Z Z轴之间的角度。范围在 [ 0 , π ] [0,\pi] [0,π]
  • γ \gamma γ(或 ψ \psi ψ)是 N \rm N N轴和X轴之间的角度(x规约)。范围在 [ 0 , 2 π ] [0,2\pi] [0,2π]

  两个参考坐标系之间的欧拉角被定义仅当两个坐标系具有相同的旋向性(handedness)。

图2:Proper Euler 角几何定义。 xyz(固定)系统显示为蓝色,XYZ(旋转)系统显示为红色。 轨道交点线(N)以绿色显示。

Tait-Bryan角

  Proper 欧拉角对于SLAM不太常见,一般是Tait-Bryan角。这个角用例应该很熟悉,应用在航空航天应用广泛。你应该听过关于俯仰角(yaw)、偏航角(pitch)和滚转角(roll)。利用这三个角度来描述刚体的方向。

  Tait-Bryan角是围绕三个不同轴,代表飞机相对世界坐标系的方向。Proper 欧拉角则是第一第三轴旋转是相同轴。不过目前我们不打算对Proper欧拉角着墨过多。

  我们以通常说的,俯仰角(pitch)、偏航角(yaw)和滚转角(roll)。等价于 Z Y X ZYX ZYX轴旋转。就以 Z Y X ZYX ZYX来描述,假设一个刚体的前方(朝向我们的方向)为X轴,右侧为Y轴,上方为Y轴,如图3所示。

图3:欧拉角的旋转示意图。上方为 Z Y X ZYX ZYX角定义。下方为 pitch=90 度时,第三次旋转与第一次滚转角相同,使得系统丢失了一个自由度(万向锁问题,后面会讲解)。【摘自SLAM十四讲】

这种形式的欧拉角将任意旋转分解成一下三个轴上的转角:

摘自维基百科

  1. 绕物体的 Z Z Z轴旋转,得到偏航角(yaw);
  1. 绕着旋转之后的 Y Y Y轴旋转,得到俯仰角(pitch);
  1. 然后绕着旋转之后的 X X X轴旋转,得到滚转角(roll);

万向锁

  万向锁这里有个英文视频说明,在优酷上。同时还推荐一个文档关于万向锁的描述,算是十分全面,其中矩阵有一部分存在计算错误(维数结果不对),大体解释上很清楚。

  在维基上一个动图显示了万向锁。

万向锁。当两个万向环(平衡环架)围绕同一个轴旋转,系统失去一个自由度。

  主要是由于定义的欧拉角中的三者层次关系顺序的中间层次,比如ZYX欧拉角中是Y轴即俯仰角(pitch)转动 1 2 π \frac{1}{2}\pi 21π时,导致第一个轴 Z Z Z的旋转与第三个轴 X X X的旋转等价,系统被限制。

  正常情况下,我们的三个方向环是独立的。

  但是当其中两个环在同一平面上的时候,导致第一次旋转和第三次旋转等价,整个旋转表示系统被限制在只能绕竖直轴旋转,丢失了一个表示维度。

  会产生万向锁的问题是由于动态欧拉角即Tait-Bryan角。而静态欧拉角不会产生此类问题。

  如果在3d Max中通过K关键帧的方式使一个茶壶做一段旋转动画,先使其在它自身的局部坐标系的 Z Z Z轴上旋转90度,接着在其 Y Y Y轴上旋转90度,最后在其 X X X轴旋转90度。 Z Z Z轴上和 Y Y Y轴上产生的旋转动画效果均是可以被预测的,然而在第三次旋转中,茶壶的旋转并没有产生可预测的关键帧动画,其运动轨迹偏离了直线形态,呈现弧线形轨迹的不合理运动,而这往往并不是动画师们预期想得到的动画效果。

  把局部坐标系模式切换到Gimbal(万向节)模式下查看坐标系的旋转变化状态。先借助三个圆环实体化坐标轴(绿线 Z Z Z轴、蓝线 Y Y Y轴、红线 X X X轴),按照之前操作的旋转顺序: Z > Y > X > a r r o w Z>Y>X>arrow Z>Y>X>arrow的层级关系将其关联起来,将茶壶在 Z Z Z轴上旋转90度时,它的子层级坐标轴 Y Y Y X X X跟随它转动,将其在 Y Y Y轴上继续旋转90度时, Y Y Y轴和 Z Z Z轴重合在了一个平面上,这就是万向节死锁。

  如需在此时做箭头往前向下的轨迹动画就会发现没有一条可达到预期效果的的旋转轴了。当把坐标轴调回局部坐标系显示,按照局部上的旋转轴来实现动画效果,就会发现其动画效果就如之前所示的弧线运动一样。这是因为在三维软件系统中默认旋转方式是按照欧拉角来计算物体旋转角度,因此无论是在何种坐标轴的显示下,内部的旋转计算方式都不会发生变化,所以第三次的旋转是三个轴向同时旋转的最后插值的结果,这就是为什么我们有时在做物体或者骨骼旋转动画时会发生一些奇怪的抖动效果。

  在三维软件中,物体三个轴向上的移动或缩放操作的先后顺序对最后的动画效果是不产生影响的,旋转则不一样,不同的旋转先后顺序可能对物体动画效果产生不同的影响。为避免旋转给动画师们带来的困扰,可以通过改变物体旋转的顺序来避免该问题的产生。以茶壶旋转动画为例,当我们改变箭头的旋转顺序为 Z X Y ZXY ZXY就可以在某种程度上避免万向节死锁问题的产生,但该方法治标不治本,万向节死锁依旧会在物体选装过程中的某个环节发生,因此该方法适合场景与动画效果较为简单的情况。

  相较于前者,另一种更有效的方法是可以采用将物体进行父子关联的方法。在三维中我们可以指定某些不可见物体来作为父物体分担一部分的旋转操作,而作为最子级的物体的自身坐标轴并没有产生变化,该方法法原理与四元数原理类似,值得注意的是可添加的轴不局限于一根,因此动画师将有更大的可调节空间,但是在设置层级关系时需要慎重思考,否则随意断开或连接层级关系都可能会产生难以控制的结果。

  第三个方法是用四元数解决旋转角度。即在旋转的控制器中有两个四元数的控制器—smooth rotation 和TCB rotation,使用这两个旋转控制器就会避免产生万向节死锁问题,但是这两个控制器的旋转值在动画中转动一次最高不会超过一圈(360度),这就很适合用来制作摄像机的运动,摄像机的运动一般情况下不会产生一次要转很多圈的情况。

  虽然目前还没有一种方法可以在任何场景中彻底避免该问题,但是,在不同的情况下,当探究清楚其产生原理后,大家可以更有针对性地选择对应的策略。

数学公式说明万向锁

  考虑这么一组变换,我先绕着 Z Z Z轴转动了 β 1 \beta_1 β1 角,然后再绕着 Y Y Y轴转动了 β 2 \beta_2 β2 角,最后绕着 X X X轴转动 β 3 \beta_3 β3角,那么整个转动过程,可以用下面的矩阵形式表示:

[ 1 0 0 0 cos ⁡ ( β 3 ) − sin ⁡ ( β 3 ) 0 sin ⁡ ( β 3 ) cos ⁡ ( β 3 ) ] [ cos ⁡ ( β 2 ) 0 sin ⁡ ( β 2 ) 0 1 0 − sin ⁡ ( β 2 ) 0 cos ⁡ ( β 2 ) ] [ cos ⁡ ( β 1 ) − sin ⁡ ( β 1 ) 0 sin ⁡ ( β 1 ) cos ⁡ ( β 1 ) 0 0 0 1 ] \begin{bmatrix}1&0&0\\0&\cos(\beta_3)&-\sin(\beta_3)\\0&\sin(\beta_3)&\cos(\beta_3)\end{bmatrix}\begin{bmatrix}\cos(\beta_2)&0&\sin(\beta_2)\\0&1&0\\-\sin(\beta_2)&0&\cos(\beta_2)\end{bmatrix}\begin{bmatrix}\cos(\beta_1)&-\sin(\beta_1)&0\\\sin(\beta_1)&\cos(\beta_1)&0\\0&0&1\end{bmatrix} 1000cos(β3)sin(β3)0sin(β3)cos(β3)cos(β2)0sin(β2)010sin(β2)0cos(β2)cos(β1)sin(β1)0sin(β1)cos(β1)0001

考虑我们最先说过,旋转可以分成三个基本旋转。

   考虑特殊情况下, β 2 = 1 2 π \beta_2=\frac{1}{2}\pi β2=21π,此时上面的矩阵乘法变成了:

[ 1 0 0 0 cos ⁡ ( β 3 ) − sin ⁡ ( β 3 ) 0 sin ⁡ ( β 3 ) cos ⁡ ( β 3 ) ] [ 0 0 1 0 1 0 − 1 0 0 ] [ cos ⁡ ( β 1 ) − sin ⁡ ( β 1 ) 0 sin ⁡ ( β 1 ) cos ⁡ ( β 1 ) 0 0 0 1 ] \begin{bmatrix}1&0&0\\0&\cos(\beta_3)&-\sin(\beta_3)\\0&\sin(\beta_3)&\cos(\beta_3)\end{bmatrix}\begin{bmatrix}0&0&1\\0&1&0\\-1&0&0\end{bmatrix}\begin{bmatrix}\cos(\beta_1)&-\sin(\beta_1)&0\\\sin(\beta_1)&\cos(\beta_1)&0\\0&0&1\end{bmatrix} 1000cos(β3)sin(β3)0sin(β3)cos(β3)001010100cos(β1)sin(β1)0sin(β1)cos(β1)0001

  然后我们得到如下矩阵乘法的结果

[ 0 0 1 sin ⁡ ( β 3 ) cos ⁡ ( β 3 ) 0 − cos ⁡ ( β 3 ) sin ⁡ ( β 3 ) 0 ] [ cos ⁡ ( β 1 ) − sin ⁡ ( β 1 ) 0 sin ⁡ ( β 1 ) cos ⁡ ( β 1 ) 0 0 0 1 ] \begin{bmatrix}0&0&1\\\sin(\beta_3)&\cos(\beta_3)&0\\-\cos(\beta_3)&\sin(\beta_3)&0\end{bmatrix}\begin{bmatrix}\cos(\beta_1)&-\sin(\beta_1)&0\\\sin(\beta_1)&\cos(\beta_1)&0\\0&0&1\end{bmatrix} 0sin(β3)cos(β3)0cos(β3)sin(β3)100cos(β1)sin(β1)0sin(β1)cos(β1)0001

  然后得到:

[ 0 0 1 sin ⁡ ( β 3 ) cos ⁡ ( β 1 ) + cos ⁡ ( β 3 ) sin ⁡ ( β 1 ) − sin ⁡ ( β 3 ) cos ⁡ ( β 1 ) + cos ⁡ ( β 3 ) sin ⁡ ( β 1 ) 0 − cos ⁡ ( β 3 ) cos ⁡ ( β 1 ) + sin ⁡ ( β 3 ) sin ⁡ ( β 1 ) cos ⁡ ( β 3 ) sin ⁡ ( β 1 ) + sin ⁡ ( β 3 ) cos ⁡ ( β 1 ) 0 ] \begin{bmatrix}0&0&1\\\sin(\beta_3)\cos(\beta_1)+\cos(\beta_3)\sin(\beta_1)&-\sin(\beta_3)\cos(\beta_1)+\cos(\beta_3)\sin(\beta_1)&0\\-\cos(\beta_3)\cos(\beta_1)+\sin(\beta_3)\sin(\beta_1)&\cos(\beta_3)\sin(\beta_1)+\sin(\beta_3)\cos(\beta_1)&0\end{bmatrix} 0sin(β3)cos(β1)+cos(β3)sin(β1)cos(β3)cos(β1)+sin(β3)sin(β1)0sin(β3)cos(β1)+cos(β3)sin(β1)cos(β3)sin(β1)+sin(β3)cos(β1)100

  接着对该矩阵使用三角公式可以得到:

[ 0 0 1 sin ⁡ ( β 3 + β 1 ) cos ⁡ ( β 3 + β 1 ) 0 − cos ⁡ ( β 3 + β 1 ) sin ⁡ ( β 3 + β 1 ) 0 ] = R \begin{bmatrix}0&0&1\\\sin(\beta_3+\beta_1)&\cos(\beta_3+\beta_1)&0\\-\cos(\beta_3+\beta_1)&\sin(\beta_3+\beta_1)&0\end{bmatrix}=R 0sin(β3+β1)cos(β3+β1)0cos(β3+β1)sin(β3+β1)100=R

  可以发现最后,旋转矩阵,无论怎么改变 β 1 , β 3 \beta_1,\beta_3 β1,β3,旋转轴一直保持在 Z Z Z方向。矩阵的最后一列和第一行都不会改变。唯一的办法是改变 β 2 \beta_2 β2的角度。

  从这可以看出来,当 Y Y Y轴旋转 1 2 π \frac{1}{2}\pi 21π时, Z Z Z X X X轴的旋转效果一样,这样就使得只需要两个轴就能表达旋转,也就是失去了一个维度。

总结

  正是由于这种奇异性问题,使得欧拉角不适合插值和迭代,往往用于人机交互。同样在SLAM中如果用欧拉角表示位姿,不会在滤波或优化中使用欧拉角表达旋转(奇异性原因)。但是如果验证算法是否有误,转换成欧拉角可以快速分辨。

  然而静态定义的欧拉角不会存在万向锁的问题,这是由于其采用世界坐标系三个轴旋转,旋转过程中坐标轴保持静止不动,而动态欧拉角会随着物体做相同的转动。-

  最后再推荐一个文档,大家可以阅读一下,这里面倒是描述了一部分数学表达欧拉角。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuYunTan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值