注释
|
我开始在名为 2.7-limit3-issue-240 的分支中添加针对此问题的测试 |
|
这些测试位于名为“2.7-limit3-issue-240”的分支中。 |
|
不确切知道您正在运行什么测试(目前不能深入到那个分支。)您能用通俗易懂的语言描述一下测试吗?输入信号是什么?脚步?三角形?正弦波?我记得在 limit3 的开发阶段,某些奇怪的输入可能会搞砸。我认为它可能是一个三角波,其速度大于 limit3 的速度限制,因此限制块永远无法跟踪输入速度。我不记得我是否能够修复它。
|
|
“失控”测试:
“超调”测试又名约束违规:
|
|
这就是我为测试所做的。 我添加了一堆 hal 引脚以公开内部变量 (limit3.comp),然后我运行了 limit.hal 文件。我也跑了上面 watch -n 0.2 halcmd 显示 pin l 在单独的命令窗口中。 在观察 l.out 时,我会从信号 s 断开并重新连接 sg.sine。在 5 到 10 次断开连接并重新连接后 – l.out 将继续向负方向移动并且在断开连接时不会停止。似乎总是朝着负面的方向逃跑。 目录中的电子表格有 2 个采样器日志。第一组数据显示失控。第二组显示正常(我认为)断开连接。 我以为我可以弄清楚发生了什么 – 但我有点不知所措。 山姆 |
|
呸。这将是一个难以解决的问题。Limit3 有一堆不平凡的数学(我记得用代数填满了几页),然后进行一些经验调整以处理代码的离散时间性质与普通物理的连续时间,其中 V = 积分 (A) 和P = 积分 (V)。它可能和我写过的任何东西一样接近“这里有龙”代码。一个建议:查看 git 历史,看看是否/何时最后一次触及核心数学。对以前的版本应用相同的测试。我以为我很努力地测试了原始代码,但也许有些东西漏掉了。或者也许后来的一些更改以当时没有出现在测试中的方式破坏了它。测试旧版本将告诉您适用于哪种情况。约翰·K
|
|
自从将 limit3 从块移动到 LinuxCNC 以来,limit3 的核心数学并没有真正发生任何变化。我们将约束从参数转换为引脚,添加了一个“加载”引脚,仅此而已。 我确实测试了 2.7 开始和当前提示之间的每个版本,并且所有版本都未能通过此错误报告中描述的两个测试。 |
|
该死的……这意味着是我的错。不幸的是,在可预见的未来将无法看到它。
|
|
我一直在通过电子邮件查看此线程,并且不知道 github 上有 halscope 屏幕截图。现在才看一眼。(也没有看到原始帖子,不确定我何时/为什么开始在电子邮件中被复制,但很高兴它发生了。)我确实记得在我的早期测试中看到过类似的行为。我只能触及问题的表面,它太深了,我现在无法全神贯注。但它与正弦波输入有关。振幅和频率的组合意味着加速度(可能是速度)和绝对位置都超出了限制。limit3 块正在尝试跟踪输入。当输入变化太快以至于输出跟不上时(速度或加速度限制),它努力预测输入将做什么,并在它最终赶上时平滑地融入其中(即,当位置误差变为零时,它试图使速度误差也为零)。它适用于步骤,因为输入是固定的——很容易与之混合。它适用于三角形,只要速度在限制范围内。如果速度超出限制,它永远无法跟踪输入,因为三角形输入总是以过高的正速度或负速度移动。对于正弦波,它无法真正预测到位置误差得到纠正时输入将做什么。在第一个测试(超调)的情况下,看起来输出只是设法赶上输入(匹配位置和速度,同时服从加速限制)就在输入(和输出)达到位置限制的那一刻。它无法知道输入即将触及位置限制并立即停止。输出必须服从加速限制,所以它必须超调。我很好奇如果正弦波较慢会发生什么,这样输出就可以在输入达到位置限制之前很好地跟踪输入……我有兴趣参与调试这个,但我不能’这几天没花太多时间,手头也没有LinuxCNC开发系统。请保持线程活跃,我会尽我所能。约翰·K 我很好奇如果正弦波较慢会发生什么,以至于输出在输入达到位置限制之前设法很好地跟踪输入….我有兴趣参与调试这个,但我不能投入好几天了,并没有真正手头上的 LinuxCNC 开发系统。请保持线程活跃,我会尽我所能。约翰·K 我很好奇如果正弦波较慢会发生什么,以至于输出在输入达到位置限制之前设法很好地跟踪输入….我有兴趣参与调试这个,但我不能投入好几天了,并没有真正手头上的 LinuxCNC 开发系统。请保持线程活跃,我会尽我所能。约翰·K
|
|
我想知道我们是否应该以某种方式在 limit3 组件和自由模式联合轨迹规划器之间共享代码。他们都解决了完全相同的问题,对吧? |
|
大多数时候它工作得很好。在上面的测试中——我唯一能让它失败的时间是当输入在限制 (+/-50) 之间变为负数时,似乎逻辑选择了错误的方向。在这种情况下,它没有选择 max-out(减速并改变方向停止),而是选择 min-out 并继续朝负方向前进。我试图让它在那个范围内不失败,我想如果我能得到好的数据,我就能看到发生了什么。它虽然似乎一直失败。
|
|
不 – 我的上述评估是不正确的。我应该闭嘴。(除了它似乎只会失败) |
|
抱歉 seb – 不会那么懒惰。行。它实际上会减速到停止(斜坡下降),但不会发生方向的改变。(当变为负数时。)当输入在 -43.1456 断开时,记录了以下数据集。你看到它减速到 0 速度。现在它应该选择 -56.08 (int-max-out) 但它选择了 -56.1。看起来它可能与这段代码有关。
在这个数据集中——in_v 和 data.old_v 都是 0。所以 ramp_a=-maxa。在这种情况下,这是错误的选择。(当速度为负时。) 所以为了测试我添加了这些行
这似乎解决了当前的问题(至少在我到目前为止的测试中) |
|
不完全正确。我知道令人震惊 |
|
好的-看看这个。我认为这至少可以解决一个极端情况……我还没有失败……
|
|
实际上 – 如果您为 maxa 选择重复的十进制数,则出于所有实际目的,您可以使失控永远不会发生。(这让我觉得我的理论是正确的,因为它只发生在 old_v 和 in_v 为零时(并且它向负方向移动)) 山姆 |
|
这并没有解决所有的问题。并将 maxa 设置为非重复小数似乎只是延长了错误的出现时间。我想我现在放弃了。 |
|
我最终重构了这个分支中的 comp ,它通过了@SebKuzminsky用小软糖进行测试。 它与旧 comp 不同,因为它处理与输入信号分开的一阶最大/最小限制。这样它可以尽最大努力跟上输入,但是当它看到最大/最小限制出现时,它会做正确的事情。 事实证明,决定何时考虑最大/最小限制以及何时考虑输入信号有点复杂,正如在一连串 事实证明,在观察速度和加速度时,很难准确地停在最大/最小限制上。此代码超出目标约 0.5%,然后必须在锁定到限制之前找到返回的方式。 |
|
请参阅#351处的公关 |
|
我整个周末都在运行 johns limit3 分支,没有任何意外。干得好! |
|
我刚刚合并了#351,所以这将在 v2.7.11-44-gcdb6603 中修复。谢谢@propcoder对于错误报告和@zultron和@samcoinc用于修复和测试。 |






out超出 [min, max] 范围
,
有时会缓慢失控。
两年前我注意到了缓慢而持续的失控,只是无法捕捉到它。现在我抓住了它并且可以复制。
以下是我重现该问题所遵循的步骤:
— 在第一个终端:
— 在第二个终端:
注意输出值超出 [min, max] 限制。
— 然后在第一个终端上:
在随机时间手动切换以下行并等待开始失控而不是停止。耐心点,多试几次。第二次我需要大约 20 次尝试:
这是我期望发生的事情:
out保持在 [-50, 50] 的范围内
hold steady 当所有输入都稳定且停止后
这是发生了什么:
out out out out the range
有时out在所有输入都稳定且在预期停止后缓慢运行
有关我的硬件和软件的信息: