论文翻译:Robust and Efficient Quadrotor TrajectoryGeneration for Fast Autonomous Flight

GitHub地址:https://github.com/HKUST- Aerial-Robotics/Fast-Planner

摘要:在这篇论文中,我们提出了一个健壮和高效的四旋翼运动规划系统,用于三维复杂环境中的快速飞行。采用运动学路径搜索方法,在离散的控制空间中寻找一条安全的、运动学可行的、时间最短的初始轨迹。利用B-样条曲线的凸包性质,将欧氏距离场中的梯度信息和动态约束有效地结合在一起,通过B-Spline优化提高了轨迹的光滑度和间隙。最后,通过将最终轨迹表示为非均匀B-Spline,采用迭代时间调整方法来保证轨迹的动态可行和非保守性。我们在各种复杂的仿真环境中对所提出的方法进行了验证。该方法的能力也在挑战现实世界的任务中得到了验证。我们以开源包的形式发布我们的代码。

1.引言

        近年来,无人机在工业检测、搜救、包裹递送等领域得到了越来越多的应用。为了在这些场景中实现完全自主,运动规划模块在生成安全和流畅的运动方面起着至关重要的作用。

        虽然已经提出了大量关于四旋翼轨迹生成的工作,但仍有两个关键问题尚未解决。首先,在时间和机载计算资源有限的情况下,没有现有的工作能够保证以较高的成功率生成安全的、运动学可行的轨迹,但是轨迹生成的效率和健壮性是必不可少的。在许多情况下,例如四旋翼在未知环境中高速飞行,轨迹应该在很短的时间内不断重新生成,以避免出现威胁。其次,为了确保生成的运动的运动学可行性,通常对速度和加速度进行保守的约束。因此,生成的轨迹的攻击性通常很难调整以满足高飞行速度更好的应用。

        在这篇论文中,我们提出了一种完整的、健壮的在线轨迹生成方法来系统地解决这两个问题。采用基于启发式搜索线性二次最小时间控制的运动学路径搜索方法。该算法在离散化的控制空间中高效地寻找一条安全、可行、时间最短的初始路径。然后在精心设计的B-Spline优化中对初始路径进行细化,该优化利用B-Spline的凸包性质来结合梯度信息和动态约束。它改进了初始路径,并快速收敛到平稳、安全、动态可行的轨迹。最后,将轨迹表示为非均匀B-样条曲线,研究了导数的控制点与时间分配的关系。基于这些关系,采用迭代时间调整方法,在避免保守约束的同时,将不可行的速度和加速度从轮廓线中挤出。

        与已有工作相比,我们提出的方法能够在更短的时间内生成高质量的杂乱环境下的轨迹,并具有更高的成功率。它可以在动力学可行的前提下产生攻击性运动。我们在许多模拟的复杂环境中展示了我们的方法的有效性和稳健性。我们还证明了我们的方法即使在挑战快速飞行的情况下也是胜任的,当轨迹应该通过真实世界的实验在很短的时间内重复生成时。我们将我们的贡献总结如下:

  1. 我们提出了一种健壮而高效的系统方法,融合了运动学路径搜索、B-样条优化和时间调整,其中安全性、动态可行性和侵略性是自下而上建立的。
  2. 提出了一种基于B-Spline凸性质的优化公式,该公式巧妙地结合了梯度信息和动态约束,快速收敛,生成光滑、安全和动态可行的轨迹。
  3. 我们研究了导数的控制点与非均匀B-样条的时间分配之间的关系。采用基于关系的时间调整方法,保证了运动的可行性和非保守性。
  4. 我们给出了我们所提出的方法的广泛的模拟和真实世界的评估。源代码以ros包的形式发布。

2.相关工作

