我猜你的传感器就像触控探头一样。我建议您在脚本上运行搜索算法,即使您的目标是创建一个插件。您可以在幕后触发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