强化学习方法在翼型拍动实验中的应用

2023-11-02 08:55曹博超
空气动力学学报 2023年9期
关键词:正弦动作效率

张 进,周 雷,曹博超

(复旦大学 航天航空系,上海 200433)

0 引言

在传统的流动控制策略设计方法中,人们通常采用一种知识驱动的逻辑:首先,建立一个数学模型,描述所关注的流体系统;然后,在给定的约束条件下,将优化算法作用于该数学模型,来寻找最优的流动控制策略。然而,这种自上而下的逻辑在面对过于复杂的流动问题或问题的参数空间过大时,会失效或使计算代价变得无法承受[1]。而自然界中的生物,在没有任何物理和数学知识的情况下,便可以本能地通过在环境中的不断试错来改进自己的动作策略。这种自下而上的经验驱动的策略优化方法,为解决复杂流动控制问题提供了新的思路。近年来,机器学习技术的迅速发展为流动控制领域带来了许多新的技术,尤其是其中的强化学习技术可以很好地复制生物体这种经验驱动的学习过程。在强化学习的优化框架下,不再要求对流体系统进行精确建模,智能体可以仅靠与环境交互的经验来提升自己的表现[2]。正是由于这样的特点,强化学习方法逐渐成为解决流动控制问题的新范式[3-5]。

在实际应用中,强化学习方法通常被用来寻找最优的流动控制策略,以达到某些预设的目标,例如减少阻力、提高升力、增加效率等。近年来,已经有许多工作开始使用强化学习方法来优化流动控制策略。Reddy 等[6]利用强化学习方法训练了模拟环境下的固定翼滑翔机,通过控制滚转角,使其能够利用模拟环境中的上升热气流进行爬升。在该工作基础上,Reddy 等[7]训练了在真实世界中的固定翼滑翔机,在训练过程中,滑翔机与气流环境进行交互,通过执行不同的动作来实现飞行控制,经过训练和优化,滑翔机可以利用真实对流环境中的上升热气流进行爬升,实现了更长时间和更高效的滑翔飞行,这提供了一种全新的飞行器自动飞行的导航策略。Rabault 等[8]训练智能体控制圆柱两个侧向射流的质量流率,稳定了圆柱的尾迹涡结构,降低了圆柱的升力和阻力。Fan 等[9]在实验和仿真中,训练了湍流中智能体适当选择位于主圆柱下游的两个小圆柱的转速,让整个系统减阻或效率最大化。Li 等[10]用稳定性分析加速了强化学习训练过程,并指出智能体感知到足够的物理信息对强化学习成功训练至关重要。姚张奕等[11]研究了强化学习在翼型分离流动控制中的应用,发现将动作历史加入状态量可以加速强化学习训练。

特别的,仿生力学因其与强化学习模仿生物学习过程的特点相似,近年来成为强化学习与流动控制结合的前沿领域。Gazzola 等[12]用强化学习方法训练了数值模拟环境中的二维鱼模型按照既定轨迹游动。Zhu 等[13]用强化学习模拟鱼类的捕食过程,训练了鱼模型通过运动在圆柱尾迹中进行姿态保持,其稳定的位置与Liao[14]对真实鱼类观察的位置一致。Gazzola等[15]利用强化学习算法训练集群中的个体保持稳定的相对位置,最后通过进化算法找到了最小个体耗能和最小集群耗能的集群模式。Novati 等[16]和Verma等[17]分别研究了二维和三维模型的集群效应,研究中上游鱼的运动方式固定,通过强化学习算法,将相对位置、历史动作信息作为状态,下游鱼模型可以利用上游鱼产生的尾迹结构,使自身速度最大化或者效率最大化,这为研究自然界中鱼类的集群行为提供了参考。

