开源改变世界

Grbl 模拟器 #112

推推 grbl 3年前 (2023-01-21) 111次浏览

对话

Grbl 模拟器 #112
贡献者

各位维护者,
我终于设法通过评论完成了 grbl 模拟器并对其进行了测试。这些变化可能看起来很大,但 grbl 实际上只在一个地方发生变化:execute_runtime 被移动到一个单独的模块,这样我就可以为模拟器覆盖它。所有其他 grbl 文件仅更改为使用 float 声明而不是 double(我没有找到一种非侵入性的方法来告诉 gcc 像 avrgcc 那样编译 double)。
模拟器的其余部分位于新目录“sim”中。模拟器尽可能多地使用 grbl 中的代码,并且应该在不触及 grbl 的情况下对 grbl 进行许多更改。
它是通过在“sim”目录中调用“make all”来构建的(当时仅支持 Windows 上的 MinGW,但所有其他平台都应该是直截了当的,因为它都是纯 c 语言)。
grbl_sim 从 stdin 获取命令,直到遇到 EOF。它像 grbl 一样响应,并在 stdout 上提供有关新创建的块的信息。在 stderr 上,它提供有关步进器位置的信息。这可以通过命令行参数(只是一个浮点数)来配置,该参数告诉模拟器打印信息的时间步长。
模拟步进器,以便缓冲区始终最大程度地充满,除非调用 plan_synchronize。

你怎么说?

Grbl 模拟器 #112
成员

嗯,你一直很忙。:) 分解和分析有很多变化,但我确实喜欢将运行时命令移动到新模块中的想法。在我们把它整合进去之前,我想真正地研究一下所有的东西。

不过有一条评论,您已将所有双精度数更改为浮点数。据我了解,AVR 编译器会自动将这些更改为在编译时浮动。但是,就向功能更强大的处理器的可移植性而言,我认为将需要更高精度的更关键的计算保持为双精度可能是个好主意,但我们可能必须首先弄清楚哪个变量需要这些更准确的值,例如弧计算。(也就是说,如果你还没有这样做的话):)

Grbl 模拟器 #112
贡献者作者

是的,一定要慢慢来。有了这么多变化,我几乎可以肯定你会发现一些东西 :)
至于浮点数:我的目的是让模拟器完全像 grbl、低精度浮点数和所有一样运行,这样人们就可以预测会发生什么每一步。最初我想要一些东西来验证我的备用计划器。但现在我可以想象一个调用 grbl_sim 来提供 3D 预览的 GUI grbl 馈线——我想称它为 TrueSim(TM) :)

顺便说一句:至于 GUI grbl feeder,你见过https://github.com/winder/Universal-G-Code-Sender吗?它就像一个魅力。但显然 Mac 上的 rxtx 存在问题,您必须在其中创建一个特殊目录 /var/something …它写在 Universal-G-Code-Sender 网站上

Grbl 模拟器 #112
成员

所以我在我的 Mac 上试了一下,我必须做几件事才能让它工作。在 Makefile 中,将编译器更改为“COMPILER=gcc.exe”并从构建语句中删除“–gc-sections”编译器标志。(出于某种原因,我的 Mac 无法识别这一点。)我运行了可执行文件并得到了 Grbl 提示符。它似乎运行良好,但唯一的问题似乎是它不响应任何运行时命令。

所以,我一直在考虑为什么这会有用,因为这增加了另一个(主要)维护的东西,你需要做的就是将你的 Arduino 连接到你的 USB 端口,看看 Grbl 是如何响应的。但现在我知道你要用它做什么,为界面创建预览器绝对是一个方便的工具。我也喜欢它如何使用 Grbl 的所有实际代码并将其包装到模拟器中。

我想我危言耸听的一面想要确保仿真器真正输出与 Arduino完全相同的输出。如果没有,那么用户可以模拟他们的代码来验证它是否一切正常,然后在对他们的设置进行物理运行后发现他们的部分被搞砸了。

对我来说,我认为如果我们能够从该仿真器的步进脉冲中获取数据以便能够在没有示波器(在某些方面受到限制)的情况下处理和查看它,那就太好了。或跟踪有多少处理器使用……话又说回来,为什么硬件仿真器不能同样有效?快速搜索后,似乎有一对夫妇在那里,但我还没有看到他们能做什么。

Grbl 模拟器 #112
贡献者作者

啊,现在我想我知道你所说的“功能更强大的处理器”是什么意思了:其他微控制器?
在这种情况下,也许我们应该引入特殊的处理器相关浮点类型定义。

