设为首页收藏本站

[对决赛] 【EviMK】Intel Edison 全自动刀路转换 高速激光雕刻机

creatorz 发表于 2015-9-14 12:00:37 | 显示全部楼层 [复制链接]
11 6652
本帖最后由 creatorz 于 2015-9-23 19:33 编辑

克里斯安德森在《创客》一书中写到,创客有四大基本工具,CNC,3D扫描仪,3D打印机和激光雕刻机,前三者已经趋于普及,唯独桌面级激光雕刻机却始终处于初级阶段。

这一次,我们革新了以往的用户体验,将传统的电脑端生成刀路,送入雕刻机雕刻的过程完全简化,加入此端拍照,彼端自动开始雕刻的黑科技,采用Intel Edison平台+OpenCV视觉运算来实现TP、OpenCV自动处理、全自动生成刀路以及输送至我们的雕刻机完成相应的自动调焦雕刻工作。
QQ截图20150914114209.jpg

QQ截图20150914114140.jpg



我们在Edison上通过预编译的Ubuntu系统来作为OpenCV的运行平台,使用脚本调用完成我们的预定目标

QQ截图20150914114243.jpg

输入一张唯美的相片,轻击雕刻即可享受一键转换带来的轻松写意的用户体验

QQ截图20150914114232.jpg

而现在,我们带来了全新的高速激光雕刻机,采用Delta急速并联臂架构,自动对焦,配有全自动刀路生成程式,雕刻速度相比其他同级别架构提升10-20倍,令以往繁杂的激光雕刻准备工作变得轻松写意,飞掣凛然,使得桌面级激光雕刻机成为可能。
QQ截图20150914112856.jpg

我们团队曾参与多款国内顶级桌面级激光雕刻方案研发,在以往开发的精准架构CoreXY,H-Bot等驱动方案基础上加以革新,借此次中美Maker创意爆炸为契机,开发了这款以速度便捷为核心方向的机器,且匹配有普通Delta以及其他3D打印机的改造方案,每个人都可以在自己的3D打印机基础上加装我们的设备方案使其变为高速桌面级激光雕刻机,让创意在Maker手中更加具现化,游刃有余。

QQ截图20150914115056.jpg

QQ截图20150914114327.jpg

QQ截图20150914114337.jpg

QQ截图20150914114352.jpg

QQ截图20150914115142.jpg

如何让您的Edison开发进阶应用呢?下面就已本项目为例大致介绍一下技术细节

首先,intel Edison 是一块功能相当强大的开发板,其综合性能远超市面上的开发板,所以非常适合用来做进阶开发和图形处理,无论是存储性能还是X86架构都表现比树莓派之类的开发板优异,而现在大多数人把Edison作为Arduino来使用,也就是所谓的Edison as Arduino,这是非常浪费的事情。所以我更推荐把Edsion作为Liunx开发板来使用。


Edison自带了自主改进的Unix系统,当然有时候可能会出现不兼容其他系统应用的问题,所以我们把Edison装载了Ubuntu系统,这样可以兼容大部分应用程序,并且可以通过安装X-Windows以及连接CSK大大的USB显示器来实现图形化操作Edison,如下图所示,就是安装了Ubuntu以及连接了RoboPeak USB Display的演示


QQ截图20150914115031.jpg


首先需要一张容量大于16GB的TF卡,在电脑上使用LINUX虚拟机或者LINUX主机,随后在系统终端以SU权限查看挂载信息并将TF卡格式化为EXT4格式
  1. <font color="#000000" size="4">sudo fdisk -lu
  2. sudo fdisk /dev/sdb
  3. sudo mkfs -t ext4 /dev/sdb</font>
复制代码



将预编译的系统镜像写入TF卡,并进入Edison终端设置从TF卡启动系统即可完成环境配置
  1. <font size="4" color="#000000">fw_setenv myrootfs_emmc 'PARTUUID=012b3303-34ac-284d-99b4-34e03a2335f4'
  2. fw_setenv myrootfs '/dev/mmcblk1p1'
  3. fw_setenv do_boot_emmc 'setenv myrootfs ${myrootfs_emmc}; run do_boot'
  4. fw_setenv do_boot_sdcard 'setenv myrootfs ${myrootfs_sdcard}; run do_boot'
  5. </font>
复制代码



随后在安装好的Ubuntu平台上安装OpenCV所需的各个基本包,当然也需要预装一些运行库,如下:
  1. <font size="4" color="#000000">sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev libtiff4-dev cmake libswscale-dev libjasper-dev</font>
复制代码


