实战视频演示: 基于机器视觉的智能分拣机械臂 您所在的位置:网站首页 基于视觉的机械臂有哪些 实战视频演示: 基于机器视觉的智能分拣机械臂

实战视频演示: 基于机器视觉的智能分拣机械臂

2024-07-10 13:52| 来源: 网络整理| 查看: 265

前言

本作品是一个基于机器人机器视觉的智能机械臂操作平台,其采用atmega32单片机作为主控制系统并通过串口与视觉识别模块进行通讯;控制系统使用12V5A开关电源供电;机械臂是一个六关节机械臂,六个伺服电机分别驱动六个关节转动,主控制系统控制六个伺服电机实现机械臂空间复杂运动。该智能平台实现了,对不同大小,颜色,二维码等目标物品的识别,按指令进行分类、抓取、搬移等动作。

该作品制作稍微复杂,但并不困难。机械臂控制代码可通过图形化软件来生成,没有难度,机器视觉则由集成度很高的图像处理器OpenMV来负责,只需要调用官方的API,很轻松地就能实现机器视觉。整个作品花些心思即可完成。

材料

MG996R 996 舵机 *6

长U型支架单轴舵机支架 *3

U型梁 *2

S3115通用支架 *5

L型支架单轴 *1

金属 机械手臂 夹持器 *1

M3螺丝螺母若干       

35步进电机 *1

M8丝杆20cm *2

联轴器5X8 *1

丝杆固定轴承 *4

A4纸 *1  

A4988驱动板 *1

ARDUINO PRO MINI *1

12V1A电源 *1              

OPENMV *1

步骤

一、机械臂部分

1、组装

2、驱动板

驱动板用的KittenBot家的RosBot机器人开发板,图像化编程还是很好用的。

3、程序

void setup(){

        Serial.begin(9600);

        kb.init();

        pinMode(A0, INPUT);

        kb.servoArray(2, 160, 10);

        delay(1*1000);

        kb.servoArray(3, 160, 10);

        delay(1*1000);

        kb.servoArray(4, 10, 10);

        delay(1*1000);

        kb.servoArray(5, 90, 5);

        delay(1*1000);

        kb.servoArray(3, 90, 10);

        kb.servoArray(4, 10, 10);

        kb.servoArray(0, 90, 10);

        kb.servoArray(1, 70, 10);

        kb.servoArray(2, 70, 10);

        kb.servoArray(3, 80, 10);

        delay(1*1000);

        kb.servoArray(5, 180, 10);

        delay(3*1000);

}

void loop(){

        char val = Serial.read();

        if(val == '1'){

                delay(1*1000);

                kb.servoArray(0, 125, 10);

                delay(1*1000);

                kb.servoArray(2, 130, 20);

                kb.servoArray(4, 20, 20);

                kb.servoArray(5, 145, 5);

                delay(1*1000);

                kb.servoArray(1, 160, 20);

                delay(2*1000);

                kb.servoArray(0, 100, 20);

                delay(2*1000);

                kb.servoArray(4, 10, 10);

                kb.servoArray(0, 90, 10);

                kb.servoArray(1, 70, 10);

                kb.servoArray(2, 70, 10);

                kb.servoArray(3, 80, 10);

                delay(1*1000);

                kb.servoArray(5, 180, 10);

        }

        if(val == '2'){

                delay(1*1000);

                kb.servoArray(0, 125, 10);

                delay(1*1000);

                kb.servoArray(4, 30, 10);

                kb.servoArray(3, 135, 10);

                delay(1*1000);

                kb.servoArray(5, 130, 10);

                kb.servoArray(2, 70, 10);

                delay(1*1000);

                kb.servoArray(1, 160, 20);

                delay(2*1000);

                kb.servoArray(0, 100, 20);

                delay(2*1000);

                kb.servoArray(4, 10, 10);

                kb.servoArray(0, 90, 10);

                kb.servoArray(1, 70, 10);

                kb.servoArray(2, 70, 10);

                kb.servoArray(3, 80, 10);

                kb.servoArray(5, 180, 10);

        }

        if(val == '3'){

                delay(1*1000);

                kb.servoArray(0, 120, 10);

                delay(1*1000);

                kb.servoArray(4, 20, 10);

                kb.servoArray(3, 130, 10);

                delay(1*1000);

                kb.servoArray(5, 115, 10);

                kb.servoArray(2, 55, 10);

                delay(1*1000);

                kb.servoArray(1, 160, 20);

                delay(2*1000);

                kb.servoArray(0, 100, 20);

                delay(2*1000);

                kb.servoArray(4, 10, 10);

                kb.servoArray(0, 90, 10);

                kb.servoArray(1, 70, 10);

                kb.servoArray(2, 70, 10);

                kb.servoArray(3, 80, 10);

                kb.servoArray(5, 180, 10);

        }

}