A.硬约束方法

        最近的一些工作解决了轨迹生成的问题。硬约束方法的先驱是最小捕捉轨迹生成[1],其中轨迹被表示为分段多项式,并通过求解二次规划(QP)问题来生成。[2]证明了最小捕捉轨迹可以以封闭的形式得到,其中通过迭代添加中间路线点来确保轨迹的安全性。Works[3]-[7]在两步流水线中生成轨迹。首先提取由立方体[3]、[8]、球体[4]、[9]或多面体[5]序列表示的自由空间,然后进行凸优化,在可行空间内产生光滑的轨迹。[6],[7]提出了一种基于B-Spline的运动学搜索方法来寻找初始轨迹,然后用弹性带优化方法对初始轨迹进行精化。均匀B样条的使用保证了动力学的可行性,但可能产生保守的运动。这些方法的一个共同缺点是轨迹的时间分配是由朴素的启发式算法给出的。然而,选择不当的时间分配会显著降低轨迹的质量。此外,可行解只能通过迭代添加更多的约束和求解二次规划问题来获得,这对于实时应用是不可取的。针对这些问题,文献[8]提出了一种搜索时间合理的路径,并通过优化保证轨迹的安全性和运动学可行性的方法。硬约束方法通过凸公式保证全局最优性。然而,自由空间中与障碍物的距离被忽略,这往往导致轨迹接近障碍物。此外,运动学约束是保守的,使轨迹的速度不足,不适合快速飞行。

B.软约束方法

        也有将轨迹生成描述为考虑平稳性和安全性的非线性优化问题的方法。[10]通过使用梯度下降方法最小化其光滑性和碰撞成本来生成离散时间轨迹。[11]也有类似的问题描述,但优化是通过无梯度抽样方法来解决的。[12]将其推广到连续时间多项式轨迹。由于时间参数化是连续的,因此避免了数值微分误差,更准确地表示了四旋翼的运动。然而,它的成功率很低。为了解决这个问题,文献[13]首先使用基于信息采样的路径搜索方法寻找一条无冲突的初始路径。这条路径作为非线性优化的更高质量的初始猜测,从而提高了成功率。在[14]中,轨迹被参数化为均匀B-样条线。由于B-Spline本质上是连续的,因此不需要显式地强制连续性,从而减少了约束的数量。由于它的地方性,它对当地的重新规划也特别有用。软约束方法利用梯度信息将轨迹推离障碍物较远,但容易陷入局部极小,且不能很好地保证算法的成功率和运动学可行性。我们的优化方法还利用了梯度信息来提高轨迹的安全性。然而,与以前计算沿轨迹计算昂贵的线积分的方法不同,基于B-样条曲线的凸包性质,重新设计了公式以使其更简单。大大提高了计算效率和收敛速度。

3.动态路径搜索

        我们的前端运动学路径搜索模块源于首次提出的用于自主车辆的混合状态A*搜索[15]。它在体素网格地图中搜索一条关于持续时间和控制成本最小的安全的、运动学的可行轨迹。如算法1和图2所示,搜索循环类似于标准的A*算法,其中P和C是指开集和闭集。使用与四旋翼动力学相关的运动基本体作为图形边,而不是直线。结构节点用于记录基元、基元结束的体素以及GC和FC成本(Sect.III-B)。基本体迭代地扩展()体素栅格贴图,并且除了具有最小FC的体素之外,那些结束于相同体素的基本体被修剪(Prune())。然后,CheckFeaable()检查剩余原语的安全性和动态可行性。这一过程一直持续到任何基元达到目标或AnalyticExpand()(Sec.III-C)成功。

图2.运动学路径搜索机制的图解。红色曲线表示由Equ.3生成的运动基元。紫色曲线是在第III-C节中解释的解析展开。

A.原始生成

        我们首先讨论Expand()中使用的运动基元的生成。四旋翼系统的微分平坦度使我们可以用三个独立的一维时间参数多项式函数[1]来表示轨迹:

B.实际成本和启发式成本

        当我们的目标是找到一个在时间和控制成本上最优的轨迹时,我们将轨迹的成本定义为:

在此定义下,EdgeCost()计算在离散化的输入u(t)=u_d和持续时间\tau生成的运动基本体的成本为e_c=(\left\|u_d\right\|^2+\rho)\tau

        遵循A*的术语,我们使用g_c来表示从起始状态Xs到当前状态Xc的最优路径的实际成本。设此最优路径由J个基元组成,则g_c计算为:g_c= {\textstyle \sum_{j=1}^{J}} (\left\|u_d\right\|^2+\rho)\tau

        一个可接受的和信息丰富的启发式方法对于加速搜索是必不可少的,如A*。因此,我们还设计了一个启发式。我们通过应用庞特里亚金斯最小原理[16]来计算一个闭合形式的轨迹,该轨迹将\mathcal{J}(\tau)X_c到目标状态X_g最小化:

