首先,对于那些不熟悉Simulink的人来说,有一个可以想象的外部Simulink部分解决方案:
我需要创建一个满足以下条件的向量:
a1
a2
v_max
。 -v_max
a_max
。 -a_max
j_max
。 -j_max
在你问“你到目前为止尝试了什么”之前,我只是想在Simulink之外解决它,我尝试了下面的所有内容;) 但也许你们有个好主意,而我一直致力于自己的解决方案。
我想基于Simulink中的触发信号生成平滑的斜坡信号(三阶导数限制)。
要获得触发步骤,我创建了一个触发子系统来传播触发输出。它看起来像是:
但我实际上并不想要一步,我需要一个非常平滑的斜坡,有限的衍生产品直到第三顺序。背后的数学是:
displacement: x
speed: v = x'
acceleration: a = v' = x''
jerk: j = a' = v'' = x'''
(如果这看起来很熟悉,我曾经有一个非常similar question。我想到了它的赏金,但在对问题进行必要的编辑之后,两个答案都将无效)
由于只有1阶速率限制器,我使用了两个导数和一个双重积分来解决我的问题。但是有一个市长的缺点,我不能再忽视了。为了便于说明,我选择了相对较大的步长0.1。
完整的最小示例(固定步骤,步长:0.1,ode4): Download here
可以看出,信号甚至没有达到10的预期步高,而且最后也不是恒定的。
在整个模型的开发过程中,这种方法对于小步长来说足够令人满意。但是我达到了我真正需要平滑坡道的程度。这意味着我需要一个最终恒定的信号,其值恰好是由步高增益指定的值。
我已经花了好几天时间来解决这个问题,并希望现在能够提供一些帮助。
我的一些想法:
Matlab function
块并编写我自己的3阶速率限制器。虽然我觉得触发时刻似乎是可能的,但我没有解决方法如何平滑斜坡末端的“减速”。此外,我需要C编译器,这将使我很难在其他系统上使用我的模型没有问题。 (至少我是这么认为的。)求解器不能显着改变(ode3或ode4),固定步长是强制性的(0.00001到0.01)。
目前使用的,不是非常有用的方法:
对于{{1>} 1.07 ,我得到以下输出(所有值都按其限制标准化): 虽然位移看起来不错,但违反加速度极限是非常有害的。
对于{{1>} 1.05 ,我得到以下输出(所有值都按其限制标准化): 加速度保持在其边界,但位移未达到预期值。 (图中并不是很清楚)混蛋仍然很大。 (我可以忍受,但这并不好)
所以在我看来,内部的Simulink解决方案远非现实。任何想法如何创建一个良好的自定义功能块?
模拟步长,步长和速率限制在模拟开始之前是已知的。 (但是我有很多这些触发了连续平滑的斜坡,它应该提供事件离散控制)。因此,我可以想象在simulink外部创建整个平滑斜坡并将其保存为dynamic amplification
对象,并在激活触发器时将其附加到当前信号上。
答案 0 :(得分:1)
你看到的问题是因为差异不是很好。 取差异会放大模拟中存在的数值。
如果您尝试应用实际步骤,那么混蛋总是很大。 我想对于你的方法,以相反的方式工作会更好: 即使你的步伐达到一个挺举,加速度和速度。
我认为你在找像ref3这样的东西: http://www.dct.tue.nl/home_of_ref3.htm 请注意网站上的免责声明,并且使用起来有点麻烦。
答案 1 :(得分:0)
一种简单(尚未改进)的方法是使用速率限制器,然后使用带过滤器的状态空间模型。从过滤器中获得速度,然后您可以应用速率限制器。继续使用速率限制器和过滤器,直到获得所需的曲线。
否则,您可以使用runge kutta公式或有限差分来得出更高阶的数值限制器。然而有人指出,他们可能会受到不良条件的影响。
我通常做的是使用一个速率限制器和三阶滤波器,然后调整时间常数(1个三极),以满足我的需求。这很有效,特别是
答案 2 :(得分:0)
长度的积分链> 1不稳定!
有一个涉及轨迹规划的大量研究领域。最简单的方法可能是使用FIR滤波器(Biagotti等)或实施在线轨迹规划器(Ezair等2014 / Knierim等2012)。