随后就可以和开发普通Linux设备一样进行其他的开发,以下放出部分我们早期的图形处理算法,仅供作为例程参考:



  1. #include<opencv2/opencv.hpp>
  2. #include<opencv2/highgui/highgui_c.h>
  3. #include<opencv2/imgproc/imgproc.hpp>
  4. #include<iostream>
  5. #include<fstream>

  6. using namespace std;
  7. using namespace cv;
  8. int main(int argc,char *argv[])
  9. {
  10.   int camera_id = 0;
  11.   ofstream outfile;
  12.   outfile.open("Gcode.txt");

  13.   if(argc>1)
  14.   {
  15.     camera_id = atoi(argv[1]);
  16.   }

  17.   cv::VideoCapture cap(camera_id);
  18.   if(!cap.isOpened())
  19.   {
  20.     printf("failed to open the camera with id %d.\n",camera_id);
  21.     return -1;
  22.   }
  23.   cv::Mat frame;
  24.   cap>>frame;
  25.   imwrite("camera_captured.png",frame);

  26.   //Mat img = imread(argv[1],CV_LOAD_IMAGE_GRAYSCALE);
  27.   Mat edges;
  28.   cvtColor(frame, edges, CV_BGR2GRAY);
  29.   //blur(edges,edges,Size(3,3));
  30.   //Canny(edges,edges,50,100,3);

  31.   
  32. /*  MatIterator_<uchar> grayit, grayend;
  33.   for(grayit = edges.begin<uchar>(),grayend = edges.end<uchar>(); grayit != grayend; ++grayit)
  34.   {
  35.       if(*grayit==255)
  36.           {
  37.         *grayit = 0;
  38.           }
  39.           else
  40.           {
  41.             *grayit = 255;
  42.           }
  43.       //outfile<<(int)((uchar)(*grayit))<<endl;
  44.   }*/

  45. //Mat roi(edges, Rect(10,10,100,100));

  46. /*
  47. 640*480
  48. */

  49. Mat roi(edges,Rect(0,0,640,480));  

  50. /*
  51. 255:
  52. G1 X10 Y10(移动到起始位置)
  53. M106(开启激光)
  54. G1 X10 Y30(雕刻从10-30之间的路径)
  55. M107(关闭激光)
  56. G1 X10 Y40(移动到下一个位置)
  57. M106
  58. G1 X10 Y50
  59. M107

  60. */
  61. /*******************************************************/

  62. #define GrayScale 255        //frame 灰度级
  63.         int width = roi.cols;
  64.         int height = roi.rows;
  65.         int pixelCount[GrayScale]={0};
  66.         float pixelPro[GrayScale]={0};
  67.         int pixelSum = width * height, threshold = 0;
  68.         uchar* data = (uchar*)roi.ptr<uchar>();

  69.         //统计每个灰度级中像素的个数
  70.         for(int i = 0; i < height; i++)
  71.         {
  72.                 for(int j = 0;j < width;j++)
  73.                 {
  74.                         pixelCount[(int)data[i * width + j]]++;
  75.                 }
  76.         }

  77.         //计算每个灰度级的像素数目占整幅图像的比例
  78.         for(int i = 0; i < GrayScale; i++)
  79.         {
  80.                 pixelPro[i] = (float)pixelCount[i] / pixelSum;
  81.         }

  82.         //遍历灰度级[0,255],寻找合适的threshold
  83.         float w0, w1, u0tmp, u1tmp, u0, u1, deltaTmp, deltaMax = 0;
  84.         for(int i = 0; i < GrayScale; i++)
  85.         {
  86.                 w0 = w1 = u0tmp = u1tmp = u0 = u1 = deltaTmp = 0;
  87.                 for(int j = 0; j < GrayScale; j++)
  88.                 {
  89.                         if(j <= i)   //背景部分
  90.                         {
  91.                                 w0 += pixelPro[j];
  92.                                 u0tmp += j * pixelPro[j];
  93.                         }
  94.                         else   //前景部分
  95.                         {
  96.                                 w1 += pixelPro[j];
  97.                                 u1tmp += j * pixelPro[j];
  98.                         }
  99.                 }
  100.                 u0 = u0tmp / w0;
  101.                 u1 = u1tmp / w1;
  102.                 deltaTmp = (float)(w0 *w1* pow((u0 - u1), 2)) ;
  103.                 if(deltaTmp > deltaMax)
  104.                 {
  105.                         deltaMax = deltaTmp;
  106.                         threshold = i;
  107.                 }
  108.         }

  109. /***********************************************/

  110. MatIterator_<uchar> grayit, grayend;
  111.   for(grayit = roi.begin<uchar>(),grayend = roi.end<uchar>(); grayit != grayend; ++grayit)
  112.   {
  113.       if(*grayit<threshold)
  114.           {
  115.         *grayit = 0;
  116.           }
  117.           else
  118.           {
  119.             *grayit = 255;
  120.           }
  121.       //outfile<<(int)((uchar)(*grayit))<<endl;
  122.   }

  123. bool data_flag = false;
  124. int x = 0,y = 0;

  125. for(int i=0;i<roi.rows;++i)
  126. {
  127.     uchar * p = roi.ptr<uchar>(i);
  128.     for(int j=0;j<roi.cols;++j)
  129.     {   
  130.       y = -i+240;
  131.       x = j-320;

  132.       if(p[j]==0 && data_flag==false)
  133.       {
  134.          data_flag=true;
  135.          outfile<<"G"<<1<<" ";
  136.          outfile<<"X"<<x<<" ";
  137.          outfile<<"Y"<<y<<endl;

  138.          outfile<<"M"<<106<<endl;
  139.       }
  140.       else if(p[j]==0 && data_flag==true)
  141.       {
  142.          
  143.       }
  144.       else if(p[j]==255 && data_flag==true)
  145.       {

  146.          data_flag=false;
  147.          x=x-1;
  148.          outfile<<"G"<<1<<" ";
  149.          outfile<<"X"<<x<<" ";
  150.          x=x+1;
  151.          outfile<<"Y"<<y<<endl;
  152.          outfile<<"M"<<107<<endl;
  153.       }
  154.        //outfile<<(int)(p[j]);
  155.       /* outfile<<"{";
  156.        outfile<<i;
  157.        outfile<<",";
  158.        outfile<<j;
  159.        outfile<<":";
  160.        if(p[j]==255)
  161.          outfile<<0;
  162.        else
  163.          outfile<<"#";
  164.        outfile<<"}"<<endl;*/
  165.     }
  166.     data_flag=false;
  167. }
  168.   
  169.   outfile.close();
  170.   imwrite("converted.png",roi);
  171.   return 0;
  172. }
