答辩后一直忙..又投入四轴的制作了..所以写资料的时间不多..
这个机器人做了半年... 刚开始别人看到都问,哪里买的??
后来好点.. 会问,东西怎么做的??
可是被一些觉得自己很懂行,但啥都不懂的师弟说. 这个网上制作教程很多,找找就一大堆.. 听着特别心酸...
还有些人说,魔方是扭到特定的形态才放进去的... 更是吐血....
不过的确.. 没这个经历的,不会感觉到制作过程的酸甜苦辣...
被师弟批得那么惨..你们要是觉得资料好找,那你们还是自己找去吧....
好了.. 吐槽完了...还是得解封一些从别的网站上找不到的东西..
此贴只是经验分享...嵌入式的设计在于软硬件的结合...参数调整,
所以这里具体的程序和硬件设计就先不发了,因为硬件设计过程多少有些bug..免得再被P了..
如果是真想做,动手能力强的,根据这个帖,应该来说做一个出来是不成问题的..
//==============================蛋疼的分割线===========================//
先介绍一下机械部分..
原料选取是选择这种..要找很简单,淘宝 "塑料条" 就有
这种材料优点是出来已经有孔,而且孔径和孔距误差不是很大,可以减少后面制作打孔数和减少对孔误差带来的尴尬..
因为塑料材料,很好切,烧热的刀也行,金刚锯片也行.一条条切开后就可以做组装机械臂的材料了.
如果怕对孔对不上的话,就数着图中过孔数来切割,就包没错了..前后上2mm的螺丝可以固死.
后面必须用180度大力舵机做扭动,不然会出问题.. 前面尽量用3kgcm以上的小舵机, 扭矩不够的容易抖舵,夹不稳..
机械结构一目了然了,应该不用说太多,找到买塑料条的地方的话,都能找到所有材料..
噢,对了,舵机的拉杆用的1mm钢棒,一般要另外找淘宝店..
来个中轴对准图.. 做机械臂最重要的是保证扭动舵机的输出轴和机械臂最终输出轴的中心一致,不然魔方会被扭散..
机械臂做好后就是做架子了.. 为了更稳固,我挑了3mm厚的铝合金条做外部支架.
这图中,舵机打孔的间距要计算好,就是根据你的魔方大小计算来打孔,因为魔方有很多尺寸,我这个尺寸只适合5.2cm的..
下来这一步不仅打孔要计算好魔方大小,而且要做好对轴中心对准..
再来个侧面图.. 这个当时拍的时侯只是装上去,没做仔细的对准
最后当然就是封顶了.. 也是一样,注意魔方尺寸和中轴对准.. 这个部分通常要多次校正.. 最繁琐的步骤.打孔不对又得重来.
来个最终的效果图.. 看着还是挺舒心的..
//==================================悲摧的分割线==================================//
下面讲讲软件识别的算法..
这个制作难主要难在完全基于STM32.. 不像电脑或者其他ARM9 CORTEX-A 等系列,有丰富的资源..
STM32做彩色视频的图像识别, 估计以前做的人也应该不会多..
先来一幅图..
这个是摄像头看到的图像...在液晶上显示..不小心刚好室友看着摄像头..(*^.^*)!...
稍微算一下.. 图片320x240,RGB565. 150多K.. 单片机RAM 48K...明显不可能存下来然后再转发上去...那如何保证刷新率和识别速度呢??
这个得动动脑筋..
其实要做显示不难, STM32有FSMC..直接将GPIO的数据马上扔给FSMC让他扫上屏幕, cpu超一点频,设置好各个信号的建立时间后.
保证显示完全没问题... 这里可能有人想到用DMA+FSMC会更好..
我只是做个大概的分析,没实验过.. 因为DMA传输一样需要争抢总线资源,而且还要等待定时器触发,仲裁等..
而且摄像头信号对时序特别敏感,即使使用DMA传输,中途一样不能争抢总线... 那我还不如将CPU资源都拿来扫屏好了,反正啥都干不了..
然后问题来了,扫上屏幕容易,因为写一个数据,内存指针会自动+1.. 但读就不是这么好读了..读取每个像素点,都要重新写地址,并且需要dummy read..
而且读出来还是BGR格式...相对于写一个像素点的时间来说,读取一次几乎需要耗费多7 8倍的时间..
写一幅图需要20ms的话.. 读取整幅图片估计100多ms才能读完,还没算处理的时间..如果全部加起来,很可能3fps的识别率都做不到.
要做到20ms写一场图像进去GRAM,然后在下20ms以内处理完,就需要读尽量少的点来完成任务...
其实在这里,对象很明显, 就是为了识别魔方.. 针对魔方的特性,对算法进行简化...
先看一下这个算法的识别效果.. 每秒25次的识别速度.. 其实要做到这样不难..
这里引用一下答辩PPT的部分内容..
首先是这个... 一开始,正幅图像,我只读取画面中间的十字架, 然后对RGB先做一下平滑滤波,这个是必须的..
然后判断RGB的跳变, 如果发现RGB全黑,就认为有一个凹槽.. 当X 和 Y 有且仅有2个凹槽,而且间距相等,基本可以认为有疑似魔方物体了.
这个算法比较好的是只要是中心块进去了,都能够识别,而不一定完完全全在中间才能识别...
计算到4个凹槽的坐标以后, 确定中心位置,为下一步做准备..
从上面计算的中心点开始,不断向外腐蚀, 腐蚀的疑似就是遇到相近RGB就吃掉..一直到边沿一个明显的跳变,就退出循环..
上下左右腐蚀完就能得到色块大概的长宽和中心位置了..
利用上面中心色块的大小和坐标关系,可以估计其余8个色块大概位置,如白色框所示...
将这8个估计中心位置递归到中心追踪的那个函数, 可以重新跟踪8个色块全部的位置,得到大小和坐标..
最后一步.. 因为如上面所说,一开始只是认为是疑似魔方物体,但不确定,在这步中,就是要计算9个色块的相对位置
这个计算方法很多,计算X相对,Y相对,或者以中心为圆心,其余4个棱和4个角在不在同一圆上等.. 随便你..
这一步是为了确认到底摄像头看到的是不是魔方..如果确认了,就将9个中心点递归到下次开始腐蚀的中心..
通过这样不停递归,就可以计算出魔方各个色块每时每刻的位置了..
其实腐蚀中, 吃掉的过程,其实是将RGB值累加起来, 然后十字腐蚀完以后,将累加值除以累加数求平均,可以得到比较好的滤波效果
得到RGB以后,是无法直接靠RGB来判断色块颜色的, 需要转换颜色系..
这里给大家点资料
http://cdc.tencent.com/?p=3760
http://zh.wikipedia.org/zh/HSL%E ... 9%E7%A9%BA%E9%97%B4
这两个是介绍 HSL颜色系的.. 看完就懂了,很简单..
这里要做的处理就是将 RGB数据转换到 HSL 颜色系, 通过色相角和亮度对魔方颜色进行判断.
下面是程序运行的截图.
图中,左下角有个小魔方色块,就是腐蚀后取平均的结果, 右上角是每个色块的色相角,右下角是色块的亮度值
右边中间是识别结果 1-黄 2-蓝 3-白 4-绿 5-红 6-橙. 仔细会发现红色和橙色色相角是差不多,这个可以结合亮度数据排序分辨..
得到各个色块的颜色后,建模,写还原算法就不难了... 这个大家想省时间的话,可以上网找算法去, 自己写也不难.
按着CFOP手法来写, 一个星期左右就能写好了... 因为魔方是固定的东西,什么模式,多少种解法是定的..
图像处理才是难点...
最后上一个视频吧..
先就写到这里了...整个设计其实难度不高, 只是想算法的时侯,得换个角度想,怎么样来得简单,但同时保证稳定性..
嵌入式的设计在于软硬件的结合...参数调整,所以这里程序和硬件就先不发了,因为硬件设计过程多少有些bug..免得再被P了..
整体思路了解就好..
转载
|