我正在用Python3脚本控制一个工业机器人和一些测试设备。几乎我所有的计时关键功能都由硬件处理,但这两条语句确实需要在一致的时间内执行:
if True == daq.readChannelsStart(channel_settings):
titan_rtde.Move(setp_list[step])在DAQ启动和机器人移动之间有10-15ms的变化。
这两个函数都是通过专用以太网网络进行通信的,只有运行Python脚本的PC才会对这些设备进行轮询,因此我希望延迟时间是一致的(虽然我没有嗅探通信量以证明这一点)。传递给这些方法的数据差别很大,所以我希望它们的执行时间是一致的,只要它们不会被操作系统(Windows 10 Enterprise 2016 LTSB)打断。
我能做些什么来减少这种变化吗?
发布于 2022-10-05 01:00:52
我能做些什么来减少这种变化吗?
泰瑞:不,没有。
这看起来是一段很好的代码,因为在check和move命令之间几乎什么也不执行,只是一个de和一个调用。您可以在检查之前无条件地分配temp = setp_list[step],然后在检查成功时传递缓存的结果。这可能会减少L2缓存丢失的一些可变性,但我无法想象它会产生多大的影响。
查看一下move命令,以验证没有增加方差的条件表达式。
您可以通过将其推入Cython或Rust模块,从而使整个过程运行得更快,并且减少了方差。但同样,如果不分析抖动的来源,很难想象会有多大的效果大小。
您可以做的最重要的更改是将调度添加到API中。最好是在机器人的末端,如果它是可变的。这样做的目的是接受延迟,并按照时间表行事。
假设移动代码如下所示:
def Move(self, sl):
if random_choice():
do_stuff() # Sometimes do important housekeeping
sleep(random()) # which takes varying amount of time.
send_move_command(sl)让我们把它放在一个时间表上:
def Move(self, sl, latency=.015):
t0 = time()
t1 = t0 + latency # scheduled time to execute the move
if ...
sleep(max(0, t1 - time()))
send_move_command(sl)现在,只要内务管理所消耗的时间少于latency秒,我们就可以成功地向外部观察者隐藏它,并显示出较低的方差。
在理想的世界中,机器人将被发送一个“从时间戳t1开始移动”命令。
假设机器人有时执行4毫秒的操作,不能被中断,从而增加了方差。当它执行的时候,如果你尝试移动的话,你就不走运了。假设在尝试重复操作之前,将经过数十毫秒。
探测机器人以确定该操作何时正在进行。用它来预测一个“很好”的时间来发送移动命令。
加一个外部时钟信号。
使用555定时器在一些方便的间隔产生脉冲,可能是1 PPS,每秒一个脉冲。将定时信号提供给DAQ和机器人。
当时钟信号较低时,抑制机器人运动。只在低时发送移动命令。现在,运动只会在时钟上升的边缘开始。考虑在下降的边缘进行DAQ交互。
https://stackoverflow.com/questions/73954938
复制相似问题