刚注意到,我的 pullrequest 不能自动合并,尽管我试图处理你最近的提交。如果有帮助,我可以重新调整它。

Grbl 模拟器 #112
贡献者作者

是的,我自己研究了一下 avr 仿真器,发现它们速度很慢(远低于实时)并且设置和操作起来很麻烦,尤其是串行通信。
因此,我使用模拟器的目标是创建一些东西,可以非常快速且易于设置地模拟 grbl 行为直至步进脉冲序列。grbl 行为和模拟器输出相等的一个条件:块缓冲区始终保持合理的满。
事实上,无法完成的是对处理器使用情况的分析。为此需要一个 avr 模拟器。这里没有快速通道。
验证模拟器结果会很好,但话又说回来,在现实生活中可能会丢失步骤,工具可能会卡在夹具中等。因此,盲目依赖模拟器无论如何都不是一种选择。
总之:grbl_sim 是一种生成刀具路径预览的简单方法,它是 a) 尽可能接近 grbl 所做的并且 b) 几乎没有额外的编码成本,没有 gcode 解释器的重新编码和加速/减速规划另一种编程语言/环境。
我相信这是两个非常好的理由。

Grbl 模拟器 #112
成员

有趣的。也许模拟器会及时变得更好,但你在这里拥有的东西肯定会为你陈述的想法工作。另外,我不得不说你的方法非常巧妙。

所以有几点和问题。

这里最主要的是我看不到这对用户有用,至少目前是这样,但作为开发工具显然是有用的。所以,也许我们应该在 sim 文件夹中放置一个自述文件来说明它的开发和实验用途,或者为 GrblSim 制作另一个官方 Grbl 组 repo(Simen,有什么评论吗?)。

其次,我认为模拟器需要完全脱离主要的 Grbl 代码库。浮点变化对我来说很好,typedefs 也会解决这个问题,但是你在 stepper.c 中添加了一个函数来获取步进器时间。相反,我们可以使用步进器的计时器通过虚拟函数调用自身来为模拟器独立计算它们。也许,这就是我们如何使用这些虚拟函数提取我们需要的所有数据;即步进脉冲数据。

那么,您如何看待这种与外部 UI 程序的接口?模拟器会通过标准输出或某些文本文件输出(步骤、位置、状态)数据吗?它会在某种预定义的数据结构中吗?

Grbl 模拟器 #112
贡献者作者

好的,README 是个好主意。
完全忘记了 stepper.c 中的额外功能。在每次调用步进中断后,我将添加代码来计算 outbits 的位置。
我已经有了一个粗略的 java 接口,用于将命令流水线化到 grbl_sim 并通过 stdout 和 stderr 读回它们。这就是我设想的 grbl_sim 的用法,当然,in- 和 outfile 命令行参数也是一个选项,但是 stdin、stdout 和 stderr 的重定向同样有用(在 Windows 上我做 2grbl_sim 0.1 < some.gcode > outfile.txt 2> stepper.txt”)。“0.1”告诉 grbl_sim 仅每 0.1 秒打印一次步进器位置(步进器 sim 时间,即使用类似 0.000001 的值来获取每一步)。

我将修复所有讨论的更改的提交,并尝试为自动合并重新设置基准。

Grbl 模拟器 #112

我只是尝试运行它,它从不打印任何步进器位置,似乎它永远不会调用步进器中断,我错过了什么?

Grbl 模拟器 #112
成员

这是测试版。有很多工作要做和解决,但这更像是一个概念验证,而不是其他任何事情。如果您对它应该做什么有任何建议,我们非常欢迎。

Grbl 模拟器 #112

稍后我肯定会更好地了解它,它的实现方式似乎也可以用作一种简单的方式来移植到其他 mcu 而无需更改 avr 主线

Grbl 模拟器 #112
贡献者作者

langwadt:步进器位置打印到 stderr。我不知道在 Mac 或 Linux 上默认情况下它去哪里,在 Windows 上它只是去控制台。您还必须将打印步进器位置的时间步长作为第一个(也是唯一的)参数(例如 0.01)。省略此参数意味着 time_step= 0.0,当前被解释为“不打印任何信息”。但是有一个错误会导致每个块末尾的位置都被打印出来,比如step: 0, 0, 0, block_end. 所以,如果你没有看到这个,你应该检查 stderr 去了哪里。可以在 main.c 中更改此行为

Grbl 模拟器 #112
成员

这可能非常有用!我正处于家庭暑假期间,所以这就是我目前有时间提供的所有反馈:-)

Grbl 模拟器 #112
成员

