array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 舵机建模仿真 - 爱码网

卓大大 您能发篇推文讲解一下舵机控制的传递函数如何求解吗 在做智能车仿真时卡在这里了。

舵机建模仿真

▲ 舵机的传递函数如何建立

的确,宅在家里手里没有实际的智能车模,也无法实际调试。利用所学习的理论知识来对智能车建模仿真也是一种锻炼的方法。这更能够将课内课外结合起来。

在仿真智能车控制中,有很多环节需要建模,其中的舵机环节是影响车模运行性能的重要环节。你提到如何对舵机进行建模的问题非常重要,回答这个问题需要从以下这几个方面来讨论。

 

什么是传递函数?

在分析和设计任何系统的时候,最重要的一个环节就是对系统进行建模。有很多数学模型可以用于控制系统的描述。比如:微分方程、传递函数、状态方程等。
舵机建模仿真

▲ 线性时不变系统的输入输出信号

传递函数是用来刻画线性时不变(LTI:Linear Time Invariant)系统零状态下输入输出信号之间的关系。针对控制问题来说,系统函数可以定义为系统输出信号的拉普拉斯变换与输入信号拉普拉斯变换的比值。

下面微分方程描述了线性时不变系统输入输出时域关系:

dny(t)dtn+a1dn1y(t)dtn1++any(t)=b0dmx(t)dtm+b1dm1x(t)dtm1++bmx(t){{d^n y\left( t \right)} \over {dt^n }} + a_1 {{d^{n - 1} y\left( t \right)} \over {dt^{n - 1} }} + \cdots + a_n y\left( t \right) = b_0 {{d^m x\left( t \right)} \over {dt^m }} + b_1 {{d^{m - 1} x\left( t \right)} \over {dt^{m - 1} }} + \cdots + b_m x\left( t \right)

如果系统是零状态,那么对方程两边做Laplace变换,可得:
(sn+a1sn1++an)Y(s)=(b0sm+b1sm1++bm)X(s)\left( {s^n + a_1 s^{n - 1} + \cdots + a_n } \right)Y\left( s \right) = \left( {b_0 s^m + b_1 s^{m - 1} + \cdots + b_m } \right)X\left( s \right)

系统函数定义为:
H(s)=Y(s)X(s)=sn+a1sn1++anb0sm+b1sm1+.+bmH\left( s \right) = {{Y\left( s \right)} \over {X\left( s \right)}} = {{s^n + a_1 s^{n - 1} + \cdots + a_n } \over {b_0 s^m + b_1 s^{m - 1} + . \cdots + b_m }}

讲到这儿,只是定义了什么是可以用于控制研究的传导函数。在具体建立舵机的系统函数之前,需要判断一下舵机是否满足建立传递函数的条件:线性时不变特性

舵机建模仿真

▲ 舵机输出与控制之间之间的关系

 

舵机是线性时不变系统吗?

线性时不变特性是描述了系统的输入输出之间的两个特性,线性性和时不变特性。

时不变特性描述了系统的由系统输入信号x(t)x\left( t \right)所引起的系统输出y(t)y\left( t \right),是否随着输入信号的时间变化x(tt0)x\left( {t - t_0 } \right)而产生相同的时间变化y(tt0)y\left( {t - t_0 } \right)。舵机的输入输出之间的关系基本上满足时不变特性。

线性特性是指系统输入输出之间满足齐次性和叠加性,如果限定系统是实数系统,那么满足叠加性也就满足齐次性了。

下图显示了舵机在给定的指令x(t)x\left( t \right)之后,实际测量输出角度y1(t)y_1 \left( t \right)变化的情况。基本上是按照一个恒定的转速转动到指定角度便停止了。

舵机建模仿真

▲ 舵机的单位阶跃相应

那么,如果将指令x(t)x\left( t \right)放大两倍,变成2x(t)2x\left( t \right),舵机大约经过两倍的时间,到达两倍的角度,角度信号为y2(t)y_2 \left( t \right)。如果仅仅是从最终输出角度数值y2()y_2 \left( \infty \right)来看,它与输入信号x(t)x\left( t \right)之间是线性(比例)关系。但从动态过程y2(t)y_2 \left( t \right)来看,输出信号并不是放大两倍:y2(t)2y1(t)y_2 \left( t \right) \ne 2y_1 \left( t \right)

所以,舵机不是一个线性系统。

舵机建模仿真

▲ 舵机输出信号示意图

由于实际舵机不满足线性时不变特性,所以本质上讲,它无法使用传递函数了描述。

 

实际系统的线性近似

的确,很多实际系统不满足线性时不变特性。这就使得应用系统函数进行描述遇到困难。在一定条件下,可以将系统进行线性近似。

