详细推导机器人学中常用的刚体旋转动力学(角动量定理、惯量张量、欧拉动力学方程)

刚体定点转动&欧拉动力学方程的推导

1. 刚体定点转动的角动量

首先,我们定义静止惯性坐标系S,对象刚体绕S系原点作定点转动;然后定义一个固连于刚体之上的动坐标系B,其原点与S系原点重合。

记刚体相对于S系的角速度为 ω \bm{\omega} ω,并将刚体看作由无数个微小质点 m i m_i mi组成,质点 m i m_i mi相对原点的位置矢量为 r i \mathbf{r}_i ri,则该刚体相对原点的角动量为:

L = ∑ i L i = ∑ i r i × m i r ˙ i = ∑ i r i × m i ( ω × r i ) \begin{align} \mathbf{L} = \sum_i \mathbf{L}_i = \sum_i \mathbf{r}_i \times m_i \dot{\mathbf{r}}_i = \sum_i \mathbf{r}_i \times m_i (\bm{\omega} \times \mathbf{r}_i) \end{align} L=iLi=iri×mir˙i=iri×mi(ω×ri)

将(1)式中的矢量用在S系下的坐标表示:

L S = ∑ i r i S × m i ( ω S × r i S ) = − ∑ i r i S × m i ( r i S × ω S ) = − ∑ i m i [ r i S ] × 2 ω S = J S ω S \begin{align} \begin{aligned} \mathbf{L}^S &= \sum_i \mathbf{r}_i^S \times m_i(\bm{\omega}^S \times \mathbf{r}_i^S) \\ &= -\sum_i \mathbf{r}_i^S \times m_i(\mathbf{r}_i^S \times \bm{\omega}^S) \\ &= -\sum_i m_i [\mathbf{r}_i^S]_\times^2 \bm{\omega}^S \\ &= \mathbf{J}_S \bm{\omega}^S \end{aligned} \end{align} LS=iriS×mi(ωS×riS)=iriS×mi(riS×ωS)=imi[riS]×2ωS=JSωS

其中

J S = − ∑ i m i [ r i S ] × 2 = ∑ i m i ( r i S ⊤ r i S I 3 − r i S r i S ⊤ ) \begin{align} \mathbf{J}_S = -\sum_i m_i [\mathbf{r}_i^S]_\times^2 = \sum_i m_i \left( \mathbf{r}_i^{S \top} \mathbf{r}_i^S \mathbf{I}_3 - \mathbf{r}_i^S \mathbf{r}_i^{S \top} \right) \end{align} JS=imi[riS]×2=imi(riSriSI3riSriS)

为刚体B相对于S系的惯性矩阵,也称为惯量张量。可见随着刚体的转动, J S \mathbf{J}_S JS是一个变化的量。

类似的,我们也可以求刚体对固连坐标系S的惯性矩阵:

J B = − ∑ i m i [ r i B ] × 2 = ∑ i m i ( r i B ⊤ r i B I 3 − r i B r i B ⊤ ) \begin{align} \mathbf{J}_B = -\sum_i m_i [\mathbf{r}_i^B]_\times^2 = \sum_i m_i \left( \mathbf{r}_i^{B \top} \mathbf{r}_i^B \mathbf{I}_3 - \mathbf{r}_i^B \mathbf{r}_i^{B \top} \right) \end{align} JB=imi[riB]×2=imi(riBriBI3riBriB)

根据刚体的定义, r i B \mathbf{r}_i^B riB并不会随刚体运动而变化,则 J B \mathbf{J}_B JB是一个常量,因此我们常常对 J B \mathbf{J}_B JB更感兴趣,因为它更能反映刚体惯性的固有属性。

将B系在S系中的姿态用旋转矩阵表示为 R B S \mathbf{R}_B^S RBS,则我们可以推导出 J B \mathbf{J}_B JB J S \mathbf{J}_S JS之间的关系:

