线程评级:
输送机的帮助
# 1
晚上好

你好,我正在尝试使用提供的传送带,但我不明白它是如何工作的…

我看到有三个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]



我错过了什么?

致以最亲切的问候
你好,

“WaitForPart”阻止程序,直到在“Get Conveyor”的XY平面上检测到一个部件。它模拟一个存在感测器。
你可以在第一个视频中看到这个程序的效果。这里附上的第二个视频是2个通用机器人和一个传送带的模拟。

一些建议:
你可以用空格键加速模拟
你可以用ESC键停止模拟(它会停止所有正在运行的程序/python脚本/移动的机器人)

“运行输送机”模拟物体在输送机顶部移动,对吧?
正确的

“等待零件”使零件探测器在“获得输送机”参考正确?
正确的

有什么方法可以让传送带停止,或者让上面的物体停止移动吗?
是的,使用ESC键或右键单击程序并选择停止。


我尝试合并这两个python程序,这样我就可以停止传送带,但没有成功。我做错了什么?
“等待部分”程序必须是唯一的程序。这个程序的目标是阻止机器人运动的执行,直到零件处于正确的位置。如果你看看附上的教程视频,你会更好地理解。

最后,在库中还有另一个拾取和放置模拟,使用2个delta机器人和相同的传送带:
https://www.youtube.com/watch?v=mv-lVsMglVI

--------------------------------------------------------------------

输送机模拟单独:




教程建立一个模拟2个机器人和传送带:

# 3
当使用RunConveyor.py时,传送器总是运行。
如何将一些条件变量传递到RunConveyor.py,或脚本中的不确定循环,这样我就可以停止输送机或恢复输送机基于某些条件?条件变量可以是机器人I/O或传感器信号等。

谢谢。
# 4
(09-13-2019, 02:08)bsun99写道:当使用RunConveyor.py时,传送器总是运行。
如何将一些条件变量传递到RunConveyor.py,或脚本中的不确定循环,这样我就可以停止输送机或恢复输送机基于某些条件?条件变量可以是机器人I/O或传感器信号等。

谢谢。

这是我自己算出来的。不错的软件。
# 5
(09-14-2019, 12:45)bsun99写道:
(09-13-2019, 02:08)bsun99写道:当使用RunConveyor.py时,传送器总是运行。
如何将一些条件变量传递到RunConveyor.py,或脚本中的不确定循环,这样我就可以停止输送机或恢复输送机基于某些条件?条件变量可以是机器人I/O或传感器信号等。

谢谢。

这是我自己算出来的。不错的软件。

嗨,你能分享一下解决方案吗?谢谢。




浏览此线程的用户:
1客人(年代)

Baidu
map