极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2848|回复: 0

开源项目分享 | 双臂二指魔方机器人(二)

[复制链接]
发表于 2023-1-12 13:21:31 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-1-12 13:21 编辑

本文素材来源于广西大学  机械工程学院
作者:孙尹同  黄祖杰
指导老师:李俚

一、视觉识别

1.方案选择
       根据硬件实际需求以及本团队能力需求,视觉颜色的识别是本项目的不可缺少的一部分,方案的选择主要有一下三种类型:

(1)OpenMV
      简单的来说,它是一个可编程的摄像头,通过MicroPython语言,可以实现需求的逻辑,而且摄像头本身内置了一些图像处理算法,很容易使用。

图1.1.1  OpenMV硬件图

2K210
      K210是由一家叫做嘉楠公司在去年推出的一款MCU,其特色在于芯片架构中包含了一个自研的神经网络硬件加速器KPU,可以高性能地进行卷积神经网络运算。在AI计算方面,K210的算力其实是相当可观的。根据嘉楠官方的描述,K210的KPU算力有0.8TOPS ,作为对比,拥有128个CUDA单元GPU的英伟达Jetson Nano的算力是0.47TFLOPS ;而最新的树莓派4只有不到0.1TFLOPS 。
       当然了,这个性能跟某些旗舰级别的SoC还是有差距的:A76级别的CPU本身就已经很变态,更何况旗舰SoC上面都会搭载用于AI加速的硬件用于异构运算,比如高通的Hexagon DSP、苹果的Neural Engine、华为的达芬奇架构NPU等等,这些NPU在某些应用下甚至能达到与数百W功耗的桌面级GPU接近的算力。

图1.1.2  K210硬件图

(3)OpenCV

      OpenCV是一个用于图像处理、分析、机器视觉方面的开源函数库.
       该库采用C及C++语言编写,可以在windows, linux, mac OSX系统上面运行。该库的所有代码都经过优化,计算效率很高,因为,它更专注于设计成为一种用于实时系统的开源库。opencv采用C语言进行优化,而且,在多核机器上面,其运行速度会更快。它的一个目标是提供友好的机器视觉接口函数,从而使得复杂的机器视觉产品可以加速面世。该库包含了横跨工业产品检测、医学图像处理、安防、用户界面、摄像头标定、三维成像、机器视觉等领域的超过500个接口函数。
      同时,由于计算机视觉与机器学习密不可分,该库也包含了比较常用的一些机器学习算法。或许,很多人知道,图像识别、机器视觉在安防领域有所应用。但,很少有人知道,在航拍图片、街道图片(例如google street view)中,要严重依赖于机器视觉的摄像头标定、图像融合等技术。
       根据现实硬件要求,openmv以及K210虽然继承了mirco python识别颜色的函数,但无法根据实际光照强度调整参数,并且无法外加更多的算法加强颜色识别,例如下图为我团队的魔方识别区域。综合考虑,本团队采用opencv进行颜色识别,并且使用主流的KMeans聚类算法,对黑色进行删除后,得出占比最大的颜色即为识别颜色。

图1.1.3  实际硬件干扰图

2.实现流程
     实现流程可分为图片区域获取、颜色阈值设置以及颜色阈值匹配三个部分。

图1.2.1  流程图

2.1 图像区域获取
       在获取图像时,我团队使用的是四摄像头四进程进行同步采样,能够更快的完成图像取样的动作,并且避免死机的现象,四个进程同时开启后,对摄像头捕获的图像进行保存,在后面的颜色识别处理中只需读取对应路径图片即可进行颜色识别。

图1.2.2  区域获取代码

图1.2.3  线程代码

2.2 图像区域分割
      对图像进行获取后,上下两个摄像头因为同时拍摄了魔方两个面的图片,需要进行图片切割以及旋转,该部分先使用旋转。


图1.2.4  区域切割代码

旋转效果


图1.2.5  区域旋转前、后效果图

旋转后进行透视变换,对周围干扰环境进行割除
透视变换效果

图1.2.6  区域透视变换前、后效果图

这样便可以获得比较晚上的九色块图片,后续进行九个色块的聚类算法便可以得到对应的颜色。

2.3 颜色阈值设置
      在颜色设置中,为了方便调颜色阈值,我团队单独写了调阈值的程序,代码及效果如下:
      在颜色空间选取中,我们团队选择了颜色阈值更加分离的RGB色彩空间,抛弃了还原人眼看见的HSV色彩空间,更容易进行颜色的识别。



图1.2.7  区域颜色阈值设置代码图

图1.2.8  区域颜色阈值设置效果图

      在效果图中,最左边为输出的颜色阈值范围,左二为原图,左三为颜色阈值范围筛选后绿色的掩模图,最右边为设置颜色阈值的滑动条。

2.4 颜色阈值匹配
      根据上图获取到每个色块的颜色阈值后,即可设置颜色识别阈值的范围,下图为6个色块的RGB颜色阈值区域。



图1.2.9  区域颜色阈值范围代码图