J S = − ∑ i m i [ r i S ] × 2 = − ∑ i m i [ R B S r i B ] × 2 = − ∑ i m i ( R B S [ r i S ] × R B S   ⊤ ) 2 = − R B S ∑ i m i [ r i S ] × 2 R B S   ⊤ = R B S J B R B S   ⊤ \begin{align} \begin{aligned} \mathbf{J}_S &= -\sum_i m_i [\mathbf{r}_i^S]_\times^2 = -\sum_i m_i [\mathbf{R}_B^S \mathbf{r}_i^B]_\times^2 \\ &= -\sum_i m_i (\mathbf{R}_B^S [\mathbf{r}_i^S]_\times \mathbf{R}_B^{S\ \top})^2 \\ &= -\mathbf{R}_B^S \sum_i m_i [\mathbf{r}_i^S]_\times^2 \mathbf{R}_B^{S\ \top} \\ &= \mathbf{R}_B^S \mathbf{J}_B \mathbf{R}_B^{S\ \top} \end{aligned} \end{align} JS=imi[riS]×2=imi[RBSriB]×2=imi(RBS[riS]×RBS )2=RBSimi[riS]×2RBS =RBSJBRBS 

2. 刚体定点转动的角动量定理

记作用在每个微小质点 m i m_i mi上的力为 F i \mathbf{F}_i Fi,则根据牛顿第二定律,作用在刚体上的合力矩为:

τ = ∑ i r i × F i = ∑ i r i × m i r ¨ i = ∑ i r ˙ i × m i r ˙ i ⏟ 0 + r i × m i r ¨ i = d d t ∑ i r i × m i r ˙ i = L ˙ \begin{align} \begin{aligned} \bm{\tau} &= \sum_i \mathbf{r}_i \times \mathbf{F}_i \\ &= \sum_i \mathbf{r}_i \times m_i \ddot{\mathbf{r}}_i \\ &= \sum_i \orange{\underbrace{\dot{\mathbf{r}}_i \times m_i \dot{\mathbf{r}}_i}_\mathbf{0}} + \mathbf{r}_i \times m_i \ddot{\mathbf{r}}_i \\ &= \frac{d}{dt} \sum_i \mathbf{r}_i \times m_i \dot{\mathbf{r}}_i \\ &= \dot{\mathbf{L}} \end{aligned} \end{align} τ=iri×Fi=iri×mir¨i=i0 r˙i×mir˙i+ri×mir¨i=dtdiri×mir˙i=L˙

这就是刚体定点转动角动量定理的表达式,即刚体所受的合力矩等于角动量的变化率

每个质元 m i m_i mi所受的力可以分解为外力和内力:

F i = F e x t , i + F i n t , i \begin{align} \mathbf{F}_i = \mathbf{F}_{ext, i} + \mathbf{F}_{int, i} \end{align} Fi=Fext,i+Fint,i

内力 F i n t , i \mathbf{F}_{int, i} Fint,i又可以分解为其余质元对 m i m_i mi的作用力之和:

F i n t , i = ∑ j ≠ i F i n t , i , j \begin{align} \mathbf{F}_{int, i} = \sum_{j \neq i} \mathbf{F}_{int, i, j} \end{align} Fint,i=j=iFint,i,j

显然 F i n t , i , j \mathbf{F}_{int, i, j} Fint,i,j F i n t , j , i \mathbf{F}_{int, j, i} Fint,j,i为一对相互作用力。根据牛顿第三定律一对相互作用力是等大、共线、反向的,则有:

F i n t , i , j + F i n t , j , i = 0 r i × F i n t , i , j + r j × F i n t , j , i = 0 \begin{align} &\mathbf{F}_{int, i, j} + \mathbf{F}_{int, j, i} = \mathbf{0} \\ &\mathbf{r}_i \times \mathbf{F}_{int, i, j} + \mathbf{r}_j \times \mathbf{F}_{int, j, i} = \mathbf{0} \end{align} Fint,i,j+Fint,j,i=0ri×Fint,i,j+rj×Fint,j,i=0

即每对内力的力矩也是相互抵消的,而每个内力总是成对出现,所以

∑ i r i × F i n t , i = 0 \begin{align} \sum_i \mathbf{r}_i \times \mathbf{F}_{int, i} = \mathbf{0} \end{align} iri×Fint,i=0

于是

τ = ∑ i r i × ( F e x t , i + F i n t , i ) = ∑ i r i × F e x t , i = τ e x t = L ˙ \begin{align} \bm{\tau} = \sum_i \mathbf{r}_i \times (\mathbf{F}_{ext, i} + \mathbf{F}_{int, i}) = \sum_i \mathbf{r}_i \times \mathbf{F}_{ext, i} = \bm{\tau}_{ext} = \dot{\mathbf{L}} \end{align} τ=iri×(Fext,i+Fint,i)=iri×Fext,i=τext=L˙

刚体所受总力矩等于外力的力矩,内力的力矩为0,刚体所受外力力矩等于刚体角动量的变化率。

3. 欧拉动力学方程的推导

我们记作用在刚体之上的外部力矩为 τ \bm{\tau} τ,则根据定点转动刚体的角动量定理,作用在刚体上的外部力矩等于刚体角动量的变化率,即:

τ S = L ˙ S = d d t ( J S ω S ) = J ˙ S ω S + J S ω ˙ S \begin{align} \bm{\tau}^S = \dot{\mathbf{L}}^S = \frac{d}{dt}\left( \mathbf{J}_S \bm{\omega}^S \right) = \dot{\mathbf{J}}_S\bm{\omega}^S + \mathbf{J}_S\dot{\bm{\omega}}^S \end{align} τS=L˙S=dtd(JSωS)=J˙SωS+JSω˙S

根据之前的推导,刚体相对于静系S系的惯性矩阵 J S \mathbf{J}_S JS是随时间变化的量,因此其对时间的倒数并不恒为0,下面给出两种方法对其时间导数进行推导。

  • 方法1:根据(5)式有

J ˙ S = d d t ( R B S J B R B S   ⊤ ) = R ˙ B S J B R B S   ⊤ + R B S J ˙ B R B S   ⊤ ⏟ 0 + R B S J B R ˙ B S   ⊤ = [ ω S ] × R B S J B R B S   ⊤ + R B S J B R B S   ⊤ [ ω S ] × ⊤ = [ ω S ] × R B S J B R B S   ⊤ − R B S J B R B S   ⊤ [ ω S ] × = [ ω S ] × J S − J S [ ω S ] × \begin{align} \begin{aligned} \dot{\mathbf{J}}_S &= \frac{d}{dt} \left( \mathbf{R}_B^S \mathbf{J}_B \mathbf{R}_B^{S\ \top} \right) \\ &= \dot{\mathbf{R}}_B^S \mathbf{J}_B \mathbf{R}_B^{S\ \top} + \underbrace{\mathbf{R}_B^S \dot{\mathbf{J}}_B \mathbf{R}_B^{S\ \top}}_\mathbf{0} + \mathbf{R}_B^S \mathbf{J}_B \dot{\mathbf{R}}_B^{S\ \top} \\ &= [\bm{\omega}^S]_\times \mathbf{R}_B^S \mathbf{J}_B \mathbf{R}_B^{S\ \top} + \mathbf{R}_B^S \mathbf{J}_B \mathbf{R}_B^{S\ \top} [\bm{\omega}^S]_\times^\top \\ &= [\bm{\omega}^S]_\times \mathbf{R}_B^S \mathbf{J}_B \mathbf{R}_B^{S\ \top} - \mathbf{R}_B^S \mathbf{J}_B \mathbf{R}_B^{S\ \top} [\bm{\omega}^S]_\times \\ &= [\bm{\omega}^S]_\times \mathbf{J}_S - \mathbf{J}_S [\bm{\omega}^S]_\times \end{aligned} \end{align} J˙S=dtd(RBSJBRBS )=R˙BSJBRBS +0 RBSJ˙BRBS +RBSJBR˙BS =[ωS]×RBSJBRBS +RBSJBRBS [ωS]×=[ωS]×RBSJBRBS RBSJBRBS [ωS]×=[ωS]×JSJS[ωS]×

  • 方法2:根据(3)式和(4)式硬推:

