Contact me: hankecnc@gmail.com

limit3 无视最小值、最大值和有时开始缓慢失控 #240

推推 grbl 3年前 (2023-01-29) 326次浏览
关闭
propcoder 打开了这个问题 2017 年 3 月 5 日 · 23条评论
关闭

limit3 无视最小值、最大值和有时开始缓慢失控#240

propcoder 打开了这个问题 2017 年 3 月 5 日 · 23条评论

注释

limit3 无视最小值、最大值和有时开始缓慢失控 #240
编码器 评论了 2017 年 3 月 5 日  

out超出 [min, max] 范围

有时会缓慢失控。

两年前我注意到了缓慢而持续的失控,只是无法捕捉到它。现在我抓住了它并且可以复制。

以下是我重现该问题所遵循的步骤:

— 在第一个终端:

halrun
loadrt limit3 names=l
setp l.min -50
setp l.max 50
setp l.maxv 4000
setp l.maxa 10000
loadrt siggen names=sg
setp sg.amplitude 100
net s sg.sine => l.in
loadrt threads name1=t period1=1000000
addf sg.update t
addf l t
start

— 在第二个终端:

watch -n 0.2 halcmd show pin l

注意输出值超出 [min, max] 限制。

— 然后在第一个终端上:
在随机时间手动切换以下行并等待开始失控而不是停止耐心点,多试几次。第二次我需要大约 20 次尝试:

unlinkp l.in
net s l.in

这是我期望发生的事情:

out保持在 [-50, 50] 的范围内
hold steady 当所有输入都稳定且停止后

这是发生了什么:

out out out out the range
有时out在所有输入都稳定且在预期停止后缓慢运行

有关我的硬件和软件的信息:

  • 我正在使用这个 Linux 发行版和版本:Debian Jessie 8.7,amd64
  • 我正在使用这个内核版本:4.5.0-0.bpo.2-amd64
  • 我正在运行 LinuxCNC 2.8.0-pre1-2881-ge624275,在 2015 实时 x86 版本上也注意到了
    • [+] 来自 linuxcnc.org 的二进制版本(包括 buildbot.linuxcnc.org)
limit3 无视最小值、最大值和有时开始缓慢失控 #240

这是一个 halscope 屏幕截图,显示了 2.7 上的 limit3 约束违规。
limit3 无视最小值、最大值和有时开始缓慢失控 #240

limit3 无视最小值、最大值和有时开始缓慢失控 #240

这是一个失控的人。请注意,当它的输出处于过冲状态时,我碰巧断开了它的输入。
limit3 无视最小值、最大值和有时开始缓慢失控 #240

cradek 推送了引用此问题的提交 2017 年 7 月 17 日

limit3 无视最小值、最大值和有时开始缓慢失控 #240

我开始在名为 2.7-limit3-issue-240 的分支中添加针对此问题的测试

limit3 无视最小值、最大值和有时开始缓慢失控 #240

这些测试位于名为“2.7-limit3-issue-240”的分支中。

limit3 无视最小值、最大值和有时开始缓慢失控 #240
贡献者
jm卡苏尼奇 评论了 2017 年 10 月 18 日 通过电子邮件
limit3 无视最小值、最大值和有时开始缓慢失控 #240

“失控”测试:

  • limit3.min = -50
  • limit3.max = 50
  • limit3.maxv = 4000
  • limit3.maxa = 10000
  • limit3.in是从siggen正弦采样的信号,幅度为100,信号包括第一个半波和第二个半波的一部分;它以 -42 结尾,就停在那里。limit3 输出不断下降超过输入并超过其最小值。这看起来像上面的“失控”屏幕截图,但没有连接和断开引脚中的 limit3。

“超调”测试又名约束违规:

  • 与上面相同的 limit3 min/max/maxv/maxa 约束
  • 输入是振幅为 100 的正弦信号
  • limit3 输出略高于最大值并低于最小值,每个周期,然后更正并返回到极限,直到下一个周期(如上面的约束违规屏幕截图所示)
limit3 无视最小值、最大值和有时开始缓慢失控 #240
合作者

