02-16-2016,12:28 AM
晚上好
您好,我试图使用提供的输送带,但我缺少了解它的工作原理...
我看到有三个Python程序“指挥” IT。
“运行传送带”模拟了传送带顶部的对象移动吗?
“等待零件”使“获取传送带”参考的零件检测器正确吗?
并很好地模拟抓手...在锡上所说的话。
事实是,当我查看“等待部分”的Python输出时,我只能看到它检测到第2部分(使用在线库中的传送带模型)
有什么办法可以阻止输送机或在其顶部移动的对象?
我尝试合并两个Python程序,以便我可以停止传送带,但没有成功。我究竟做错了什么 ?
我想念什么?
此致
您好,我试图使用提供的输送带,但我缺少了解它的工作原理...
我看到有三个Python程序“指挥” IT。
“运行传送带”模拟了传送带顶部的对象移动吗?
“等待零件”使“获取传送带”参考的零件检测器正确吗?
并很好地模拟抓手...在锡上所说的话。
事实是,当我查看“等待部分”的Python输出时,我只能看到它检测到第2部分(使用在线库中的传送带模型)
有什么办法可以阻止输送机或在其顶部移动的对象?
我尝试合并两个Python程序,以便我可以停止传送带,但没有成功。我究竟做错了什么 ?
代码:
#键入帮助(“ Robolink”)或帮助(“ Robodk”)以获取更多信息
#按F5运行脚本
#注意:您无需保留此文件的副本,您的Python脚本保存在电台上
从Robolink Import *#API与Robodk通信
来自Robodk Import *#基本矩阵操作
rl = robolink()
#此脚本模拟传送带
toxtor_name ='传送带'
pickable_objects_keyword ='part'
#相对于传送带坐标的MM/S运动速度:
move_speed_mms = [0,50,0]
refresh_rate = 0.005
#定义输送机的工作区以选择对象:
conv_sz_x_min = 0
conv_sz_x_max = 440
conv_sz_y_min = 0
conv_sz_y_max = 2000
conv_sz_z_min = -200
conv_sz_z_max = +500
#移动到达输送机末端并未挑选的对象:
fallen_objects = [0,-1500,0]
#获取工作空间的输送机项目和参考:
conv = rl.item(toxtor_name)
cons_reference = conv.parent()
PESECONV = conv_reference.poseabs()
#现实生活中的一秒意味着模拟的1秒。模拟速度是从车站取出的
simulation_speed = 1
def is_inside_conveyor(姿势):
“”“检查传送带工作区内是否有姿势”
pos = pose.pos()
如果pos [0]> cons_sz_x_min和pos [0] conv_sz_y_min和pos [1] conv_sz_z_z_min和pos [2]
返回true
返回false
def toxtor_move_object(姿势,delta_time):
“”“根据时间和速度,将物体姿势通过输送机移动。
delta_mm = mult3(move_speed_mms,delta_time)
newpose = transl(delta_mm)*姿势
返回newpose
#获取所有对象(字符串列表)
all_objects = rl.itemlist(item_type_object)
#将对象列表转换为项目指针(更快)
#还过滤列表仅考虑可拨动的对象
对象= []
objects_name = []
objects_active = []
对于我的范围(len(all_objects)):
如果all_objects [i] .count(pickable_objects_keyword)> 0:
objects.append(rl.item(all_objects [i]))
objects_name.append(all_objects [i])
objects_active.append(false)
#可以在输送机中使用的物体数量
nobjects = len(对象)
#无限循环以模拟传送带行为
current_time = 0
tic()
time_last = toc()
而真:
#首先:寻找不在输送机中而是在输送机工作区中的对象
对于我的范围(nobjects):
obj_i =对象[i]
#如果对象已经在输送机中,则跳过
如果objects_active [i]:
继续
#检查对象是否已由工具采用。如果是这样,请不要将其放入输送机中
如果obj_i.parent()。type()== item_type_tool:
继续
#检查对象是否在输送机工作区域内
posei = obj_i.poseabs()
poseirel = invh(pececonv)*posei
如果IS_INSIDE_CONVEYOR(POSEIREL):
#取对象
obj_i.setparentstatic(Conv)
print('将对象%s添加到传送带'%objects_name [i])
objects_active [i] = true
#第二步:更新输送机中每个对象的位置
simulation_speed = rl.simulationspeed()
time_current = toc()
time_delta = time_current -time_last
time_last = time_current
current_time = current_time + time_delta*simulation_speed
#列出具有匹配位置以更新的对象列表
obj_items = []
obj_poses_abs = []
对于我的范围(nobjects):
obj_i =对象[i]
#检查对象是否已从传送带中挑选
如果objects_active [i]和obj_i.parent()!= cons:
objects_active [i] = false
print(从传送带中选出'object%s'%objects_name [i])
继续
#跳过输送机中不在的对象的更新
如果不是objects_active [i]:
继续
#更新对象的位置
posei = invh(pececonv)*obj_i.poseabs()
newposei = trovestor_move_object(posei,time_delta*simulation_speed)
如果不是IS_INSIDE_CONVEYOR(NEWPOSEI):
print('警告!! object%s在模拟开始后以%.1F降低了传送带'%(objects_name [i],current_time))
#RAREISE异常('对象%s未从输送机中挑选!'%objects_name [i])
newposei = transl(fallen_objects)*newposei
objects_active [i] = false
#obj_i.setpose(newposei)#这会引起刷新(可能很慢)
obj_items.append(obj_i)
obj_poses_abs.append(poseconv*newposei)
#更新对象位置
rl.setposesabs(obj_items,obj_poses_abs)
# 休息一下...
暂停(Refresh_rate)
#将站点的目标用作参考平面:
target_name ='获取传送带'
laser_plane = [0,-1,0]#飞机的正常
#在此公差内激活
tolerance_check_mm = 10
#寻找具有关键字“零件”的零件
pickable_objects_keyword ='part'
#每1 ms更新状态
recheck_period = 0.001
#获取目标和检测平面
target = rl.item(target_name)
targetpose = target.poseabs()
detect_plane_point = targetpose.pos()
detect_plane_vector = laser_plane
#定义一个函数以检测目标
def part_detected(pos):
“”“检查一个零件是否在检测区域(点靠近平面)”
pos_proj = proj_pt_2_2_plane(pos,detect_plane_point,detect_plane_vector)
demand2plane = norm(subs3(pos,pos_proj)))
如果dange2plane 返回true
返回false
如果part_detected:
move_speed_mms = [0,0,0]
我想念什么?
此致