机器谱 发表于 2023-12-26 09:14:08

机器人制作开源方案 | 面向农业生产的授粉机器人

本帖最后由 机器谱 于 2023-12-26 09:14 编辑

作者:许柏宁、李毅成、王晨、曹昱博、钟宇杰单位:太原理工大学指导老师:韩嘉宇、任杰宇       花粉从花药到柱头的移动过程叫做授粉,授粉是一种植物结成果实必经的过程。根据植物的授粉方式不同,可分为自然授粉和人工辅助授粉两类。现代机械出现后,人工辅助授粉的效率显著上升,果实产量随之提高。另一方面,世界范围内的人口老龄化加剧、农业从业人员短缺催生了“机器代人”的旺盛需求。不难看出,机器人技术正在农业领域大显身手,通过将机器人技术和3D建模等技术紧密结合,精密授粉系统可以将花粉精确地传送于正确的地方。因此本团队立足于现实情况,研究并设计了不同于现下已有的农业机器人--面向农业生产的授粉机器人。该机器人面向农业生产,旨在解决现有的认知决策控制难、高效精准作业难、自主导航行走难、手脚协同难、自动化程度低等问题。
https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgqcbaqwYo7IGXWTCUBTjzAw!600x600.png.webp1. 所解决的关键技术与未来技术
      现代农业已经走向智能化、精细化时代,许多农业生产场景都需要类似人工灵巧作业的机器。农业机器人应运而生,能够承担农业从业人员“干不了”、“干不好”、“干不快”、“不愿干”、“危害大”等的工作。但是也存在一些技术的挑战,例如:① 认知决策控制难;② 高效精准作业难;③ 自主导航行走难,自动化程度低;④ 手脚协同难;⑤ 成本高等挑战。       授粉机器人通过视觉处理模块、控制板、舵机、灰度传感器、光电传感器等部件的配合扫描周围环境生成三维模型,其流程为:视觉处理模块进行数据采集,获取植株坐标、障碍物坐标等信息并同时进行物景认知,随后通过LOD算法进行三维建模,从而解决认知决策控制难的难题。       授粉机器人通过已建立的三维模型决定进行选择性授粉,做到不伤植株进行授粉,从而解决高效精准作业难的难题。授粉机器人通过进行农田初步合理规划,规定植株间距以及机器人识别、转弯标记点,从而达成标准化的农田。通过灰度传感器以及光电传感器的配合可以解决自主导航行走难,自动化程度低的难题。授粉机器人通过特定的手眼协同算法,进一步提升机器人的灵活性,解决手脚协同难的难题。       未来机器人将会变得越来越轻量化,功能丰富化,自动化,且与大数据技术、物联网技术相串联,机器学习领域、人工智能领域相结合,实现机器自动编程、自动运行,从根本上将人力劳动与农业生产相分离,实现农业生产效率最大化。
2. 关键核心技术或未来技术的关键解决方案和实现的关键性能指标
      首先对农田进行初步合理规划,根据植株类型规定合理的植株间距以及机器人扫描识别标记点、转弯标记点等,使农田标准化。在出发点运行机器人的环境扫描程序,通过控制舵机进行角度调节帮助视觉处理模块实时识别周围环境,获取包含障碍物坐标、植株雌花坐标等数据,同时进行物景认知,并以此为依据使用LOD算法建立三维环境模型,从而解决决策控制的难题。关键性能指标:扫描灵敏度、扫描准确率、模型成型率、决策合理性。       在出发点运行授粉机器人的授粉程序,通过已有的物景认知所建立的三维模型结果对植株外围雌花进行授粉避免伤害植株,从而解决高效精准作业难的问题。关键性能指标:植株受损率、外围雌花授粉率、植株受损程度。       通过灰度传感器扫描到标记点向控制板主控制板发送的信号以及光电传感器扫描到标记点向控制板主控制板发送的信号判断授粉机器人接下来的工作行为,例如:灰度传感器向控制板主控制板发送高电平信号并且光电传感器向控制板主控制板发送低电平信号则机器人进行转弯操作。灰度传感器向控制板主控制板发送高电平信号并且光电传感器向控制板主控制板发送高电平信号则进行机器人停靠操作。从而帮助授粉机器人提升自动化率。关键性能指标:自动化率,识别准确率,,识别灵敏度,人工辅助次数。       通过手眼协同算法,通过舵机的微调减小机器人停靠点的误差,从而解决手脚协同难的问题。当机器人到达授粉点后机器人舵机控制授粉装置靠近雌花,到达雌花附近后通过形状识别以及色域识别的组合识别方式判断雌花柱头在图像中的坐标,假若雌花偏左,则视觉处理模块向主控制板发送相应信号,主控制板控制舵机向左微调,同理可得各个方向的微调方式,当花朵位于预先设置好的坐标中心区域后进行下一步的授粉操作,从而完成一次授粉。关键性能指标:移动准确率,返回坐标值,授粉成功率。       通过模块化分区加工例如模块化加工机械臂,机器人底盘等各个部件降低成本,通过选用新型低廉耐磨的材料增加耐久度降低成本,通过进一步丰富授粉机器人的功能,例如进行生物仿真在授粉机器人中增加可控的人工蜂巢、通过视觉处理模块监测病虫害情况以及植株健康情况来增加产品附加值变向降低成本。关键性能指标:产品耐久度、产品附加值、产品成本。