这就是我为测试所做的。
http://electronicsam.com/images/KandT/testing/limit3/

我添加了一堆 hal 引脚以公开内部变量 (limit3.comp),然后我运行了 limit.hal 文件。我也跑了上面

watch -n 0.2 halcmd 显示 pin l

在单独的命令窗口中。

在观察 l.out 时,我会从信号 s 断开并重新连接 sg.sine。在 5 到 10 次断开连接并重新连接后 – l.out 将继续向负方向移动并且在断开连接时不会停止。似乎总是朝着负面的方向逃跑。

目录中的电子表格有 2 个采样器日志。第一组数据显示失控。第二组显示正常(我认为)断开连接。

我以为我可以弄清楚发生了什么 – 但我有点不知所措。

山姆

limit3 无视最小值、最大值和有时开始缓慢失控 #240
贡献者
jm卡苏尼奇 评论了 2017 年 10 月 18 日 通过电子邮件
limit3 无视最小值、最大值和有时开始缓慢失控 #240

自从将 limit3 从块移动到 LinuxCNC 以来,limit3 的核心数学并没有真正发生任何变化。我们将约束从参数转换为引脚,添加了一个“加载”引脚,仅此而已。

我确实测试了 2.7 开始和当前提示之间的每个版本,并且所有版本都未能通过此错误报告中描述的两个测试。

limit3 无视最小值、最大值和有时开始缓慢失控 #240
贡献者
jm卡苏尼奇 评论了 2017 年 10 月 18 日 通过电子邮件
limit3 无视最小值、最大值和有时开始缓慢失控 #240
贡献者
jm卡苏尼奇 评论了 2017 年 10 月 18 日 通过电子邮件
limit3 无视最小值、最大值和有时开始缓慢失控 #240

我想知道我们是否应该以某种方式在 limit3 组件和自由模式联合轨迹规划器之间共享代码。他们都解决了完全相同的问题,对吧?

limit3 无视最小值、最大值和有时开始缓慢失控 #240
合作者
三星币 评论了 2017 年 10 月 19 日  

大多数时候它工作得很好。在上面的测试中——我唯一能让它失败的时间是当输入在限制 (+/-50) 之间变为负数时,似乎逻辑选择了错误的方向。在这种情况下,它没有选择 max-out(减速并改变方向停止),而是选择 min-out 并继续朝负方向前进。我试图让它在那个范围内不失败,我想如果我能得到好的数据,我就能看到发生了什么。它虽然似乎一直失败。

        if ( fabs(err+dp*2.0) < fabs(err) ) {
	    ramp_a = -ramp_a;
	}
	if ( ramp_a < 0.0 ) {
	    lout = min_out;
	    data.old_v = min_v;
	} else {
	    lout = max_out;
	    data.old_v = max_v;
	}
limit3 无视最小值、最大值和有时开始缓慢失控 #240
合作者

不 – 我的上述评估是不正确的。我应该闭嘴。(除了它似乎只会失败)

limit3 无视最小值、最大值和有时开始缓慢失控 #240
合作者

抱歉 seb – 不会那么懒惰。行。它实际上会减速到停止(斜坡下降),但不会发生方向的改变。(当变为负数时。)当输入在 -43.1456 断开时,记录了以下数据集。你看到它减速到 0 速度。现在它应该选择 -56.08 (int-max-out) 但它选择了 -56.1。看起来它可能与这段代码有关。

 	if ( in_v > data.old_v ) {
	    ramp_a = maxa;
	} else {
	    ramp_a = -maxa;
	}

在这个数据集中——in_v 和 data.old_v 都是 0。所以 ramp_a=-maxa。在这种情况下,这是错误的选择。(当速度为负时。)

所以为了测试我添加了这些行

    /* determine which way we need to ramp to match v */
    if ( in_v > data.old_v ) {
        ramp_a = maxa;
    } else {
        ramp_a = -maxa;
    }
    if (min_v < 0 && max_v > 0 && data.old_out < 0 && lin > min_) {
        ramp_a = maxa;
    }  

这似乎解决了当前的问题(至少在我到目前为止的测试中)
这是一个问题,我有点尴尬……我想不出更好的方法。

