【python+Coppeliasim】仓储机器人

news2024/11/24 11:34:06

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/661833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解HTTP协议和HTTPS协议

目录 一.HTTP协议 1.什么是HTTP 2.HTTP发展历史 3.HTTP请求和响应 4. 抓包的方式和工具Fiddler 1.开发者工具 2.Fiddler 二.请求和响应 1.请求和响应报文 2.URL结构 3.常见的方法 1.GET方法 2.POST方法 3.其他方法 三.请求报头(header) 1.Host 2.Content-Length 3.Co…

Objective-C 混用UITabBar与UINavigation

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 混用UITabBar与UINavigation做app&#xff0c;tab和nav&#xff0c;有时候显示有时候…

有关浪涌保护器参数科普

浪涌保护器&#xff08;SPD&#xff09;或简称电涌保护器是一种用于确保防止瞬态浪涌的设备。它用于保护家庭和商业应用免受电压瞬变的影响。它与必须保护的负载并联连接。 什么是瞬态浪涌&#xff1f; 瞬态浪涌是持续几微秒的功率&#xff08;电压和电流&#xff09;的突然增…

CleanMyMac X4.13.6电脑清理垃圾最干净的软件

CleanMyMac是一款Mac清理工具&#xff0c;MacOSX系统下知名系统清理软件&#xff0c;它可以流畅地与系统性能相结合&#xff0c;只需简单的步骤就可以节省硬盘空间&#xff0c;提高电脑的运行速度&#xff0c;时刻保持电脑的清洁和健康&#xff0c;监视和优化Mac的性能。 现在…

高可用数据库集群mariadb(mysql)

一、概述 是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件 二、端口号 22 三、高可用MHA简述 目前在mysql高可用方面是一个成熟的方案&#xff0c;是一套优秀的高可用环境下故障切…

在用户界面线程上等待的危险性

我们做这么一个假设哈。 如果有一个线程&#xff0c;它拥有一个窗口&#xff0c;则在这个线程的整个运行过程中&#xff0c;我们都不应该调用 Sleep 函数。为什么&#xff1f; 因为 Sleep 调用会导致线程在睡眠等待期停止处理窗口消息。即使对于持续时间较短的睡眠也是如此&a…

【正点原子STM32连载】 第三十三章 DAC实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第三…

亚马逊云服务器EC2开通Windows系统实例和远程RDP连接远程桌面

在这篇文章中&#xff0c;我们准备详细的亲测记录开通亚马逊云服务器EC2开通Windows系统。这里需要提醒的是&#xff0c;如果我们是初次免费体验亚马逊云服务器账户的话&#xff0c;是有支持单个云服务器750小时免费&#xff0c;如果我们超过部分是需要支付的&#xff0c;所以如…

探究贴纸滤镜和美颜SDK的技术实现原理

在移动应用高需求的背景下&#xff0c;贴纸滤镜和美颜SDK成为了移动应用中不可或缺的功能之一。那么&#xff0c;这些功能是如何实现的呢&#xff1f;本文将探究贴纸滤镜和美颜SDK的技术实现原理。 一、贴纸滤镜的技术实现原理 贴纸滤镜是一种可以在图片或视频上添加贴纸、滤镜…

1、DuiLib的编译和运行

文章目录 1、原生DuiLib的编译和运行1.1、下载并解压成这个样子1.2、打开.sln解决方案文件1.3、编译成功 2、网易DuiLib编译和运行2.1、下载并解压成这个样子2.2、打开.sln解决方案文件2.3、编译成功 3、腾讯DuiLib编译和运行vs 20173.1、下载并解压成这个样子3.2、打开.sln解决…

个人IP打造全过程:如何打造出属于自己的个人IP?

随着互联网的快速发展&#xff0c;个人IP已经逐渐成为一个热门话题。拥有自己的个人IP可以为你带来更多的机会和收益&#xff0c;让你在竞争激烈的市场中脱颖而出。但是&#xff0c;要想打造自己的个人IP并不是一件容易的事情。本文将为你介绍如何打造属于自己的个人IP。#IP# 一…

Burp Suite 功能详解(渗透测试工具)

一、抓包。 找到 代理--拦截--打开自带浏览器&#xff08;这里也可以自己找扩展设置代理&#xff0c;但还要添加安全证书等等&#xff0c;我觉得太麻烦了&#xff0c;还不如直接使用Burp Suite自带的浏览器抓包&#xff09;。 这是Burp Suite自带网页的页面。 点击开启拦截。 …

VMware Cloud Director Availability 4.6 | 灾难恢复和迁移 | DRaaS

VMware Cloud Director Availability 4.6 | 灾难恢复和迁移 | DRaaS 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-cloud-director-availability-4/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VMware Cloud …

二维码在隐患排查中的应用:扫码上报,实时通知

正值安全生产月&#xff0c;对企业而言隐患排查是安全管理的重要环节&#xff0c;众多企业设立了安全部门&#xff0c;部门内的相关人员会定期对生产设备、作业场所、作业人员等进行检查&#xff0c;以确保安全隐患的消除&#xff0c;从而预防事故的发生。 传统的隐患排查主要…

2018年全国硕士研究生入学统一考试管理类专业学位联考写作试题

2018年1月真题 四、写作&#xff1a;第56~57小题&#xff0c;共65分。其中论证有效性分析30 分&#xff0c;论说文35分。 56.论证有效性分析&#xff1a; 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0c;对该论证的有…

掌握Spring Cloud:打造高效可靠的微服务生态系统

1、SpringCloud概述 Spring Cloud是一个用于构建分布式系统的开源框架&#xff0c;它提供了一系列的组件和工具&#xff0c;用于实现微服务架构中的各项核心功能。本文将重点介绍Spring Cloud中的关键组件&#xff0c;并详细探讨它们的功能和作用。 网关&#xff1a;Zuul/Gat…

自动化测试-selenium基础操作

元素操作 方法&#xff1a; 1、.send_keys() # 输入方法 2、.click() # 点击方法 3、.clear() # 清空方法# 导包 from time import sleep from selenium import webdriver# 实例化浏览器 driver webdriver.Chrome()# 打开网址 driver.get(https://www.baidu.com/)# 需求 e…

HTTP项目常见状态码笔记(200,302,400,403,404,405,500...),

目录 认识 "状态码" (status code) 出现200 403 Forbidden 出现404 404 Not Found 出现 405 Method Not Allowed 出现 500 Internal Server Error 504 Gateway Timeout 302 Move temporarily 301 Moved Permanently 出现 "空白页面" 出现 &qu…

制作内网离线百度地图

下载离线地图瓦片 通过百度ak&#xff08;没有的可以去百度官网自行申请下载&#xff09;&#xff0c;拉取下列git 项目&#xff0c;可以免费下载离线瓦片 https://gitee.com/jinqianwang/baidu-offline-map-download 目录结构&#xff1a; 使用步骤&#xff1a; 第一步&am…