线程评级:
一个非阻塞移动命令仍然阻塞我的代码
# 1
我正在模拟模式下运行代码。我想在不阻塞的情况下移动机械臂,这样我就可以在机械臂移动时获得TCP的位置。我正在使用moveJ命令移动机械臂。为了检查MoveJ命令是否仍然阻塞,我添加了打印时间命令。这是我的代码:
代码:
运动中的运动:
print("Start: " +str(time.time()))
机器人。MoveJ(运动,阻止= False)
print("Stop: " +str(time.time()))

我可以看出代码仍然阻塞,因为在开始和停止打印语句之间有1.3秒的延迟。为什么代码仍然阻塞?它总是在模拟模式下阻塞吗?我需要使用像“asyncio”这样的库来使它不阻塞吗?
我可以通过使用async.io让它工作:


代码:
Async def non_blocking(循环,执行器):
等待asyncio.wait (
fs = {
getPosition loop.run_in_executor(执行器),
moveRobot loop.run_in_executor(执行器),
},
return_when = asyncio。ALL_COMPLETED
# 3
我也遇到了同样的问题:

我在一个站点中有两个机器人(R1和R2),我想从API向它们中的任何一个发射非阻塞移动命令。最简单的形式:

代码:
R1. movej (R1_T1,False) #1关节移动第一个机器人R1到目标R1_T1
R1. movej (R1_T2,False) #2关节移动第一个机器人R1到目标R1_T2

R2. movej (R2_T1,False) #3关节移动第二个机器人R2到目标R2_T1
R2. movej (R2_T2,False) #4关节移动第二个机器人R2到目标R2_T2

尽管选项blocking=False,两个连续的移动命令#1和#2到R1有效地引入了阻塞行为,因为命令#2直到命令#1完成才会执行。因此,对R2执行命令#3和#4也会被阻塞,直到命令#1完成。

我想要的行为是R1连续执行它的命令#1和#2,而不阻止R2开始连续执行命令#3和#4,与彼此的繁忙状态无关。

如何实现异步的任何建议。在这种情况下,还是其他方式?

最好的问候,

Maarten
# 4
同一个机器人的每一个移动都不会执行,除非前一个移动完成。

为了完成你计划完成的事情,最好是为每个机器人插入动作:
代码:
#1移动第一个机器人R1到目标R1_T1
#2移动第二个机器人R2到目标R2_T1

#3移动第一个机器人R1到目标R1_T2
#4移动第二个机器人R2到目标R2_T2
你也可以通过触发R1.Stop()来停止机器人的运动。你可能需要从一个单独的线程触发这个,如果你不想让你的脚本停止,你就必须在try/catch中包装你的Movement。
# 5
嗨,艾伯特,变换命令并不能解决问题。按你提议的顺序:

  • 到R1的命令#3将不会执行,直到R1完成命令#1,这是预期的。
  • 对R2的命令#4直到R2完成命令#2才会执行,这是预期的。
  • 直到R1完成1号命令,R2才会执行4号命令。剩下的问题是什么

我希望能够向R1和R2提供命令,并让它们连续执行命令,而不管另一个机器人的状态如何。

此外,我还需要一个通用的解决方案,它适用于任何数量的命令和任何时间长度的移动命令。当一个新命令排队时,对单个机器人的连续命令的顺序是固有的,但对两个机器人的连续命令的组合顺序将事先未知。但由于两个机器人都应该独立操作,组合顺序应该是无关紧要的:每个机器人只是独立地执行自己的连续命令列表。
# 6
我知道,在我们讨论的例子中,除非1和2完成,否则最后一个移动命令不会执行。这是一个很好的观点。要解决这个问题,你应该在一个单独的线程上运行同一机器人的每组机器人运动。一个单独的脚本也可以工作(它最终是一个单独的线程)。

“将3个机器人与屏幕同步”的示例moveobot脚本正是这样做的(它在单独的线程上移动每个机器人)。
# 7
谢谢你的帮助,艾伯特,但我发现“用屏幕同步机器人”的例子对于我试图实现的简单事情来说非常复杂。

我附加了一个带有两个机器人的拆卸站,每个机器人有三个联合目标,以及一个python脚本,从中我打算让机器人沿着它们的目标执行一系列运动,同时运行(不需要同步)。我可能没有正确地使用线程。你能不能看一下剧本,让它按你想的那样运作?


附加文件
.rdk indepMove.rdk(大小:1.31 MB /下载:32022世界杯国家队名单5)
# 8
嗨,艾伯特,你能在我上周上传的站点中发现问题吗?运行程序时的行为是非常出乎意料的:有时机器人确实以线程的形式开始它们的移动序列,有时则不是。




浏览此线程的用户:
1客人(年代)