开放式激光振镜运动控制器在Ubuntu+Qt下的激光振镜校正

电子说

1.3w人已加入

描述

Ubuntu是一款免费且开源的操作系统,基于强大的Linux内核,它支持多用户、多任务、多线程操作,拥有多CPU架构,可以简化开发过程,具备出色的移植性。

今天,正运动小助手给大家分享一下Ubuntu下基于QT的激光振镜的校正。在正式学习之前,我们先了解一下正运动ZMC408SCAN-V22运动控制器,ZMC408SCAN-V22支持在Linux环境进行开发使用。

01 ZMC408SCAN-V22硬件介绍

ZMC408SCAN-V22是正运动技术推出的高性能双振镜运动控制器,集成了2个百兆以太网口,支持EtherCAT、EtherNET、CAN、RS232、RS485、24路通用数字输入、20路通用数字输出、2路通用模拟量输出、2路通用模拟量输入、4个本地差分脉冲轴接口、1个MPG手轮编码器接口、2个带反馈振镜接口、1个LASER激光专用接口、1个FIBER激光器接口。开放式系统框图如下所示:

激光振镜

ZMC408SCAN-V22总线控制器支持EtherCAT总线连接,支持最快500μs的刷新周期,支持最多达16轴运动控制,支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴设置等;采用优化的网络通讯协议可以实现实时的运动控制。

激光振镜

ZMC408SCAN-V22通过CAN、EtherCAT总线可以连接各个扩展模块,从而扩展数字量、模拟量或运动轴。可以在

Windows,Linux,Mac,Android,Wince各种操作系统下开发,提供vc,c#,vb.net,labview等各种环境的dll库。上位机软件编程参考《ZMotion PC函数库编程手册》。

激光振镜

02 Linux下使用Ubuntu+Qt进行振镜校正软件的开发

(一)振镜校正的目的

振镜本身在制造过程中或者在长时间使用后可能会存在一些畸变,振镜校正的一个主要目的就是检测和修正这些畸变,以确保激光的精度。

通过定期的校正和调整,可以有效地管理和纠正振镜的畸变,从而提高激光系统的整体性能和稳定性。

激光振镜未进行振镜校正时标刻的矩形激光振镜振镜校正后标刻的矩形

(二)新建Qt项目并添加函数库

1.在Qt Creator菜单选择“File”→“New File or Project...”,打开创建项目向导。选择Application项目集,创建Qt Widgets Application项目,设置项目名称和保存位置。

激光振镜

2.导入厂家提供的相关函数库及头文件。

(1)将zmotion.h和ZScancorrect.h头文件、zmcaux.cpp和zmcaux.h以及libzmotion.so和libZScanCorrect.so库复制到新建的项目文件夹中。

激光振镜

(2)在Qt Creator选择新建的Qt项目右击选择“Add Library...” → “External library”点击next,将刚才复制到项目文件夹上的libzmotion.so和libZScanCorrect.so库文件导入到项目中。

激光振镜

(3)在Qt Creator下右击新建的Qt项目,选择“Add Existing Files...”,将之前复制到项目文件下的头文件zmotion.h和ZScancorrect.h以及zmcaux.cpp和zmcaux.h添加到项目中。

激光振镜

(4)函数库添加成功后,打开pro文件可以看到相关的函数库和头文件信息。

激光振镜

03 振镜校正例程流程和相关函数介绍

1.振镜校正流程图

激光振镜

2.主要函数的介绍

(1)取消校正

激光振镜

(2)下载三次文件

激光振镜

(3)多点迭代校正

激光振镜

(4)保存校正数据到文件

激光振镜

(5)读取校正文件

激光振镜

(6)使用校正文件进行校正

激光振镜

(7)误差补偿后校正

激光振镜

(8)相关错误码

激光振镜

04 振镜校正例程的实现及原理

1.预校正并标刻

