【python+Coppeliasim】仓储机器人

7b658a38d30395ebef6ed815433e4eab.png

一、仓储机器人介绍

仓储机器人(也称为自动导航AGV,Automated Guided Vehicle)是一种智能机器人系统,专门设计用于在仓库、物流中心和制造业等环境中执行货物搬运和物流任务。它们被广泛应用于自动化仓储和物流管理系统中,以提高效率、降低成本,并增强操作的准确性和安全性。

仓储机器人通常具有以下特点和功能:

  1. 自主导航:仓储机器人配备了导航系统,如激光导航、视觉导航或地标导航等,能够自主感知环境、规划路径并避开障碍物,实现自主导航和定位。

  2. 货物搬运:仓储机器人可以携带和运输货物,包括装载、卸载、搬运、堆垛等任务。它们可以与货架、输送系统或其他设备进行协同操作,从而实现高效的物流和仓储管理。

  3. 任务调度和协调:仓储机器人能够接收任务指令并根据优先级和需求进行任务调度。它们可以与仓库管理系统或物流管理软件进行通信,实时更新任务状态并优化任务分配,以最大程度地提高物流效率。

  4. 环境感知和安全性:仓储机器人配备了各种传感器,如激光传感器、红外线传感器和摄像头等,用于感知周围环境并避免与人员或其他障碍物发生碰撞。它们还具备安全机制,如紧急停止按钮和声音警示器,以确保工作场景的安全性。

  5. 数据收集和分析:仓储机器人可以收集和记录各种数据,如货物数量、存储位置、工作时间等。这些数据可以用于仓库和物流管理的分析和优化,帮助提高生产效率和运营决策。

仓储机器人的应用可以涵盖各个行业,包括电子商务、制造业、医疗保健、食品和饮料等。它们可以承担从货物入库、库存管理到订单拣选和出库等多个环节的任务,大大提高了物流运营的效率和准确性。随着技术的不断发展,仓储机器人将继续演进和应用于更广泛的领域,为物流和仓储行业带来更多的机遇和变革。

二、视频演示

三、python程序

3bc107f3205123fcc327ce7bc4031e4e.png

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)

四、训练多层感知机

2dc1cea8b73ccc7cc47880439f007f60.png

# 导入所需库
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')

2ee8cc0112fe86dfa318aa05fd72feed.png

数据集font2

b9b7c63f0ade87e06bdd32822dcac857.png

数据集font1

五、识别字符串

2a339590c8c56e19d6a8d933cf03d66f.png

测试集

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

猜你喜欢

转载自blog.csdn.net/cxyhjl/article/details/131278671