@jgeisler0303:延斯。只是跟进。你在哪里?我很好奇,因为它很酷。

Grbl 模拟器 #112
贡献者作者

对不起,我最近没有发表评论。不过,我一直在阅读这些问题。在寒冷季节之前真的很忙我的房子,晚上光线不足迫使我今年停下来。尚未实施任何讨论的更改,但也没有忘记。很紧急吗?我肯定会回到它,因为我仍然希望它也能为 java Universial-GCode-Sender 的可视化扩展提供动力。

Grbl 模拟器 #112
成员

没有!不急。就是想。:)

Grbl 模拟器 #112
成员

@jgeisler0303:我正在努力改进规划器和步进驱动程序,我认为这会非常方便。您有时间更新其中的一些代码以便我开始使用吗?它不一定是完美的。我只需要指出正确的方向。谢谢!

Grbl 模拟器 #112
成员

没关系!我让它工作了。它非常简单(而且很棒)。:)

Grbl 模拟器 #112
贡献者作者

听起来还不错。我仍然计划尽快让它与您的最新边缘一起使用。如果我能以任何其他方式帮助您,请告诉我。我想我在某个地方有一个 MATLAB 脚本可以读取 grbl-sim 输出并绘制它。

我试着跟上这些问题。它的嗡嗡声。你如何管理这个?你还有固定的工作还是只是不睡觉?你真的应该得到一枚勋章什么的!

Grbl 模拟器 #112
贡献者作者

PS:你可能已经想通了,所以以防万一:

  1. 唯一的命令行参数告诉 grbl-sim 步进器信息行之间的时间间隔。所以,如果你想让每个步进器都有自己的时间戳,你必须将这个参数设置为 1e-6 左右。
  2. 要在 grbl-sim 中进行正确的设置,您可以将 $x= yyy.yy 命令放在实际测试代码之前。我计划为设置添加第二个命令行参数和/或默认文件。
Grbl 模拟器 #112
成员

哈哈。睡觉?谁需要睡觉?:) 我很幸运,最近有很多空闲时间和我在读研究生的未婚妻一起工作。当她在学习时,我在 Grbl 上工作。谁知道空闲时间什么时候会停止,因此需要努力完成这些工作。

无论如何,一直专注于修复/升级步进算法,所以最近几天我没能玩它。主要是因为它无法模拟 AVR 在步骤中断期间的实际处理时间,但我想当规划器获得相同处理时我会使用它。

Grbl 模拟器 #112

@jgeisler0303为什么不使用文件实际实现 NVS(EEPROM),而不是让用户始终将 $* 添加到他们的测试 G 代码的开头?我的意思是,您已经挂钩/替换了 eeprom.c 函数,为什么不一路走下去让它变得有用 :-)
这就是我在 fork 中所做的,对于代码的其余部分,它的行为就像真正的 EEPROM : 您只需配置一次设置。

Grbl 模拟器 #112
贡献者作者

@csdexter这听起来像是合乎逻辑的下一步。我真的让它运行​​起来很简单,然后停止了开发。
要在第一次输入 $x=y 命令时将设置写入 EEPROM?

很高兴听到你克隆了它。我得看看你的叉子。你适应最新的grbl edge了吗?

Grbl 模拟器 #112

@jgeisler0303我没有克隆你的模拟器,而是开发了一个完整的 HAL 来更容易地移植到其他架构。第一个 HAL 实现用于 AVR,第二个用于主机(即您编译的 POSIX 机器),我广泛使用它来调试和观察代码的工作方式。所有的功劳都归功于你激发了这个想法——这比让 simulavr 工作然后以传统方式调试代码 (gdb & Co.) 容易很多很多倍。

我的 EEPROM 代码(在主机 HAL 中)在这里,“本地”(AVR) 版本在这里

出于战略原因,我的叉子有点落后于此处的官方代码:我打算以不同于此处实施方式的方式实施一些事情。

Grbl 模拟器 #112
贡献者作者

刚刚重新启动了使用最新的 grbl 边缘运行的模拟器。它不需要修改原始文件,但会在编译时通过注入包含侵入 planner.c 和 protocol.c(请参阅 makefile)。
代码非常混乱,但我想在这么久之后把它弄出来。第一次测试生成了这张 ShapeOko“HelloWorld.nc”文件的精美图片:https ://www.dropbox.com/s/m3j3nsubb050qzu/HelloWorld.nc.jpg 。它以颜色编码的步进速度显示 3D 中的精确步进位置。生成图形的测试文件和 gnuplot 脚本包含在提交中。
grbl_sim 的输入和输出仍然通过标准输入、标准输出和标准错误。但是输出格式发生了变化,因此无需修改即可与 gnuplot 一起使用。
如果你想编译 grbl_sim,请确保在 makefile 中更改你的 gcc 编译器的路径。