原理:预校正通过标刻图形得到实际的标刻大小,通过实际的大小计算出与目标标刻尺寸的缩放比例,当预校正的实际大小和目标标刻的大小一致时,可以进行采点操作。

void MainWindow::on_beforeCheck_mark_clicked()
{    
   if( 0 == g_handle)    
   {
       QMessageBox::warning(this,"提示","控制器未连接!");        
       return;    
   }    
   dataRenew();    //更新获取页面数据    
   ZScan_CancelCorrect(g_handle, ui- >scan_list- >currentIndex(), ui- >Units- >text().toDouble(), 1.0, tableStartNum);    // 先取消校正    
   int RowNum = sqrt(countRow());//获取当前选择的校正点数    
   QString strFile3 = CreateMakingString(RealCorrectSizeX, RealCorrectSizeY, RowNum, XLineLenght, YLineLenght);    // 生成三次文件字符串    
   Down3File(strFile3);     // 下载三次文件到控制器中    
   // 刷新列表,将列表数据插入为标准点坐标    
   model- >removeRows(0, model- >rowCount());    
   ZPoint *tmp = pointData(RowNum,dScanSize);    
   for (int i = 0; i < RowNum * RowNum; i++)    
   {        
       QList rowItems;        
       rowItems < < new QStandardItem(QString::number(tmp[i].x,'f',3))< < new QStandardItem(QString::number(tmp[i].x,'f',3))< < new QStandardItem(0,'f',3))< < new QStandardItem(0,'f',3);        
       model- >insertRow(i, rowItems);    
   }    
   delete [] tmp;    
   PreCorrectFlag = 0;//标记为预校正
}

2.多点迭代校正的方式进行振镜校正

原理:多点迭代校正,通过实际测量得到标刻点数据,和标准点数据比较可以直观的看到误差,振镜校正函数通过实际点数据对振镜进行校正,在经过多次迭代校正后可以明显看出实际点位数据和标准点数据的误差减小。