虽然强化学习方法目前已经有了许多数值模拟环境中的应用,但是在实验室的真实流体环境中的应用还较少。本文拟选择拍动推进的效率优化问题来验证强化学习方法在真实流体环境中的有效性。拍动推进是流动控制中一个经典问题,研究拍动推进有助于设计更高效的水下推进器和扩展流体力学理论体系[18-19]。在现有的翼型拍动相关研究中,因为正弦运动产生的推力呈周期性且相对稳定,便于建模和控制,研究人员通常在正弦运动的假设下,来讨论不同参数对模型的游动性能的影响。Senturk 等[20-21]利用直接数值模拟方法研究了翼型纯俯仰和浮沉运动,讨论了斯特劳哈尔数(St)和雷诺数(Re)对性能的影响,研究表明,推力和效率具有很强的雷诺数依赖性,越大的雷诺数对应着越高的最优效率。Floryan 等[22]和Lagopoulos 等[23]分别提出有关推力系数和效率的相似律和下游尾迹结构转变的相似律,借助这些相似律可以预测和描述正弦运动族的游动性能。然而,自然界中的生物在狩猎、躲避捕食者、追求配偶或饥饿时采用了更多样化的运动形式[24]。因此,了解非正弦的运动对游动性能的影响也非常重要。

目前,学者对于非正弦运动的研究主要涉及间歇性游动和非正弦的周期性步态。Floryan 等[25]对做间歇性拍动的翼型进行了实验,研究表明,间歇性运动通常对能量是有利的,运动相同的距离,间歇性运动比连续运动更节省能量,同时,如果将真实鱼类的代谢耗能纳入考虑范围,连续游泳可能在能量上更占优势。Akoz 等[26]计算了间歇运动的平均游动速度和运输成本后,发现了最优推进效率的运动占空比。类似于间歇性拍动,非正弦的步态也可能会带来效率的增益。Chao 等[27]对做雅可比椭圆函数运动(包含三角波运动、正弦运动、方波运动)的二维翼型进行了数值模拟,发现正弦运动具有最高的推进效率。van Buren 等[28]的研究支持了这一观点,并进一步指出,如果运动的波形是方波,会比正弦运动表现出更大的推力,相应地也需要消耗更多的能量,且从尾迹的角度来看,方波运动的快速启动和停止会产生双射流尾迹而不是典型的涡街,三角波和正弦运动则在下游形成相似的反卡门涡街和单一的射流尾迹。

除了间歇性游动和非正弦的周期性步态外,更一般的运动可以是任意一种不规则、非周期性的运动,这会导致流场的变化更为复杂,对推进的影响也更加难以预测和控制。由于传统方法的限制,有关非周期、不规律的运动对游动性能的影响还没有被充分地讨论。本研究拟将拍动翼型的效率优化问题转化为一个序列决策问题,建立对应的马尔可夫决策过程,并引入强化学习框架来求解。在这个框架下,模型可以实现更一般的运动,并自动地通过与水洞环境的交互来提高自身的运动效率。本研究的目的是验证强化学习方法在流体力学实验环境中优化流动控制策略的可行性,以期为未来的相关研究提供参考。

1 实验设备与装置

实验在复旦大学航空航天系的循环式水洞中进行,实验装置如图1 所示。实验段尺寸为0.5 m(高)×0.5 m(宽)× 6 m(长),水速范围为0~5 m/s 连续可调。实验模型为NACA0012 翼型,弦长c=200 mm,展长s=220 mm。实验中水速U=0.077 m/s,对应的基于弦长的雷诺数为Re=1.3×104。转动轴位于距离模型前缘25%弦长处,模型上下两端装有单分量的力传感器测量来流方向的力,模型上方还搭载一个扭矩传感器测量模型受到的扭矩,模型的转动由一个舵机驱动(STS3046)。力和力矩传感器的时序信号由数据采集卡(JY USB-62401)采集,并与舵机的动作反馈信号进行同步,所有信号的采样频率设置为80 Hz。在数据采集装置搭建中,对信号线以及接头处进行了屏蔽处理以消除环境噪声对信号的影响。另外,在进行平均推力系数及推进效率测量时,采取5 次重复性实验取平均值的方式来消除实验中的随机误差。

图1 实验装置Fig.1 Experimental setup

在拍动推进系统中,推力系数和弗劳德推进效率是最重要的游动性能指标。推力系数和效率的时平均量定义如下:

其中:Fx为运动诱导的力在流向的分量;ρ为水的密度;U为来流速度;s为翼型的展长;c为弦长;为平均有用功率;为平均需用功率;M为转动扭矩;ω为转动角速度;T为计算平均值的时间区间长度。本实验中,在评价翼型拍动动作的平均效率和平均推力系数时,取T=120s。

对于周期性拍动推进系统,其运动的频率通常用无量纲参数斯特劳哈尔数(St)描述:

式中:f为周期性运动的频率;A为尾缘的摆幅。

