《世冠科技仿真软件GCKontrol舵机模型的参数调优.docx》由会员分享,可在线阅读,更多相关《世冠科技仿真软件GCKontrol舵机模型的参数调优.docx(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、摘要:模型参数优化是通过极小化目标函数使得模型输出和实际观测数据之间到达最 佳的拟合程度,由于环境模型本身的复杂性,常规优化算法难以到达参数空间上的全局最 优。近年来,随着计算机运算效率的快速提高,直接优化方法得到了进一步开发与广泛应 用。如今越来越多的参数调优过程都是通过自动化的方法完成的,它们旨在使用带有策略 的启发式搜索在更短的时间内找到最优超参数,除了初始设置之外,并不需要额外的手动 操作。本文将介绍基于GCKontrol的例如工程,通过Python脚本调用GCKontrol API接口, 进行参数优化,来获取模型的最优参数解。Python 及 GCKontrol API 简介Pyth
2、on是一种解释型、面向对象、动态的高级程序设计语言。自从20世纪90年代初 Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和开发Web系统。目前Python 已经成为最受欢迎的程序设计语言之一。由于Python语言的简洁、易读以及可扩展性,众多开源的科学计算软件包都提供了 Python的调用接口,例如计算机视觉库OpenCV、三维可视化库VTK、复杂网络分析库igraph 等。而Python专用的科学计算扩展库就更多了,例如三个十分经典的科学计算扩展库: NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功 能,因此Pytho
3、n语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处 理实验数据、制作图表,甚至开发科学计算应用程序,在人工智能的科学领域也有很多应用。 近年随着数据分析扩展库Pandas机器学习扩展库scikit-leam以及Python Notebook交互环 境的日益成熟,Python也逐渐成为数据分析领域的首选工具。在GCKontrol中,我们做到了支持Python的API功能,实现了批量仿真和自动化建模、 测试的效果。对于建模,GCKontrolAPI支持自动化创立模型、设置模型参数以及连线;对于 仿真,支持翻开模型,配置时间信息,运行仿真并获取数据结果。全局优化与局部优化全局优化程序
4、从一系列的初始状态出发,在函数值空间整个区域,最终找到全局稳定点方式是大 量的去撒点,大量的去做几何结构优化,然后比拟哪一个才是最稳定的。很显然的,这个工 作量比拟大,很类似挨个尝试的方法。目标角度rad 口硒I角度rad图16 minimize法的结果图图1全局优化局部优化无论是量子化学还是密度泛函的计算,与做初始结构是有关的。在初始结构的基础上, 构建了初始波函数,或者是初始电子密度,然后进行辩分。当找到某一个局部稳定点位置的 时候,它比它周边的所有的点,能量都要低。那么就有一种风险,程序就认为,它不需要再 做结构几何优化了,这个地方就是最稳定的。按这个局部的指向,程序又回到这个局部稳定
5、点,这种点叫驻点。但问题在于,不止一个驻点,局部稳定点有很多个。基于不同的初始结 构,它附近的结构稳定点,可能相同,可能不同。程序并没有这个能力,从这样一个局部去 识别到全局稳定点。这种情况下并没有得到一个全局稳定点,但这个状态还是稳定的,只是 一个亚稳态,结构优化是对初始结构很敏感的,无论是量化计算还是密度泛函的计算都存在 这个问题,因此我们往往只能得到,靠近初始点的那个局部稳定点,而不是全局稳定点。图2局部优化Python与GCKontrol案例:舵机模型在之前的文章用GCKontrol搭建电动舵机系统中,我们介绍了舵机模型的整体架构 以及模型的特性,在本文中将继续使用此模型,通过限制优化
6、目标的范围,优化模型的相关 参数值,使之仿真结果到达最优。控制系统的动态性能指标对于稳定系统,系统动态性能指标通常在系统阶跃响应曲线上来定义。因为系统的单位 阶跃响应不仅完整反映了系统的动态特性,而且反映了系统在单位阶跃信号输入下的稳定状 态。同时,单位阶跃信号又是一个最简单、最容易实现的信号。1 .最大超调量(简称超调量)瞬态过程中输出相应的最大值超过稳态值的百分数,即cmax C(8)8% =/ 、 x 100%C(oo)式中,Cw%和c(8)分别为输出相应的最大值和稳态值,c(oo) = Jim c(t)ot-002 .峰值时间输出相应超过稳态值第一次到达峰值所需要的时间。3 .上升时间
7、输出响应第一次到达稳态值的时间。有时也定义为输出从稳态值的10%上升到90%的时 间。本例中我们重点关注超调量及上升时间两个参数的优化,将限定二者的范围区间,并使 仿真结果的误差带始终保持在0.005o步骤一:确定参数根据经验了解到在位置环中Kp_er_rad对舵机的响应速度起主导作用,Ki_er_Rad对舵 机的超调起主导作用,所以针对这两个值做组合的运算,找到合理的范围,使响应速度的加 快的同时,超调量变小。图4 Kp与Ki脚本内容如下:朴次置参数的调一期犯I耳Kp_er_rad_list = np.arange(50, 150, 10, dtype_=_np.dtypeCnp.float
8、)Ki_er_rad_list = np.arangeClQO, 150, 5, dtype_=_np.dtypefnp.float) result_array =_np.empty(np.size(Kp_er_rad_list) * np.size(Ki_er_rad_list)z 4) objective_array =_np.empty(np.size(Kp_er_rad_list), np.size(Ki_er_rad_list)EMA_Project.SetSimulationTotalTime(l)tar angle.SetParameter(y0, SIMTIME0,1? 0.0
9、3344: 0) n = 0图5设置参数的调节范围步骤二:确定优化目标在模型里将目标舵机角度定义为阶跃响应,仿真一次查看目标角度和实际角度的结果曲 线如下:0044004400”002400140004-0006 00ai0203040.50.60.7图6第一次仿真结果图根据导出的csv数据可知,此次仿真舵机角度最高点的数据为0.039rad,超调量为17.4%, 上升时间为0.179s。接下来我们定义超调量需要在。5%的范围内,上升时间为输出从稳态值的10%上升到 90%所需要的时间,这段时间称为响应时间,并且规定响应时间需要在0。05秒的范围内。 脚本内容如下:def calTr(Resp
10、onse_value, tar_anqle):start value = tar angle * 0.1end_value = tar_angle * 0.9start_time = cal_timePoint(Response_valuestart_value) end_time = cal_timePoint(Response.value, end_value) Tr value = end time - start_timeprint(,响应时间的为%8.6fs1 %Tr value)Top value = np.max(Response.value.z 1) if Top_value
11、tar_angle:Delta value = (Top value - tar angle) / tar angle * 100 *w*w*w*w*M*M*w*w*w%M*w*w*WVw%*w*w*w*w/w*w*w*w*yi一print。超调量为826% %Delta value) else:Delta value = -1#意味着没有超调print没有超调量1) return Tr value. Delta value图7响应时间&超调量步骤三:获取PID参数设置模块使用GCKontrol的Python API获取当前正在运行库的名称,并获取所需要的变量值,在 这里我们取目标角度、气动力
12、矩和响应角度,并分别命名,如下:义获取亚正后红口勺;瓦金冬为即a/匚m厂 EMA.Project = KontrolO在获堰II标鱼度输板块奥.条为整J期91Wtar_angle = EMA.Project.GetBlock(tar_angle) tar_angle_y= 0.0#获取气动力矩施模块?一命名为aj._torque air_torque = EMA.Project.GetBlock(nair_torque)real_angle : EMA-Project.GetBlock(AirLoad_and_AileronInertia.rad)旻获取位置坯ELD叁数改量模块Kp_er_ra
13、d =EMA.Project.GetBlock(Motor.Kp_er_rad)Ki.er.rad = EMA_Project.GetBlockCMotor.Ki_er_radn)Kd_er_rad = EMA_Project.GetBlockCMotor.Kd_er_rad)图8获取PID参数步骤四:运行优化PID控制器参数整定方法一:穷举法穷举法米用排列组合的方式进的循环仿真,根据约束条件计算动态响应时间和超调量:#采用排列组也方式 二勺砧坏仿1,计了丁态心下时间和超泄址Jfor i in rangeClen(Kp_er_rad_list): for j in range(len(Ki_e
14、r_rad_list): Kp_er_rad.SetParameter(gainf float(Kp_er_rad_listi) Ki_er_rad.SetParameter(gainz float(Ki_er_rad_listj) EMA-Project.Simulationstart() result_tar_list = tar_angle.GetSimulationResult() result_real_list = real_angle.GetSimulationResult() result_tar_array = np.array(result.tar.list1:) resu
15、lt_real_array = np.array(result_real_list1:) Trz Delta = calTr(result_real_array., 0, 2, 0.03344) result_arrayn,二Kp_er_rad_listi, Ki_er_rad_listj, Tr, Delta图9穷举法约束条件为:超调量必须小于5%并且最终的目标角度值和实际角度值相差小于0.005 (rad),并将条件代入到目标方程中。H系数 kl = 1.0 k2 = 1.0 林超调量小于5% objl = max(abs(Delta - 5), 0) print。objl的值为:,/bj
16、l)g拉所直罢的条件值别负数结念求强岐卮的旧标方理objective_arrayij = (kl * Tr + k2 * objl)*10.0 print(indexes,二 ixj) print(objective-array)n = n + 1time.sleep(0.05)图io目标方程将坐标轴的值换成Kp和Ki实际的值,并画出最终的热力图。xLabel=np . arange(50, 151, 10)yLabel=np.arange(100z 151, 5)fig = pit .figureOax = fig.add_subplot(lll)ax.set_yticks(range(le
17、n(yLabel)axset_yticklabels(yLabel)ax.set_xticks(range(len(xLabel) ax.set_xticklabels(xLabel)#画出最终的热力图pit.pcolormesh(objective_array) 用添加热力图标选pit.title(1ExhaustiveMethod)pit.xlabel(Kp_er_rad)pit.ylabel(* Ki_er_rad1) plt.showQ图11穷举法作图过程最终运行的结果如下列图,可以看出当Kp=105和Ki=137.5处目标方程到达最优(颜色值 最深)。方法一是一种“参数空间”扫描的方
18、法,利用穷举法可以找到一个合理的初始参数,继 而引入下面的整定方法二:局部优化。PID控制器参数整定方法二:局部优化一minisize非线性规划是一种求解目标函数或约束条件中有一个或儿个非线性函数的最优化问题 的方法。在python里用非线性规划求极值,最常用的就是minimize方法,minimize是 scipy.optimize中的函数,可以实现非线性规划问题;给定一个优化目标,其可以自动求出优 化目标取极值时所对应的参数。它的使用格式为:scipy.optimize.minimize(fun, xO, args=(), method=None, jac=None, hess=None,
19、 hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)。 其中局部内容解释如下: fun:求最小值的目标函数; xO:初始迭代值;method:求解的算法,目前可选的有:zNelder-Mead zPowell ZCG ZBFGS Newton- CG L-BFGS-B、TNC、COBYLA、SLSQP等; options:其他选项;maxiter:最大迭代次数; disp :是否显示过程信息。在本例如工程中我们使用Nelder-Mead求解算法,Nelder-Mead算法是一种求多元函数
20、 局部最小值的算法,其优点是不需要函数可导并能较快收敛到局部最小值。对N元函数f(x) (这里把函数自变量用N维矢量来表示),该算法需要提供函数自变量空间中的一个初始 点打算法从该点出发寻找局部最小值。将穷举法中获取到的最优值作为初始值,并加入minimize整定方法进行算法求解,内 容如下:#将,为举法的奴优什i代入初始值,,也次进仃拳数侬化x0 = np.array(105, 137.5)res = minimize(TotalObjz x0z method = Nelder-Mead# jac = False, options=,maxiter:100f 1disp: True)图 13
21、 Nelder-Mead其中,目标方程与图10中的内容一致,初始值xO为(105,137.5),求解算法选择的是 Nelder-Mead,由于算法不需要雅克比矩阵,故这里输入False,最大迭代次数为100次,显 示过程信息。在这里我们绘制散点图,并为起始点与终止点在图形中增加注释,由于首次运行不确定 终止点的位置,所以在运行第一次的时候,记录了终止点的Kp与Ki的值,并在第二次运行 前输入了终止点注释箭头的位置,将图形以最好的方式展示。 ,人 41. .1r/.ipit scatter(store.Pid_varl, store_Pid_var2)pit.title(ParametricOp
22、timization1)pit.xlabel(Kp_er_rad1)pit.ylabel(1Ki_er_rad)g接方举达力敢鼓优值代入初始m 次进红参数优化pit.annotate。FirstPoint xy=(105z 137.5)uxytext=(105z 130)xweight=bold color=r, arrowprops=dict(arrowstyle=- Zconnectionstyle=arc3xcolor=red), bbox=dict(boxstyle=round,pad=0.5, fc= * yellow, ec=kxlw=l_Aalpha=0 . 4)pit.anno
23、tate(EndPointxy=(115.500x130.625)xytext=(11810)v/eight=boldcolor=r, arrowprops=dict(arrowstyle=1-*xconnectionstyle=arc3xcolor=red), bbox=dict(boxstyle=round,pad=0.5* z fc=yellow, ec=k,lw=l ,alpha=0.4)图14 minisize法画图过程图15散点图在脚本中将每次仿真的目标方程值打印出来,求得:起始点Kp=105.000, Ki=137.500 0寸, 此时的目标方程值为0.267;终止点Kp=115.500, Ki=130.625时,此时的目标方程值为0.263。 在GCKontrol的2D面板中可以看出,与图6相比,此次仿真舵机角度最高点的数据为0.035rad, 超调量为4.43%,上升时间为0.263s。数据证明不仅降低了超调量和上升时间,并且也能保 证每次仿真在合理的范围之内。