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下的激光振鏡校正,就分享到這里。
更多精彩內容請關注“正運動小助手”公眾號,需要相關開發環境與例程代碼,請咨詢正運動技術銷售工程師。
本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。
審核編輯 黃宇
-
運動控制器
+關注
關注
2文章
380瀏覽量
24518 -
Ubuntu
+關注
關注
5文章
550瀏覽量
29269 -
開放式
+關注
關注
0文章
23瀏覽量
9179 -
激光振鏡
+關注
關注
1文章
16瀏覽量
3255
發布評論請先 登錄
相關推薦
評論