2 基于强化学习的流动控制

2.1 强化学习算法

强化学习是求解马尔可夫决策过程上的数学框架。一个典型的马尔可夫决策过程由M={S,A,R,P,γ}表示。在t时刻的状态st∈S下,智能体可以根据策略函数选择动作at~π(st;x)。策略函数可以将状态空间和动作空间映射到实数域,S×A→[-1,1],参数由x表示。智能体做出一个动作后,状态会更新为st+1,并且智能体会得到来自于环境的奖励信号rt+1~R(st,at)。强化学习的目标就是更新策略函数的参数x,从而最大化累计回报奖励其中 γ ∈[0,1)代表了折扣因子,其值越大代表智能体越重视未来的奖励。

本文采用PPG(phasic policy gradient)算 法[29]。PPG 算法是一种基于策略梯度的强化学习算法,是PPO(proximal policy optimization)算法[30]的一种变体。PPG 算法和PPO 算法均包含两个网络:一个是策略网络,实现状态到动作的映射at~π(st;x),参数用x表示;另一个是价值网络,提供对状态价值函数V(st;w)=Eπ[Gt|st]的判断,辅助策略网络进行更新,参数用w表示。

网络参数的更新是通过最小化损失函数实现的。PPG 算法的训练分为两个交替进行的阶段。第一个策略训练阶段用来训练策略网络和价值网络,对应的损失函数为:

其中:LPG和 LVF分别为策略网络和价值网络的损失函数;ρt为重要性抽样比,代表了新旧策略选择相同动作的概率比值,用于调整样本的权重以准确估计新策略的价值;clip 为裁剪函数,将 ρt裁剪到(1-ε,1+ε)区间中;ε为控制裁剪程度的超参数,可以控制策略更新的程度;为广义优势函数,衡量了智能体在给定状态下采取某个动作相对于平均预期回报的优势程度,用于指导策略更新;t为基于广义优势函数构建的对真实状态价值函数值的估计;wold为价值网络旧参数。通过对 LPG的训练,可以让策略网络最小化广义优势函数。通过对 LVF的训练,可以让价值网络通过自举法接近真实的价值函数。更多相关细节可参考文献[29-30]。

第二个辅助训练阶段,损失函数为:

其中:LJT和 LVF分别为策略网络和价值网络的损失函数;DKL(π(st;xold)||π(st;x))为更新前后新旧策略的K-L(Kullback-Leibler divergence)散度;β为控制新旧策略差异的超参数。LJT由 两项组成,最小化 Laux项,能让策略网络的底层参数从对价值函数的拟合中获益,优化 β项可以限制网络更新的幅度,从而保障训练的稳定性。在辅助训练阶段,还会对价值网络的损失函数LVF进行额外的训练。

从训练流程来看,PPO 算法相当于只有第一个策略训练阶段的PPG 算法。在网络结构上,两者的价值网络结构相同。而PPG 算法的策略网络在输出层有两个输出,一个输出策略 π(st;x),另一个输出策略网络对价值的判断,即V(st;x)。但PPO 算法的策略网络只有一个策略输出 π(st;x)。

2.2 动作、状态设计

强化学习中的动作、状态和奖励设计非常关键,其直接影响着强化学习算法的学习效果和性能。在流动控制的强化学习实验中,动作、状态和奖励的设计需要配合流动物理情况进行调整。实验中,拍尾定义为模型的尾缘从一端移动到另一端的过程,模型的动作设计为下一个正弦拍尾动作的幅度和频率,表示为at={At,ft}。研究中,模型会在一侧摆动到最大幅度后开始执行下一个动作,并且为了避免模型出现一直在一侧摆动的情况,模型每次的拍尾动作被强制要求经过流向的对称面。出于效率与推力间的平衡,单侧的摆动角度被限制在7°~20°之间。因为角度过低时,虽然会得到较高的效率,但推力较小,没有实际的意义;另一方面,角度过大时,效率又会迅速降低,均不利于搜索在较大推力下的高效率游动行为。同时,设定频率范围使得单次拍尾的瞬时St能够处于0.2~0.8 区间。智能体可以任意选择动作空间中的拍动动作组合,达到优化效率的目的。