J ˙ S = d d t ∑ i m i ( r i S ⊤ r i S I 3 − r i S r i S ⊤ ) = ∑ i m i ( ( ω S × r i S ) ⊤ r i S I 3 ⏟ 0 + r i S   ⊤ ( ω S × r i S ) I 3 ⏟ 0 − ( ω S × r i S ) r i S   ⊤ − r i S ( ω S × r i S ) ⊤ ) = ∑ i m i ( − [ ω S ] × r i S r i S   ⊤ + r i S r i S   ⊤ [ ω S ] × ) = ∑ i m i ( ( r i S   ⊤ r i S [ ω S ] × − [ ω S ] × r i S r i S   ⊤ ) − ( r i S   ⊤ r i S [ ω S ] × − r i S r i S   ⊤ [ ω S ] × ) ) = ∑ i m i ( [ ω S ] × ( r i S   ⊤ r i S I 3 − r i S r i S   ⊤ ) − ( r i S   ⊤ r i S I 3 − r i S r i S   ⊤ ) [ ω S ] × ) = [ ω S ] × ∑ i m i ( r i S   ⊤ r i S I 3 − r i S r i S   ⊤ ) − ∑ i m i ( r i S   ⊤ r i S I 3 − r i S r i S   ⊤ ) [ ω S ] × = [ ω S ] × J S − J S [ ω S ] × \begin{align} \begin{aligned} \dot{\mathbf{J}}_S &= \frac{d}{dt} \sum_i m_i \left( \mathbf{r}_i^{S \top} \mathbf{r}_i^S \mathbf{I}_3 - \mathbf{r}_i^S \mathbf{r}_i^{S \top} \right) \\ &= \sum_i m_i \left( \underbrace{(\bm{\omega}^S \times \mathbf{r}_i^S)^\top \mathbf{r}_i^S \mathbf{I}_3}_\mathbf{0} + \underbrace{\mathbf{r}_i^{S\ \top} (\bm{\omega}^S \times \mathbf{r}_i^S) \mathbf{I}_3}_\mathbf{0} - (\bm{\omega}^S \times \mathbf{r}_i^S) \mathbf{r}_i^{S\ \top} - \mathbf{r}_i^S (\bm{\omega}^S \times \mathbf{r}_i^S)^\top \right) \\ &= \sum_i m_i \left( -[\bm{\omega^S}]_\times \mathbf{r}_i^S \mathbf{r}_i^{S\ \top} + \mathbf{r}_i^S \mathbf{r}_i^{S\ \top} [\bm{\omega^S}]_\times \right) \\ &= \sum_i m_i \left( \left( \red{\mathbf{r}_i^{S\ \top}\mathbf{r}_i^S[\bm{\omega}^S]_\times} - [\bm{\omega}^S]_\times \mathbf{r}_i^S \mathbf{r}_i^{S\ \top} \right) - \left( \red{\mathbf{r}_i^{S\ \top}\mathbf{r}_i^S[\bm{\omega}^S]_\times} - \mathbf{r}_i^S \mathbf{r}_i^{S\ \top} [\bm{\omega}^S]_\times \right) \right) \\ &= \sum_i m_i \left( [\bm{\omega}^S]_\times \left( \mathbf{r}_i^{S\ \top}\mathbf{r}_i^S \mathbf{I}_3 - \mathbf{r}_i^S \mathbf{r}_i^{S\ \top} \right) - \left( \mathbf{r}_i^{S\ \top}\mathbf{r}_i^S \mathbf{I}_3 - \mathbf{r}_i^S \mathbf{r}_i^{S\ \top} \right) [\bm{\omega}^S]_\times \right) \\ &= [\bm{\omega}^S]_\times \sum_i m_i \left( \mathbf{r}_i^{S\ \top}\mathbf{r}_i^S \mathbf{I}_3 - \mathbf{r}_i^S \mathbf{r}_i^{S\ \top} \right) - \sum_i m_i \left( \mathbf{r}_i^{S\ \top}\mathbf{r}_i^S \mathbf{I}_3 - \mathbf{r}_i^S \mathbf{r}_i^{S\ \top} \right) [\bm{\omega}^S]_\times \\ &= [\bm{\omega}^S]_\times \mathbf{J}_S - \mathbf{J}_S [\bm{\omega}^S]_\times \end{aligned} \end{align} J˙S=dtdimi(riSriSI3riSriS)=imi 0 (ωS×riS)riSI3+0 riS (ωS×riS)I3(ωS×riS)riS riS(ωS×riS) =imi([ωS]×riSriS +riSriS [ωS]×)=imi((riS riS[ωS]×[ωS]×riSriS )(riS riS[ωS]×riSriS [ωS]×))=imi([ωS]×(riS riSI3riSriS )(riS riSI3riSriS )[ωS]×)=[ωS]×imi(riS riSI3riSriS )imi(riS riSI3riSriS )[ωS]×=[ωS]×JSJS[ωS]×

