|
上節課程我們講述了如何通過Ubuntu+Qt進行振鏡校正(詳情點擊→開放式激光振鏡運動控製器在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支持ETHERNET、EtherCAT、USB、CAN、RS485、RS232等通訊接口,通過CAN、EtherCAT總線可以連接各個擴展模塊,從而擴展數字量、模擬量或運動軸。可以在windows,linux,Mac,Android,wince各種操作係統下開發,提供vc,c#,vb.net,labview等各種環境的dll庫,如下圖。上位機軟件編程參考《ZMotion PC函數庫編程手冊》。

02 Ubuntu+Qt進行文本標刻項目的開發
(一)新建Qt項目並添加函數庫
1.在Qt Creator菜單選擇“文件”→“新建文件或項目...”,打開創建項目向導。選擇Application項目集,創建Qt Widgets Application項目,設置項目名稱和保存位置。

2.導入廠家提供的相關函數庫及頭文件。
(1)將zmotion.h和zmcaux.h、zmcaux.cpp以及libzmotion.so庫複製到新建的項目文件夾中。

(2)在Qt Creator選擇新建的Qt項目右擊選擇“添加庫...”→“外部庫”點擊下一步,將剛才複製到項目文件夾上的libzmotion.so庫文件導入到項目中。

(3)在Qt Creator下右擊新建的Qt項目,選擇“添加現有文件...”,將之前複製到項目文件下的libzmotion.so、zmotion.h、zmcaux.cpp以及zmcaux.h添加到項目中。

(4)函數庫添加成功後,打開pro文件可以看到相關的函數庫和頭文件信息。此時已經將例程需要用到的函數庫和頭文件都加入到項目中了,接下來開始實現例程。

(二)安裝Linux下字體引擎庫
1.FreeType字體引擎庫的安裝
字體引擎庫有很多,在例程中我們選擇使用FreeType字體引擎庫來進行字符輪廓解析。首先我們需要在Ubuntu環境中下載FreeType庫,在終端命令行中輸入sudo apt-get update和sudo apt-get install libfreetype6 libfreetype6-dev命令在線安裝FreeType庫,如下圖所示:

安裝完成後隻需要在使用時引入#include 頭文件即可。實現文本標刻的例程必須安裝字體引擎庫來解析字符,否則無法得到字符的關鍵點坐標,就無法完成標刻和繪製。
2.設置字體文件
FreeType庫(ku)沒(mei)有(you)掃(sao)描(miao)係(xi)統(tong)字(zi)體(ti)庫(ku)文(wen)件(jian)的(de)功(gong)能(neng),在(zai)進(jin)行(xing)輪(lun)廓(kuo)解(jie)析(xi)時(shi),需(xu)要(yao)將(jiang)字(zi)體(ti)文(wen)件(jian)傳(chuan)入(ru)。所(suo)以(yi)在(zai)正(zheng)式(shi)開(kai)始(shi)例(li)程(cheng)前(qian),需(xu)要(yao)把(ba)提(ti)前(qian)下(xia)載(zai)好(hao)的(de)字(zi)體(ti)文(wen)件(jian)放(fang)在(zai)項(xiang)目(mu)文(wen)件(jian)下(xia),方(fang)便(bian)解(jie)析(xi)字(zi)體(ti)時(shi)直(zhi)接(jie)使(shi)用(yong)。在(zai)當(dang)前(qian)項(xiang)目(mu)下(xia)新(xin)建(jian)一(yi)個(ge)字(zi)體(ti)文(wen)件(jian)夾(jia),將(jiang)提(ti)前(qian)下(xia)載(zai)好(hao)的(de)字(zi)體(ti)複(fu)製(zhi)到(dao)文(wen)件(jian)夾(jia)中(zhong),如(ru)下(xia)圖(tu)所(suo)示(shi):

03 文本標刻流程以及相關函數介紹
(一)文本繪製流程
文本的處理首先是需要將文本輪廓進行解析,對輪廓信息進行分解,輪廓信息中包含輪廓的類型,文本輪廓分為線段、二次貝塞爾曲線、三(san)次(ci)貝(bei)塞(sai)爾(er)曲(qu)線(xian),對(dui)於(yu)貝(bei)塞(sai)爾(er)曲(qu)線(xian)類(lei)型(xing)需(xu)要(yao)將(jiang)曲(qu)線(xian)分(fen)解(jie)為(wei)小(xiao)線(xian)段(duan)進(jin)行(xing)處(chu)理(li),可(ke)以(yi)控(kong)製(zhi)分(fen)解(jie)的(de)精(jing)度(du),將(jiang)所(suo)有(you)的(de)輪(lun)廓(kuo)線(xian)處(chu)理(li)完(wan)即(ji)代(dai)表(biao)已(yi)經(jing)完(wan)成(cheng)當(dang)前(qian)字(zi)符(fu)的(de)繪(hui)製(zhi)。

(二)相關函數接口介紹
1.加載和初始化字體文件

2.計算貝塞爾曲線的二次項係數
貝bei塞sai爾er曲qu線xian是shi通tong過guo控kong製zhi點dian來lai定ding義yi的de一yi種zhong曲qu線xian形xing狀zhuang,貝bei塞sai爾er曲qu線xian的de一yi個ge關guan鍵jian性xing質zhi是shi它ta是shi由you一yi組zu控kong製zhi點dian和he二er項xiang式shi基ji函han數shu組zu合he而er成cheng的de。二er項xiang式shi係xi數shu確que定ding了le每mei個ge控kong製zhi點dian在zai貝bei塞sai爾er曲qu線xian中zhong的de權quan重zhong。在zai計ji算suan貝bei塞sai爾er曲qu線xian上shang的de點dian時shi,每mei個ge控kong製zhi點dian的de貢gong獻xian由you其qi對dui應ying的de二er項xiang式shi係xi數shu乘cheng以yi相xiang應ying的de基ji函han數shu得de出chu。貝bei塞sai爾er曲qu線xian通tong過guo調tiao整zheng控kong製zhi點dian的de位wei置zhi和he二er項xiang式shi係xi數shu來lai實shi現xian各ge種zhong複fu雜za的de曲qu線xian形xing狀zhuang。

3.獲取貝塞爾曲線的點坐標

4.三次文件初始化

5.生成空移字符串

6.生成開光字符串

7.生成關光字符串

8.生成標刻點字符串

9.下載三次文件

10.通用命令執行接口

04 文本標刻的實現例程
文wen本ben標biao刻ke例li程cheng首shou先xian需xu要yao獲huo取qu到dao文wen本ben數shu據ju,獲huo取qu到dao外wai部bu輸shu入ru文wen本ben後hou,將jiang文wen本ben進jin行xing單dan個ge解jie析xi,生sheng成cheng字zi符fu輪lun廓kuo數shu據ju,接jie下xia來lai的de處chu理li就jiu是shi對dui輪lun廓kuo數shu據ju進jin行xing轉zhuan換huan,將jiang貝bei塞sai爾er曲qu線xian數shu據ju全quan部bu轉zhuan換huan為wei小xiao線xian段duan來lai處chu理li,最zui後hou將jiang小xiao線xian段duan相xiang連lian接jie,生sheng成cheng三san次ci文wen件jian字zi符fu串chuan,下xia載zai到dao控kong製zhi器qi中zhong,執zhi行xing標biao刻ke命ming令ling即ji可ke完wan成cheng文wen本ben的de標biao刻ke。
(1)將文本解析為輪廓數據,FreeType庫解析文本時需要對字符進行單個處理,將每個字符都進行解析輪廓。
//初始化輪廓數據
FT_Init_FreeType(&library);
const char* fontFilePath = gainFontFilePath(text_data.type);
FT_New_Face(library, fontFilePath, 0, &face);
// 獲取字符的索引
FT_UInt glyphIndex = FT_Get_Char_Index(face, charCode);
// 加載字符的輪廓信息
FT_Int32 loadFlags = FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP;
FT_Load_Glyph(face, glyphIndex, loadFlags);
// 獲取字形槽
FT_GlyphSlot glyphSlot = face->glyph;
// 獲取字形的輪廓信息
FT_Outline* outline = &glyphSlot->outline;
(2)jianglunkuoshujuzhuanhuanweixiaoxianduanshengchengsanciwenjianzifuchuan,duiyuxianduanshujukeyizhijietongguozuobiaoweizhishengchengsanciwenjianzifuchuan,duiyubeisaierquxianshuju,xuyaoxunhuanbianli,jiangsuoyouquxianshujuzhuanhuanweixiaoxianduanshuju,zuihoushengchengsanciwenjianzifuchuan。
//將所有輪廓數據遍曆,對不同類型的數據進行不同的處理
for(int n=0;n < outline->n_contours;n++)
{
LaserScan_z3p_EmptyMove(strFile3,startX,startY,markPara.JumpSpeed,corrJumpDelay);//空移到起點
LaserScan_z3p_OpenLight(strFile3,markPara.Io_value.emit_io,markPara.OpenDelay,markPara.MarkSpeed);//開光
tag = FT_CURVE_TAG(tags[0]); //判斷當前輪廓數據的類型
switch(tag)
{
case FT_CURVE_TAG_ON: //線段
{
LaserScan_z3p_Mark(strFile3,markPara.CorDelay,line,2);
}
case FT_CURVE_TAG_CONIC: //兩次貝塞爾曲線
{
ZPointF *pointData = new ZPointF[myVector.size()];
for (unsigned long i = 0; i <= myVector.size() - 1; ++i)
{
pointData[i] = myVector[i];
}
LaserScan_z3p_Mark(strFile3,markPara.CorDelay,pointData,myVector.size());//標刻
}
default: //三次貝塞爾曲線
{
ZPointF *pointData = new ZPointF[myVector.size()];
for (unsigned long i = 0; i <= myVector.size() - 1; ++i)
{
pointData[i] = myVector[i];
}
LaserScan_z3p_Mark(strFile3,markPara.CorDelay,pointData,myVector.size());//標刻
}
}
LaserScan_z3p_CloseLight(strFile3,markPara.Io_value.emit_io,markPara.CloseDelay,corrJumpDelay);//關光
}
(3)使用Free Type庫(ku)解(jie)析(xi)生(sheng)成(cheng)的(de)輪(lun)廓(kuo)坐(zuo)標(biao)點(dian),是(shi)按(an)照(zhao)內(nei)部(bu)矩(ju)陣(zhen)的(de)像(xiang)素(su)位(wei)置(zhi)決(jue)定(ding),暫(zan)時(shi)沒(mei)有(you)相(xiang)關(guan)的(de)函(han)數(shu)來(lai)調(tiao)整(zheng)起(qi)始(shi)點(dian)坐(zuo)標(biao)位(wei)置(zhi),但(dan)是(shi)在(zai)使(shi)用(yong)文(wen)本(ben)標(biao)刻(ke)時(shi),必(bi)須(xu)要(yao)確(que)定(ding)標(biao)刻(ke)的(de)起(qi)點(dian)位(wei)置(zhi),所(suo)以(yi)在(zai)例(li)程(cheng)中(zhong)的(de)實(shi)現(xian)方(fang)法(fa)是(shi)將(jiang)解(jie)析(xi)出(chu)的(de)的(de)坐(zuo)標(biao)位(wei)置(zhi)進(jin)行(xing)比(bi)較(jiao),得(de)到(dao)最(zui)小(xiao)的(de)X和Y坐標,將所有的輪廓坐標偏移最小坐標位置,保證起始點是在原點位置開始,後續可以通過更改起點位置來確定相對位置。
(4)三次文件字符串追加完成後,將三次文件下載到控製器中,進行文本標刻。
//初始化三次文件字符串
LaserScan_z3p_Init();
//生成文本標刻字符串
Z3p_process();
//回原點,打開急停信號,關閉激光器使能
LaserScan_z3p_EmptyMove(strFile3,0,0,markPara.JumpSpeed,corrJumpDelay);//空移到原點
//將三次文件字符串下載到控製器中
ZMC_DownMem3File(g_handle,strFile3.toLatin1().data(),strFile3.length(),"Zmc_text.z3p");
QString filePath = "Zmc_text.z3p";
QFile file(filePath);
//在當前項目下生成三次文件
if (file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream stream(&file);
stream << strFile3;
file.close();
QMessageBox::warning(this,"提示","3次文件生成成功!");
}
05 文本標刻的實現效果
1.建立控製器連接,設置激光器參數和工藝參數。

2.輸入需要標刻的文本,可以根據需要設置相關的文字屬性,下麵是輸入文字通過QPaint繪製的文本。

3.可以更改字體,文本開始位置以及設置傾斜屬性,下麵是設置後的效果。

4.點擊生成三次文件,選擇標刻圖形,下圖是通過示波器抓取的標刻數據。

|