其中p_{\mu c},v_{\mu c},p_{\mu g},v_{\mu g}是当前和目标位置和速度。\mathcal{J}^*(T)是等式4定义的成本。为了找到使成本最小的最佳时间T,我们将{\alpha}_{\mu},{\beta}_{\mu}代入\mathcal{J}^*(T),并求出\frac{\partial \mathcal{J}^*(T) }{\partial {T}}=0的根。选择使最小费用\mathcal{J}^*和可行轨迹最小的根,记为T_h.我们使用\mathcal{J}^*(T_h)作为启发式h_c.f_c定义为:f_c=g_c+h_c=g_c+\mathcal{J}*(T_h)

C.解析展开

        由于控制输入的离散化,很难在目标状态下有一个基元结束。为了弥补这一缺陷,同时也为了加快搜索速度,我们引入了一种解析展开方案。当节点从开放集合中弹出时,使用第III-B节中的相同方法计算从X_cX_g的轨迹。如果通过安全和动态可行性检查,则提前终止搜索。这种策略对于提高效率是有效的,特别是在稀疏环境中,因为它具有更高的成功率并且更早地终止搜索。

D.最佳性和完备性

        从理论上讲,不能保证路径搜索的最优性和完备性。但实际运行效果令人满意。为达到最优,评价(Sect. VII-A1)表明,牺牲最优性是可以接受和可调整的。此外,在初始路径接近最优的情况下,我们的优化(Sect.IV)会发现这是最优的。为了完整性,评价(Sect. VII-A1)表明,在实际应用中,它在大多数情况下都能找到可行的解。此外,我们的方法可以扩展到支持可变持续时间基元和可变分辨率体素网格,如[15]所述,以提供更强的完备性保证。

4.B-Spline轨迹优化

        正如在Sect.III-D中提到的,由路径搜索产生的路径可能是次优的。此外,由于忽略了自由空间中的距离信息,该路径通常接近障碍物(图5)。因此,在提出的B-Spline优化算法中,我们提高了路径的光滑度和间隙。利用均匀B-样条曲线的凸包性质,结合欧氏距离场中的梯度信息和动态约束,在很短的时间内收敛到光滑、安全和动态可行的轨迹。

图3 (a)轨迹用B-Spline(p_b=3)表示。每个线段由控制点的相应凸包限定(例如,凸包和线段显示为绿色和橙色)。(b)一阶导数(速度)也是B-样条,因此具有相同的性质。导数的控制点可以用公式7来计算。

图5.使用基于梯度的数值优化方法使轨迹变形。红色和绿色曲线是初始路径和优化后的B-Spline曲线。黄点表示B样条线的控制点。由于忽略了距离信息,初始路径接近障碍物,而基于梯度的优化则推开了B-Spline。

A.均匀B-样条

        B-Spline的凸包性质(图3)对于设计我们的优化公式是必不可少的。我们在第四-B节表明,它对于确保整个弹道的动态可行性和安全性是非常有用的。

B.凸包属性

        凸包性质(图3)在我们的方法中被广泛使用,以确保动态可行性和安全性。

为了B-Spline的安全性,我们需要确保它的所有凸包都是无碰撞的。同样,我们需要确保d_h>0,其中 d_h 是凸包中任何一个占用的体素到任何一点 Q_h 之间的距离(图4)。通过三角不等式,我们得到d_h>d_c-r_h,其中 d_c 是体素与任何一个控制点之间的距离。因为 Q_h 在凸壳内,我们还有r_h\le r_{12}+r_{23}+r_{34}。将它们组合在一起, d_h>d_c-(r_{12}+r_{23}+r_{34})始终有效。

        因此,如果我们确保:

然后保证凸包是无碰撞的。

图4.确保B-Spline(p_b=3)的凸包是无碰撞的图示。

C.问题表述

        对于由N+1个控制点\left \{ Q_0,Q_1,...,Q_N \right \}定义的p_b次B-Spline轨迹,我们优化了N+1-2p_b个控制点的子集\left \{ Q_{pb},Q_{p_b+1},...,Q_{N-p_b} \right \}。第一个和最后一个p_b控制点不应更改,因为它们确定边界状态。总成本函数定义为