将(14)式代入(13)中就得到了刚体的Euler动力学方程:

τ S = ω S × J S ω S − J S ω S × ω S ⏟ 0 + J S ω ˙ S = ω S × J S ω S + J S ω ˙ S \begin{align} \begin{aligned} \bm{\tau}^S &= \bm{\omega}^S \times \mathbf{J}_S \bm{\omega}^S - \underbrace{\mathbf{J}_S \bm{\omega}^S \times \bm{\omega}^S}_\mathbf{0} + \mathbf{J}_S \dot{\bm{\omega}}^S \\ &= \bm{\omega}^S \times \mathbf{J}_S \bm{\omega}^S + \mathbf{J}_S \dot{\bm{\omega}}^S \end{aligned} \end{align} τS=ωS×JSωS0 JSωS×ωS+JSω˙S=ωS×JSωS+JSω˙S

在无人机等机器人应用中,我们一般是从CAD模型中获取机器人相对于自身固连坐标系B的惯性矩阵,以及常用的IMU传感器测量的机器人角速度也是在B系中表示的,我们将Euler动力学方程(9)式两边同时乘以 R S B \mathbf{R}_S^B RSB得到

τ B = R S B τ S = R S B ( ω S × J S ω S ) + R S B J S ω ˙ S = R S B ω S × R S B J S ω S + R S B J S ω ˙ S = ω B × R S B J S R S B   ⊤ R S B ω S + R S B J S R S B   ⊤ R S B ω ˙ S = ω B × J B ω B + J B ω ˙ B \begin{align} \begin{aligned} \bm{\tau}^B = \mathbf{R}_S^B \bm{\tau}^S &= \mathbf{R}_S^B (\bm{\omega}^S \times \mathbf{J}_S \bm{\omega}^S) + \mathbf{R}_S^B \mathbf{J}_S \dot{\bm{\omega}}^S \\ &= \mathbf{R}_S^B \bm{\omega}^S \times \mathbf{R}_S^B \mathbf{J}_S \bm{\omega}^S + \mathbf{R}_S^B \mathbf{J}_S \dot{\bm{\omega}}^S \\ &= \bm{\omega}^B \times \mathbf{R}_S^B \mathbf{J}_S \mathbf{R}_S^{B\ \top} \mathbf{R}_S^B \bm{\omega}^S + \mathbf{R}_S^B \mathbf{J}_S \mathbf{R}_S^{B\ \top} \mathbf{R}_S^B \dot{\bm{\omega}}^S \\ &= \bm{\omega}^B \times \mathbf{J}_B \bm{\omega}^B + \mathbf{J}_B \dot{\bm{\omega}}^B \end{aligned} \end{align} τB=RSBτS=RSB(ωS×JSωS)+RSBJSω˙S=RSBωS×RSBJSωS+RSBJSω˙S=ωB×RSBJSRSB RSBωS+RSBJSRSB RSBω˙S=ωB×JBωB+JBω˙B

可见Euler动力学方程在B系和S系中的形式是相同的。

💡 注意, ω ˙ B \dot{\bm{\omega}}^B ω˙B是B系相对S系的角速度变化率在B系中的坐标,即 ω ˙ B = ( d d t ω ) B = R S B ω ˙ S \dot{\bm{\omega}}^B = \left( \frac{d}{dt}\bm{\omega} \right)^B = \mathbf{R}_S^B \dot{\bm{\omega}}^S ω˙B=(dtdω)B=RSBω˙S;而不是角速度在B系中的坐标的变化率,即 ω ˙ B ≠ d d t ( ω B ) \dot{\bm{\omega}}^B \neq \frac{d}{dt} (\bm{\omega}^B) ω˙B=dtd(ωB)

4. 质心系中的欧拉动力学方程

之前的讨论都是基于刚体绕定点转动这个假设,S系为惯性系。

然而在一般情况下我们的机器人会在空间中作复杂的运动,如果我们将之前的S系换作以原点固连在刚体上随刚体进行平动的质心系C,则刚体的运动可以分解为质心的平动和绕质心的定点转动。