3. 作品说明书3.1 项目背景        中国是世界上番茄种植面积最大、产量最多的国家,占蔬菜总量的 7%左右。气候变换异常影响自然授粉成功率,如果大面积种植番茄时不进行人工干预授粉,其结果是授粉率只能占一半,严重影响产量和经济效益。政策上《数字乡村发展战略纲要》鼓励将粮食作物生产与智慧农业生态结合。由此可见农业机器人的研发极其的重要并且有广阔的市场前景。
3.2 作品简介        面向不同授粉条件,研发的授粉机器人,主要由两部分组成:机器人底盘和机器人机械臂。机器人底盘主要完成机器人的行走以及识别授粉作物并停靠等功能。授粉机器人机械臂主要完成机器人对花朵的识别以及授粉。       授粉机器人底盘主要是由铝板切割板、直流电机、车轮、灰度传感器、光电传感器等组成。我们通过对农业生产生活情况的详读研究,确定了使用光电传感器与灰度传感器控制车体实现笔直行进和在标定处精准转弯;接着设计各零部件,确定底盘尺寸及各个零部件的安装位置。       授粉机器人机械臂采用四自由度关节型机械臂,使用舵机作为关节驱动器,使机械臂运动自如;使用控制板作为主控制器,通过舵机控制板控制舵机转动特定角度从而控制机械臂进行授粉作业;机械臂末端安装授粉装置,视觉处理模块位于授粉装置中央,主要用于检测授粉位置,配合机械臂完成对授粉的精准进行。采用标准的授粉笔在花朵上做标记来模拟人工授粉异花植物的授粉过程。
3.3 创新点        ① 优化结构:通过力学分析减小底盘,使底盘零件布局紧凑,使车体更稳定。       ② 手眼及部件协调(特征偏差):通过视觉处理模块摄像头捕获图像,在程序中设定视觉处理模块扫描到的花朵标准面积和偏差值,当授粉装置接近花朵的时候将摄像头扫描到的花朵面积值反馈给上位机并检测是否在偏差范围内,控制机械臂的微调。       ③ 平面定位系统:使用光电传感器识别需授粉作物;使用灰度传感器来检测车体姿态,使车体稳定前进,配合灰度传感器扫描农田标记点进行精准转弯。       ④ 运用 LOD 算法完成三维建模:通过舵机控制视觉处理模块扫描周围的环境,获取植株坐标、障碍物坐标等信息,同时进行物景认知,并以此为依据运行LOD算法进行三维建模。
3.4 机械结构设计        本组设计的授花粉机器人整体结构如下图所示:https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg7szaqwYoiO3AowcwvQY4hAM!600x600.png.webp授粉机器人整体结构      机器人车体底板11由铝合金板材制成,四个实心橡胶车轮14对称分布在车体前端和后端,通过四个橡胶轮的速度差实现转弯;底板后端安装八路灰度传感器9,左右两侧对称安装光电开关10,构成传感导航模块引导机器人底盘循航。执行机构为四自由度机械臂,包括旋转云台13和自由度连杆机构6,连杆机构可绕旋转云台转动,由关节舵机8和5、大机械臂6、小机械臂4以及关节舵机5组成。舵机控制各转动副,可使机器人针对不同方向和高度的授粉靶标灵活完成授粉动作。旋转云台基座13与车体底板12连接。1为视觉系统视觉处理模块,控制机械臂实现精准授粉;2为授粉枪,授粉枪由小型舵机,进行花粉的传粉工作;3控制实现一个自由度上的旋转。整个小车的电力系统由电池仓7中的电池提供。
3.5 设计过程 3.5.1分析授粉作业环境        在生产实际中,场地为有压实过道的大棚农田,田垄宽为50~70cm、田垄高为10~15cm的田间场所,作物间距≥20cm,土壤的土壤相对湿度在15%~45%范围内,番茄的生长高度在150cm左右,结果的高度在30~120cm之间,一株番茄植株有5~8个花序,每个花序有3~7朵花且花朵呈黄色,直径通常为2cm。机器人要完成悬空生长的花朵授粉。在授粉过程中,机器人自主完成所有动作,不能被遥控。3.5.2 选择授粉机器人所需传感器        在授粉工作中,授粉机器人需要解决自主导航、智能避障、音视频交流、目标识别、花朵授粉等功能,授粉机器人底盘主要是由铝板切割板、直流电机、车轮、灰度传感器、光电传感器等组成。我们通过对农业生产生活实践进行详细研究,确定了使用灰度传感器和光电传感器控制车体实现笔直行进和在标记处精准转弯。       授粉机器人使用控制板作为主控制器,通过舵机控制板控制舵机转动特定角度从而控制机械臂进行授粉作业。机械臂末端安装授粉装置,视觉处理模块位于授粉装置中央,主要用于检测授粉位置,配合机械臂完成对授粉的精准进行。3.5.3 设定底盘尺寸、机械臂构型及传感器安装位置        底盘尺寸的设计需要以农业生产场地道路宽度为依据,根据相关实地测量,场地中最狭窄的道路宽约为400mm,因而设计授粉机器人的底盘尺寸为385mm×320mm。考虑到机械臂有一定的重量,为避免授粉机器人产生倾倒等危险,机械臂在底盘的安装位置大体位于底盘正中央。       控制板与舵机控制板放置在底盘合适位置即可。机械臂末端安装授粉装置,视觉处理模块位于授粉装置中央,主要用于检测授粉位置,配合机械臂完成对授粉的精准进行。光电传感器安放于底盘左右两侧,灰度传感器安放于车体最前方,便于识别标记点,用于控制车体实现笔直行进和精准转弯。3.5.4 优化机器人结构        通过力学分析、结构分析将底盘尺寸减小,一方面使底盘零件布局更加紧凑,另一方面缩小的底盘可以使车体通过农田的狭窄部分,同时微调底盘重心位置使车体更稳定。3.5.5 授粉机器人运动控制系统        根据场地需求,设计授粉机器人的主控制程序;根据授粉作物的高度,设计机械臂的动作组,让机械臂实现精准授粉;主控制器和舵机驱动器、电机驱动器、视觉模块的通信,控制授粉机器人实现笔直行进、精确转弯和对作物的精准授粉。3.5.6 进行实地试验,优化控制系统程序        在搭建的模拟场地中,通过优化编码器参数控制授粉机器人在无灰度传感器线的场地行进,并辅以陀螺仪使其走直。利用建立的三维模型返回的特定参数使小车在授粉作物旁停靠,同时通过正逆运动学分析及手眼协调算法控制机械臂授粉。在标记转弯处,通过调节四个车轮的转速实现精准转弯。
3.6 后续改进 3.6.1 优化机器人的结构        将轮胎改为履带式,进一步减少授粉机器人陷入泥潭无法运作的风险,将机器人的密封性进一步完善防止外界工作的恶劣环境损害机器人的电子元器件。3.6.2 丰富机器人功能        在授粉机器人中增加蜜蜂蜂巢,放入培育的蜜蜂,使用蜜蜂进行辅助授粉可以更加完全的对于植株进行授粉,使授粉工作更加的完美。3.6.3 改进程序算法        进一步实现利用障碍物、花朵坐标等数据建立三维环境模型,运用机器学习的智能决策算法决策路径。       通过视觉处理模块监测病虫害情况以及植株健康情况。       建立授粉识别云数据库,以增强授粉识别能力,丰富可授粉的植物种类。       进一步实现利用障碍物、花朵坐标等数据建立三维环境模型,运用机器学习的智能决策算法决策路径。       优化授粉手眼协调算法,提高授粉精准度和成功率。
4. 设计图纸https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgq8-aqwYoiJqBlQMwxQY41QQ!600x600.png.webphttps://28846868.s21i.faiusr.com/4/ABUIABAEGAAgq9DaqwYowI283gMwwQY4zgQ!600x600.png.webphttps://28846868.s21i.faiusr.com/4/ABUIABAEGAAgz9DaqwYor4usvgMwvQY40QQ!600x600.png.webp5. 示例程序授粉视觉17.0.py
import sensor, image, time