其中,f_s 和 f_c 是平滑度和碰撞成本。f_v 和 f_a 是速度和加速度的软限制。\lambda _1\lambda _2和 \lambda _3 在平稳性、安全性和动态可行性之间进行了权衡。

        我们通过一个函数来定义光滑度代价 f_s,该函数捕捉轨迹的几何信息,而不依赖于时间分配,这与许多最近的工作不同,它使用平方的突起或急速的积分。这是因为优化后的时间分配可以进行调整(Sect.v)。这将更改轨迹的导数,并降低优化捕捉(急速)的意义。我们使用弹性频带成本函数(控制点Q_{p_b-2}Q_{p_b-1}Q_{N-p_b+1}Q_{N-p_b+2}不是最优化的,但需要评估总体光滑度。同样,它们中的一些作为常量包含在公式14中,以评估导数)[18],[19]:

        从物理角度看,该公式将轨迹视为一条弹力带,其中每一项F_{i+1,i}=Q_{i+1}-Q_iF_{i-1,i}=Q_{i-1}-Q_i分别是两个弹簧连接节点Q_{i+1}Q_{i}Q_{i-1}Q_{i}的合力。如果所有项都等于零,则所有控制点将均匀分布在一条直线上,这是理想的光滑。

        同样,碰撞成本表示为作用于每个控制点的障碍物的排斥力:

式中,d(Q_i)Q_i与障碍物之间的距离。f_c是一个可微的潜在成本函数,其中d_{thr}指定了通过障碍物的阈值:

        如第IV-B节所示,必须满足方程8,以使轨迹是无碰撞的。由于碰撞成本使控制点远离障碍物,d_c>0是显而易见的。此外,r_{j,j+1}是仅依赖于B-样条线的参数化的可调参数。在实践中,只要我们选择显著较小的r_{j,j+1},(j) \in \left \{ 0,1,...,N \right \}(在我们的实现中,r_{j,j+1}<0.2),轨迹在大多数情况下是安全的。这在极端情况下可能是无效的,例如,环境非常杂乱。即使这样,我们也可以对B-样条线进行重新参数化,以选择更小的r_{j,j+1},在此之后仍将满足等式8。

        我们对超过最大允许值v_{max}a_{max}的轨迹上的速度或加速度进行处罚,代价类似于Equ.12。1-D速度v_{\mu}的惩罚为:

其中\mu \in\left \{ x,y,z \right \}。加速度处罚具有相同的形式。应用凸包性质(图3),我们定义f_vf_a,以使不可行的速度和加速度控制点受到惩罚:

5.时间调整

        虽然我们在路径搜索和优化中限制了运动学上的可行性,但有时会得到不可行的轨迹。根本原因是,梯度信息往往会拉长整体轨迹,同时将其推向远离障碍物。因此,四旋翼必须更有攻击性地飞行,以便在相同的时间内飞行更长的距离,如果原始运动已经接近物理极限,这不可避免地会导致过度攻击性运动。

        为了保证动态可行性,我们采用了一种基于导数控制点与非均匀B-Spline的时间分配(节点跨度)之间的关系的时间调整方法。多亏了这种关系,我们可以通过调整关联的时间分配来如我们预期的那样改变航班的攻击性。因此,可以在不过度保守的约束下确保动态可行性。

        我们首先介绍了时间平差的数学基础。然后算法2是为了解决过于激进的轨迹而提出的。

A.非均匀B-Spline

        非均匀B-样条是一种更一般的B-样条。与均匀B-Spline的唯一不同之处在于,它的每个结点跨度\Delta t_m=t_{m+1}-t_m是相互独立的。非均匀B-Spline的一阶和二阶导数{V}'_i{A}'_i的控制点可以通过以下公式计算:

通过凸包性质(图3),为了加强用非均匀B-样条表示的轨迹的动态可行性,在可行域内强制一阶和二阶导数的所有控制点就足够了。我们在V-B节证明了这可以通过改变截面中不可行控制点的相应结点跨度来实现。

