|
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進行振鏡校正軟件的開發
(一) 振鏡校正的目的
zhenjingbenshenzaizhizaoguochengzhonghuozhezaichangshijianshiyonghoukenenghuicunzaiyixiejibian,zhenjingxiaozhengdeyigezhuyaomudejiushijiancehexiuzhengzhexiejibian,yiquebaojiguangdejingdu。
通過定期的校正和調整,可以有效地管理和糾正振鏡的畸變,從而提高激光係統的整體性能和穩定性。

未進行振鏡校正時標刻的矩形

振鏡校正後標刻的矩形
(二)新建 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.預校正並標刻
原理: 預yu校xiao正zheng通tong過guo標biao刻ke圖tu形xing得de到dao實shi際ji的de標biao刻ke大da小xiao,通tong過guo實shi際ji的de大da小xiao計ji算suan出chu與yu目mu標biao標biao刻ke尺chi寸cun的de縮suo放fang比bi例li,當dang預yu校xiao正zheng的de實shi際ji大da小xiao和he目mu標biao標biao刻ke的de大da小xiao一yi致zhi時shi,可ke以yi進jin行xing采cai點dian操cao作zuo。
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.多點迭代校正的方式進行振鏡校正
原理: 多(duo)點(dian)迭(die)代(dai)校(xiao)正(zheng),通(tong)過(guo)實(shi)際(ji)測(ce)量(liang)得(de)到(dao)標(biao)刻(ke)點(dian)數(shu)據(ju),和(he)標(biao)準(zhun)點(dian)數(shu)據(ju)比(bi)較(jiao)可(ke)以(yi)直(zhi)觀(guan)的(de)看(kan)到(dao)誤(wu)差(cha),振(zhen)鏡(jing)校(xiao)正(zheng)函(han)數(shu)通(tong)過(guo)實(shi)際(ji)點(dian)數(shu)據(ju)對(dui)振(zhen)鏡(jing)進(jin)行(xing)校(xiao)正(zheng),在(zai)經(jing)過(guo)多(duo)次(ci)迭(die)代(dai)校(xiao)正(zheng)後(hou)可(ke)以(yi)明(ming)顯(xian)看(kan)出(chu)實(shi)際(ji)點(dian)位(wei)數(shu)據(ju)和(he)標(biao)準(zhun)點(dian)數(shu)據(ju)的(de)誤(wu)差(cha)減(jian)小(xiao)。
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, "警告", "數據可能不正確,請檢查數據\r\nyes表示退出校正\r\nno表示繼續校正", 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.根據校正文件進行振鏡校正
原理: xiaozhengwenjianbenzhishangshitongguoduodiandiedaixiaozhengshengchengde,jiangxiaozhengdianshujudoucunchuzaiwenjianzhong,tongguoduquxiaozhengwenjian,jiangshujuduchu,duizhenjingjinxingxiaozheng,ruowenjianxiaozhengwancunzaiqingweiwuchakeyitongguowenjianbuchangdiedaixiaozhengdefangshitigaoxiaozhengjingdu。
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)繼續測量標刻點的數據,導入點數據或手動添加到程序中,重複步驟二三提高校正精度。 若ruo精jing度du還hai是shi達da不bu到dao要yao求qiu,可ke以yi繼ji續xu加jia點dian迭die代dai校xiao正zheng來lai提ti高gao精jing度du,若ruo已yi達da到dao精jing度du則ze可ke以yi將jiang校xiao正zheng數shu據ju保bao存cun到dao校xiao正zheng文wen件jian中zhong,方fang便bian後hou續xu直zhi接jie使shi用yong文wen件jian校xiao正zheng。

2.文件校正方式進行振鏡校正
(1)選擇校正文件進行振鏡校正

(2)進jin行xing實shi際ji測ce量liang,若ruo測ce量liang數shu據ju無wu誤wu,則ze校xiao正zheng完wan成cheng。若ruo出chu現xian點dian位wei誤wu差cha可ke采cai取qu坐zuo標biao補bu償chang的de方fang式shi進jin行xing補bu償chang校xiao正zheng,將jiang補bu償chang值zhi填tian入ru,進jin行xing校xiao正zheng並bing標biao刻ke,重zhong新xin測ce量liang數shu據ju,可ke多duo次ci進jin行xing補bu償chang操cao作zuo,若ruo誤wu差cha過guo大da,或huo者zhe較jiao多duo點dian位wei存cun在zai問wen題ti,需xu要yao使shi用yong多duo點dian疊die加jia迭die代dai校xiao正zheng的de方fang式shi進jin行xing振zhen鏡jing校xiao正zheng。

完整代碼獲取地址
▼

本次,正運動技術開放式激光振鏡運動控製器在Ubuntu+Qt下的激光振鏡校正,就分享到這裏。
更多精彩內容請關注“ 正運動小助手 ”公眾號,需要相關開發環境與例程代碼,請谘詢正運動技術銷售工程師:400-089-8936。
本(ben)文(wen)由(you)正(zheng)運(yun)動(dong)技(ji)術(shu)原(yuan)創(chuang),歡(huan)迎(ying)大(da)家(jia)轉(zhuan)載(zai),共(gong)同(tong)學(xue)習(xi),一(yi)起(qi)提(ti)高(gao)中(zhong)國(guo)智(zhi)能(neng)製(zhi)造(zao)水(shui)平(ping)。文(wen)章(zhang)版(ban)權(quan)歸(gui)正(zheng)運(yun)動(dong)技(ji)術(shu)所(suo)有(you),如(ru)有(you)轉(zhuan)載(zai)請(qing)注(zhu)明(ming)文(wen)章(zhang)來(lai)源(yuan)。

正運動技術專注於運動控製技術研究和通用運動控製軟硬件產品的研發,是國家級高新技術企業。正運動技術彙集了來自華為、中(zhong)興(xing)等(deng)公(gong)司(si)的(de)優(you)秀(xiu)人(ren)才(cai),在(zai)堅(jian)持(chi)自(zi)主(zhu)創(chuang)新(xin)的(de)同(tong)時(shi),積(ji)極(ji)聯(lian)合(he)各(ge)大(da)高(gao)校(xiao)協(xie)同(tong)運(yun)動(dong)控(kong)製(zhi)基(ji)礎(chu)技(ji)術(shu)的(de)研(yan)究(jiu),是(shi)國(guo)內(nei)工(gong)控(kong)領(ling)域(yu)發(fa)展(zhan)最(zui)快(kuai)的(de)企(qi)業(ye)之(zhi)一(yi),也(ye)是(shi)國(guo)內(nei)少(shao)有(you)、完整掌握運動控製核心技術和實時工控軟件平台技術的企業。主要業務有:運動控製卡_運動控製器_EtherCAT運動控製卡_EtherCAT控製器_運動控製係統_視覺控製器__運動控製PLC_運動控製_機器人控製器_視覺定位_XPCIe/XPCI係列運動控製卡等等。
|