from pyb import UART

import json

import pyb

import math

sj=9

def modified_data(data):

   data = int(data)

   str_data=''

   if data < 10:

       str_data = str_data + '000' + str(data)

   elif data >= 10 and data < 100:

       str_data = str_data + '00' + str(data)

   elif data >=100 and data <1000:

       str_data = str_data + '0' + str(data)

   else:

       str_data = str_data + str(data)

   return str_data.encode('utf-8')

kernel_size = 1

kernel = [-2, -1,   0, \

          -1,   1,   1, \

         0,   1,   2]

   #####C区的阈值

threshold_0 = [(46, 79, -56, 43, 34, 106),(64, 79, -44, 34, 55, 106),(67, 100, -44, 10, 52, 106),

(52, 100, -44, 25, 37, 109),(52, 100, -110, 37, 37, 109),(70, 100, -80, 19, 43, 115),

(64, 100, -62, 19, 46, 127),(21, 46, -46, 31, 7, 79),(27, 100, -82, 49, 16, 70)]

#####B正区的阈值

threshold_1 = [(52, 88, -64, 8, 37, 106), (61, 100, -106, 20, 22, 112),(59, 100, -128, 96, 22, 127),(68, 100, -128, 63, 28, 127),

(68, 100, -128, 90, 16, 127),(68, 100, -128, 90, 31, 127),(65, 100, -128, 87, 49, 127),

(65, 100, -128, 87, 49, 127),(66, 100, -56, 28, 46, 115),(24, 100, -74, 19, 43, 106)]

   #######B反的阈值

