开放式激光振镜运动控制器在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下的文本标刻
相关文章:

开放式激光振镜运动控制器在Ubuntu+Qt下的文本标刻
开放式激光振镜运动控制器在UbuntuQt下的文本标刻 上节课程我们讲述了如何通过UbuntuQt进行振镜校正(详情点击→开放式激光振镜运动控制器在UbuntuQt下的激光振镜校正),本节文本标刻是在振镜校正的前提下实现的。 在正式学习之前࿰…...

推荐3款AIai论文大纲一键生成文献,精选整理!
在当前的学术写作环境中,AI论文大纲生成工具已经成为许多学者和学生的重要助手。这些工具不仅能够快速生成高质量的论文大纲,还能提供内容填充、文献引用和查重修改等全方位的服务。以下是三款值得推荐的AI论文大纲一键生成文献工具:千笔-AIP…...

数据库之索引<保姆级文章>
目录: 一. 什么是索引 二. 索引应该选择哪种数据结构 三. MySQL中的页 四. 索引分类及使用 一. 什么是索引: 1. MySQL的索引是⼀种数据结构,它可以帮助数据库高效地查询、更新数据表中的数据。 索引通过 ⼀定的规则排列数据表中的记录&#x…...

多维时序 | Matlab基于BO-LSSVM贝叶斯优化最小二乘支持向量机数据多变量时间序列预测
多维时序 | Matlab基于BO-LSSVM贝叶斯优化最小二乘支持向量机数据多变量时间序列预测 目录 多维时序 | Matlab基于BO-LSSVM贝叶斯优化最小二乘支持向量机数据多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于BO-LSSVM贝叶斯优化最小二乘支…...

Netty笔记03-组件Channel
文章目录 Channel概述Channel 的概念Channel 的主要功能Channel 的生命周期Channel 的状态Channel 的类型channel 的主要方法 ChannelFutureCloseFuture💡 netty异步提升的是什么要点总结 Channel概述 Channel 的概念 在 Netty 中,Channel 是一个非常重…...

1----安卓机型修复串码 开启端口 檫除基带 支持高通与MTK机型工具预览与操作解析
在玩机过程中。很多玩家会碰到各种各样的故障 。其中最多的就在于基带 串码类。由于目前的安卓机型必须修改或者写入串码等参数必须开启端口。而一些初级玩友不太了解开启参数端口的步骤。这个工具很简单的为安卓机型开启端口。并且操作相对简单。 此工具基本功能 1-----可以…...

Docker容器技术1——docker基本操作
Docker容器技术 随着云计算和微服务架构的普及,容器技术成为了软件开发、测试和部署过程中的重要组成部分。其中,Docker作为容器技术的代表之一,以其简便易用的特点赢得了广大开发者的青睐。 Docker允许开发者在轻量级、可移植的容器中打包和…...
ElasticSearch介绍+使用
ElasticSearch 1.背景 ElasticSearch的最明显的优势在于其分布式特性,能够扩展到上百台服务器,极大地提高了服务器的容错率。在大数据时代背景下,ElasticSearch与传统的数据库相比较,能够应对大规模的并发搜索请求,同…...

Redis——常用数据类型List
目录 List列表常用命令lpushlpushxrpushrpushlrangelpoprpoplindexlinsertllenlremltrim key start stoplset 阻塞版本命令blpopbrpop list的编码方式list的应用 List列表 Redis中的list相当于数组,或者 顺序表,一些常用的操作可以通过下面这张图来理解…...

前端基础知识+算法(一)
文章目录 算法二分查找条件注意方式基本原理左闭右闭正向写法 左闭右开正向写法 前端基础知识定时器及清除盒子垂直水平居中的方式垂直水平1.flex布局2.grid布局3.定位对于块级元素 解决高度塌陷的方式1.给父元素一个固定的高度2.给父元素添加属性 overflow: hidden;3.在子元素…...

photozoom classic 9解锁码2024年最新25位解锁码
photozoom classic 9 破解版顾及比恐龙还要稀有,我曾经和你一样一直再找,找了好几个月,也没有找到真的破解版,下载很多次, 都是病毒插件之类的 我昨天下了几次,没有一个不附带插件病毒木马的.......&#x…...

Oracle发邮件功能:设置的步骤与注意事项?
Oracle发邮件配置教程?如何实现Oracle发邮件功能? Oracle数据库作为企业级应用的核心,提供了内置的发邮件功能,使得数据库管理员和开发人员能够通过数据库直接发送邮件。AokSend将详细介绍如何设置Oracle发邮件功能。 Oracle发邮…...
优化理论及应用精解【9】
文章目录 二次型函数二次型函数详细解释一、定义二、性质三、应用四、示例五、图表辅助说明(由于文本限制,无法直接提供图表) “西尔维斯特准则”一、定义二、来源三、应用场景 参考文献 二次型函数 二次型函数详细解释 一、定义 二次型函…...

