线程评级:
  • 0票(s) - 0平均
  • 1
  • 2
  • 3.
  • 4
  • 5
在函数调用期间执行多个机器人动作
# 1
大家好,

我目前正在攻读硕士学位期间,为一个机器人3d打印站的床调平系统工作。我已经实现了每一个必要的功能,以水平实际打印床(在不规则的打印表面创建探针点,创建网格,网格插值,应用新的z值到G-Code)。因此,我使用了一个按钮,它调用一个函数,该函数具有在UI中按钮上面声明的特定参数。

我需要实现的最后一件事似乎是我对RoboDK的理解相当大的问题。我需要移动机器人到打印床(没有问题),一旦传感器发送信号(通过串行,输入已经工作),机器人的运动应该停止,下一个点应该被探测。

我已经尝试过一次只移动一点机器人,然后检查传感器是否活动,但阻止这一实现的主要问题是,从按钮调用的函数只应用运动,当函数完成/结束。但是我需要在这个函数中做很多探测点在一个循环中。我找不到在不终止函数本身的情况下移动机器人的方法。

我正在使用->runProgram();其中实现了很多MoveL命令。但正如我所说,实际的“runProgram”只发生在按钮调用的末尾。

是否有可能在按钮功能完成之前强迫机器人移动到按钮功能内部?

我希望有人能帮我解决我的问题。

我使用PluginExample作为我的插件(c++)的基础。
我忘了补充:
我的问题的解决方案是一个脚本,它可以一直在一个恒定的循环中运行,即使机器人正在执行一个任务。
有可能吗?
# 3
我猜你的传感器就像触控探头一样。我建议您在脚本上运行搜索算法,即使您的目标是创建一个插件。您可以在幕后触发Python脚本并收集结果。脚本更好,因为你有更少的函数回调,你可以线性地执行你的机器人程序(这在插件上不太容易做到,因为你不能执行阻塞机器人运动)。

我附上了一些代码,展示了如何使用Python代码运行二进制搜索算法。搜索是按1毫米的步长完成的,当发现一个触点时,它开始将搜索减半,直到满足一定的公差。

我们在RoboDK API中也有一个搜索函数(SearchL),你可以从Python脚本运行它。另一方面,这种搜索算法需要对机器人控制器进行额外的配置。

代码:
def posetoward (pose1, pose2, dist1_mm):
返回从pose1到pose2的delta_mm的姿势"""
如果dist1_mm <= 0:
#越界/无效
dist1_mm = 0
返回pose1

pose_delta = invH(pose1) * pose2
距离= norm3 (pose_delta.Pos ())
如dist1_mm > distance:
#越界
dist1_mm =距离
返回pose2

因素= dist1_mm /距离
x, y, z, w, p, r = Pose_2_UR (pose_delta)
return pose1 * UR_2_Pose([x*因子,y*因子,z*因子,w*因子,p*因子,r*因子])

def ProbePoint(xyzijk, r, poseref=eye(4)):
""使用首选探测方法探测点"""
如果这是真的:
返回ProbePointSteps(xyzijk, r, poseref)
其他:
返回ProbePointBinary(xyzijk, r, poseref)