我们对此时刚体绕质心的定点转动进行分析。刚体固连坐标系B的原点依然与质心系C的原点(即质心)重合,而与之前不同的是平动参考系S不再是惯性系,在此参考系中刚体会受到等效惯性力的作用,此时的欧拉动力学方程写为:

τ C + τ 惯 C = ω C × J C ω C + J C ω ˙ C \begin{align} \bm{\tau}^C + \bm{\tau}_惯^C = \bm{\omega}^C \times \mathbf{J}_C \bm{\omega}^C + \mathbf{J}_C \dot{\bm{\omega}}^C \end{align} τC+τC=ωC×JCωC+JCω˙C

其中 τ 惯 \bm{\tau}_惯 τ是等效惯性力对质心的力矩。设该时刻刚体质心的线加速度为 a \mathbf{a} a,那么:

τ 惯 = ∑ i r i × m i a = ( ∑ i m i r i ) × a = ( ∑ i m i ) r C × a \begin{align} \begin{aligned} \bm{\tau}_惯 &= \sum_i \mathbf{r}_i \times m_i \mathbf{a} = \left( \sum_i m_i \mathbf{r}_i \right) \times \mathbf{a} \\ &= \left(\sum_i m_i\right) \mathbf{r}_C \times \mathbf{a} \end{aligned} \end{align} τ=iri×mia=(imiri)×a=(imi)rC×a

其中 r C \mathbf{r}_C rC是C系下的质心位置矢量,咱们的C就是质心系,原点就是质心,那当然有 r C = 0 \mathbf{r}_C = \mathbf{0} rC=0,所以

τ 惯 = 0 \begin{align} \bm{\tau}_惯 = \mathbf{0} \end{align} τ=0

平动质心参考系中惯性力力矩为0

💡 因为(19)式中没有任何刚体约束,所以这个结论实际上对非刚体也成立。

因此在质心参考系中的刚体欧拉动力学方程与惯性系中相同:

τ C = ω C × J C ω C + J C ω ˙ C \begin{align} \bm{\tau}^C = \bm{\omega}^C \times \mathbf{J}_C \bm{\omega}^C + \mathbf{J}_C \dot{\bm{\omega}}^C \end{align} τC=ωC×JCωC+JCω˙C

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在`chrono`源代码,主要通过以下几个方面来检查多体动力学方程是否确: 1. 动力学方程的构建:在源代码,使用拉格朗日力学原理来构建多体动力学方程。这涉及到解析地定义物体的动能、势能以及约束条件等。源代码会根据系统的物体和约束,使用拉格朗日乘子或柔性约束构建动力学方程。 2. 约束满足性的检查:在多体动力学系统,约束的满足性非常重要。源代码通过监测约束反作用力、约束误差以及违反约束的程度来检查约束的满足性。如果约束条件没有得到满足,可能意味着动力学方程存在问题。 3. 能量守恒的验证:能量守恒是多体动力学的一个重要原则。源代码会在仿真过程计算系统的总能量(动能和势能之和)。在理想情况下,总能量应该保持不变。源代码会监视总能量的随时间变化,并与预期的结果进行比较,以验证能量守恒是否得到满足。 4. 碰撞检测与响应:如果系统存在碰撞,源代码会进行碰撞检测和碰撞响应。碰撞检测用于检测物体之间的碰撞,并计算碰撞点和向量等信息。碰撞响应用于计算碰撞力和碰撞点的速度修。源代码会验证碰撞检测和碰撞响应是否确,以确保动力学方程在碰撞情况下的准确性。 5. 验证特定场景:根据具体的多体动力学问题,源代码可能会包含一些特定场景的验证。这些验证可以涉及角动量和动能守恒、弹性碰撞的动量和能量守恒等。通过这些验证,源代码可以确保特定场景下动力学方程确性。 在`chrono`源代码,还可能包含其他用于验证多体动力学方程确性的方和技术。这些方和技术通常是基于数值计算、实验数据或理论分析等方面的。源代码开发者会利用这些方和技术,对多体动力学方程进行验证,从而确保模拟结果的准确性和可靠性。 希望这个解释能帮到你!如有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值