limit3 无视最小值、最大值和有时开始缓慢失控 #240

limit3 无视最小值、最大值和有时开始缓慢失控 #240
合作者

不完全正确。我知道令人震惊

limit3 无视最小值、最大值和有时开始缓慢失控 #240
合作者

好的-看看这个。我认为这至少可以解决一个极端情况……我还没有失败……

From 29ec4493096bd1d374f254bdf8c715a7d980a98a Mon Sep 17 00:00:00 2001
From: Sam Sokolik <samcoinc@gmail.com>
Date: Thu, 19 Oct 2017 17:20:13 -0500
Subject: Inital fix for limit3 negative run away.

Signed-off-by: Sam Sokolik <samcoinc@gmail.com>

diff --git a/src/hal/components/limit3.comp b/src/hal/components/limit3.comp
index 6ff14a7b1..3200f56a0 100644
--- a/src/hal/components/limit3.comp
+++ b/src/hal/components/limit3.comp
@@ -18,6 +18,7 @@ typedef struct {
     double old_in;	/* previous input */
     double old_out;	/* previous output */
     double old_v;	/* previous 1st derivative */
+    double older_v;     /* Fix for negative run away */
 } limit3_data;
 
 FUNCTION(_) {
@@ -71,6 +72,10 @@ FUNCTION(_) {
 	} else {
 	    ramp_a = -maxa;
 	}
+        /* An inelegant fix for slow negative runaway */
+        if (data.old_v == 0 && in_v == 0 && data.older_v < 0 ) {
+            ramp_a = maxa;
+        }
 	/* determine how long the match would take */
 	match_time = ( in_v - data.old_v ) / ramp_a;
 	/* where we will be at the end of the match */
@@ -90,9 +95,11 @@ FUNCTION(_) {
 	}
 	if ( ramp_a < 0.0 ) {
 	    lout = min_out;
+            data.older_v = data.old_v;
 	    data.old_v = min_v;
 	} else {
 	    lout = max_out;
+            data.older_v = data.old_v;
 	    data.old_v = max_v;
 	}
     }
limit3 无视最小值、最大值和有时开始缓慢失控 #240
合作者
三星币 评论了 2017 年 10 月 21 日  

实际上 – 如果您为 maxa 选择重复的十进制数,则出于所有实际目的,您可以使失控永远不会发生。(这让我觉得我的理论是正确的,因为它只发生在 old_v 和 in_v 为零时(并且它向负方向移动))

山姆

limit3 无视最小值、最大值和有时开始缓慢失控 #240
合作者

这并没有解决所有的问题。并将 maxa 设置为非重复小数似乎只是延长了错误的出现时间。我想我现在放弃了。

limit3 无视最小值、最大值和有时开始缓慢失控 #240
贡献者

我最终重构了这个分支中的 comp ,它通过了@SebKuzminsky用小软糖进行测试。

它与旧 comp 不同,因为它处理与输入信号分开的一阶最大/最小限制。这样它可以尽最大努力跟上输入,但是当它看到最大/最小限制出现时,它会做正确的事情。

事实证明,决定何时考虑最大/最小限制以及何时考虑输入信号有点复杂,正如在一连串if案例中所看到的那样。为了清楚起见,我尽力对代码进行注释。

事实证明,在观察速度和加速度时,很难准确地停在最大/最小限制上。此代码超出目标约 0.5%,然后必须在锁定到限制之前找到返回的方式。

limit3 无视最小值、最大值和有时开始缓慢失控 #240

limit3 无视最小值、最大值和有时开始缓慢失控 #240
贡献者

请参阅#351处的公关

zultron 添加了对引用此问题的 zultron/machinekit 的提交 2017 年 11 月 18 日

limit3 无视最小值、最大值和有时开始缓慢失控 #240
合作者

我整个周末都在运行 johns limit3 分支,没有任何意外。干得好!

limit3 无视最小值、最大值和有时开始缓慢失控 #240

我刚刚合并了#351,所以这将在 v2.7.11-44-gcdb6603 中修复。谢谢@propcoder对于错误报告和@zultron@samcoinc用于修复和测试。