threshold_2 = [(67, 96, -58, 27, 60, 115),(76, 100, -58, 39, 60, 106),

(70, 100, -55, 42, 45, 112),(52, 100, -55, 42, 45, 112),(88, 100, -55, 95, -11, 124)]

   #####B全部的阈值

threshold_3=[(67, 96, -58, 27, 60, 115),(76, 100, -58, 39, 60, 106),

(70, 100, -55, 42, 45, 112),(52, 100, -55, 42, 45, 112),(88, 100, -55, 95, -11, 124),(63, 97, -128, 64, 7, 103),(52, 88, -64, 8, 37, 106),

(61, 100, -106, 20, 22, 112),(59, 100, -128, 96, 22, 127),(68, 100, -128, 63, 28, 127),

(68, 100, -128, 90, 16, 127),(68, 100, -128, 90, 31, 127),(65, 100, -128, 87, 49, 127),

(65, 100, -128, 87, 49, 127),(66, 100, -56, 28, 46, 115),(24, 100, -74, 19, 43, 106),(22, 52, -76, 29, 2, 127),

(27, 100, -82, 49, 16, 70)]

sensor.reset()

sensor.set_pixformat(sensor.GRAYSCALE)

sensor.set_framesize( sensor.QQVGA)

uart = UART(3, 115200)

sensor.skip_frames(time = 300)

sensor.set_auto_gain(False)

sensor.set_auto_whitebal(False)

clock = time.clock()

sensor.set_vflip(0)#新加的

sensor.set_hmirror(False)#新加的

while(True):

    clock.tick()

    if uart.any():

      sj = uart.read(1)

      sj=int(sj)

      print(sj)

      if sj==6:                                           #b正sj=2

            sensor.reset()

            sensor.set_pixformat(sensor.GRAYSCALE)

            sensor.set_framesize( sensor.QQVGA)

            uart = UART(3, 115200)

            sensor.skip_frames(time = 300)

            sensor.set_auto_gain(False)

            sensor.set_auto_whitebal(False)

            clock = time.clock()

            sensor.set_vflip(0)#新加的

            sensor.set_hmirror(False)#新加的

            sj=2

            print(sj)

      elif sj==7:                                              #b反sj=3

            sensor.reset()

            sensor.set_pixformat(sensor.GRAYSCALE)

            sensor.set_framesize( sensor.QQVGA)

            uart = UART(3, 115200)

            sensor.skip_frames(time = 300)

            sensor.set_auto_gain(False)

            sensor.set_auto_whitebal(False)

            clock = time.clock()

            sensor.set_vflip(0)#新加的

            sensor.set_hmirror(False)#新加的

            sj=3

            print(sj)

      elif sj==8:                                                #c区的sj=1

            sensor.reset()

            sensor.set_pixformat(sensor.GRAYSCALE)

            sensor.set_framesize( sensor.QQVGA)

            uart = UART(3, 115200)

            sensor.skip_frames(time = 300)

            sensor.set_auto_gain(False)

            sensor.set_auto_whitebal(False)

            clock = time.clock()

            sensor.set_vflip(0)#新加的

            sensor.set_hmirror(False)#新加的

            sj=1

            print(sj)

