79 lines
2.4 KiB
Python
79 lines
2.4 KiB
Python
import copy
|
|
import time
|
|
import math
|
|
import argparse
|
|
|
|
import warnings
|
|
import pandas as pd
|
|
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
|
|
from functools import wraps
|
|
from collections import defaultdict
|
|
from typing import List, Counter
|
|
from tqdm import tqdm
|
|
|
|
# 机器参数
|
|
max_head_index, max_slot_index = 6, 120 # 暂时默认所有机器参数相同
|
|
max_machine_index = 3
|
|
interval_ratio = 2
|
|
slot_interval = 15
|
|
head_interval = slot_interval * interval_ratio
|
|
head_nozzle = ['' for _ in range(max_head_index)] # 头上已经分配吸嘴
|
|
|
|
# 位置信息
|
|
slotf1_pos, slotr1_pos = [-31.267, 44.], [807., 810.545] # F1(前基座最左侧)、R1(后基座最右侧)位置
|
|
fix_camera_pos = [269.531, 694.823] # 固定相机位置
|
|
anc_marker_pos = [336.457, 626.230] # ANC基准点位置
|
|
stopper_pos = [635.150, 124.738] # 止档块位置
|
|
|
|
# 时间参数
|
|
T_pp, T_tr, T_nc = 2, 5, 25
|
|
|
|
# 电机参数
|
|
head_rotary_velocity = 8e-5 # 贴装头R轴旋转时间
|
|
x_max_velocity, y_max_velocity = 1.4, 1.2
|
|
x_max_acceleration, y_max_acceleration = x_max_velocity / 0.079, y_max_velocity / 0.079
|
|
|
|
# 不同种类供料器宽度
|
|
feeder_width = {'SM8': (7.25, 7.25), 'SM12': (7.00, 20.00), 'SM16': (7.00, 22.00),
|
|
'SM24': (7.00, 29.00), 'SM32': (7.00, 44.00)}
|
|
|
|
# 可用吸嘴数量限制
|
|
nozzle_limit = {'CN065': 6, 'CN040': 6, 'CN220': 6, 'CN400': 6, 'CN140': 6}
|
|
|
|
|
|
def axis_moving_time(distance, axis=0):
|
|
distance = abs(distance) * 1e-3
|
|
Lamax = x_max_velocity ** 2 / x_max_acceleration if axis == 0 else y_max_velocity ** 2 / y_max_acceleration
|
|
Tmax = x_max_velocity / x_max_acceleration if axis == 0 else y_max_velocity / y_max_acceleration
|
|
if axis == 0:
|
|
return 2 * math.sqrt(distance / x_max_acceleration) if distance < Lamax else 2 * Tmax + (
|
|
distance - Lamax) / x_max_velocity
|
|
else:
|
|
return 2 * math.sqrt(distance / y_max_acceleration) if distance < Lamax else 2 * Tmax + (
|
|
distance - Lamax) / y_max_velocity
|
|
|
|
|
|
def head_rotary_time(angle):
|
|
while -180 > angle > 180:
|
|
if angle > 180:
|
|
angle -= 360
|
|
else:
|
|
angle += 360
|
|
return abs(angle) * head_rotary_velocity
|
|
|
|
|
|
def timer_wrapper(func):
|
|
@wraps(func)
|
|
def measure_time(*args, **kwargs):
|
|
start_time = time.time()
|
|
result = func(*args, **kwargs)
|
|
|
|
print("function {} running time : {} s".format(func.__name__, time.time() - start_time))
|
|
return result
|
|
|
|
return measure_time
|
|
|
|
|