一、仓储机器人介绍
仓储机器人(也称为自动导航AGV,Automated Guided Vehicle)是一种智能机器人系统,专门设计用于在仓库、物流中心和制造业等环境中执行货物搬运和物流任务。它们被广泛应用于自动化仓储和物流管理系统中,以提高效率、降低成本,并增强操作的准确性和安全性。
仓储机器人通常具有以下特点和功能:
自主导航:仓储机器人配备了导航系统,如激光导航、视觉导航或地标导航等,能够自主感知环境、规划路径并避开障碍物,实现自主导航和定位。
货物搬运:仓储机器人可以携带和运输货物,包括装载、卸载、搬运、堆垛等任务。它们可以与货架、输送系统或其他设备进行协同操作,从而实现高效的物流和仓储管理。
任务调度和协调:仓储机器人能够接收任务指令并根据优先级和需求进行任务调度。它们可以与仓库管理系统或物流管理软件进行通信,实时更新任务状态并优化任务分配,以最大程度地提高物流效率。
环境感知和安全性:仓储机器人配备了各种传感器,如激光传感器、红外线传感器和摄像头等,用于感知周围环境并避免与人员或其他障碍物发生碰撞。它们还具备安全机制,如紧急停止按钮和声音警示器,以确保工作场景的安全性。
数据收集和分析:仓储机器人可以收集和记录各种数据,如货物数量、存储位置、工作时间等。这些数据可以用于仓库和物流管理的分析和优化,帮助提高生产效率和运营决策。
仓储机器人的应用可以涵盖各个行业,包括电子商务、制造业、医疗保健、食品和饮料等。它们可以承担从货物入库、库存管理到订单拣选和出库等多个环节的任务,大大提高了物流运营的效率和准确性。随着技术的不断发展,仓储机器人将继续演进和应用于更广泛的领域,为物流和仓储行业带来更多的机遇和变革。
二、视频演示
三、python程序
python程序框架
确保您的目录中有以下文件,以便运行python程序:
1. sim.py
2. simConst.py
3.合适的远程API库:
“remoteApi.dll”(Windows)、“remoteApi.dylib”(Mac) 或“remoteApi.so”(Linux)
4. simpleTest.py(或任何其他示例文件)
主程序:
from robot import Brain
b = Brain()
b.go_to([-0.55, -4.35, 0.05])
b.save_package([-0.55, -4.35, 0.05], 1)
b.go_to([0.25, -4.35, 0.05])
b.save_package([0.25, -4.35, 0.05], 2)
b.go_to([-0.45, 2.1, 0.05])
b.drop_package([-0.45, 2.45, 0.35], 1)
b.drop_package([-0.123, 2.45, 0.35], 2)
四、训练多层感知机
# 导入所需库
from PIL import Image
import numpy as np
import LettersNumbersClassification as LetNumClassif
import OCR_Lite as OCR
import matplotlib.pyplot as plt
import cv2
# 训练多层感知机(只需执行一次,因为它会将模型保存在文件中,所以现在已注释掉)
LetNumClassif.train('dataset/fonts')
# 打开图像并将其转换为numpy数组
img = Image.open('dataset/labels/numbers4.png')
img = np.asarray(img, dtype=np.float32)
# 将图像转换为灰度图像
img = np.mean(img, axis=2)
# 将图像二值化
img = np.where(img > 150, 0, 1)
# 显示二值化后的图像
plt.figure(figsize=(9, 5))
plt.imshow(img, cmap='gray', vmin=0, vmax=1)
plt.show()
# 使用OCR识别图像中的文本
text = OCR.OCR(img)
print(text)
def train(imgs_path):
dicClases = {}
X = []
y = []
for i in range(1, 6):
path = imgs_path + '/font' + str(i) + '/'
for x in os.listdir(path):
for j in imScales:
img = Image.open(path + x)
s0 = (int)(dataset_images_sizeX * j)
s1 = (int)(dataset_images_sizeY * j)
img = img.resize((s0, s1))
img = np.asarray(img, dtype=np.float32)
img = np.mean(img, axis=2)
img = np.where(img < 200, 1, 0)
indices = np.where(img == 1)
y0 = np.min(indices[0]) - 5
y1 = np.max(indices[0]) + 5
x0 = np.min(indices[1]) - 5
x1 = np.max(indices[1]) + 5
if (y0 < 0):
y0 = 0
if (y1 >= s1):
y1 = s1 - 1
if (x0 < 0):
x0 = 0
if (x1 >= s0):
x1 = s0 - 1
img = img[y0:y1, x0:x1]
img = Image.fromarray(img)
img = np.asarray(img.resize((dataset_images_sizeX, dataset_images_sizeY)))
clase = getClassIDfromChar(x[0], False)
"""
lett = getCharFromClassID(clase)
plt.figure(figsize=(9,5))
plt.imshow(img, cmap='gray', vmin=0, vmax=1)
plt.title(str(clase) + ", " + str(lett))
plt.show()
"""
X.append(img.reshape(-1))
y.append(clase)
if (clase not in dicClases):
dicClases[clase] = x[0]
X = np.asarray(X)
TY = np.asarray(y)
y = np.zeros((TY.shape[0], len(dicClases.keys()) + 1), np.uint8)
for i, tyVal in enumerate(TY):
y[i, tyVal] = 1
X, y = shuffle(X, y, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, stratify=y, random_state=1)
clf = MLPClassifier(random_state=1, max_iter=2000, hidden_layer_sizes=[400, 200, 200],
learning_rate_init=1.0e-3, alpha=0.01)
clf.fit(X_train, y_train)
dump(clf, 'MLP.joblib')
数据集font2
数据集font1
五、识别字符串
测试集
def ClassifyLettersNumbers(imgs):
clf = load('MLP.joblib')
ln = ''
crow = 1
prevMeanVal1 = 0
for im, row, meanval1 in imgs:
im_c = Image.fromarray(im)
im_c = np.asarray(im_c.resize((dataset_images_sizeX, dataset_images_sizeY)))
im_c = np.where(im_c == 1, 1, 0)
y_pred = clf.predict_proba(im_c.reshape(1, -1))
clase = y_pred.argmax(axis=1)
lett = getCharFromClassID(clase)
"""
plt.figure(figsize=(9,5))
plt.imshow(im_c, cmap='gray', vmin=0, vmax=1)
plt.title(lett)
plt.show()
"""
if (row != crow):
ln = ln + '\n'
crow = row
prevMeanVal1 = 0
else:
if (meanval1 - prevMeanVal1) > (dataset_images_sizeX * 0.35):
ln = ln + ' '
prevMeanVal1 = meanval1
ln = ln + lett
# print(lett, row, meanval1)
return ln
六、吸盘Lua脚本
-- 初始化函数
function sysCall_init()
-- 获取吸盘传感器、闭环虚拟器、吸盘和吸盘链接的句柄
s=sim.getObjectHandle('suctionPadSensor')--接近传感器
l=sim.getObjectHandle('suctionPadLoopClosureDummy1')--将要固连在物体上的dummy1
l2=sim.getObjectHandle('suctionPadLoopClosureDummy2')--固连在力传感器上的dummy2
b=sim.getObjectHandle('suctionPad') --吸盘
suctionPadLink=sim.getObjectHandle('suctionPadLink')--吸盘力传感器
-- 获取脚本模拟参数
infiniteStrength=sim.getScriptSimulationParameter(sim.handle_self,'infiniteStrength')--无限力
maxPullForce=sim.getScriptSimulationParameter(sim.handle_self,'maxPullForce')--最大拉力
maxShearForce=sim.getScriptSimulationParameter(sim.handle_self,'maxShearForce')--最大剪切力
maxPeelTorque=sim.getScriptSimulationParameter(sim.handle_self,'maxPeelTorque')--最大剥离扭矩
-- 设置闭环虚拟器的链接虚拟器为-1,将闭环虚拟器的父对象设置为吸盘
sim.setLinkDummy(l,-1)-- --取消dummy1 的关联
sim.setObjectParent(l,b,true)--设置dummy1的的父对象为吸盘
-- 获取闭环虚拟器2的矩阵并将其设置为闭环虚拟器的矩阵
m=sim.getObjectMatrix(l2,-1)
sim.setObjectMatrix(l,-1,m)--设置l 与 l2 位姿重合
-- 初始化末端执行器状态为0(未激活)
effector = 0
end
-- 设置末端执行器状态函数
function setEffector(inInts,inFloats,inStrings,inBuffer)
effector=inInts[1]
return {},{},{},''
end
-- 驱动函数
function sysCall_actuation()
-- 根据机器人程序直接控制吸盘的激活/未激活状态:
if (effector==1) then
active = true --激活吸盘
else
active = false--吸盘未激活
end
-- 获取闭环虚拟器的父对象
parent=sim.getObjectParent(l)
if (active==false) then
-- 如果吸盘未激活且闭环虚拟器的父对象不是吸盘,则将闭环虚拟器的链接虚拟器设置为-1,将其父对象设置为吸盘,并将其矩阵设置为闭环虚拟器2的矩阵
if (parent~=b) then
sim.setLinkDummy(l,-1)--取消dummy1 的关联
sim.setObjectParent(l,b,true)
m=sim.getObjectMatrix(l2,-1)
sim.setObjectMatrix(l,-1,m)
end
else--接近传感器触发 激活
-- 如果吸盘激活且闭环虚拟器的父对象是吸盘,则检测到一个可响应形状并通过力传感器与其连接(通过闭环虚拟器链接)
if (parent==b) then
index=0
while true do
shape=sim.getObjects(index,sim.object_shape_type)--遍历所有形状
if (shape==-1) then--一个形状也没有
break
end
if (shape~=b) and (sim.checkProximitySensor(s,shape)==1) then --传感器检测到的形状
if (sim.getObjectInt32Parameter(shape,sim.shapeintparam_respondable)~=0) then
sim.setObjectParent(l,shape,true)
sim.setLinkDummy(l,l2)--关联l,l2
break
end
end
index=index+1
end
end
end
end
-- 清理函数,在仿真结束时调用,将闭环虚拟器的链接虚拟器设置为-1,将其父对象设置为吸盘,并将其矩阵设置为闭环虚拟器2的矩阵。
function sysCall_cleanup()
sim.setLinkDummy(l,-1)
sim.setObjectParent(l,b,true)
m=sim.getObjectMatrix(l2,-1)
sim.setObjectMatrix(l,-1,m)
end
The End