为了在给定的均匀来流条件下建立马尔可夫过程,将强化学习智能体的状态定义为模型的运动历史。智能体观察到的状态是前n个拍尾动作的历史,表示为st={at-n+1,···,at},本实验取n=12。在该设置下,可以使得智能体的状态时间窗口长度足够来流流过4c~5c的距离,从而保证更早的拍动动作对当前翼型的水动力学状态的影响可以忽略不计,进而保证该问题的马尔可夫性,即状态可以唯一确定当前模型周围的流场。

2.3 奖励函数设计

在使用强化学习算法优化一个长期高效的智能体时,最直接的方法是将长期效率作为奖励函数。但是这样会使样本量减少且训练难度增加。因为强化学习算法的更新需要 (st,at,rt+1,st+1)的轨迹历史,如果rt+1是 长时间尺度的奖励,则st、at也需要是长时间尺度的,以满足马尔科夫性。而当st、at是长时间尺度的状态和动作时,会出现两个问题:第一个是样本量变少,在相同时间内,轨迹中收集到的(st,at,rt+1,st+1)数量减少,网络参数更新的次数降低;第二是搜索难度变大,长时间尺度的状态空间更复杂,智能体需要更长时间的探索才能学习到优化策略。有一种简单的做法是,将当前动作的短期效率作为奖励函数。但这使得优化的目标变成了累计短期效率之和,而非长期效率,因此智能体有可能会过拟合短期效率,导致陷入局部最优解。同时,短期效率与模型的当前状态强相关,使得训练过程很容易受到实验噪声的影响,造成短期效率的波动,这样的噪声可能使得模型无法学习到长期推进效率最优的策略。在本研究中发现,当计算平均效率的窗口长度接近水流通过3c长度的时间,需要的训练时间较少并能得到很高的长期效率表现,这个效率评价时间窗口大概对应8 次拍尾动作所需的时间。

2.4 网络结构和超参数设计

数据采集卡用C#语言控制,强化学习代码基于Python 语言的Tensorflow 库构建。

策略网络和价值网络的隐藏层均由两层LSTM(long short-term memory)网络和一层全连接层组成。价值网络的两层LSTM 的节点数分别为64 和128。策略网络的两层LSTM 的节点数分别为32 和64。全连接层的节点数分别为32 和64。网络结构使用LSTM 是为了更好地捕捉时序信息。策略网络比价值网络的节点数更少是因为策略函数一般有更低的复杂度。策略网络和价值网络的学习率均设置为0.004,折扣因子 γ设置为0.999,控制策略训练损失函数的裁剪系数 ε为0.2,策略网络的探索噪声为0.1,每次更新的批量大小为64。

2.5 强化学习训练流程

图2 展示了本研究中强化学习的训练流程,并着重说明了单个回合内的交互过程。每个回合分为两个阶段,即编译阶段和交互阶段。

图2 强化学习训练流程图Fig.2 Flowchart of the reinforcement learning procedure

在编译阶段开始时,上一个回合的结束状态被作为当前回合的初始状态(除了第一个回合是进行随机初始化)。策略网络会根据初始状态生成下一个时刻的动作a0,因为在本研究的设置中,状态仅仅是动作的堆叠,所以可以直接推断出下一个时刻的状态。由此,智能体可以提前生成回合中所要执行的所有动作。编译阶段完成后,训练进入交互阶段,每个回合的交互阶段持续60 s。在交互阶段开始前,模型会重复两次初始状态的动作来初始化流场。初始化完成后,智能体会根据预先编译好的动作开始运动,并且记录下交互的轨迹{s0,a0,r0,s1,···,sT,aT,rT}。

在单个回合交互阶段结束后,设定一分钟的间歇,再开始下个回合的编译阶段,以避免回合与回合间的流场交叉干扰。智能体在回合间歇内按照强化学习算法进行网络参数更新。单个回合的最后一个状态sT被记录用于初始化下一个回合,通过这样的方式,可以还原连续学习的过程。实验的最大回合数设为400,整个迭代学习过程都是在水洞实验室中自动进行的,无需人为干预,持续时间大概为12 h。

3 结果与讨论

3.1 算法比较

为了验证强化学习算法的有效性,对两种不同的强化学习算法(PPO 和PPG 算法)获得的训练结果进行了对比。两组强化学习实验的所有参数设置均相同,并计算了每个回合(60 s)的平均效率,画出了两种算法的学习曲线。为了更好地观察学习曲线的变化趋势,对效率进行了窗口长度为5 的滑动平均处理。从图3 中可以看出,PPG 算法能够更快地收敛到一个较高的推进效率水平,且最终表现也优于PPO算法。PPG 算法下的智能体可以在150 回合左右将效率稳定维持在14%左右,而PPO 算法训练的智能体在250 回合左右才将效率提高到10%左右的水平。