B.结点跨度调整

        设{V}'_i=\left [ {V}'_{i,x}, {V}'_{i,y}, {V}'_{i,z}\right ]^T是一个不可行的速度控制点。设{V}'_{i,u}为最大不可行分支并且\left |{V}'_{i,u} \right |=v_m。从等式15我们知道{V}'_{i,u}会受持续时间t_{i+p_b+1}-t_{i+1}的影响。如果我们将该持续时间更改为\hat{t}_{i+p_b+1}-\hat{t}_{i+1}=\mu _v\left ( {t}_{i+p_b+1}-{t}_{i+1} \right ),则{V}'_{i,u}变为:

因此,如果我们设置\mu _v=\frac{v_m}{v_{max}},那么速度是可行的,因为\left | \hat{V}_{i,u} \right |=\frac{v_{max}}{v_m} \left | {V}'_{i,u} \right |=v_{max}\in\left [ -v_{max},v_{max} \right ]

C.迭代时间调整

        根据第V-B节的推导,采用算法2,以加强动态可行性。它迭代地找到轨迹的不可行的速度和加速度控制点\mathcal{V}\mathcal{A}(第2行),并调整相应的结点跨度(第3-10行)。由于节点跨度\Delta t_m会影响几个控制点,反之亦然,因此使用两个常数\alpha _v\alpha _a来限制{\mu}' _v{\mu}' _a(行5、9)可防止任何时间跨度过度扩展。

6.实施详情

A.实验设置

        本文提出的运动规划方法在C++11环境下用通用的非线性优化解算器NLopt语言实现。我们设置r=2,τ=0.5进行路径搜索,λ1=10.0,λ2=0.8,λ3=0.01进行优化,αa=αv=1.1进行时间调整。

        首先,我们进行了未知杂波环境下的快速自主飞行实验(Sect.VII-B)。我们使用自行开发的配备Velodyne VLP-16 LiDAR的四旋翼平台(图6(A)),采用LOAM[20]估计四旋翼的姿态并生成密集的点云图。为了获得用于反馈控制的高速率状态估计,我们利用扩展卡尔曼滤波(EKF)将基于激光的估计与IMU和声纳测量进行融合。包括运动规划、状态估计、映射和控制在内的所有模块都运行在双核3.00 GHz Intel i7-5500U处理器上,该处理器具有8 GB RAM和256 GB固态硬盘。

        然后,在第Sect.VII-C节,我们重点测试我们提出的方法在攻击性飞行中的快速重新规划能力,为此,我们使用了更轻、更灵活的四旋翼平台(图6(B))。为了消除车载感官带来的不确定性,运动捕捉系统OptiTrack5提供了准确的位姿反馈,并预先构建了环境地图。运动规划和控制模块在NVIDIA TX2计算机上运行。

图6.四旋翼平台用于(A)完全自主飞行和(B)积极的运动学重新规划。

B.重新规划策略

        1)退化-视野局部规划:当四旋翼在未知环境中飞行时,由于传感范围有限,它必须频繁地重新规划轨迹。为了提高效率,我们采用了滚动范围规划方案,其中轨迹只在已知空间内生成(图7)。一旦运动基元在该范围之外结束,路径搜索就终止,随后是优化和时间调整。在未知的空间进行规划往往是无用的,因此可以省去这样的工作。

图7.有限感测范围的局部规划策略。红色曲线和黄色曲线是优化前后的轨迹。不透明和透明的障碍为已知的和未知的。

        2)重新规划触发机制:在两种情况下触发重新规划。首先,如果当前轨迹与新出现的障碍物相撞,就会触发(碰撞检查是在配置空间(C空间)中进行的,其中四旋翼被建模为一个点,障碍物被半径膨胀。这种检查的计算成本可以忽略不计。),这确保了一旦检测到任何碰撞,就有新的安全轨迹可用。其次,以固定的时间间隔调用计划器。它使用最新的环境信息定期更新轨迹。

C.欧几里德距离场

        我们维护用于我们的优化的体素网格地图的EDF,它是通过一种有效的O(N)算法[21]计算的,其中{n}=N^3是更新的体素网格的数量。为了补偿体素网格图引入的EDF离散化误差,有利于数值优化,采用三线性插值法来提高距离和梯度信息的精度[14]。EDF的全局更新代价非常大,可能会阻塞对快速自动飞行至关重要的规划模块。为了解决这个问题,我们只使用增量更新策略来更新传感范围内的体素网格[22]

7.结果

