开放式激光振镜运动控制器在Ubuntu+Qt下的文本标刻

开放式激光振镜运动控制器在Ubuntu+Qt下的文本标刻

上节课程我们讲述了如何通过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 <ft2build.h>头文件即可。实现文本标刻的例程必须安装字体引擎库来解析字符,否则无法得到字符的关键点坐标,就无法完成标刻和绘制。

2.设置字体文件

FreeType库没有扫描系统字体库文件的功能,在进行轮廓解析时,需要将字体文件传入。所以在正式开始例程前,需要把提前下载好的字体文件放在项目文件下,方便解析字体时直接使用。在当前项目下新建一个字体文件夹,将提前下载好的字体复制到文件夹中,如下图所示:
在这里插入图片描述

03 文本标刻流程以及相关函数介绍

(一)文本绘制流程
文本的处理首先是需要将文本轮廓进行解析,对轮廓信息进行分解,轮廓信息中包含轮廓的类型,文本轮廓分为线段、二次贝塞尔曲线、三次贝塞尔曲线,对于贝塞尔曲线类型需要将曲线分解为小线段进行处理,可以控制分解的精度,将所有的轮廓线处理完即代表已经完成当前字符的绘制。

在这里插入图片描述

(二)相关函数接口介绍
1.加载和初始化字体文件
在这里插入图片描述

2.计算贝塞尔曲线的二次项系数

贝塞尔曲线是通过控制点来定义的一种曲线形状,贝塞尔曲线的一个关键性质是它是由一组控制点和二项式基函数组合而成的。二项式系数确定了每个控制点在贝塞尔曲线中的权重。在计算贝塞尔曲线上的点时,每个控制点的贡献由其对应的二项式系数乘以相应的基函数得出。贝塞尔曲线通过调整控制点的位置和二项式系数来实现各种复杂的曲线形状。
在这里插入图片描述

3.获取贝塞尔曲线的点坐标
在这里插入图片描述

4.三次文件初始化
在这里插入图片描述

5.生成空移字符串
在这里插入图片描述

6.生成开光字符串
在这里插入图片描述

7.生成关光字符串
在这里插入图片描述

8.生成标刻点字符串
在这里插入图片描述

9.下载三次文件
在这里插入图片描述

10.通用命令执行接口
在这里插入图片描述

04 文本标刻的实现例程

文本标刻例程首先需要获取到文本数据,获取到外部输入文本后,将文本进行单个解析,生成字符轮廓数据,接下来的处理就是对轮廓数据进行转换,将贝塞尔曲线数据全部转换为小线段来处理,最后将小线段相连接,生成三次文件字符串,下载到控制器中,执行标刻命令即可完成文本的标刻。
(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)将轮廓数据转换为小线段生成三次文件字符串,对于线段数据可以直接通过坐标位置生成三次文件字符串,对于贝塞尔曲线数据,需要循环遍历,将所有曲线数据转换为小线段数据,最后生成三次文件字符串。

//将所有轮廓数据遍历,对不同类型的数据进行不同的处理
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库解析生成的轮廓坐标点,是按照内部矩阵的像素位置决定,暂时没有相关的函数来调整起始点坐标位置,但是在使用文本标刻时,必须要确定标刻的起点位置,所以在例程中的实现方法是将解析出的的坐标位置进行比较,得到最小的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.点击生成三次文件,选择标刻图形,下图是通过示波器抓取的标刻数据。
在这里插入图片描述

5.文本标刻效果演示。

开放式激光振镜运动控制器在Ubuntu+Qt下的文本标刻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/421780.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

F12抓包08:查看网站Cookie

课程大纲 1、查看Cookie 1. 应用界面查看&#xff1a;按F12进入浏览器的开发者模式 - “应用”&#xff08;Application&#xff09; - Cookie&#xff0c;可查看Cookie并进行增、删、改、查操作。 2. 控制台命令行查看&#xff1a;按F12进入浏览器的开发者模式 - “控制台”&…

2025年第八届计算机图形和虚拟国际会议(ICCGV 2025)即将召开!

2025年第八届计算机图形和虚拟国际会议&#xff08;ICCGV 2025&#xff09;将于2025年2月21-23日在中国成都举行。随着信息技术的飞速发展&#xff0c;计算机图形学与虚拟现实技术正以前所未有的速度重塑着我们的认知世界与交互体验。从沉浸式游戏到精准医疗模拟&#xff0c;从…

坐牢第三十八天(Qt)

1、使用Qt绘画事件处理画一个闹钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QPaintEvent>//画画处理事件 #include <QPainter>//画画 #include <QTime> //时间类 #include <QTimer>…

电流互感器电压互感器

一&#xff0c;电流互感器 用途&#xff1a;对信号做精确采样和适当补偿功能&#xff0c;方便对5A以内的交流电进行信号采集。主要作用就是对电流进行测量和取样。 扩展&#xff1a;对应输出模拟交流信号可以调节&#xff0c;可根据电位器&#xff08;调节放大比例&#xff0…

Ali_Yun Port

Ali_Yun Port 云服务器端口