#C区的识别程序

    while   (sj==1):

      if uart.any():

            sj = uart.read(1)

            sj=int(sj)

            print(sj)

            if sj==6:                                           #b正sj=2

                sensor.reset()

                sensor.set_pixformat(sensor.GRAYSCALE)

                sensor.set_framesize( sensor.QQVGA)

                uart = UART(3, 115200)

                sensor.skip_frames(time = 300)

                sensor.set_auto_gain(False)

                sensor.set_auto_whitebal(False)

                clock = time.clock()

                sensor.set_vflip(0)#新加的

                sensor.set_hmirror(False)#新加的

                sj=2

                print(sj)

            elif sj==7:                                              #b反sj=3

                sensor.reset()

                sensor.set_pixformat(sensor.GRAYSCALE)

                sensor.set_framesize( sensor.QQVGA)

                uart = UART(3, 115200)

                sensor.skip_frames(time = 300)

                sensor.set_auto_gain(False)

                sensor.set_auto_whitebal(False)

                clock = time.clock()

                sensor.set_vflip(0)#新加的

                sensor.set_hmirror(False)#新加的

                sj=3

                print(sj)

            elif sj==8:                                                #c区的sj=1

                sensor.reset()

                sensor.set_pixformat(sensor.GRAYSCALE)

                sensor.set_framesize( sensor.QQVGA)

                uart = UART(3, 115200)

                sensor.skip_frames(time = 300)

                sensor.set_auto_gain(False)

                sensor.set_auto_whitebal(False)

                clock = time.clock()

                sensor.set_vflip(0)#新加的

                sensor.set_hmirror(False)#新加的

                sj=1

                print(sj)

      sensor.set_pixformat(sensor.GRAYSCALE)

      img = sensor.snapshot().lens_corr(1.8)

      img.morph(kernel_size, kernel)

      img.laplacian(1, sharpen=True)

      for c in img.find_circles(threshold = 6000, x_margin = 10, y_margin = 10, r_margin = 10,

            r_min =15, r_max = 100, r_step = 2):

            area = (c.x()-c.r(), c.y()-c.r(), 2*c.r(), 2*c.r())

            print('发现了圆C')

            sensor.set_pixformat(sensor.RGB565)

            img = sensor.snapshot().lens_corr(1.8)

            blob=img.find_blobs(threshold_0, roi=area,area_threshold=566, margin=20)

            if blob:

                img.draw_rectangle(area, color = (255,255,255))

                img.draw_cross(c.x(),c.y())

                mj=4*c.r()*c.r()

                xzb = modified_data(c.x())

                yzb = modified_data(c.y())

                mjzb = modified_data(mj)

                uart.write('st')

                uart.write(xzb)

                uart.write(yzb)

                uart.write(mjzb)

                print(xzb, yzb,mjzb)

                print('one')

