职位:7 线程:2 2021年10月加入:
声誉:
2
10-23-2021,02:43点
(这篇文章最后修改:10-23-2021,02:57点Hofbauec)。
大家好,
我目前工作在床上找平系统机器人3 d印刷站的过程中我的硕士学位。我已经实现每个功能必要水平的实际印刷床(创建不规则的印刷表面探测点,创建一个网格,网格插值,应用新的z值刀位点)。所以我使用一个按钮调用一个函数与特定的参数声明以上按钮在UI中。
最后我需要实现似乎相当RoboDK问题对我的理解。我需要移动机器人到打印床(没有问题),一旦传感器发出信号(通过串行输入已经工作),机器人的运动应该停止,第二点应该探索。
我已经试图移动机器人一次只一点,检查传感器是否actve之后,但阻止这个实现的主要问题是,调用函数的按钮仅适用于运动,当函数完成/结束。但我需要做大量的探测点在这个函数在一个循环。我找不到解决移动机器人没有结束函数本身。
我用- >调用();很多MoveL命令实现的。但就像我说的,实际的“调用”只发生在按钮调用的结束。
有可能迫使button-function的机器人在移动之前,函数达到结束?
我希望有人能帮助我与我的问题。
我使用PluginExample作为基础插件(c++)。
职位:7 线程:2 2021年10月加入:
声誉:
2
我忘了添加: 解决我的问题将是一个脚本,它可以运行在一个常数循环即使机器人执行任务。 这样有可能吗?
帖子:1775 线程:1 加入:2018年4月
声誉:
95年
我猜你的传感器就像一个触摸探针。我建议你在一个脚本运行搜索算法,即使你的目标是创建一个插件。您可以触发一个Python脚本在幕后和收集结果。脚本是更好的你会有更少的回调函数,你可以执行你的机器人程序线性(这是不那么容易做插件,你不能执行阻塞机器人运动)。
我附加了一些代码显示了如何使用Python代码运行二进制搜索算法。的搜索是通过步骤1毫米和接触时发现它开始分裂搜索减半,直到你满足一定的宽容。
我们也有一个搜索功能(SearchL) RoboDK API,您可以从Python脚本运行。另一方面,这个搜索算法在机器人控制器需要额外的配置步骤。
代码:
def PoseTowards (pose1 pose2 dist1_mm): ”““回归的姿势delta_mm远离pose1 pose2”“ 如果dist1_mm < = 0: #界外/无效 dist1_mm = 0 返回pose1
* pose2 pose_delta = invH (pose1) 距离= norm3 (pose_delta.Pos ()) 如果dist1_mm >距离: #界外 dist1_mm =距离 返回pose2
因素= dist1_mm /距离 x, y, z, w, p, r = Pose_2_UR (pose_delta) 返回pose1 * UR_2_Pose ([x *因素,y *因素,z *因素,w *因素,p *因素,r *因素])
def ProbePoint (xyzijk r poseref =眼(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探针激活时设置为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 =最小(最大(shift_z, 0), pose_distance)
#计算新姿势移动 pose_shift_z = PoseTowards (pose_from pose_to shift_z)
#机器人移动到新的位置 r.MoveL (pose_shift_z)
#这将引发一个异常如果机器人有问题 #验证运动是可能的 #地位,status_msg = robot.ConnectedState () #如果地位! = ROBOTCOM_READY: # #停止如果连接不成功 # printLog(“真正的机器人不可能移动”) #继续
#迫使延迟有更稳定的数据! ! 暂停(PAUSE_MOVE)
#探头输入 contact_str = r.getDI (DI_PROBE) 联系= contact_str str (PROBE_ON)
#检测运动的感觉 -1.0 = 1.0如果联系其他人 如果感觉! = sense_last: #复位计数器在同一个方向运动 itcount_same = 0
itcount = itcount + 1 itcount_same = itcount_same + 1
#一个乘数因子申请步骤 乘数= 1 如果contact_last不是没有: #这里永远下跌除了第一次迭代 乘数= 0.5 如果接触= = contact_last: 乘数= 2
sense_last =感 delta_move_abs = abs (search_step) shift_z = shift_z + * delta_move_abs感
search_step = search_step *乘数
#检测的迭代: print (“% 02 i-plane Z = f % 5.3毫米= % % s的一步。3f" % (itcount, shift_z, u'\u2191' if sense > 0 else u'\u2193', delta_move_abs)) 如果接触而不是contact_last shift_z_last并不是没有和delta_move_abs < 4 * TOLERANCE_MM: # 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(“达到最大数量的iteractions !”) 打破
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_max: search_step = search_step_max
#做完了。点的方法。 r。setSpeed (SpeedApproach SpeedApproach) r.MoveL (pose_from)
返回targetJoints
def PoseSplit (pose1 pose2 delta_mm = 1): ”““平分之间移动2姿势delta_mm增量”“ * pose2 pose_delta = invH (pose1) 距离=规范(pose_delta.Pos ()) 如果距离< = 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 /步骤 因为我在范围(步骤1): 因素= i + 1 pose_list。追加(pose1 * UR_2_Pose ([xd *因素,码*因素,zd *因素,wd *因素,pd *因素,rd *因素]))
返回pose_list
职位:7 线程:2 2021年10月加入:
声誉:
2
10-25-2021,04:15点
(这篇文章最后修改:10-25-2021,04:16点Hofbauec)。
我已经在我的程序imlemented这个方法。非常感谢你救了我的一天是完美。
有一个方法来跳转到下一个指令在一个已经运行的程序通过python RoboDK吗?这将使我的应用程序故障保险证明。(我把我的照片想要达到在附件)
帖子:1775 线程:1 加入:2018年4月
声誉:
95年
很高兴听到你能实现这个项目。
目前没有API开始一个项目在一个特定指令但我们会实现它,这样你就可以在一条指令给定id。示例:
可用的更新应该在不到1周。
职位:7 线程:2 2021年10月加入:
声誉:
2
非常感谢你,这将是一个伟大的除了!
但有可能直接跳到一个新行,这除了在活动计划,或者我需要停止程序,设置开始ID,然后重新启动它吗?
帖子:1775 线程:1 加入:2018年4月
声誉:
95年
10-27-2021,与
(这篇文章最后修改:10-27-2021,与一些艾伯特)。
是的,你应该能够启动程序在一个新的指令,即使它已经运行。然而,机器人可以完成当前指令之前运行。
职位:7 线程:2 2021年10月加入:
声誉:
2
谢谢你的更新。
我已经试过,像预期的那样工作。现在的机器人移动到下一个探测点一旦探测传感器激活。
|