A.分析和比较

        1)路径搜索的比较:我们将我们的路径搜索与方法[23]进行比较,这两种方法都使用时间最优控制公式来生成基元。在随机布置100个障碍物的40×40×5m地图上进行比较,最大速度限制为3m/S,最大加速度限制为2m/s2。由于体素网格的分辨率是影响该方法性能的关键因素,因此采用不同的分辨率进行综合评估(表I,第1列,第3-5行)。为了进行公平的比较,我们使用[23]的开源实现。结果列于表Ⅰ中。

        如静止所示,这两种方法都产生了运动学上可行的轨迹。我们的方法在一个数量级的情况下速度更快,并且倾向于生成持续时间更短的路径。然而,它的控制成本略高。随着体素网格的变粗,我们的方法的效率提高了,但代价是控制成本较高,成功率较低。这种趋势是意料之中的,因为修剪具有较粗体素网格的基元会导致较低的搜索复杂度,而更可行(可能是更好的)路径会丢失。

          2)优化比较:对于后端轨迹优化,我们与我们以前的工作进行了比较[13]。我们以前的方法和所提出的方法都利用EDF进行非线性优化。为了公平起见,我们使用路径搜索给出的相同路径作为初始值。首先,我们比较两种方法的目标函数相对于时间的成本(图8(A))。显然,提出的方法的成本在最初的几毫秒内迅速下降,而另一种方法的下降速度要慢得多。其次,如图8(B)和表II所示,对光滑度(平方挺度的积分)进行了比较。即使所给出的方法给出的时间更少,所得到的轨迹也更平滑。

图8.在随机杂波环境中,我们提出的优化方法与基于梯度的优化方法[13]进行了比较。

B.机载自主飞行

        我们在充满挑战的未知环境中进行了完全自主的快速飞行实验(图9(A))。为了进一步挑战我们的方法,我们使用以四旋翼为中心的半径为5米的球体修剪全局地图,并仅使用该球体内的地图进行轨迹生成(图9(B)-9(D)),这比我们的实际感知范围小得多。非结构化的环境、有限的感知范围以及高的飞行速度对运动规划模块提出了挑战,因为它需要在突然出现新的威胁时不断地、快速地重新生成轨迹。我们请读者参考视频附件以了解更多详细信息。

图9. 未知杂乱环境中的完全自主飞行。运动规划模块只知道彩色地图。在这种受限环境下,飞行1-3的最大速度和平均速度分别达到1.7m/S和1.3m/s。

C.攻击性飞行

        攻击性飞行实验是在图10所示的环境中进行的。在实验中,四旋翼的目标被人不断且任意地改变。一旦设定了新的目标,就会重新规划并立即执行新的轨迹。最大速度和加速度分别设定为2.5m/S和1.5m/s2。这项任务在几个方面具有挑战性。由于飞行的攻击性和目标的变化是突然的,运动规划模块应该在相当短的时间内生成新的轨迹,以便对变化做出快速反应,从而使四旋翼的运动连续而平稳。此外,由于环境的限制和混乱,很难在很短的时间内产生平滑、安全和动态可行的轨迹。该实验验证了该方法能够在保证可行性的前提下生成攻击性运动。实验还表明,即使目标在攻击性飞行过程中突然改变,我们的方法也能在复杂环境中快速生成新的轨迹。视频中还包括了更多细节。

图10.攻击性飞行试验。在攻击性的飞行中,目标被任意改变,新的轨迹被重新规划。

8.总结

        在本文中,我们提出了一种新的用于四旋翼自主导航的在线运动规划方法。将在线快速运动规划问题分解为前端的运动学路径搜索后端的非线性轨迹优化问题。采用运动学路径搜索方法,寻找一条安全、运动学可行、时间最短的初始路径,并通过基于梯度的优化,进一步提高了初始路径的光滑性和通畅性。利用B-Spline的凸包性质,与以往的基于梯度的规划方法相比,显著提高了优化的效率和收敛速度。最后,通过将航迹表示为非均匀B-Spline,根据给定的期望飞行攻击度来调整时间分配,并在各种复杂环境下验证了所提方法的有效性。该方法的能力也在挑战现实世界的任务中得到了验证。

        未来,我们计划在大规模或动态环境等极端情况下挑战我们的四旋翼系统。此外,我们还将我们的轨迹优化方法扩展到群体问题。

参考文献

        见原文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值