#B正的识别程序

    while   (sj==2):

      if uart.any():

            sj = uart.read(1)

            sj=int(sj)

            print(sj)

            if sj==6:                                           #b正sj=2

                sensor.reset()

                sensor.set_pixformat(sensor.GRAYSCALE)

                sensor.set_framesize( sensor.QQVGA)

                uart = UART(3, 115200)

                sensor.skip_frames(time = 300)

                sensor.set_auto_gain(False)

                sensor.set_auto_whitebal(False)

                clock = time.clock()

                sensor.set_vflip(0)#新加的

                sensor.set_hmirror(False)#新加的

                sj=2

                print(sj)

            elif sj==7:                                              #b反sj=3

                sensor.reset()

                sensor.set_pixformat(sensor.GRAYSCALE)

                sensor.set_framesize( sensor.QQVGA)

                uart = UART(3, 115200)

                sensor.skip_frames(time = 300)

                sensor.set_auto_gain(False)

                sensor.set_auto_whitebal(False)

                clock = time.clock()

                sensor.set_vflip(0)#新加的

                sensor.set_hmirror(False)#新加的

                sj=3

                print(sj)

            elif sj==8:                                                #c区的sj=1

                sensor.reset()

                sensor.set_pixformat(sensor.GRAYSCALE)

                sensor.set_framesize( sensor.QQVGA)

                uart = UART(3, 115200)

                sensor.skip_frames(time = 300)

                sensor.set_auto_gain(False)

                sensor.set_auto_whitebal(False)

                clock = time.clock()

                sensor.set_vflip(0)#新加的

                sensor.set_hmirror(False)#新加的

                sj=1

                print(sj)

      sensor.set_pixformat(sensor.RGB565)

      img = sensor.snapshot().lens_corr(1.8)

      blob=img.find_blobs(threshold_1,area_threshold=580, margin=10)

      if blob:

            sensor.set_pixformat(sensor.GRAYSCALE)

            img = sensor.snapshot().lens_corr(1.8)

            img.morph(kernel_size, kernel)

            img.laplacian(1, sharpen=True)

            GAIN_SCALE = 2.0

            current_gain_in_decibels = sensor.get_gain_db()

            sensor.set_auto_gain(False, gain_db = current_gain_in_decibels * GAIN_SCALE)

            for c in img.find_circles(threshold = 4700, x_margin = 10, y_margin = 10, r_margin = 10,

                r_min = 18, r_max = 100, r_step = 2):

                  print("发现了圆B正")

                  area = (c.x()-c.r(), c.y()-c.r(), 2*c.r(), 2*c.r())

                  area1 = (c.x()-c.r(), c.y()-c.r(), c.r(), c.r())

                  sensor.set_pixformat(sensor.RGB565)

                  img = sensor.snapshot().lens_corr(1.8)

                  blob=img.find_blobs(threshold_1, roi=area1,area_threshold=132, margin=10)

                  if blob:

                        img.draw_rectangle(area, color = (255,255,255))

                        img.draw_cross(c.x(),c.y())

                        mj=4*c.r()*c.r()

                        xzb = modified_data(c.x())

                        yzb = modified_data(c.y())

                        mjzb = modified_data(mj)

                        uart.write('st')

                        uart.write(xzb)

                        uart.write(yzb)

                        uart.write(mjzb)

                        print(xzb, yzb,mjzb)

                        print('two')
                           #B反的识别程序

    while   (sj==3):

      if uart.any():

            sj = uart.read(1)

            sj=int(sj)

            print(sj)

            if sj==6:                                           #b正sj=2

                sensor.reset()

                sensor.set_pixformat(sensor.GRAYSCALE)

                sensor.set_framesize( sensor.QQVGA)

                uart = UART(3, 115200)

                sensor.skip_frames(time = 300)

                sensor.set_auto_gain(False)

                sensor.set_auto_whitebal(False)

                clock = time.clock()

                sensor.set_vflip(0)#新加的

                sensor.set_hmirror(False)#新加的

                sj=2

                print(sj)

            elif sj==7:                                              #b反sj=3

                sensor.reset()

                sensor.set_pixformat(sensor.GRAYSCALE)

                sensor.set_framesize( sensor.QQVGA)

                uart = UART(3, 115200)

                sensor.skip_frames(time = 300)

                sensor.set_auto_gain(False)

                sensor.set_auto_whitebal(False)

                clock = time.clock()

                sensor.set_vflip(0)#新加的

                sensor.set_hmirror(False)#新加的

                sj=3

                print(sj)

            elif sj==8:                                                #c区的sj=1

                sensor.reset()

                sensor.set_pixformat(sensor.GRAYSCALE)

                sensor.set_framesize( sensor.QQVGA)

                uart = UART(3, 115200)

                sensor.skip_frames(time = 300)

                sensor.set_auto_gain(False)

                sensor.set_auto_whitebal(False)

                clock = time.clock()

                sensor.set_vflip(0)#新加的

                sensor.set_hmirror(False)#新加的

                sj=1

                print(sj)

      sensor.set_pixformat(sensor.RGB565)

      img = sensor.snapshot().lens_corr(1.8)

      blob=img.find_blobs(threshold_1,area_threshold=580, margin=10)

      if blob:

            sensor.set_pixformat(sensor.GRAYSCALE)

            img = sensor.snapshot().lens_corr(1.8)

            img.morph(kernel_size, kernel)

            img.laplacian(1, sharpen=True)

            GAIN_SCALE = 2.0

            current_gain_in_decibels = sensor.get_gain_db()

            sensor.set_auto_gain(False, gain_db = current_gain_in_decibels * GAIN_SCALE)

            for c in img.find_circles(threshold = 4909, x_margin = 10, y_margin = 10, r_margin = 10,

                r_min = 18, r_max = 100, r_step = 2):

                  area = (c.x()-c.r(), c.y()-c.r(), 2*c.r(), 2*c.r())

                  area1 = (c.x()-c.r(), c.y()-c.r(), c.r(), c.r())

                  print("发现了圆B反")

                  sensor.set_pixformat(sensor.RGB565)

                  img = sensor.snapshot().lens_corr(1.8)

                  blob=img.find_blobs(threshold_2, roi=area1,area_threshold=205, margin=10)

                  if blob:

                        img.draw_rectangle(area, color = (255,255,255))

                        img.draw_cross(c.x(),c.y())

                        mj=4*c.r()*c.r()

                        xzb = modified_data(c.x())

                        yzb = modified_data(c.y())

                        mjzb = modified_data(mj)

                        uart.write('st')

                        uart.write(xzb)

                        uart.write(yzb)

                        uart.write(mjzb)

                        print(xzb, yzb,mjzb)

                        print('three')

            #A的识别程序

    img = sensor.snapshot().lens_corr(1.8)

    img.morph(kernel_size, kernel)

    img.laplacian(1, sharpen=True)

    for c in img.find_circles(threshold = 6799, x_margin = 10, y_margin = 10, r_margin = 10,

                r_min = 15, r_max = 100, r_step = 2):

             area = (c.x()-c.r(), c.y()-c.r(), 2*c.r(), 2*c.r())

             print("识别到圆A")

             # sensor.set_pixformat(sensor.RGB565)

             # img = sensor.snapshot().lens_corr(1.8)

             # blob=img.find_blobs(threshold_0, roi=area,area_threshold=900, margin=10)

             if 1>0:

                img.draw_rectangle(area, color = (255,255, 255))

                img.draw_cross(c.x(),c.y())

                mj=4*c.r()*c.r()

                xzb = modified_data(c.x())

                yzb = modified_data(c.y())

                mjzb = modified_data(mj)

                uart.write('st')

                uart.write(xzb)

                uart.write(yzb)

                uart.write(mjzb)

                print(xzb, yzb,mjzb)

                print('zero')

             if uart.any():

                sj = uart.read(1)

                sj=int(sj)

                print(sj)

                if sj==6:                                           #b正sj=2

                  sensor.reset()

                  sensor.set_pixformat(sensor.GRAYSCALE)

                  sensor.set_framesize( sensor.QQVGA)

                  uart = UART(3, 115200)

                  sensor.skip_frames(time = 300)

                  sensor.set_auto_gain(False)

                  sensor.set_auto_whitebal(False)

                  clock = time.clock()

                  sensor.set_vflip(0)#新加的

                  sensor.set_hmirror(False)#新加的

                  sj=2

                  print(sj)

                elif sj==7:                                              #b反sj=3

                  sensor.reset()

                  sensor.set_pixformat(sensor.GRAYSCALE)

                  sensor.set_framesize( sensor.QQVGA)

                  uart = UART(3, 115200)

                  sensor.skip_frames(time = 300)

                  sensor.set_auto_gain(False)

                  sensor.set_auto_whitebal(False)

                  clock = time.clock()

                  sensor.set_vflip(0)#新加的

                  sensor.set_hmirror(False)#新加的

                  sj=3

                  print(sj)

                elif sj==8:                                                #c区的sj=1

                  sensor.reset()

                  sensor.set_pixformat(sensor.GRAYSCALE)

                  sensor.set_framesize( sensor.QQVGA)

                  uart = UART(3, 115200)

                  sensor.skip_frames(time = 300)

                  sensor.set_auto_gain(False)

                  sensor.set_auto_whitebal(False)

                  clock = time.clock()

                  sensor.set_vflip(0)#新加的

                  sensor.set_hmirror(False)#新加的

                  sj=1

                  print(sj)
更多详情请见:【S041】面向农业生产的授粉机器人https://www.robotway.com/h-col-307.html

页: [1]
查看完整版本: 机器人制作开源方案 | 面向农业生产的授粉机器人