图3 不同强化学习算法的学习曲线Fig.3 Learning curves for different reinforcement learning algorithms

PPG 算法比PPO 算法训练速度更快的原因是PPG实现了策略网络和价值网络之间的特征共享,同时将它们的训练解耦,从而有更高的样本利用率。PPG算法在策略训练阶段后还引入了辅助训练阶段,通过对 Laux的训练,使得策略网络的底层参数能从拟合价值函数的过程中获益。辅助训练阶段还对价值网络进行额外的训练,加快了状态价值函数的收敛速度,并且价值网络并没有直接地与策略网络共享参数,因此额外训练不会导致策略网络受到价值网络训练的干扰,在更短的回合数内学习到了更高效率的运动策略。

3.2 训练过程分析

为了更好地展示出强化学习的训练过程,将PPG 算法下不同回合的智能体表现绘制成推力系数-效率曲线,如图4 所示。初始的模型推进效率大约在4%左右,推力系数大约为0.2。随着训练的进行,模型的效率不断提高,最终达到了14%左右。

图4 PPG 算法学习路径Fig.4 Learning path for the PPG algorithm

同时给出了相应回合下的运动波形、有用功率(FxU)、需用功率(Mω)时间历史,如图5 所示。从图5中可以看到智能体的动作调整过程。由图5(a)对应的第1 回合运动历史可以看出,智能体在训练开始时,做的是杂乱无章的随机拍动动作。在大约5~10 s及25~30 s 区间,模型采取了接近最大摆幅的拍动,提高了瞬时有用功率,瞬时有用功率峰值约为0.05 W,但是这样的运动消耗了更大的需用功率,需用功率的峰值约到达0.8 W。大幅度的摆动动作虽然能够提高有用功率,但也需付出更大的需用功率,总体上会导致效率的降低。由图5(b)可以看出,在第100 回合时,智能体不再轻易尝试大幅度的摆动动作,从而将需用功率控制在较低的范围中以获得更高的效率。由图5(c)可以看出,在大约第200 回合时,智能体运动的幅度已经处于一个比较稳定的范围,有用功率和需用功率都不再出现类似早期的瞬时较大变化。但此时的频率还偏高,因此在第200 回合后,智能体主要专注于频率的微调。如图5(d)所示,在大约第400 回合时,运动的幅度和频率都在一个更小的范围内波动,同时瞬时需用功率也得到了进一步的控制,最终获得了效率的进一步提升。

图5 不同回合下的运动波形、有用功率和需用功率时间历程Fig.5 Time history of the motion waveform,useful power and required power after different iterations

智能体在400 回合的训练过程中,学会了控制每一次拍动动作的角度和频率,在提高有用功率的同时避免大幅运动带来的需用功率增加,以获得持续提升长期推进效率的效果,最终智能体收敛到了一种合适的幅度和频率下的近似正弦运动。

3.3 推力约束下的效率优化

强化学习算法的一大优势是,仅通过修改奖励函数即可实现在约束条件下的训练。本实验通过修改奖励函数,实现了在给定推力条件下的高效运动策略搜寻。

为了训练出能够实现高推力运动的智能体,将奖励函数设计为:当推力系数大于给定阈值时,奖励等同于效率;当推力系数小于给定阈值时,奖励为0。对推力系数阈值分别为0.6 和0.9 的两种情况进行了训练,学习曲线和学习路径如图6 所示。在图6(a)中,绿色和紫色曲线分别代表推力系数阈值0.6 和0.9 的学习曲线。在图6(b,c)中,颜色由浅至深的圆点分别对应了第1、100、200、400 回合,阴影区域对应推力系数大于0.6(绿色)和0.9(紫色)的区域。

图6 推力约束条件下的学习曲线和学习路径Fig.6 Learning curves and learning paths under the thrust constraint