def ProbePointBinary(pose_from, pose_to, r, search_step_max=1):
""用二分搜索算法探测一个点,并返回与碰撞点的关节。如果没有发现碰撞,则返回None。
pose_from:从构成
pose_to:构成
接待员:机器人项目
"""

#稳定时间(以秒为单位
PAUSE_MOVE = 0.25

#探头的数字输入
DI_PROBE = 0

#当探针激活时设置DI ON为1,否则设置为0
PROBE_ON = 1

#让机器人移动的最小增量(使其可重复性减半)
MIN_INCREMENT = 0.005

#-------------------------------------------
search_step = search_step_max
pose_distance =距离(pose_from.Pos(), pose_to.Pos()))

#移动机器人到进场点
r.setSpeed (SpeedApproach SpeedApproach)
r.MoveL (pose_from)

#运行搜索
r.setSpeed (SpeedProbe SpeedProbe)



#----------------------------------
targetJoints =没有

#定义第一个增量,shift_z包含相对于起始点到第二个点的偏移量
shift_z = search_step

itcount = 0
Itcount_same = 0 #相同方向的计数器

shift_z_last =没有
联系=没有
contact_last =没有
sense_last =没有
而真正的:
#确保新点在可接受的范围内
Shift_z = max(Shift_z, 0), pose_distance)

#计算要移动的新姿势
pose_shift_z = posetoward (pose_from, pose_to, shift_z)

#移动机器人到新位置
r.MoveL (pose_shift_z)

#如果机器人有问题,应该抛出异常
#验证移动是可能的
#status, status_msg = robot.ConnectedState()
if status != ROBOTCOM_READY:
如果连接不成功,请停止
# printLog("真实机器人不可能移动")
#继续

#强制延迟以获得更稳定的数据!!
暂停(PAUSE_MOVE)

#获取探测输入
contact_str = r.getDI (DI_PROBE)
contact = str(PROBE_ON) in contact_str

#检测运动感
如果contact else -1.0,则Sense = 1.0
如果sense != sense_last
#重置计数器在同一方向的移动
itcount_same = 0

Itcount = Itcount + 1
Itcount_same = Itcount_same + 1

#为步骤应用乘数因子
乘数= 1
如果contact_last不是None:
除了第一次迭代,我们总是会落在这里
乘数= 0.5
如果contact == contact_last:
乘数= 2

sense_last =感
delta_move_abs = abs (search_step)
Shift_z = Shift_z + sense*delta_move_abs

Search_step = Search_step *乘数

#检测迭代结束:
print(“%02i-Plane Z= %5.3f mm %s Step= %.”3.f" % (itcount, shift_z, u'\u2191' if sense > 0 else u'\u2193', delta_move_abs))
如果contact and not contact_last and shift_z_last不为None并且delta_move_abs < 4* tolerance: # shift_z_last- t。shift_z < S.TOLERANCE_MM:
#终止条件,我们完成了,我们检测到一个有效点
.list targetJoints = r.Joints () ()

# T。SHIFT_Z_START = T.shift_z
打印(“接触迭代:“)
print (str (targetJoints))
打破

如果itcount > 100:
print("已达到迭代动作的最大次数!")
打破

Elif itcount_same > 10:
打印(“目标越界?”)
打破

shift_z_last = T.shift_z
contact_last =联系

#确保我们没有迈出太小的一步
如果search_step < MIN_INCREMENT:
search_step = MIN_INCREMENT
Elif search_step >
search_step = search_step_max

#我们完成了。移到进场点。
r.setSpeed (SpeedApproach SpeedApproach)
r.MoveL (pose_from)

返回targetJoints


def PoseSplit(pose1, pose2, delta_mm=1):
在给定增量delta_mm的情况下,将移动分割为两个姿势
pose_delta = invH(pose1) * pose2
距离=规范(pose_delta.Pos ())
如果distance <= delta_mm:
返回(pose2)

pose_list = []

x, y, z, w, p, r = Pose_2_UR (pose_delta)

步骤= max (int(距离/ delta_mm))

xd = x /步骤
码= y /步骤
zd = z /步骤
wd = w /步骤
pd = p /步骤
rd = r /步骤
对于I在range(steps-1)中:
因素= i + 1
pose_list。追加(pose1 * UR_2_Pose([xd*factor,yd*factor,zd*factor,wd*factor,pd*factor,rd*factor]))

返回pose_list
# 4
我已经在我的程序中实现了这个方法。非常感谢,你帮了我大忙,效果很好。

有没有一种方法可以通过python跳转到RoboDK中已经运行的程序的下一个指令?这样我的应用程序就不会出现故障了。(我在附件里放了一张我想要达到的目标的图片)


附加文件 图像(年代)

# 5
很高兴听到你能够在你的项目中实现这一点。

目前还没有从特定指令开始程序的API,但我们将实现它,以便您可以从给定的指令id开始。例子:

代码:
程序。setParam(“开始”,id)
更新应该在不到1周的时间内可用。
# 6
非常感谢,这将是一个伟大的补充!

但是是否有可能在活动程序期间使用此添加直接跳转到新行,或者我需要停止程序,设置启动ID然后重新启动它?
# 7
是的,您应该能够在一个新的指令上启动程序,即使它已经在运行。然而,机器人可能在跳转到新指令之前完成当前指令的运行。
# 8
再次感谢您的更新。

我已经试过了,效果和预期的一样。一旦探测传感器被激活,机器人就会移动到下一个探测点。




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