news 2026/10/20 17:01:49

PMSM转速环超螺旋滑模控制:从原理到仿真对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PMSM转速环超螺旋滑模控制:从原理到仿真对比

这段时间一直在折腾永磁同步电机(PMSM)的转速环控制。双闭环PI在空载、额定工况下表现确实很稳定,但一旦加上负载扰动、把转动惯量调大,或者让定子电阻漂移一点,转速曲线就开始拖泥带水。于是我把目光转向了滑模控制,又进一步试了超螺旋滑模(Super-Twisting Sliding Mode Control)。这篇文章就围绕这个仿真过程展开,把我从原理推导到建模仿真再到调参踩坑的全过程记录下来,给正在做电机控制仿真的同行一个现成的参考。

先说结论:在PMSM转速环里用超螺旋滑模替代PI,动态响应和抗扰能力确实有明显改善,尤其是在参数摄动和负载突变的场景下,转速跌落更小、恢复更快,而且比普通滑模的抖振小得多。具体怎么做、为什么这样做、仿真里会遇到哪些坑,下面我一条一条展开。

1. 为什么转速环不继续用PI,偏要换滑模

1.1 双闭环PI的“舒适区”边界在哪

PMSM矢量控制最常见的架构就是转速外环加电流内环。转速环输出的是q轴电流指令,电流环负责快速跟踪让实际电流跟上,然后通过SVPWM给逆变器生成电压。这样的双闭环结构在工况平稳、电机参数接近标称值时,PI控制的表现完全够用。

问题出在三处。第一是转动惯量J的变化,J变大意味着系统的惯性变大,同样的PI参数下相位裕度下降,转速容易震荡;J变小则系统过于灵敏,同样的增益会导致过冲。第二是负载扭矩突变,比如从空载直接跳到额定负载,转速会先掉下来,然后靠积分项慢慢拉回去,这个恢复时间通常需要几百毫秒,对某些工艺场景来说太慢。第三是电机参数随温度变化,比如永磁体磁链在高温下会下降,定子电阻随温度升高而变大,这会让PI整定时的对象模型逐渐失准。

PI控制本质上是一个线性控制器,它的调节能力依赖被控对象的线性化模型。PMSM是一个强耦合、多变量、非线性系统,虽然id=0解耦后可以近似成线性模型,但那是建立在“参数不变、扰动可忽略”的假设上的。一旦工况偏离这个假设,线性控制器的性能就会打折。这是我认为换控制策略的根本理由。

1.2 滑模控制的本质是“用不连续换鲁棒性”

滑模控制的核心思想不是去精确建模扰动,而是用一路高增益的切换项直接把扰动“顶”回去。控制量的形式大致是:

u = u_eq + M * sign(s)

其中s是滑模面,u_eq是基于标称模型算出来的等效控制项,M * sign(s)则是让系统状态往滑模面上压的切换项。只要M的取值大于系统扰动的上界,系统状态就会被强行推上滑模面,然后在滑模面上滑向平衡点。这个过程的优点是:扰动的影响被切换项彻底压制,控制性能对参数摄动不敏感。

代价就是抖振。sign(s)在理想数学里是阶跃跳变,但实际离散系统中,状态不可能精确停在滑模面上,而是会在面附近来回穿越。每次穿越都会触发一次控制量的正负跳变,反映到物理量上就是q轴电流的高频波动、电磁转矩脉动、转速曲线上的毛刺,严重时甚至会让机械系统共振。

我第一次用普通滑模做转速环的时候,仿真倒是能跑,但转矩波形上的抖振让人没法看,控制器输出一直在高频振荡,这种状态没法直接往硬件上搬。所以我又把注意力放到了二阶滑模,尤其是超螺旋算法上。

1.3 为什么偏偏是超螺旋滑模

滑模控制的改进方向很多,比如用饱和函数替代符号函数、加模糊边界层、用扰动观测器补偿等等,但这些方案大多有一个通病:为了消除抖振,牺牲了鲁棒性或者换来了更复杂的结构。

超螺旋滑模的思路不太一样。它把切换作用拆成两条通道:一条通道对滑模面误差的平方根做连续化处理,另一条通道把切换信号放到积分环节里。最终的控制量是这两部分的和,等效来看,高频切换被积分器“软化”了,而系统依然拥有有限时间收敛的性质,也不需要知道扰动的导数——这两个特性让它很适合用在电机控制这种对实时性和可靠性要求都高的场景。