复制代码


在脚本开发完成以后,再编写自己的相应下位机接口控制程序,即可完成开发,实现自己精彩纷呈的Edison智慧应用。



EvilMaker团队简介:
数年前,我们与周围创意无穷,效率至上的小伙伴组建了EvilMaker团队,拥有无限的创造力和激情,善于迸发出令人意想不到的创意,精准可靠的完成项目,他们有些专注于EDA设计,有些专注于机械工程,工业设计,跨平台程序撰写,后期特效,美工布局,相互之间都是志同道合的挚友。正是因为对这些无上的热情和追求,才让我们相聚在一起,思维在一起,制造在一起,未来,我们将有无穷种可能。

When dark come to morning light , EvilMaker is about time to arrive。黑暗降临,是泼染了黎明,还是卷走了血雨腥风,我只知道有些人正在创造不为人知的创造者









发表于 2015-9-14 13:19:21 | 显示全部楼层
牛逼!
回复 支持 反对

使用道具 举报

发表于 2015-9-14 13:27:32 来自手机 | 显示全部楼层
z神大作!
回复 支持 反对

使用道具 举报

发表于 2015-9-14 14:15:12 | 显示全部楼层
怎么像软广告呢?
回复 支持 反对

使用道具 举报

发表于 2015-9-14 15:01:57 | 显示全部楼层
dsweiliang 发表于 2015-9-14 14:15
怎么像软广告呢?

23333,我们并不卖产品呀。。就是做着玩的~
回复 支持 反对

使用道具 举报

发表于 2015-9-14 15:16:04 | 显示全部楼层
creatorz 发表于 2015-9-14 15:01
23333,我们并不卖产品呀。。就是做着玩的~

求详细教程
回复 支持 反对

使用道具 举报

发表于 2015-9-14 21:06:50 | 显示全部楼层

对求详细教程。
回复 支持 反对

使用道具 举报

发表于 2015-9-17 10:59:04 | 显示全部楼层
Z神!!终于看到秀作品了!棒棒哒!
回复 支持 反对

使用道具 举报

发表于 2015-9-21 10:59:36 | 显示全部楼层
赞!NB!!!!先去申请知识产权保护~
回复 支持 反对

使用道具 举报

发表于 2015-9-21 17:35:58 | 显示全部楼层
求视频地址!
回复 支持 反对

使用道具 举报

发表于 2015-10-5 09:57:55 | 显示全部楼层
同求,激光雕刻的头不是有了么,商场看不到
回复 支持 反对

使用道具 举报

发表于 2016-6-13 09:57:41 | 显示全部楼层
激光头哪里买的?
回复 支持 反对

使用道具 举报

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

本版积分规则 允许回帖同步到新浪微博  

推荐阅读

精华导读




公司简介| 联系我们| 加入我们| 微博| 优酷| 英文网站| DF创客社区 ( 沪ICP备09038501号-4  
友情链接| 硬创邦| 花生壳社区| 模友之吧| 电子发烧友社区| 创客星球| 云汉电子社区| 电子工程网| 与非网| Arduino中文社区| 南极熊3D打印网|

上海智位机器人有限公司  沪ICP备09038501号-4   

Powered by Discuz! X3.1

Licensed Comsenz Inc.

返回顶部 返回列表