查看: 7705|回复: 24

[原创] 树莓派搭建基于Python3和OpenCV实现的解魔方机器人

  [复制链接]

主题

好友

2682

积分

进士

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 250 天

    连续签到: 22 天

    [LV.8]以坛为家I

    发表于 2018-2-27 00:23:04 |显示全部楼层
    本帖最后由 Litthins 于 2019-3-8 15:15 编辑

    ————————————作品简介————————————

    我们的机器人是基于树莓派卡片计算机设计的嵌入式解魔方机器人。本机器人采用双手臂二指结构,机械部分使用的是飞思卡尔FRDM系列微控制器。机器人的基本功能由运行在嵌入式Linux系统上的模块化服务程序组来实现。本机器人可独立运行,也可通过LAN进行远程控制。作品配有音频视频输出,用户可实时获取计算机视觉图像。产品提供人机交互功能,设备可根据外部环境做出简单反应。未来的一段时间里,我将从机械设计和程序设计两方面进行讲解,看完本教程,大家将有能力做出属于自己的解魔方机器人,而且完全可以做的比我们更好。准备好了吗,我们的教程开始了!

    2018年5月12日

    ————————————教程部分————————————


    STEP1.机器人设计思路简单介绍

    其实网上一直有很多像是六爪或者四爪的解魔方机器人,虽然基本原理都大同小异,但是可以照着从头到尾把机器人做出来的这样一份资料却不容易找到,而且很多资料里面,一些具体功能的实现,使用的算法也介绍的比较模糊,这就加大了很多读者第一次做魔方机器人的难度。首先我来介绍下这个魔方机器人需要实现的一些基本的功能:1、机器人要能识别出魔方的六个面,也就是图像识别这一块,笔者使用的是opencv,这个是在树莓派上通过python实现的,后边会详细讲到;2、机器人要能计算出魔方的解法步骤,这个使用的是github上现成的项目,先卖个关子,后面会提到;3、机器人要能有专门的机械结构来实现解魔方的动作,这一块笔者使用的是42步进电机,因为之前做这个比赛是很需要速度的,当然,如果大家不介意那么几十秒的差距的话,便宜的舵机会是更好的选择。实现了上述三个主要功能,机器人基本就能正常运行了。有心的读者会发现电机的控制可能需要一块微控制器,其实树莓派用python直接控制GPIO理论上应该也是可以的,我没试过,感兴趣的读者如果尝试成功了,欢迎和我们交流。我个人还是建议大家选个单片机,51的啊,stm32的啊都很好的,笔者使用的是飞思卡尔的FRDM-KE06Z,至于为啥选这个板子,真没什么特别要说明的,长的好看吧,讨人喜欢,有爱板网以前的评测为证:“传承并颠覆着——时尚潮“板” FRDM-KE06Z评测”所以说了这么多,要做这个机器人,需要树莓派一只,单片机一只,电机用步进电机还是舵机,这里面有一些细微的差别会影响到后面程序和机械结构的设计,到时候我会提到,大家不用太在意,最后这个机器人一定能做出来的,放心啦。

    2018年5月15日

    STEP2.针对机器人的树莓派软件环境搭建

    机械结构的实现放到后面来讨论,因为这里面有一块和程序密切相关。今天要解决的是树莓派上软件环境的搭建,我们需要用到python3(包括python3的虚拟环境和RPi.GPIO模块)、魔方解算程序kociemba和OpenCV。

    Python3的虚拟环境。我们使用python3的pyvenv,创建一个MyProjects文件夹,cd进去,运行命令:

    1. pi@raspberrypi:~/MyProjects $ pyvenv venv
    复制代码

    楼主使用的是2018-04-18-raspbian-stretch,sudo apt update和upgrade过后,能直接使用。

    之后激活虚拟环境,用如下命令:

    1. pi@raspberrypi:~/MyProjects $ source ./venv/bin/activate
    复制代码

    如果成功,则新的提示符前端会带上(venv),像这样:

    1. (venv) pi@raspberrypi:~/MyProjects $
    复制代码

    然后我们来看一下$PATH:

    1. (venv) pi@raspberrypi:~/MyProjects $ echo$PATH
    2. bash: echo/home/pi/MyProjects/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games: No such file or directory
    复制代码

    之后我们推出虚拟环境,用deactivate命令,推出后提示符前端的(venv)会消失,再看一下本来的$PATH:

    1. (venv) pi@raspberrypi:~/MyProjects $ deactivate
    2. pi@raspberrypi:~/MyProjects $ echo$PATH
    3. bash: echo/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games: No such file or directory
    复制代码

    两次的PTAH不一样,这样在虚拟环境中所做的更改不会影响到虚拟环境外面,这么做的好处在下面我们讨论编译安装OpenCV的时候会很明显。以上所有操作附个图,让大家有个直观印象。

    pyvenv

    pyvenv

    2018年5月30日



    树莓派的SWAP分区修改。由于OpenCV在编译时会大量使用内存和SWAP分区,常规的编译会导致内存和SWAP分区用尽进而系统失去响应。所以最好的方法是使用更大的SWAP分区。在树莓派上常用的更改交换分区大小的方法有两种,一种是仅在当前开机状态下有效的更改,这种更改在下次开机时会失效,系统SWAP分区会变回默认的100MB;另一种是一次更改永久生效的方法。鉴于本次修改只是为了编译OpenCV,我们使用第一种方法。注意,SWAP分区的大小可以使用htop命令查看,改软件可能需要通过apt安装才能使用。

    首先,进入到/var文件夹,ls命令可以看到swap文件。

    1. cd /var && ls
    复制代码

    swap1

    swap1

    然后,卸载swap文件。

    1. sudo swapoff swap
    复制代码

    接着使用htop可以看到swap变为0K,这就是成功了。

    swap2

    swap2

    然后我们创建一个更大的swap文件,使用下述命令:

    1. sudo dd if=/dev/zero of=swap bs=1M count=2048
    复制代码

    其中,count是新swap文件的大小,单位是bs参数中的1M,2048就是2GB。该命令完成需要四分钟左右,完成之前可以看到读写SD卡的绿色灯常亮。完成后的截图应该是这样的。

    swap3

    swap3

    之后装载新的swap文件,命令如下:

    1. sudo mkswap swap
    复制代码

    可以在htop中看到新的swap分区大小为1.75GB,嗯,这样就成功了。

    swap4

    swap4

    下面我们开始在树莓派上正式编译安装OpenCV3。

    2018年6月5日


    树莓派3b编译安装OpenCV-3.4.1。这一部分涉及的操作是配置软件环境步骤里最多的,我在经验频道单独写了一篇经验,请跳转完成剩下的操作:树莓派3b编译安装完整OpenCV-3.4.1 for Python3(http://jingyan.eeboard.com/article/76476),包过包教会。请先完成OpenCV的编译安装,测试无误后我们接着做后面的准备。到这里软件环境的搭建就过一半了,剩下的都是很简单的操作,将在下次更新。

    opencv

    opencv

    2018年7月3日


    STEP3.颜色识别初探

    这次要更新的是魔方颜色识别的相关内容。大家都知道魔方共有六种颜色,那么只要我们的程序能够从拍摄的照片中提取出魔方的内容,再将六种颜色识别出来即可,颜色识别的结果是有54个值的颜色序列。方法有很多种,先介绍对图像处理技术要求并不高的方法,该方法适合没有图像处理经验的朋友或者刚开始接触图像处理的朋友。这里有两个概念需要明确,第一,从一张完整的照片中提取出魔方的内容,并不一定需要高大上的算法来识别,如果拍摄魔方六个面时,可以做到每个面相对摄像头的位置都是固定的,那么恭喜,只需要从每张照片的特定部分将魔方的内容抠出来即可,这样就巧妙地规避了魔方识别的技术问题。第二,识别魔方的颜色,并不是要让计算机判断出具体的颜色是什么。举个例子,如果在一个打乱的魔方中,把所有红色和所有绿色对换,那么对魔方的解法,一般而言,其实不会产生任何影响。所以我们只需要让计算机能分辨出六种颜色即可,而不必在意具体的颜色是什么。认真点说,我们需要的是魔方的状态,而不是颜色,颜色只是状态的表现形式而已,所以最后能识别出颜色“A\B\C\D\E\F”就可以很好地完成任务啦。当然,基本的图像处理的技能还是需要的,这就是我们为什么需要OpenCV的原因。我们需要使用Python调用OpenCV中的图像裁切,变换和滤波。

    首先熟悉一下计算机中颜色的表示方法,第一个是RGB,将颜色表示为红绿蓝三种颜色占比不同所得到的数组[R,G,B],这个大家都知道,简单易懂。第二个是灰度图像,即,将彩色照片转换为灰度照片,用一个像素有多黑来表示颜色,每个像素表示为一个接近黑的百分比数值,可以理解为[G%]。这样就提供了一个思路,将魔方的六个面拍下来,裁切出我们需要的部分,滤波,对每张照片裁切出的魔方内容,设计算法将RGB颜色转换为灰度颜色,再处理九个颜色块,最终得到用灰度表示的9个值的颜色序列。再将6*9=54个值的灰度颜色序列放到一起,使用查表方法将54个颜色值分为6类,就得到我们需要的颜色序列啦,颜色序列其实是魔方的状态。具体需要用到的函数请参考OpenCV的文档,这里就不给出实例啦。直接上图。

    魔方颜色识别

    魔方颜色识别

    有经验的朋友可能会发现使用这种RGB转灰度的方式,识别效果受周围环境影响很大,当然,这只是最简单的一种方法,查表法局限性比较大,准确性不高。想要提高准确性,可以在滤波上下功夫,用聚类算法替换查表法,这样效果会有一定提升。当然还有高级一些的方法,大家仁者见仁智者见智,这里就不写出来啦,欢迎到评论区留言讨论。今天就先到这里啦,下次重点更新魔方机器人的核心算法,即如何用颜色序列求出解魔方步骤的关键更新,敬请期待。

    2019年3月8日




    回复

    使用道具 举报

    主题

    好友

    2682

    积分

    进士

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 250 天

    连续签到: 22 天

    [LV.8]以坛为家I

    发表于 2018-12-20 22:07:14 |显示全部楼层
    回复

    使用道具 举报

    主题

    好友

    2682

    积分

    进士

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 250 天

    连续签到: 22 天

    [LV.8]以坛为家I

    发表于 2019-3-9 10:39:48 |显示全部楼层
    本次更新了颜色识别的基础理论,下次重点更新魔方机器人的核心算法,即如何用颜色序列求出解魔方步骤的关键更新,敬请期待。
    回复

    使用道具 举报

    主题

    好友

    5188

    积分

    状元

    该用户从未签到

    发表于 2018-2-27 11:21:14 |显示全部楼层
    本帖最后由 ky123 于 2018-2-27 11:25 编辑

    先感谢分享,Python现在大火,我室友也在学呢。
    然后预祝你过初审。
    最后,可依教你什么情况下大家喜欢留言。
    第一,技术问题询问;
    第二,附件隐藏,评论可见。

    作为楼主,可控的是第二条。从操作上讲,你会不会隐藏呀?
    t01e57d0206a0c30d11.jpg


    回复

    使用道具 举报

    主题

    好友

    2682

    积分

    进士

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 250 天

    连续签到: 22 天

    [LV.8]以坛为家I

    发表于 2018-2-27 14:16:16 |显示全部楼层
    ky123 发表于 2018-2-27 11:21
    先感谢分享,Python现在大火,我室友也在学呢。
    然后预祝你过初审。
    最后,可依教你什么情况下大家喜欢留言 ...

    为了看到更多的留言,这种操作是需要的呢
    12505728334358455516198F93AD17A68984B28D96.jpg
    回复

    使用道具 举报

    主题

    好友

    5188

    积分

    状元

    该用户从未签到

    发表于 2018-2-27 14:30:07 |显示全部楼层
    Litthins 发表于 2018-2-27 14:16
    为了看到更多的留言,这种操作是需要的呢

    是也
    t018f1133b5b1c18ab9.jpg

    回复

    使用道具 举报

    主题

    好友

    41

    积分

    白丁

    该用户从未签到

    发表于 2018-2-28 09:43:22 |显示全部楼层
    预祝你过初审,期待楼主更新。
    回复

    使用道具 举报

    主题

    好友

    2682

    积分

    进士

  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 250 天

    连续签到: 22 天

    [LV.8]以坛为家I

    发表于 2018-3-2 22:49:51 |显示全部楼层
    szlbz 发表于 2018-2-28 09:43
    预祝你过初审,期待楼主更新。

    谢谢,目前正积极准备答辩材料,机器人零件正在安排3d打印,预计下周能出答辩结果。
    回复

    使用道具 举报

    匿名  发表于 1970-1-1 08:00:00
    post_deleted
    回复

    使用道具

    主题

    好友

    5188

    积分

    状元

    该用户从未签到

    发表于 2018-4-10 09:13:52 |显示全部楼层
    Litthins 发表于 2018-4-6 23:44
    冒个泡汇报一下进度
    我们的机器人现在解一个魔方大概需要25秒左右,速度相比半个月以前提升了300%
    图 ...

    叮,扣以的
    回复

    使用道具 举报

    主题

    好友

    3

    积分

    白丁

    该用户从未签到

    发表于 2018-4-19 23:21:53 |显示全部楼层
    预祝顺利,楼主厉害
    回复

    使用道具 举报

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

    关闭

    站长推荐上一条 /5 下一条

    手机版|爱板网

    GMT+8, 2019-3-18 22:39 , Processed in 0.161451 second(s), 24 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-5   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001056号

    Powered by Discuz!

    返回顶部