2.5 KMeans聚类算法
       本章节的核心为KMeans聚类算法,是识别出正确颜色的重要部分,相较于上面直接颜色阈值区域匹配,进行KMeans聚类算法后能够删除黑色区域,从而减少机械爪子对色块遮挡的干扰。


图1.2.10  KMeans聚类算法代码图


图1.2.11  KMeans聚类算法代码图

KMeans聚类算法的效果如下:


图1.2.12  KMeans聚类算法效果图

       左一为各颜色区域的阈值范围以及占比,中间为输入图片,右一为聚类分割后区分的三种颜色。可以明显看出对黑色区域筛选后,再根据占比最高,从而获得正确的红色阈值范围。

2.6 编号输出
      编号输出的方法包括六个面的序号排序,排序正确后再进行每个面九个色块的顺序编号,便于应对各种魔方摆放顺序的情况。


图1.2.13 编号输出代码图

图1.2.14 编号输出代码图

二、还原控制

      魔方还原算法最早可以追溯到1980年捷克共和国的女大学生Jessica Fridrich发明的CFOP算法,目前这个算法仍然广泛应用于国际魔方速拧比赛中。而经过几十年的发展,魔方还原的主流算法有:层先法、角先法、TM算法和二阶段算法。关于算法的优劣与否,主要看它的两个方面:魔方还原步数、魔方寻优时间。本文算法追求的是在尽可能短的时间内完成魔方的还原。双臂二指魔方机器人还原魔方的时间包括寻优的时间和机器人拧魔方的时间,而双臂二指魔方机器人完成一次魔方旋转所用的时间是固定的,因此机器人还原魔方的时间与还原指令的长度呈线性关系,即还原指令长度越短,魔方还原所花费的时间越少。根据相关资料显示,Kociemba 二阶段算法是最优的选择。本章主要介绍Kociemba 二阶段算法。

1.魔方状态分析
       魔方的状态分析是实现魔方成功求解的前提和基础。如果把魔方的12个棱块放于12个边的位置,根据排列顺序有12!种情况,除此之外,还要考虑棱块的方向问题,有2种方向置于12个边上,根据乘法原理可知有种情况,综上所述棱块的状态数一共有:
       同理,魔方有8个角块,每个角块朝向有3种,所以角块的状态数一共是:

      然而,魔方的一些状态是不存在的。因为对于一个还原的魔方来说,不存在单独改变一个棱块或角块的朝向的情况以及单独一对角块和一对棱块互换位置的情况[37],所以应该在魔方所有状态的基础上去掉一个倍数:

      此可以得到魔方的所有可能状态数:


由此得到:
       魔方的所有可能状态有43252003274489856000种,说明魔方还原的难度非常之大,想要通过胡乱的旋转侥幸将魔方还原是几乎不可能的。因此各种各样的魔方还原算法接踵而来,目前人们已经将“上帝之数”压缩到20,即任何一种组合的魔方都能在20步以内还原。

2. Kociemba 二阶段算法
       经上位机(电脑)视觉识别处理完成之后,就得到一串包含魔方相对位置与颜色的字符串,这串字符串就代表了这个魔方此时的状态信息,通过这串字符串,计算机也就可以准确的得到此时的魔方模型状态。目前来说,魔方机器人使用较为广泛的算法是来自 Kociemba 的二阶段算法,以下简称 Kociemba 算法。Kociemba 算法是一种能在较短时间内使用较短步数还原魔方的算法,通常能在 1s 内得到平均 20 步的解法,相比较于人工还原魔方的方法,如层先法、角先法,进阶的如 CFOP 法的动辄上百步还原步骤,是非常具有优势的, 所以我们也采用的此算法。       我们可以把魔方简单的看做一个立方体,对每个面进行相应的标记,六个面分我们可以把魔方简单的看做一个立方体,对每个面进行相应的标记分别为 U(顶面)、F(前面)、 L(左面)、R(右面)、B(后面)、D(下面),对于每一个面,又分别有顺时针旋转 90°,逆时针旋转 90°, 旋转 180°(顺时针逆时针均可)这三种操作,我们可以把对应的操作记为 XY,其中 X 为面的代号,Y 为对 应操作代号(1 为顺时针旋转 90°,2 为旋转 180°,3 逆时针旋转 90°),如 U3 就代表着是顶层逆时针旋转 90°。经 Kociemba 算法得到的解法就是多个上述操作代号相连起来,例如“D2 R1 D3 F2 B1 D1 R2 D2 R3 F2 D3 F2 U3 B2 L2 U2 D1 R2 U1”就是经 Kociemba 算法得出来的完整的一个解魔方步骤。

3.魔方转动状态分析


      我们可以把魔方简单的看做一个立方体,对每个面进行相应的标记,六个面分别为U(顶面)、F(前面)、L(左面)、R(右面)、B(后面)、D(下面),对于每一个面,又分别有顺时针旋转90°,逆时针旋转90°,旋转180°(顺时针逆时针均可)这三种操作,我们可以把对应的操作记为XY,其中X为面的代号,Y为对应操作代号(1为顺时针旋转90°,2为旋转180°,3逆时针旋转90°),如U3就代表着是顶层逆时针旋转90°。

