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

我目前工作在床上找平系统机器人3 d印刷站的过程中我的硕士学位。我已经实现每个功能必要水平的实际印刷床(创建不规则的印刷表面探测点,创建一个网格,网格插值,应用新的z值刀位点)。所以我使用一个按钮调用一个函数与特定的参数声明以上按钮在UI中。

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

我已经试图移动机器人一次只一点,检查传感器是否actve之后,但阻止这个实现的主要问题是,调用函数的按钮仅适用于运动,当函数完成/结束。但我需要做大量的探测点在这个函数在一个循环。我找不到解决移动机器人没有结束函数本身。

我用- >调用();很多MoveL命令实现的。但就像我说的,实际的“调用”只发生在按钮调用的结束。

有可能迫使button-function的机器人在移动之前,函数达到结束?

我希望有人能帮助我与我的问题。

我使用PluginExample作为基础插件(c++)。
# 2
我忘了添加:
解决我的问题将是一个脚本,它可以运行在一个常数循环即使机器人执行任务。
这样有可能吗?
# 3
我猜你的传感器就像一个触摸探针。我建议你在一个脚本运行搜索算法,即使你的目标是创建一个插件。您可以触发一个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
# 4
我已经在我的程序imlemented这个方法。非常感谢你救了我的一天是完美。

有一个方法来跳转到下一个指令在一个已经运行的程序通过python RoboDK吗?这将使我的应用程序故障保险证明。(我把我的照片想要达到在附件)


附加文件 图像(年代)

# 5
很高兴听到你能实现这个项目。

目前没有API开始一个项目在一个特定指令但我们会实现它,这样你就可以在一条指令给定id。示例:

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

但有可能直接跳到一个新行,这除了在活动计划,或者我需要停止程序,设置开始ID,然后重新启动它吗?
# 7
是的,你应该能够启动程序在一个新的指令,即使它已经运行。然而,机器人可以完成当前指令之前运行。
# 8
谢谢你的更新。

我已经试过,像预期的那样工作。现在的机器人移动到下一个探测点一旦探测传感器激活。




用户浏览这个线程:
1客人(年代)