Grbl 模拟器 #112
成员

太棒了,延斯!这真的很酷。我将继续合并它,并在 sim 目录中添加一个自述文件,让人们知道它是什么。我有几个星期没有工作了,因为我正在努力让我的工作室最终建立起来,但我确实有一个让计划者更有效率的想法。它基于你大约一年前的想法。我已经充实了一些内容,希望得到您的意见。它现在在基于 Matlab 的模拟器中。我可以寄给你吗?

camnit 添加了一个引用此拉取请求的提交 2013 年 1 月 18 日

Grbl 模拟器 #112 chamnit 合并提交dd06268 到 grbl :边缘 2013 年 1 月 18 日
Grbl 模拟器 #112
贡献者作者

哇,感谢合并。现在我真的有理由整理代码了:-)
事实上,我的计划是使用模拟器来测试我的规划器。但如果
你有时间这样做,那就更好了,因为我一直忙于
家庭和孩子。(模拟器在工作中兼职)。当然
,我很乐意协助并查看您的代码!

我想到的另一条路是编写一个 Java GUI 来查看
模拟器输出以及 gcode 和动画以及
整个 shebang。这最终可能成为 UGS 的一部分。
祝你工作坊好运,玩得开心。

太棒了,延斯!这真的很酷。我将继续合并它
,并在 sim 目录中添加一个自述文件,让人们知道它是什么。
我有几个星期没有工作了,因为我正在努力
让我的工作室最终建立起来,但我确实有一个让
计划者更有效率的想法。它基于你大约
一年前的想法。我已经充实了一些内容,希望得到您的意见。
它现在在基于 Matlab 的模拟器中。我可以寄给你吗?


直接回复此电子邮件或在 GitHub
#112(评论)上查看。

Grbl 模拟器 #112

模拟器在我的(非常新鲜的)前端中可以很好地预览:
http ://www.jks.com/guckma/grblfront.png

Grbl 模拟器 #112

好的!
它是用什么写的?

Grbl 模拟器 #112

C++、VS2010

Grbl 模拟器 #112

开源?

Grbl 模拟器 #112

还没有,缺少太多功能(即使是我自己使用的),比如慢跑、长度传感器……

Grbl 模拟器 #112

不幸的是,Windows ……

Grbl 模拟器 #112
贡献者

您好,

如果你正在考虑开源,你可以使用 QT 来
实现跨平台,这样我们 Linux 用户也可以使用它。

谢谢,
马库斯

JKSoft 在 2013-01-28 10:29 写道:

还没有,缺少太多功能(即使是我自己使用的),比如慢跑、
长度传感器……


直接回复此电子邮件或在 GitHub
#112(评论)上查看。

Grbl 模拟器 #112

不错!
加油!

Grbl 模拟器 #112

如果你正在考虑开源,你可以使用 QT 来
实现跨平台,这样我们 Linux 用户也可以使用它

我对Linux一无所知..

Grbl 模拟器 #112
贡献者

JKSoft 在 2013-01-28 10:51 写道:

if you are thinking going open source you could use QT for example to
make is cross platform so we Linux users may be able to use it too

我对Linux一无所知..

我认为你不需要了解Linux,你现在只需要
在Windows下开发。
但是如果你让它开源,并且如果你使用 QT 或任何其他跨
平台框架,让它在 Mac OS 和 Linux 上运行不会花费太多时间
……并且有人(例如我的 Linux)可以给你发一个
如有必要,为其他操作系统打补丁。我没有看到
这个应用程序有太多变化,所以它很可能只是
在其他平台上重新编译。

问候,
马库斯

PS: I used QT only one time and someone told me he was able to compile
the code under Windows, so I guess this should be true for the opposite
as well:
https://gitorious.org/~alpharesearch/robocut/alpharesearchs-robocut
https://gitorious.org/%7Ealpharesearch/robocut/alpharesearchs-robocut

Grbl 模拟器 #112
Member

@JKSoft : Very sweet! I’m glad you got the simulator integrated without too much difficulty (I hope). We were hoping that someone would take up the new code and apply in a new cool way, as most of us are quite busy recently to keep working at this.

As for QT, I think if you can share your C++ source on Github, that in my mind would be good enough to get people who do know QT or Java to see how you installed it into your GUI frontend. Good commenting goes a long way. This would definitely help everyone I think.

喜欢 (0)