从图6(a)可以看出,在添加了对推力的额外要求后,学习过程比没有推力要求时更慢,并且最终得到的运动效率更低。在推力系数阈值为0.6 时,在第200 回合左右,智能体的效率达到了11%左右。在推力系数阈值为0.9 时,在第300 回合左右,智能体的效率才稳定到了10%左右。由图6(b,c)可知,最终得到的运动策略对应的平均推力系数分别为0.76 和1.02,均高于推力要求阈值。

学习过程变慢的原因是高推力的运动空间是整体运动空间的一个子空间,没有约束条件时,智能体可以学习到任意一个局部最优的运动策略,但是增加约束条件后,智能体必须要在给定的更狭窄的运动空间中进行探索优化,这增加了智能体的探索难度,从而降低了学习速度。

在推力施加约束后,智能体学习到的运动策略效率会降低。这是因为在高推力的运动空间中,最优运动效率比起没有推力约束的最优效率要低。比如正弦运动族的推力达到某种程度后,效率就会显著降低[18-19]。

3.4 频率分析及与正弦运动的比较

对加与不加推力约束的最终运动策略进行统计分析,绘制了运动策略瞬时拍动频率和幅度的箱线图,如图7 所示。结果表明,较大的推力系数阈值可以使得智能体在更高幅度、更高频率的运动空间中进行探索。不加约束的强化学习收敛到的运动策略的平均幅度为12.5°左右。施加推力约束条件后得到的运动策略的平均幅度分别约为15°、17°。

图7 不同推力约束下的运动策略频率和幅度箱线图Fig.7 Boxplot of the frequency and amplitude for motions under different thrust constraints

为更好地评价智能体学习到的运动策略的表现,将其与模型在正弦运动下的表现进行对比。测量了不同频率下摆动幅度为±12.5°、±15°、±17°的正弦运动的性能,每次测量时间长度为120 s,进行五组重复实验取平均值。同时利用智能体最终运动策略网络生成运动时间序列,并将其表现与正弦运动的表现在推力-效率图上进行对比(图8)。结果表明,强化学习智能体的推进效率均达到了相似正弦运动下的效率的上边界。此外,根据智能体最终运动形式的所有拍动动作的平均幅度和平均频率,计算出平均St,其数值范围约为 0.4~0.55,与正弦运动下的最优St范围一致。

图8 强化学习运动与正弦运动的比较Fig.8 Comparison between the reinforcement learning motion and the sinusoidal motion

4 结论与展望

本文基于实验测量和强化学习算法研究了拍动翼型的非定常推进问题。通过强化学习方法,对拍动翼型的非周期动作进行了优化,得到了高效推进的非周期运动策略。并通过改变奖励函数,实现了智能体在高推力要求下的效率优化。研究得出以下主要结论:

1)强化学习可以作为工程中探索复杂流动问题和高维参数空间的研究手段。但是使用不同的强化学习算法和不同的超参数,会对训练表现产生很大影响。本文中,PPG 算法能够比PPO 算法更快地收敛到更高效率的运动策略。在真实的流体环境中进行算法或者超参数的对比非常消耗资源,未来可以通过设计更加适合流体环境的算法或在数值模拟环境中初步确定超参数等方式解决该问题。

2)改变奖励函数可以训练智能体完成不同的任务。例如在本实验中增加了推力的限制,智能体依然能在约束条件下找到优化的运动策略。在实际工程应用中,可以通过修改奖励函数或调整强化学习框架中的约束条件,来训练适合不同工况的智能体,从而满足工程中多样的流动控制需求。

3)研究发现,强化学习方法获得的最终运动策略与正弦运动下的最优表现相当。这也从侧面说明了,在单自由度拍动动作下,适当的振幅和频率下的正弦运动基本是高效率推进的最优选择。该结论与前人对非正弦拍动运动的研究结论吻合[27-28]。

在后续研究中,拟进一步增加模型的自由度,例如加入俯仰运动-浮沉运动的组合、扩大模型的动作空间等。亦可将流体环境反馈添加到智能体的状态量中,让智能体能够根据反馈实时地调整自身动作,从而实现智能体在复杂来流条件下的动作策略优化。

猜你喜欢
正弦动作效率
例说正弦定理的七大应用
正弦、余弦定理的应用
提升朗读教学效率的几点思考
“美”在二倍角正弦公式中的应用
动作描写要具体
非同一般的吃饭动作
基于VSG的正弦锁定技术研究
跟踪导练(一)2
“钱”、“事”脱节效率低
提高讲解示范效率的几点感受