比如,只研究系统输入输出之间变化量的关系,可以引入增量线性系统的概念。如果系统是分段线性的,可以在每一阶段内建立对应的传递函数。
舵机建模仿真

▲ 分段线性化

如果系统输入输出之间的关系足够平滑,而系统运行时变化范围小,这样可以使用局部线性化来近似该系统。

舵机建模仿真

▲ 小型号线性化

那么对于舵机来讲,它是否满足上面的线性近似呢?很遗憾,至少对控制车模转向的小型舵机来讲,在它的工作范围内很难获得比较好用的线性化后的模型了,主要的原因是舵机工作在大的动态范围内。
舵机建模仿真

▲ 舵机控制前轮转向

 

为什么舵机不是线性的?

舵机内部包括有小型直流电机、减速齿轮、驱动电路以及位置传感器等,是一个机电一体化的位置闭环负反馈系统。其中的小型电机、位置传感器以及直流电机都可以近似看成线性系统,非线性主要来自于驱动电路。

由于受到工作电压以及功率的限制,驱动电路输出具有饱和特性。这样就决定了电机转速被限制在一定的范围之内。当电路输出进行饱和之后,电机的转速就是恒定值,驱动输出角度按照恒定角速度转动,从而与输入信号之间就不再保持线性关系了。

舵机建模仿真

▲ 舵机内部结构示意图

所以,你可能看到网络上很多对舵机进行建模分析的,大部分都是针对于大型的伺服舵机,它的输出能力大于实际负载,或者说特别关注于小范围的动态过程,此时可以使用传递函数建立相对精确的模型。

 

如何近似建立舵机数学模型?

根据上面分析,如何来对舵机建立可以用于仿真的数学模型呢?

1. 修改舵级的驱动

前面分析了小型舵机的非线性主要来自于内部驱动电路板输出饱和造成的,因此如果更换外部强劲的驱动电路,就可以减少这方面的限制了。

在推文五线接口舵机中给出了是所有A4950作为舵机功率驱动的设计方法,在一定程度上可以扩大舵机工作的线性范围。

由于舵机的特性关系到车模运行的速度,所以在比赛规则中除了特殊的组别(节能组、大型L型车模)之外,是不允许修改舵机内部电路的。

2. 使用纯延时环节替代舵机

由于舵机基本上工作在饱和恒速状态,在实际建模分析的时候,可以将它的传递函数近似以下的方式:

(1)比例环节: 就是输入输出之间就是一个比例放大环节。传递函数为:H(s)=kH\left( s \right) = k

(2)纯延时环节: 根据舵机的工作参数,将舵机近似成一个纯延时环节:H(s)=est0H\left( s \right) = e^{ - st_0 }。其中t0t_0可以根据舵机参数来确定。
(3)一阶惯性关节:
H(s)=est0=et02set02s1t0s2+t02s28++(t0s2)kk!1+t0s2+t02s28++(t0s2)kk!1t0s+1H\left( s \right) = e^{ - st_0 } = {{e^{ - {{t_0 } \over 2}s} } \over {e^{{{t_0 } \over 2}s} }} \approx {{1 - {{t_0 s} \over 2} + {{t_0^2 s^2 } \over 8} + \cdots + {{\left( { - {{t_0 s} \over 2}} \right)^k } \over {k!}}} \over {1 + {{t_0 s} \over 2} + {{t_0^2 s^2 } \over 8} + \cdots + {{\left( {{{t_0 s} \over 2}} \right)^k } \over {k!}}}} \approx {1 \over {t_0 s + 1}}

下面是使用纯延迟环节仿真车模在转弯时的运行情况:

舵机建模仿真

▲ 车模实际运行情况

舵机建模仿真

▲ 使用纯延时环节仿真车模转向控制

3. 建立舵机的非线性模型

不再使用传递函数来描述舵机的输入输出关系,而是直接建立它的输入输出之间的非线性动态关系。这一点可以通过普通的状态机、查表方法、人工神经网络建立。或者通过测量舵机的输入输出关系来进行数值描述等。

4. 硬件在环

如论数学描述多么精确,实际上都很难对舵机在实际上工作状态下完整的描述。因此,将来在做仿真的时候,也可以建立起硬件在环的仿真机制。将整个的仿真环节回归到时间域来进行。舵机模型则利用它的非线性时间模型来给出动态特性。

舵机建模仿真

▲ 硬件在环仿真示意图

小结

对于智能车仿真来讲,建议你可以使用简单的比例、纯延时、一阶惯性环节来对车模上的舵机进行建模。虽然这只是近似,但在给出车模控制基本参数之后,在实际的车模运行中再进行参数调整。

如果一切都能够通过仿真搞定,那么还需要现场比赛干什么呢?

相关文章: