02-16-2016, 12:28 am
晚上好
你好,我正在尝试使用提供的传送带,但我不明白它是如何工作的…
我看到有三个python程序“命令”它。
“运行输送机”模拟物体在输送机顶部移动,对吧?
“等待零件”使零件探测器在“获得输送机”参考正确?
和模拟抓手只是好…照罐头上说的做。
问题是,当我查看“等待部分”的python输出时,我只能看到它检测到第2部分(使用在线库中的输送机模型)
有什么方法可以让传送带停止,或者让上面的物体停止移动吗?
我尝试合并这两个python程序,这样我就可以停止传送带,但没有成功。我做错了什么?
我错过了什么?
致以最亲切的问候
你好,我正在尝试使用提供的传送带,但我不明白它是如何工作的…
我看到有三个python程序“命令”它。
“运行输送机”模拟物体在输送机顶部移动,对吧?
“等待零件”使零件探测器在“获得输送机”参考正确?
和模拟抓手只是好…照罐头上说的做。
问题是,当我查看“等待部分”的python输出时,我只能看到它检测到第2部分(使用在线库中的输送机模型)
有什么方法可以让传送带停止,或者让上面的物体停止移动吗?
我尝试合并这两个python程序,这样我就可以停止传送带,但没有成功。我做错了什么?
代码:
输入help("robolink")或help("robodk")查看更多信息
#按F5运行脚本
#注意:你不需要保留这个文件的副本,你的python脚本会和站点一起保存
从robolink导入* # API与RoboDK通信
从robodk导入* #基本矩阵操作
RL = Robolink()
#这个脚本模拟一个传送带
输送机名称= '输送机'
PICKABLE_OBJECTS_KEYWORD = '零件'
# 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(CONVEYOR_NAME)
conv_reference = conv_parent ()
poseconv = conv_reference.PoseAbs()
#现实生活中的1秒意味着1秒的模拟。模拟速度是从车站取的
Simulation_speed = 1
def is_inside_conveyor(姿势):
"""检查一个姿态是否在输送机工作空间内"""
pos = pos . pos ()
if pos[0] > CONV_SZ_X_MIN and pos[0] < CONV_SZ_X_MAX and pos[1] > CONV_SZ_Y_MIN and pos[1] < CONV_SZ_Y_MAX and pos[2] > CONV_SZ_Z_MIN and pos[2] < CONV_SZ_Z_MAX:
还真
返回假
Def conveyor_move_object(pose, delta_time):
"""根据时间和速度在传送带中移动物体"""
delta_mm = mult3(MOVE_SPEED_MMS, delta_time)
Newpose = transl(delta_mm)*pose
返回newpose
#获取所有对象(字符串列表)
all_objects = RL.ItemList(ITEM_TYPE_OBJECT)
#转换对象列表为项目指针(更快)
#同时过滤列表,只考虑可选对象
Objects = []
Objects_name = []
Objects_active = []
对于range(len(all_objects))中的I:
if all_objects[i].count(PICKABLE_OBJECTS_KEYWORD) > 0:
objects.append (RL.Item (all_objects[我]))
objects_name.append (all_objects[我])
objects_active.append(假)
#可以进入传送带的物体数量
Nobjects = len(对象)
#无限循环模拟输送机行为
Current_time = 0
抽搐()
Time_last = toc()
而真正的:
#第一:寻找不在输送机中但在输送机工作区中的对象
对于range(nobjects)中的I:
Obj_i = objects[i]
如果物体已经在传送带中,则跳过
如果objects_active[我]:
继续
#检查对象是否已经被工具取走。如果有,不要带进传送带
if obj_i.Parent().Type() == ITEM_TYPE_TOOL:
继续
#检查物体是否在输送机工作区域内
posei = obj_i.PoseAbs()
波塞雷尔= invH(波塞列夫)*波塞雷尔
如果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 = []
对于range(nobjects)中的I:
Obj_i = objects[i]
#检查物体是否已从传送带中取出
if objects_active[i] and obj_i.Parent() != conv:
objects_active[i] = False
print('对象%s被从传送器中取出' % objects_name[i])
继续
#对于不在传送带中的对象跳过更新
如果不是objects_active[i]:
继续
#更新对象的位置
posei = invH(poseconv)*obj_i.PoseAbs()
newposei =输送机移动对象(posei, time_delta*SIMULATION_SPEED)
如果不是is_inside_conveyor(newposei):
打印(“警告! !物体%s在%从传送带上掉下来。1f seconds after simulation started' % (objects_name[i], current_time))
#raise异常('对象%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] # normal的平面
#在此容限内激活
Tolerance_check_mm = 10
使用关键字“Part”查找零件
PICKABLE_OBJECTS_KEYWORD = '零件'
#每1毫秒更新一次状态
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_plane(pos, DETECT_PLANE_POINT, DETECT_PLANE_VECTOR)
(subs3(pos,pos_proj))
如果distance2plane < TOLERANCE_CHECK_MM:
还真
返回假
如果part_detected:
Move_speed_mms = [0,0,0]
我错过了什么?
致以最亲切的问候