二、传送带部分

1、结构图

2、驱动电路

3、程序

#include

Servo servo1;

void setup() {

  servo1.attach(5);

  Serial.begin(9600);

}

void loop() {

  int angle = analogRead(A0);

  angle = map(angle, 0, 1023, 0, 180);

  Serial.print("angle = ");

  Serial.println(angle);

  servo1.write(angle);

  delay(15);

}

三、视觉部分

视觉模块是参考开源的OPENMV绘制的PCB,采用基于OPENMV的图像识别模块,主控为STM32F767,工作频率可达260MHZ,摄像头使用0V7725,30W像素。机器视觉识别系统的主控芯片STM32F767通过串口通信方式与主控制系统ATMEGA32单片机传输信息

1、原理图

2、AprilTag标签识别原理

AprilTag是一个视觉基准系统,可用于各种任务,包括AR,机器人和相机校准。这个Tag可以直接用打印机打印出来,而AprilTag检测程序可以计算相对于相机的精确3D位置,方向和ID。在机器人领域有广泛应用。AprilTag的算法,可以计算出Tag在3维空间中的位置, 与其对应的ID。

3、颜色识别功能

颜色识别是通过识别指定物品的色块,返回色块的值给主控,主控再根据返回的信息控制机械臂执行相应的动作。

4、程序

①标签识别

import sensor, image, time, math

 

sensor.reset()

sensor.set_pixformat(sensor.RGB565)

sensor.set_framesize(sensor.QQVGA) # we run out of memory if the resolution is much bigger...

sensor.skip_frames(time = 2000)

sensor.set_auto_gain(False)  # must turn this off to prevent image washout...

sensor.set_auto_whitebal(False)  # must turn this off to prevent image washout...

clock = time.clock()

 

tag_families = 0

tag_families |= image.TAG16H5 # comment out to disable this family

tag_families |= image.TAG25H7 # comment out to disable this family

tag_families |= image.TAG25H9 # comment out to disable this family

tag_families |= image.TAG36H10 # comment out to disable this family

tag_families |= image.TAG36H11 # comment out to disable this family (default family)

tag_families |= image.ARTOOLKIT # comment out to disable this family

 

def family_name(tag):

    if(tag.family() == image.TAG16H5):

        return "TAG16H5"

    if(tag.family() == image.TAG25H7):

        return "TAG25H7"

    if(tag.family() == image.TAG25H9):

        return "TAG25H9"

    if(tag.family() == image.TAG36H10):

        return "TAG36H10"

    if(tag.family() == image.TAG36H11):

        return "TAG36H11"

    if(tag.family() == image.ARTOOLKIT):

        return "ARTOOLKIT"

 

while(True):

    clock.tick()

    img = sensor.snapshot()

    for tag in img.find_apriltags(families=tag_families): # defaults to TAG36H11 without "families".

        img.draw_rectangle(tag.rect(), color = (255, 0, 0))

        img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))

        print_args = (family_name(tag), tag.id(), (180 * tag.rotation()) / math.pi)

        print("Tag Family %s, Tag ID %d, rotation %f (degrees)" % print_args)

        print(clock.fps)

②颜色识别

import sensor, image, time

 

thresholds = [(0, 100, 51, 127, -3, 127), # generic_red_thresholds

              (0, 100, -128, -19, -128, 127), # generic_green_thresholds

             (39, 100, -63, 13, -128, -16)] # generic_blue_thresholds

 

sensor.reset()

sensor.set_pixformat(sensor.RGB565)

sensor.set_framesize(sensor.QVGA)

sensor.skip_frames(time = 2000)

sensor.set_auto_gain(False) # must be turned off for color tracking

sensor.set_auto_whitebal(False) # must be turned off for color tracking

clock = time.clock()

 

while(True):

    clock.tick()

    img = sensor.snapshot()

    for blob in img.find_blobs(thresholds, pixels_threshold=800, area_threshold=1500):

        img.draw_rectangle(blob.rect(), color = (255, 0, 0))#red

 

        img.draw_string(100,100,'red', color=(255,0,0))

        img.draw_cross(blob.cx(), blob.cy())

整个过程比较复杂,但完成之后就只剩下满满的成就感,感兴趣的试一试吧!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有