nginx实现https安全访问的详细配置过程
文章目录 前言什么是 HTTP?什么是 HTTPS?HTTP 和 HTTPS 的区别为什么 HTTPS 被称为安全的?配置过程配置自签名证书 前言 首先我们来简单了解一下什么是http和https以及他们的区别所在. 什么是 HTTP? HTTP,全称为“超…...
1. TypeScript基本语法
TypeScript 学习总结 TypeScript 是一种 JavaScript 的超集,增加了静态类型检查和编译时错误检测,从而提高了代码的可维护性和可靠性。以下是 TypeScript 的基础知识总结,包括语法、运算符、数据类型、变量声明和作用域。 ## 基本语法TypeS…...
C# UDP与TCP点发【速发速断】模式
1、UDP 客户端 //由于收发都在本机,所以只用一个IP地址 IPAddress addr IPAddress.Parse("127.0.0.1"); var ptLocal new IPEndPoint(addr,9001);//本机节点,用于发送var ptDst new IPEndPoint(addr,9002);//目标节点…...

pikachu下
CSRF(跨站请求伪造) CSRF(get) url变成了这样了,我们就可以新开个页面直接拿url去修改密码 http://pikachu-master/vul/csrf/csrfget/csrf_get_login.php?username1&password2&submitLogin CSRF(post) 这里只是请求的方式不同,…...

Go语言开发im-websocket服务和vue3+ts开发类似微信pc即时通讯
前言 IM即时通讯聊天, 为软件开发者打造,不依赖第三方sdk,完全用Go语言开发即时通讯服务,支持H5、Electron、Wails 、Uniapp和各种小程序的IM即时通讯, 快速实现私聊、群聊、在线客服!让你快速搭建一个微信聊天系统,打…...

Redis如何实现分布式锁
目录 获取锁: 释放锁: Lua脚本: Redisson 分布式锁是,满足分布式系统或集群模式下多进程可见并且互斥的锁,因为我们熟知的java中的锁只是在单体架构下单个jvm中才会生效,如果部署了多个jvm则会导致新的…...

面向对象程序设计之继承(C++)
1.继承的定义 1.1继承的概念 继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量),这样产⽣新的类,称派⽣类。继承 呈现了⾯向…...

Docker 镜像(或 Docker 容器)中查找文件命令
在 Docker 镜像(或 Docker 容器)中运行如下两个命令时: cd / find . -name generate.py它们的含义如下,我们来一行一行详细拆解,并结合例子讲解: ✅ 第一行:cd / ✅ 含义 cd 是“change dire…...

Python趣学篇:Pygame重现经典打砖块游戏
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《Python星球日记》 目录 一、游戏背景与技术选型1. 打砖块游戏…...
代码训练LeetCode(19)轮转数组
代码训练(19)LeetCode之轮转数组 Author: Once Day Date: 2025年6月3日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 189. 轮转数组 - 力扣(LeetCode)力扣 (LeetCode) 全球极客挚爱的…...
Web前端为什么要打包?Webpack 和 Vite 如何助力现代开发?
一. 为什么要使用框架库? 1.1 传统网页与现代前端的差异 在最早期的网页开发中,我们只需要写几个.html文件,配上.css和.js文件,浏览器直接加载就能展现页面,每个文件都是独立的静态资源,简单且直观 但现在网站越来越复杂了: 需要用到最新的js语法(比如ES6)使用框架(Vue…...

ISO18436-2 CATII级振动分析师能力矩阵
ISO18436-2021是当前针对针对分析师的一个标准,它对振动分析师的能力和知识体系做了4级分类,这里给出的是一家公司响应ISO18436的CATII级标准,做的一个专题培训的教学大纲。摘自: 【振動噪音產學技術聯盟】04/19-23 ISO 18436-2…...
Elasticsearch | 如何将修改已有的索引字段类型并迁移数据
CodingTechWork 引言 在 Elasticsearch 中,一旦索引的字段类型被定义,就无法直接修改已有字段的类型。例如,如果你已经将 timestamp 字段的类型设置为 TEXT,并希望将其更改为 DATE 类型,这将需要一些额外的步骤。在这…...
【LeetCode 热题100】BFS/DFS 实战:岛屿数量 腐烂的橘子(力扣200 / 994 )(Go语言版)
🌊 BFS/DFS 实战:岛屿数量 & 腐烂的橘子(LeetCode 200 & 994) 两道图论基础题,涉及 BFS 与 DFS 的应用,主要用于掌握二维网格中遍历与标记访问的技巧: 🏝️ 200. 岛屿数量…...

uniapp中view标签使用范围
不止用于微信小程序。兼容型号,是uniapp内置组件之一,在uniapp中进行了跨平台适配。支持所有uniapp的平台。如微信小程序、h5、app、支付宝小程序...

HALCON 深度学习训练 3D 图像的几种方式优缺点
HALCON 深度学习训练 3D 图像的几种方式优缺点 ** 在计算机视觉和工业检测等领域,3D 图像数据的处理和分析变得越来越重要,HALCON 作为一款强大的机器视觉软件,提供了多种深度学习训练 3D 图像的方式。每种方式都有其独特的设计思路和应用场…...

Triton推理服务器部署YOLOv8(onnxruntime后端和TensorRT后端)
文章目录 一、Trition推理服务器基础知识1)推理服务器设计概述2)Trition推理服务器quickstart(1)创建模型仓库(Create a model Repository)(2)启动Triton (launching triton)并验证是否正常运行(3)发送推理请求(send a inference request)3)Trition推理服务器架…...