我当时选择它的另一个原因是参数少、结构相对固定。转速环控制器的核心参数只有两个增益,试凑空间小,比那些需要同时调节七八个参数的自抗扰方案更好上手。对于我这种希望快速在仿真里验证效果的人来说,这个特性非常关键。

2. 超螺旋滑模控制器的推导与设计

2.1 PMSM转速环的数学模型

在id=0的矢量控制下,PMSM的机械运动方程可以写成:

J * dω/dt = 1.5 * pn * ψf * iq - TL - B * ω

其中J是转动惯量,pn是极对数,ψf是永磁体磁链,iq是q轴电流,TL是负载转矩,B是阻尼系数。这个式子忽略了电流环的动态,因为电流环带宽通常远高于转速环,可以近似认为iq能瞬间跟上指令值。

把和iq无关的项全部看成扰动,定义扰动项D = -(TL + B*ω)/J,那么:

dω/dt = a * iq + D

其中a = 1.5 * pn * ψf / J。转速环的任务是:给定转速指令ω*,让实际转速ω快速跟随,同时抑制扰动D的影响。

2.2 定义滑模面和控制律

取转速误差e = ω* - ω,滑模面定义为:

s = e

也就是让转速误差直接作为滑模面,这个选择的优点是结构最简、物理意义清楚,控制器设计目标就是让s收敛到0。之所以不用PID型滑模面s = e + c * ∫e dt,是因为超螺旋算法本身已经带有积分通道,再加一个外部的积分滑模面反而会让参数调节变复杂,我在初期尝试时明显感觉到两者叠加容易产生积分饱和问题。

超螺旋滑模控制律的形式是:

iq* = (1/a) * [dω*/dt + k1 * |s|^0.5 * sign(s) + ∫ k2 * sign(s) dt]

其中k1和k2是两个待整定的正增益。这个式子的结构可以拆成三部分理解:

  • dω*/dt是前馈项,让控制器对速度指令的变化有更好的跟踪能力;
  • k1 * |s|^0.5 * sign(s)是比例类切换项,它的力度随误差的减小而减小,当距离滑模面较远时用力猛烈拉回,接近滑模面时介入变得柔和;
  • ∫ k2 * sign(s) dt是一个“缓慢累积”的项,它专门用来对付常值扰动和慢变扰动。滑模面附近的高频切换都被这个积分器吸收,最终送到q轴的参考电流反而比较光滑。

把上面的iq*代回运动方程,得到的误差动力学方程可以分析出,只要k1、k2取得合适,s会在有限时间内到达0,系统状态被约束在滑模面上,从而对扰动D不敏感。

2.3 增益整定的实用准则

增益k1和k2的具体取值,理论上需要满足不等式约束,约束条件涉及扰动上界的估计。但在工程实践中,扰动上界很难精确知道,所以我的做法是先按经验初选,再在仿真里微调。

给出一个可直接使用的起点:k1取500到2000,k2取5000到20000。单位取决于仿真里转速是rad/s还是rpm,如果是rpm,增益要相应放大几十倍。我仿真时转速用rad/s,电机额定转速1500rpm大概对应157rad/s,取k1=800、k2=8000,效果已经不错。

调参的经验是:先调k2,再调k1。k2太小,系统会在稳速时出现静态误差或者低频振荡,因为积分通道没有足够力度去抵消常值负载;k2太大,转速会出现周期性振荡,显得“发飘”。k1管的是动态响应速度,增大k1,启动响应更快,但过大会让q轴电流出现明显尖峰。

关于扰动的假设也要说清楚。超螺旋滑模要求扰动项的导数有界,而不是扰动本身有界。这比普通滑模的约束更宽松,也是对“为什么它能用更缓和的控制实现同等鲁棒性”这个问题的最直观解释。我之前用扩张状态观测器来估计这个扰动并做前馈补偿,和超螺旋算法配合得也很好,后面会再提。

3. 在仿真平台里搭建完整的PMSM矢量控制系统

3.1 系统整体的拓扑结构

