【问题标题】:3rd-order rate limiter in Simulink? How to generate smooth triggered signals?Simulink 中的三阶速率限制器?如何生成平滑的触发信号?
【发布时间】:2013-11-27 10:53:20
【问题描述】:

首先对于那些不熟悉 Simulink 的人来说,有一个可以想象的外部 Simulink 部分解决方案:

我需要创建一个满足以下条件的向量:

  • 已知初始值a1
  • 已知最终值a2
  • 它有一个预定义的步长,但长度不是预先确定的
  • 整个范围内的一阶导数限制为v_max resp。 -v_max
  • 整个范围内的二阶导数限制为a_max resp。 -a_max
  • 整个范围内的三阶导数限制为j_max resp。 -j_max
  • 在第一点和最后一点,所有导数都

在你问“到目前为止你尝试了什么”之前,我只是想在 Simulink 之外解决它,然后我尝试了下面的全部内容;) 但也许你们有一个好主意,而我一直在研究自己的解决方案。


我想根据 Simulink 中的触发信号生成平滑斜坡信号(三阶导数限制)。

为了获得触发步骤,我创建了一个触发子系统来传播触发输出。看起来是这样的:

但我实际上不想要一个步骤,我需要一个非常平滑的斜坡,其导数有限,直到 3 阶。背后的数学是:

displacement: x
speed: v = x'
acceleration: a = v' = x''
jerk: j = a' = v'' = x'''

(如果你觉得这很熟悉,我曾经有一个非常 similar question。我想过要赏金,但在对问题进行必要的编辑后,两个答案都将无效)

由于只有一阶速率限制器,我使用了两个导数和一个双重积分来解决我的问题。但是有一个市长的缺点,我不能再忽视了。为了便于说明,我选择了一个相对较大的步长 0.1。

完整的最小示例(Fixed Step,stepsize:0.1,ode4):Download here

可以看出,信号甚至没有达到预期的步高10,而且最后也不是恒定的。

在我的整个模型的开发过程中,这种方法对于小步长来说已经足够令人满意了。但我达到了我真正需要按预期平滑坡道的地步。这意味着我需要一个最终恒定的信号,其值正好是由步高增益指定的值。

我已经花了几天的时间来解决这个问题,现在希望在这里得到一些帮助。

我的一些想法:

  • 动态增加步高超过实际所需值并使最终输出饱和。如果速率限制、步高和仿真步长不灵活,可能会找到一个令人满意的解决方案。但由于一切都必须灵活,因此违反加速度和加加速度限制的情况太多了。
  • 我尝试使用Matlab function 块并编写我自己的三阶限速器。尽管触发时刻对我来说似乎是可能的,但我没有解决如何在坡道末端平滑“减速”的方法。我还需要 C 编译器,这会使我的模型很难在其他系统上毫无问题地使用。 (至少我是这么认为的。)

求解器不能显着改变(ode3 或 ode4),并且必须有固定的步长(0.00001 到 0.01)。


目前使用的,不是很实用的方法:

对于 1.07dynamic amplification,我得到以下输出(所有值均按其限制标准化): 虽然位移看起来不错,但违反加速度限制是非常有害的。

对于 1.05dynamic amplification,我得到以下输出(所有值均按其限制标准化): 加速度保持在其边界内,但位移未达到预期值。 (在图片中不是很清楚)混蛋仍然很大。 (我可以忍受,但这并不好)


所以在我看来,Simulink 内部的解决方案远非现实。任何想法如何创建一个表现良好的自定义功能块?


在模拟开始之前,模拟步长、步高和速率限制是已知的。 (但是我连续有很多这些触发的平滑斜坡,它应该提供一个事件离散控件)。所以我可以想象在 simulink 之外创建整个平滑斜坡并将其保存为timeseries 对象,并在触发器激活时将其附加到当前信号上。

【问题讨论】:

  • 我不完全确定我理解您的非 Simulink 解释。我想您正在寻找的是一个向量x,它代表了一段时间内的位置,并且有一个对应的向量t 指定了时间,对吧?向量的长度不是固定的,但diff(t) 是一个给定的常数dt。然后通过导数,您的意思是diff(x) ./ diff(t),它与diff(t) / dt 相同。这是正确的吗?
  • 第二个问题:我感觉可能有很多向量可以满足您的约束。您是否有一些最优标准来选择其中一种解决方案?
  • @A.Donda: diff(x) 在 Simulink 中应该是 du/dt。有许多解决方案,但只有一种可以在最短的时间内达到台阶高度。我目前正在与我的同事一起研究非 Simulink 解决方案,因为他告诉我,我什至有 4 个不同的加加速度值(黄色曲线的峰值)和 2 个不同的加速度值(绿色)来表征我的斜坡。解决方案是微不足道的(他已经有 2000 行 python 代码)。简化的案例,我实际上在这里要求可以更容易地完成,我只是还没有时间在这里发布。
  • 我想我会将此作为一个优化问题来处理。指定多个步骤,通过j 向量定义所有内容,计算avxcumsum,将约束实现为软约束,即超过最大值的惩罚等。如果对于给定数量的步骤有一个解决方案,应该找到它。减少步骤数,直到不再找到解决方案。我想试一试,但现在没有时间。如果过几天你还需要它,我可能会坐下来做。
  • @A.Donda 我不能完全关注你。我不需要它,因为我要解决更复杂的情况。那我可能不会在圣诞节前找到时间再次简化它来回答这个问题。因此,如果您有动力并且真的想回答这个问题,好吧,但是如果没有解决方案,我会很好。无论如何谢谢你! :)

标签: matlab simulink


【解决方案1】:

您看到的问题是因为差异没有很好地调节。 取差值会放大模拟中存在的数值。

此外,如果您尝试应用实际步骤,则混蛋总是很大。 我想你的方法最好反过来工作: 即做一个挺举、加速度和速度来实现你的步伐。

我认为您正在寻找类似 ref3 块的东西: http://www.dct.tue.nl/home_of_ref3.htm 请注意网站上的免责声明,使用起来有点麻烦。

【讨论】:

  • ref3 确实看起来很有希望。不幸的是,我不再从事这个项目并且无法对其进行测试。我们最终使用了一个类似应用程序的 python 实现。
【解决方案2】:

一种简单(尚待改进)的方法是使用速率限制器,然后使用带有过滤器的状态空间模型。从过滤器中您可以获得速度,然后您可以对其应用速率限制器。您继续使用速率限制器和过滤器,直到获得所需的曲线。

否则,您可以使用 ie runge kutta 公式或有限差分来提出更高阶的数值速率限制器。但是有人指出,他们可能会受到不良条件的影响。

我通常做的是使用一个速率限制器和一个三阶滤波器,然后调整时间常数(1 个三极点),以满足我的需求。这很好用,尤其是

【讨论】:

    【解决方案3】:

    长度 > 1 的积分器链不稳定!

    有一个庞大的研究领域涉及轨迹规划。最简单的方法可能是使用 FIR 滤波器(Biagotti 等人)或实施在线轨迹规划器(Ezair 等人 2014 / Knierim 等人 2012)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多