4. kociemba算法结果
        经Kociemba算法得到的解法就是多个上述操作代号相连起来,例如“D2 R1 D3 F2 B1 D1 R2 D2 R3 F2 D3 F2 U3 B2 L2 U2 D1 R2 U1”就是经Kociemba算法得出来的完整的一个解魔方步骤。对于我们的机器人而言,这样的一个步骤是不能直接运用的,对于双臂二指机器人而言,如图,它能直接转动的面只有D、B两个面,要想转动其他的面,还需要进行一些其他的机械臂的操作转化,接下来会在下位机算法中详细介绍。


5. 串口通讯
       经Kociemba算法得到的解法,需要经过一定的通讯手段,将数据从上位机传输给下位机进行后续的操作,故选择简单并且稳定的usb串口通讯,只需要将上位机和下位机通过一根usb线连接起来,选取和下位机相对应的端口号和波特率,就可以向下位机传输这一组数据了,下附python源代码,其中的txt便是经Kociemba算法得到的一串包含正确解法的字符串。


6. 串口数据接收及数据解码
      下位机进行串口缓存检测,一旦有数据输入时,就按顺序读取单个字符值,并转化为字符,循环赋值给a数组。这样就可以得到上位机传输过来的数据了。


       但这样得到的字符串并不能被下位机直接识别,将得到的字符串以空格为界,将两个空格之间的字符的ASCLL码相加,使得魔方的每一个转动方式都有一个对应的十进制数字与之相对应。


7. 机械臂控制及转化算法
       我们的双臂二指机器人包含两个舵机,分别控制左右两只手手指的夹紧与放开,另外还包含两个步进电机,用来分别控制左右两个机械臂的转动,我们可以做如下定义:
       L0左手手指张开
       L1左手手指夹紧
       Ls左手顺时针旋转90°
       Ln左手逆时针旋转90°
       L180左手旋转180°(至于是顺时针还是逆时针之后会有另行说明)

舵机控制代码:


      步进电机在转动的时候,根据手指的夹紧和张开状态,有三种速度可以选择,在不同负载下选择不同的速度来进行转动,其中lim值的作用在下文防缠绕算法中会详细说明:


R0、R1、Rs、Rn、R180则是右手相应动作。
       这样,我们就可以把魔方还原的解法通过一定的映射,转换为机器人相应的机械步骤,从而让机器人可以正确还原魔方。定义机械臂手指平行地面为归位,垂直地面为不归位,在进行一次转动操作以后,一共会出现三种状态,分别是1:左手归位、右手不归位2:左手不归位、右手归位3:左右手都归位。如在左右手臂都是初始状态时执行U3步骤:R1→L180→R0→Rn,对于其他步骤,同样存在相应的转化方法,下附表1。

表1 待转动面转动至操作面机械臂动作转化表
     
       经过这样的操作之后,只是把待转动面移动到了机械爪的操作范围之内,至于是顺时针还是逆时针,用左手还是右手,经过程序的进一步判断以后就可以进行下一步操作。

8. 坐标转换算法
      当然,在双手机械臂还原魔方的过程中,会涉及到一定的坐标变换,如执行U3步骤之后,后续的所有还原步骤中:U→D、D→U、L→R、R→L,F和B面不变,不难发现,只要是对U面进行操作,都是这样的坐标转换步骤。当然,对于其他另外的5个面,在进行操作以后也会有一定的转换规则,下附表2。


表2  转动过程中坐标转换对照表

9.步进电机控制
       当步进电机加速度过快时,会使魔方发生错位的风险,在这里,通过使用了Arduino自带的AccelStepper库函数,可以更加简单方便的来驱动步进电机来达到想要的速度。

10.线的防缠绕算法
       由于机器人选择的是用舵机来控制手指的开合,在舵机和控制板之间必须要有一根线来传输数据和提供电力,在魔方进行还原的过程中,如果不加以限制,这根线就会一点一点的缠绕在机械臂上,为了解决这个问题,我们做了如下优化工作:定义机器人初始机械臂状态为“0”,当机械臂顺时针旋转90°后,我们让机械臂状态值加上90,逆时针旋转90°则减去90,在之前定义旋转180°的时候,我们没有定义旋转的方向,在这里,我们可以根据状态值动态选择顺时针还是逆时针,具体来说,就是在机械臂要进行旋转180°的时候,机械臂状态值大于0时,选择逆时针旋转180°,同时状态值减少180,状态值小于0时,选择顺时针旋转180°,同时状态值加上180,这样的算法会使机械臂在旋转的过程中,机械臂的状态值始终是趋近于0也就是机械臂的状态始终向着初始状态靠近,这样就可以解决线的缠绕问题。


在经过这样的一系列算法处理以后,魔方机器人就可以驱动电机,实现还原魔方的操作了。
通过 10 次的平稳运行测试,还原速度在 18s~25s 区间内,平均还原速度为 22.9 s。



想了解更多机器人开源项目资料请关注 机器谱网站 https://www.robotway.com



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 17:05 , Processed in 0.044835 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表