我搭的系统结构是典型的转速-电流双闭环,只是转速环控制器从PI换成了超螺旋滑模。整体链路如下:

速度指令ω进入超螺旋滑模控制器,输出q轴电流指令iq;d轴电流指令id直接设0;两个电流指令分别和反馈电流id、iq做差,送入两个PI控制器;PI输出得到dq轴电压指令ud、uq*;经过反Park变换得到αβ轴电压;送入SVPWM模块生成开关信号;开关信号驱动三相逆变器,逆变器给PMSM供电;电机的机械输出转速反馈回转速环,相电流经Clarke和Park变换反馈给电流环。

这套结构最关键的改动就是转速环那一个模块。为了跟原来的PI方案公平对比,我把搭建好的超螺旋滑模控制器设计成独立的可切换模块,仿真里通过一个开关就能在PI和滑模之间切换,这样能保证其他环节完全一致,对比结果有说服力。

3.2 电机参数和仿真环境的设置

我用的是一组典型的小功率PMSM参数,具体数值如下表。

参数数值
定子电阻Rs2.875 Ω
d轴电感Ld0.0085 H
q轴电感Lq0.0085 H
永磁体磁链ψf0.175 Wb
极对数pn4
转动惯量J0.001 kg·m²
阻尼系数B0.0001 N·m·s
直流母线电压311 V
额定转速1500 rpm
额定负载5 N·m

仿真环境选择上,我用的是某主流仿真平台和它的模型库,求解器选变步长的ode23tb,因为这种带高频开关的系统比较“硬”,ode45经常跑得很慢。最大步长限制在1e-5秒,仿真时长设为1.5秒,采样时间固定在1e-5秒。这里有个重要细节:控制器的采样时间要尽量接近求解器的最大步长,如果步长过大,sign函数切换的频率会受限,抖振会以另一种方式重新出现。

3.3 超螺旋滑模控制器的模块化实现

我强烈建议把超螺旋滑模控制器封装成一个M函数模块,而不是用基础元件搭。原因有两个:一是控制律里有|s|^0.5和积分两项,用基础元件搭很容易出错且难以调试;二是封装之后改增益参数只需要改一个模块,配合批处理脚本扫参数非常方便。

核心逻辑的示意代码如下,你在自定义函数模块里改成对应语言版本即可:

# 输入:u(1)为转速指令omega_ref,u(2)为实际转速omega # 输出:iq_ref,即q轴电流指令 # 参数:k1, k2, a = 1.5 * pn * psi_f / J s = omega_ref - omega sign_s = sign(s) # 符号函数,s>0取1,s<0取-1 term1 = k1 * sqrt(abs(s)) * sign_s term2 = integral # 积分器状态,初值设0,注意限幅 iq_ref = (d_omega_ref + term1 + term2) / a dq_omega_ref/dt = 0 # 转速指令为阶跃时该项为0;斜坡指令时需计算导数

这里最需要注意的就是对s特别小或者为零的处理。sqrt(abs(s))在s=0附近导数很大,实际离散仿真里容易算出异常大的term1值,导致iq_ref瞬间冲到限幅值。我通常在sqrt里面加一个很小的常数eps,比如1e-6,来避免数值尖峰。这个细节不处理好,你会发现转速曲线在到达稳态的瞬间出现一个莫名其妙的尖刺。

3.4 电流环PI参数的整定

电流环我用的是传统PI,参数按零极点对消法整定。电流环的传递函数近似为开环增益K * (Ls + R) / L,PI的零点应设计在电机电气极点附近,也就是Ti = L / R。带宽取得适中,800到1200 rad/s比较合适,太高了容易和SVPWM的开关频率互相干扰。

我最后用的参数是Kp = 12,Ki = 420。注意这里的单位体系必须和模型里的单位保持一致,我做的是标幺值还是实际值,自始至终都要统一。电流环整定的时候,可以先让转速环开环,用恒定的iq*强制电流跟踪,观察电流阶跃响应;超调控制在5%以内,响应时间在几个毫秒级别,就可以算整定完毕。电流环整不好,转速环再高级也会被内环拖累,这一点千万不要跳过去。

4. 三组仿真对比实验:从启动到突变再到参数摄动

4.1 空载启动:先看动态响应的底子