bool MainWindow::ScanCorrection(int MakingRowNum)
{    
   //通过点数数据,进行振镜校正    
   memset(PointDataX, 0, MakingRowNum);    
   memset(PointDataY, 0, MakingRowNum);    
   int cur_item = model- >rowCount();    // 检查当前数据项数量是否正确    
   if (cur_item != MakingRowNum)    
   {       
       QMessageBox::critical(this, "错误", "数据错误");       
       return false;    
   }    
   for (int row = 0; row < MakingRowNum; ++row)//将所有点数据取出,进行多点校正    
   {        
       QStandardItem *item = model- >item(row, 2);        
       PointDataX[row] = item ? item- >text().toDouble() : 0.0;        
       item = model- >item(row, 3);        
       PointDataY[row] = item ? item- >text().toDouble() : 0.0;    
   }    
   // 检测数据是否正确    
   if (!CheckCorrectData(MakingRowNum,PointDataX,PointDataY))    
   {       
       if (QMessageBox::question(this, "警告", "数据可能不正确,请检查数据rnyes表示退出校正rnno表示继续校正", QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)       
       {           
           return false;       
       }    
   }    
   double x1 = -RealCorrectSizeX / 2;    
   double y1 = -RealCorrectSizeY / 2;    
   double x2 = RealCorrectSizeX / 2;    
   double y2 = RealCorrectSizeY / 2;    
   // 调用 ZScan_CorrectMorePtIter 函数,传递适当的参数    
   int ret = ZScan_CorrectMorePtIter(g_handle, ui- >scan_list- >currentIndex(), PointDataX, PointDataY, ui- >checkBox- >isChecked(), sqrt(countRow()), ui- >Units- >text().toDouble(),x1, y1, x2, y2, ui- >mark_Size- >text().toDouble(), 1.0, tableStartNum, PreCorrectFlag);    
   if (CheckError(ret, "ZScan_CorrectMorePtIter"))        
       return false;    
   PreCorrectFlag = 1;    
   return true;
}

3.根据校正文件进行振镜校正

原理:校正文件本质上是通过多点迭代校正生成的,将校正点数据都存储在文件中,通过读取校正文件,将数据读出,对振镜进行校正,若文件校正完存在轻微误差可以通过文件补偿迭代校正的方式提高校正精度。

void MainWindow::on_but_Check_clicked()
{    
   if( 0 == g_handle)    
   {        
       QMessageBox::warning(this,"提示","控制器未连接!");        
       return;    
   }    
   QString fileName = QString::fromStdString(ui- >file_Route- >text()    
   .toLatin1().data());    
   if (fileName.isEmpty())    
   {        
       QMessageBox::critical(this, "错误", "请先选择矫正文件!");        
       return;    
   }    
   if (ChangeDirMode == 1)    
   {        
       // 设置 X 和 Y 方向的步进比例        
       int ret = 0;        
       if (ui- >x_Dir- >text().toInt() == -1)        
       {            
           ret = ZAux_Direct_StepRatio(g_handle, markpara.AxisList[0], 1, -1);        
       }        
       else        
       {            
           ret = ZAux_Direct_StepRatio(g_handle, markpara.AxisList[0], 1, 1);        
       }        
       if (ret != 0)        
       {            
           QMessageBox::critical(this, "错误", QString("文件校正失败  X方向设置失败   错误码:%1").arg(ret));            
           return;        
       }        
       if (ui- >y_Dir- >text().toInt() == -1)        
       {            
           ret = ZAux_Direct_StepRatio(g_handle, markpara.AxisList[1], 1, -1);        
       }        
       else        
       {            
           ret = ZAux_Direct_StepRatio(g_handle, markpara.AxisList[1], 1, 1);        
       }        
       if (ret != 0)        
       {            
           QMessageBox::critical(this, "错误", QString("文件校正失败  Y方向设置失败   错误码:%1").arg(ret));            
           return;        
       }    
   }    
   int rest = ZScan_CorrectFromFile(g_handle, fileName.toLatin1().data(), scanNum, tableStartNum);//使用校正文件进行振镜校正    
   if (rest != 0)    
   {        
       QMessageBox::critical(this, "错误", QString("文件校正错误   错误码:%1").arg(rest));    
   }    
   else    
   {        
       QMessageBox::information(this, "信息", "文件校正完成");    
   }
}

05 通过振镜校正例程对激光振镜进行校正

1.多点迭代校正方式进行振镜校正

(1)连接到控制器,并进行工艺参数设置,根据实际激光器类型和IO参数以及标刻参数进行设置。

激光振镜

(2)输入需要实际标刻的尺寸,进行预校正标刻,使用预校正标刻的实际XY测量值来计算缩放比例,可以进行多次预校正标刻和测量,计算出较为精准的比例,这里的误差越小,后续校正的次数将会减少。

激光振镜

(3)通过导入点数据或者手动填入点数据,进行标刻并校正,可以通过与标准点坐标数据对比,直观看到误差。

激光振镜

(4)继续测量标刻点的数据,导入点数据或手动添加到程序中,重复步骤二三提高校正精度。若精度还是达不到要求,可以继续加点迭代校正来提高精度,若已达到精度则可以将校正数据保存到校正文件中,方便后续直接使用文件校正。

激光振镜

2.文件校正方式进行振镜校正

(1)选择校正文件进行振镜校正

激光振镜

(2)进行实际测量,若测量数据无误,则校正完成。若出现点位误差可采取坐标补偿的方式进行补偿校正,将补偿值填入,进行校正并标刻,重新测量数据,可多次进行补偿操作,若误差过大,或者较多点位存在问题,需要使用多点叠加迭代校正的方式进行振镜校正。

激光振镜

本次,正运动技术开放式激光振镜运动控制器在Ubuntu+Qt下的激光振镜校正,就分享到这里。

更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师。

本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分