基于云原生向量数据库 PieCloudVector 的 RAG 实践

近年来&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;已然成为最热门的话题之一。工业界出现了各种内容生成工具&#xff0c;能够跨多种模态产生多样化的内容。这些主流的模型能够取得卓越表现&#xff0c;归功于创新的算法、模型规模的大幅扩展&#xff0c;以及海…

FlinkCDC 3.2.0 新增优点 Pattern Replacement in routing rules

新增优点&#xff1a;Pattern Replacement in routing rules flinkcdc 3.2.0版本相较于3.1.0版本&#xff0c;避免了多表多sink多次写 route 路由的麻烦&#xff0c;类似于统一前后缀的形式多表多sink&#xff0c;通过<>正则&#xff0c;大大减少了书写 官网&#xff1…

【干货分享】Ftrans安全数据交换系统 搭建跨网数据传输通道

安全数据交换系统是一种专门设计用于在不同的网络、系统或组织之间安全地传输数据的软件或硬件解决方案。这种系统通常包含多种安全特性&#xff0c;以确保数据在传输过程中的保密性、完整性和可用性。 安全数据交换系统可以解决哪些问题&#xff1f; 安全数据交换系统主要解…

图分类!!!

deepwalk 使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系&#xff0c;DeepWalk给出的方法是使用随机游走(RandomWalk)的方式在图中进行节点采样,RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问…

CogView-3-Plus:深度解锁智谱AI的图像生成新力量

一、引言&#xff1a;AI助力创意与效率的全面提升 在如今这个瞬息万变的科技时代&#xff0c;AI大模型早就不是实验室里的“神秘武器”&#xff0c;它们已经实实在在地融入到我们的日常工作中了&#xff0c;尤其是在图像生成和内容创作这块儿&#xff0c;简直是效率神器。只要几…

微软 Power Apps MDA 模型驱动应用解决Image字段查询出来缩略图问题变原图方法(c#+Plugin方式)

微软 Power Apps MDA 模型驱动应用解决Image字段查询出来缩略图问题变原图方法&#xff08;c#Plugin方式&#xff09; 在某些特定的场景中&#xff0c;需要将Image字段中的图片取出来&#xff0c;一般来说直接查询这个字段可以直接取&#xff0c;取出来的就是一个Base64格式的图…

OpenHarmony鸿蒙( Beta5.0)智能窗户通风设备开发详解

鸿蒙开发往期必看&#xff1a; 一分钟了解”纯血版&#xff01;鸿蒙HarmonyOS Next应用开发&#xff01; “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…

springboot luttuc redis 集成protobuf,手动序列化反序列化

前置需知&#xff1a; 1.本文章和网上大部分博客配置不太一样&#xff0c;各位看官要分析一下自己的需求。集成protobuf 本文章主要是手动调用protobuf的序列化方法&#xff0c;而不是交由springboot 去做&#xff0c;会偏向原生java 使用方式 2.由于为了和公司其他的项目达成…

工业机器人9公里远距离图传模块,无人机低延迟高清视界,跨过距离限制

在科技日新月异的今天&#xff0c;无线通信技术正以未有的速度发展&#xff0c;其中&#xff0c;图传模块作为连接现实与数字世界的桥梁&#xff0c;正逐步展现出其巨大的潜力和应用价值。今天&#xff0c;我们将聚焦一款引人注目的产品——飞睿智能9公里远距离图传模块&#x…

前端Excel热成像数据展示及插值算法

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏:《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 目录 &#x1f4d8; 前言 &#x1f4d8;一、热成像数…

Linux s3c2440 开发板上的操作系统实现 ubuntu

使用s3c2440开发板 使用ubuntu 1.ubuntu中的tftp&#xff0c;和nfs Trivial File Transfer Protocol,简单文件 传输协议。 通过网络在客户端与服务器之间进行简单文件 传输。提供不复杂、开销不大的文件传输服务。 Network File System&#xff0c;网络文件系统。通过 网络…

如何显示Dialog窗口

文章目录 1. 概念介绍2. 使用方法2.1 Overlay效果2.1 Dialog效果 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get显示snackBar"相关的内容&#xff0c;本章回中将介绍使用get显示Dialog.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

深入剖析嵌套调用和链式访问,以及函数的声明和定义(超全面覆盖)

1. 前情提要 在上一篇博客中&#xff0c;我们大致了解了函数的种类&#xff0c;以及自定义函数中形参和实参的具体区别 我们知道实参是需要传递给形参的&#xff0c;但其实形参和实参占据的是完全独立的内存空间 x&#xff0c;y在执行过程中会得到a和b的值&#xff0c;但是x…

Redis的数据类型以及应用场景

Redis - 数据类型 Redis是一种开源的内存数据结构存储&#xff0c;用作数据库、缓存和消息代理。 它支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等。 1. 字符串&#xff08;String&#xff09; Redis 的字符串&#xff08;String&#xff09;数据类型…

SQL(结构性查询语句)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、SQL是什么&#xff1f;二、DDL三、DML四、DQL五、DCL总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、SQL是什么&#xff…