第一组实验是空载启动,转速指令从0阶跃到157rad/s,PI方案和超螺旋滑模方案分别记录转速曲线。

PI方案的参数是我认真调过的,不是随便拿一组数据凑数。结果转速从0爬升到稳态大约用了0.45秒,最大超调约4%,进入5%误差带的调节时间约0.6秒。这个表现其实已经算不错了,但转速曲线在接近稳态时有一个明显的“慢半拍”过程,这正是积分项慢慢消差造成的。

超螺旋滑模方案同等条件下,转速爬升到稳态用了0.2秒左右,超调几乎为零,调节时间在0.25秒以内。转速爬升段的速度更快,原因是切换项从起点就给了系统较大的加速力度,而PI在误差大的时候主要靠比例项,力度增长是线性的,超螺旋滑模的|s|^0.5项在误差较大时带来的等效增益更大,所以加速阶段更有劲。

4.2 突加额定负载:最见真章的一组

第二组实验模拟运行中突加负载:分别在0.6秒时从空载突加5N·m负载,观察转速的跌落量和恢复时间。

PI控制下,转速跌落了约12rad/s,恢复时间约0.5秒,且转速曲线上有明显的小幅振荡才会慢慢回到给定值。这个振荡是PI参数在负载变化后重新平衡的过程,不是纯积分延迟导致的。

超螺旋滑模控制下,同样突加5N·m,转速跌落只有5rad/s左右,恢复时间约0.2秒,回落过程很平滑。原因也很直接:负载突变引起的扰动项D的导数是脉冲式的,超螺旋滑模的积分通道立刻响应,把负载增量补偿掉了,而PI的积分项需要时间积累,动作用会偏慢。这就是两种算法在“先天结构”上的差距,不是一味增大PI参数就能弥补的。

这里我需要说明一下,转速跌落的绝对值大小受电流环带宽和直流母线电压限制。如果负载突变太大,电流输出到达限幅,转速跌落该多大还是多大。超螺旋滑模的贡献是缩短恢复时间、减小持续偏差,而不是突破物理极限。

4.3 参数摄动:直接挑战系统的未知变化

第三组实验是令转动惯量J翻倍,从0.001kg·m²变成0.002kg·m²,其他所有参数不变,重复第一组空载启动实验。

PI控制在J翻倍后,转速曲线出现了两者明显变化:启动变慢,大约用0.7秒才稳,而且到达稳态后出现了约2rad/s低频振荡,需要手动重新调参才能消除。这说明PI参数的鲁棒性有限,对系统惯性变化非常敏感。

超螺旋滑模控制的表现则稳健得多。J翻倍后,启动时间从0.2秒变成了0.28秒,超调依然很小,稳态时没有振荡。整个响应形态只是略微变慢,并没有因为参数变化而紊乱。这一点的原因可以追溯到超螺旋算法的结构:扰动项D的变化幅度变大,只要D的导数仍然有界,积分通道就能应对,系统不具备发散的路径。

基于这三组对比,我对这组超螺旋滑模参数在不同工况下都做了验证,结论是可复现的。如果你自己搭仿真,建议也按这个顺序来:先空载看动态响应,再突加负载看抗扰性,最后改参数看鲁棒性。三个维度的结果都满意,方案才算站得住。

5. 仿真过程中踩过的坑,以及对应的处理办法

5.1 积分饱和和初值问题

超螺旋滑模里有积分通道,积分器的状态初值必须为0,并且一定要加限幅。我一开始没限幅,转速指令从0阶跃到额定值时,积分项在误差持续为正的阶段疯狂累积,等到转速接近指令值时积分器已经远超实际需要的补偿量,结果转速直接冲出目标一大截,再被修正回来,形成大幅超调。这个现象其实和PI的积分饱和很像,但超螺旋的积分增益k2有时取得很大,超调会更剧烈。

我的处理办法如下。

  1. 将所有积分器初值设0,并配置外部复位信号。转速指令每次跳变时,如果系统希望“重来一次”,可以用复位信号清零积分项。

  2. 积分限幅按q轴电流限幅的60-80%来设。比如iq限幅20A,积分项输出限幅设为15A,因为积分项只是控制量的一部分,还需要给比例项和切换项留出调节余量。

  3. 在S函数里实现积分器时,采用“抗饱和积分”方法:先算当前步积分增量,如果积分项已达到限幅且增量方向与限幅方向一致,则丢弃该增量;如果方向相反则正常累加。这样可以缩小积分器在限幅处“卡住”的时间。

5.2 s=0附近数值处理的细节

这是我在调试中印象最深的一个坑。超螺旋控制律里有个|s|^0.5项,一开始我按数学原式写,结果仿真在转速到达稳态的瞬间,电流波形上出现了一个宽度极窄的高幅值尖峰,转速曲线有毛刺。

原因很容易理解:s趋近0时,|s|^0.5趋近0,但它的导数趋向无穷大,离散求解器在s过零点附近会取到极小但非零的s值,计算出的term1要么接近0要么突然很大,数值上出现不连续。好在解决办法也不复杂:

term1 = k1 * sqrt(abs(s) + 1e-6) * sign(s)

这里加1e-6是让sqrt函数在s=0附近变为光滑函数。1e-6这个数值本身对控制精度的影响可以忽略,但它消除了数值尖峰。类似的问题在符号函数上也会出现,如果把符号函数换成tanh(s/δ),也能在一定程度上进一步压低抖振,代价是系统的有限时间收敛性质被近似化。我个人偏好保持sign和sqrt的形式,只做防数值异常处理,毕竟我们做的是仿真,真实应用里还有更多硬件层面的问题要面对。

5.3 求解器和步长选择不当导致“假抖振”

有一次我换了解算器配置,用ode45搭配最大步长1e-3,结果超螺旋滑模的转速波形出现严重的锯齿状波动,电流波形几乎是噪声。我一度以为是增益没调好,花了不少时间去扫参数,最后发现是步长设置的问题。

超螺旋滑模里sign函数的开关切换发生在滑模面邻域内,如果求解步长太大,系统在单个步长内就会穿越滑模面很远,控制量按当前步长的状态计算,下一个步长又被反向推回,这个往复运动的频率完全由步长决定,而不是由控制器动力学决定,体现出来的就是剧烈的“数值抖振”。

我的建议是使用变步长隐式求解器,比如ode23tb,最大步长不要超过1e-4秒。如果使用定步长求解器,步长建议设在1e-5到1e-6秒之间。系统里还有SVPWM和逆变器开关,开关频率通常在10kHz级别左右,时间尺度上和1e-5秒匹配,步长过大也会引入开关谐波混叠。这一点在仿真设置里就要提前想清楚,不要等波形异常了再去排查。

5.4 对比实验必须保证“同条件”

做PI和超螺旋滑模的对比时,容易忽略“其他环节完全一致”这个前提。比如电流环PI参数、SVPWM实现方式、求解器步长、甚至PMSM模型内部的初始化方式,都会直接影响对比结果。我自己最开始也犯过一个错误:对比的时候给PI方案用的是定步长1e-6,给滑模方案用的是变步长,结果两组曲线差别巨大,根本分不清是算法差异还是仿真设置差异。

保证同条件的具体做法是:在工程文件里设计一个“基准配置脚本”,统一设置电机参数、电流环PI、求解器、仿真时长、采样时间。对比时只切换转速环控制器这一个模块,一切变量保持不动。这样做出来的结果才能算数,不然那些对比结论很容易把自己误导。

6. 从仿真出发:下一步还能往哪个方向扩展

6.1 转速环与扩展状态观测器的联合设计

我在调试中注意到,转速环的q轴电流指令中有相当大一部分是在补偿负载转矩和摩擦力矩等“慢扰动”,这部分工作如果全交给超螺旋滑模的积分通道,k2就得取较大值,系统对测量噪声的敏感度也随之上升。

一个可行的改造方向是引入扩展状态观测器(ESO),把负载转矩和低速摩擦作为扩张状态实时估计出来,并在控制器里前馈补偿。这样超螺旋滑模只需要对付估计残差这一小部分扰动,k2可以显著下调,系统对噪声的鲁棒性更好。我在仿真里做过这个组合方案,效果是:突加负载转速跌落进一步缩小,同时测得的电流纹波略有下降。

6.2 增益的自适应调整

k1和k2是固定的,而系统的运行工况是变化的。启动阶段误差大且希望快速趋近,k1要求较高;进入精调阶段后,过大的k1会引发微观层面的抖振。通过模糊规则或简单的分段调节逻辑,让k1和k2随|s|的大小和误差变化率自动调整,可以在不影响鲁棒性的前提下让稳态精度更好。这个方向适合那些希望把算法进一步产品化的朋友。

6.3 低速和零速工况的特别关注

PMSM在零速和低速时,反电动势很小,电流环的调节能力变弱,超螺旋滑模在滑模面附近的收敛行为也会受到影响。对此,需要叠加高频注入方法或者改用其他观测策略,单纯靠转速环控制器本身解决不了。仿真验证时一定要加一段低速工况的测试,不然很容易被“额定转速下表现良好”的结论迷惑。


做了一圈仿真下来,我个人的体会是,超螺旋滑模并不是一种“神化”的算法,它的优势建立在清晰的结构分析之上:两条互补的控制通道,一个管动态收敛,一个管稳态补偿。仿真阶段它相对容易实现,实际硬件部署时还有很多环节需要处理,比如电流采样延迟、逆变器非线性、机械谐振等,这些在仿真里看不出来。但至少对于控制器结构的选型来说,它的抗扰能力和对参数变化的鲁棒性,确实值得你在下一个PMSM控制项目里认真试一回。

最后分享一个小技巧:当你拿到一组现成的超螺旋滑模仿真参数时,别急着直接跑工况图。先冷态运行一下,把空载启动曲线的斜率、稳态电流纹波幅度、转速过冲量记下来,然后手动改成只有k1没有k2的状态,再看同一组曲线——通过这样的“剥离对比”,你能很快建立起每个参数的直觉,之后遇到异常波形,判断起来会快很多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 17:01:45

MySQL输入密码闪退怎么办?从报错定位到重置密码的完整排查指南

先说个十万火急又特别接地气的事&#xff1a;高高兴兴双击MySQL命令行客户端&#xff0c;输入root密码&#xff0c;回车&#xff0c;结果窗口就像被鬼吹了一口&#xff0c;“嗖”一下关没了。这种“mysql输入密码闪退”的场面&#xff0c;我敢说至少有一半MySQL初学者都碰到过&…

作者头像 李华
网站建设 2026/10/20 17:01:38

基于微信小程序与Spring Boot的文旅宣传系统实践与解析

做这类"小程序Spring Boot"的文旅宣传项目&#xff0c;我前后接触过好几个&#xff0c;河湟文化旅游景点宣传系统算是里面比较典型的一个。河湟地区的历史底蕴和民族文化特色非常鲜明&#xff0c;景点分散、类型多样&#xff0c;面向的游客群体又偏年轻化&#xff0c…

作者头像 李华
网站建设 2026/10/20 17:01:21

TortoiseSVN安装配置全指南:版本选择、组件勾选与避坑排查

简介&#xff1a;TortoiseSVN&#xff08;俗称小乌龟&#xff09;是一款面向Windows用户的Subversion版本控制客户端&#xff0c;适合个人开发者与团队协作场景&#xff0c;用于解决代码版本管理、多人协同修改与历史追溯等问题。资源以rar压缩包形式提供&#xff0c;整体约16.…

作者头像 李华
网站建设 2026/10/20 17:00:48

从Chain到Harness Runtime:AI Agent架构选型与落地实践

1. 先想清楚&#xff1a;你需要的到底是一个Agent&#xff0c;还是一次对话补丁这两年“Agent”这个词被用得越来越泛&#xff0c;很多项目本质上只是给LLM套了个对话壳子&#xff0c;然后对外宣称自己是Agent。真正动手做过落地的人应该都有同感&#xff1a;架构选型这事&…

作者头像 李华
网站建设 2026/10/20 16:55:28

日报Skill:轻量级工作流设计的四层架构与落地实践

1. 什么是“日报Skill”&#xff1f;它不是代码&#xff0c;而是一套可复用的轻量级工作流设计 最近在几个技术社区和产品协作群里&#xff0c;频繁看到“日报Skill”这个词被反复提起&#xff0c;甚至有团队把它写进了周会纪要模板里。起初我以为是某个新出的AI插件或SaaS工具…

作者头像 李华