tag 标签: 教程

相关博文
  • 2024-10-28 08:20
    424 次阅读|
    0 个评论
    前言 (一)在当今这个瞬息万变的数字化时代,导航技术已经深入到我们生活的方方面面,从日常出行到物流配送,再到应急救援,无不彰显其重要性。 随着智能手机和物联网技术的飞速发展,对于导航系统的需求不再仅仅局限于简单的路线指引,而是更加追求精准性、实时性和智能化。在此背景下,将高德导航的路径规划算法高效应用于单片机系统及移动APP中,不仅是对传统导航技术的一次革新,更是推动智慧城市、智能交通系统建设的关键一环。 (二)单片机,作为嵌入式系统的核心,凭借其体积小、功耗低、集成度高等特点,在车载设备、智能家居、工业自动化等领域发挥着不可替代的作用。 将高德导航的路径规划功能集成到单片机上,意味着可以实现更为紧凑、低功耗的导航解决方案,为车辆自主导航、无人机路径规划等应用场景提供强有力的技术支持。这不仅要求算法在保持高精度的同时,还需进行深度优化以适应单片机有限的计算资源和存储能力。 (三)所以本文将给大家分享一下,我将高德开放平台的导航、路径规划功能运用到单片机及APP上,从而可以快速开发导航类、规划类的项目。当然方法有非常多种,我本次分享的仅仅是高德的冰山一角,高德提供的API,甚至可以让单片机不需要APP支持,独立运行导航、路径规划等项目 本文末尾,有项目所有代码的下载地址 效果展示 (一)APP展示 由于是快速开发,所以没有任何美化,仅是实现功能。APP开发平台:App Inventor 图:设定目的地后,会自动规划最近的路线,然后实时定位导航 (二)单片机展示 单片机:ESP32 图:APP开始导航后,将导航信息发送到ESP32 项目大纲 APP设定目的地→→地理编码API→→APP定位经纬度→→坐标转换API→→路径规划API→→APP显示静态图→→提交单片机显示 为了不泄露信息,最好对高德API进行封装,然后通过自己的API来操作。同时APP和单片机的通信也用到API。http://api.xemowo.top (一)获取高德开放平台API ①路径规划API:https://lbs.amap.com/api/webservice/guide/api/direction 对步行、公交路径规划,返回从原地到目的地的信息(方向,距离,时间,步行指示等) ②地理编码API:https://lbs.amap.com/api/webservice/guide/api/georegeo 将地址信息,转化为经纬度等信息。如:中山市港口镇政府,返回信息:"location" :"113.384324,22.584733" ③坐标转换API:https://lbs.amap.com/api/webservice/guide/api/convert 将用户输入的非高德坐标(GPS坐标、mapbar坐标、baidu坐标)转换成高德坐标。 ④静态地图:https://lbs.amap.com/api/webservice/guide/api/staticmaps 项目可以不用静态地图,因为路径规划API也会返回带有标记的静态图 (二)封装API(因人而异,后面我会放出PHP源码) ①地址查询经纬度:http://api.xemowo.top/api/gaode/chaxun.php 文档:http://api.xemowo.top/api/chaxun.html ②坐标转换:http://api.xemowo.top/api/gaode/gps.php 文档:http://api.xemowo.top/api/GPS.html ③路径规划:http://api.xemowo.top/api/gaode/walk.php 文档:http://api.xemowo.top/api/walk.html ④单片机接收信息:http://api.xemowo.top/api/gaode/esp_walk.php 文档:http://api.xemowo.top/api/esp_walk.html (三)制作APP App Inventor,Android编程工具https://www.17coding.net/ 采用图形化积木式的拖放组件,完全在线开发的Android编程环境,无需复杂的软件安装,可以通过浏览器直接访问并进行编程。 (四)单片机编程 Arduino IDE,内置很多库函数,对编程极其方便,速成项目,并且资料很多,对初学者帮助非常大 高德API (一)注册高德开放平台的账号https://lbs.amap.com/ (二)应用管理----创建新应用 (三)添加key,选择web服务(请勿泄露key) (四)寻找所需的API,本期项目我们需要4个高德API 注意个人用户调用的限量,企业用户会多一些,超过限量可能被禁止使用 ①路径规划API:https://lbs.amap.com/api/webservice/guide/api/direction 对步行、公交路径规划,返回从原地到目的地的信息(方向,距离,时间,步行指示等) ②地理编码API:https://lbs.amap.com/api/webservice/guide/api/georegeo 将地址信息,转化为经纬度等信息。如:中山市港口镇政府,返回信息:"location" :"113.384324,22.584733" ③坐标转换API:https://lbs.amap.com/api/webservice/guide/api/convert 将用户输入的非高德坐标(GPS坐标、mapbar坐标、baidu坐标)转换成高德坐标。 ④静态地图:https://lbs.amap.com/api/webservice/guide/api/staticmaps 项目可以不用静态地图,因为路径规划API也会返回带有标记的静态图 制作API 搭建API(网站)需要一台服务器,并且需要开发环境 我这里的环境如下: 系统:Orange Pi 1.0.2 Jammy (aarch64) WEB平台:OpenResty PHP:PHP-72 域名:API.XEMOWO.TOP (一)坐标转换API (http://api.xemowo.top/api/GPS.html) 示例:http://api.xemowo.top/api/gaode/gps.php?gps=113.38472,22.59476&photo=0
  • 热度 3
    2023-11-30 10:21
    557 次阅读|
    0 个评论
    一、实验目的 学习直方图统计的原理,掌握图像的读取方法,并实现在LCD上显示灰度图像的直方图统计结果。 二、实验原理灰度直方图 灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是 将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。灰度直方图是灰度 级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。 直方图是用来整理计量值的观测数据,分析其分布状态的统计方法,用于对总体的分布特征进行推断。直方图的作用如下: (1)检验数据分布的类型,分析数据是否服从正态分布,判断数据有无异常; (2)与产品规格界限做比较,可直观地判断分布中心是否偏离规格中心,以确定是否需要调整并求出其调整量;还可判断数据分布的散差(分布范围)是否满足规格范围的要求,以确定是否采取缩小散差的技术性措施; (3)用于进行过程能力调查和不合格品率估计; (4)客观地反映操作者的技术水平和主观努力程度。 从概率的观点来理解,灰度出现的频率可看作其出现的概率,这样直方图就对应于概率密度函数 pdf(probability density function),而概率分布函数就是直方图的累积和,即概率密度函数的积分。也可以直接从代表每种灰度的象素数目的直方图来观察。 灰度直方图的计算是很简单的,依据定义,若图象具有 L(通常 L=256,即 8 位灰度级)级灰度,则大小为 MxN 的灰度图象 f(x,y)的灰度直方图 hist 可用如下计算获得: (1)初始化 hist =0 ; k=0,…,L-1 (2)统计 hist ++ ; x, y =0,…,M-1, 0,…,N-1 (3)标准化 hist /=M*N 程序流程 程序流程设计中首先要进行外设使能配置,接着进行LCD管脚复用配置和LCD中断配置,然后进行LCD显示的初始化,最后读取工程目录下的BMP图像并进行直方图统计,并在 LCD 显示灰度值大 小的统计结果。 视频分析与视觉库 VLIB 是一个TI 的软件库,可加速视频分析开发并将性能提高多达 10 倍。VLIB 是针对 C6x DSP 内核优化的可扩展库。包括的40 多个内核的集合可以实现背景建模与减法、对象特征提取、追踪与识别和低级像素处理。 包括适用于 C64x+、C674x 和 C66x 处理器的 Windows 和 Linux 安装可执行文件。每个可执行文件安装一个组件包存储库、一个文档目录、一个 Eclipse 插件目录和一个扩展的组件目录结构,其中包含组件库、头文件和测试示例。 TMS320C6748处理器使用的是vlib_c674x_3_3_2_0。 vlib_c674x_3_3_2_0 将安装到CCS5.5 的安装路径,安装完成后会有相应的文件夹出现。源码所在路径:\vlib_c674x_3_3_2_0\packages\ti\vlib\src 程序源码 初始化缓存 使用VLIB 的库来为直方图计算进行缓存初始化。使用时,直接包含“VLIB_histogram_1D_Init_U8.h”文件 即可。 API 接口 VLIB_histogram_1D_Init_U8(const uint8_t *restrict binEdges,const int32_t numBins, uint8_t *restrict histArray); 程序使用VLIB 的库来进行灰度直方图统计前的缓存初始化,调用的程序源码和使用说明可以安装VLIB后查看。调用的初始化函数中,第一个参数是直方图的边界值,第二个参数是直方图的区间数。第三个参数是内部使用的缓冲器。 直方图计算 使用VLIB 的库来从 8 位无符号整数数组计算直方图。使用时,直接包含“VLIB_histogram_1D_U8.h”文件 即可。 API 接口 VLIB_histogram_1D_U8(const uint8_t *restrict X, const int32_t numX,const int32_t numBins,const uint16_t binWeight,const uint8_t *restrict histArray,uint16_t *restrict H1,uint16_t *restrict H2,uint16_t *restrict H3,uint16_t *restrict H); 程序使用VLIB 的库来进行灰度直方图统计,调用的程序源码和使用说明可以安装VLIB后查看。调用的直方图统计函数中,第一个参数是输入图像的数组,第二个参数是输入图像数组的元素个数。第三个参数是直方图的区间数。第四个参数是直方图中该区域的像素增量。第五个参数是指向内部使用的缓冲器。第六~第八个参数是指向内部使用的数组。第九个参数是用来保存直方图计算结果的数组。 三、操作现象实验设备 本实验使用的硬件接口为LCD,所需硬件为实验板、仿真器、LCD和电源。 硬件连接 (1)连接仿真器和电脑的USB接口, (2)将拨码开关拨到DEBUG模式01111,连接实验箱电源,拨动电源开关上电。 软件操作 导入工程,选择Demo文件夹下的对应工程 编译工程,生成可执行文件 将CCS连接实验箱并加载程序 程序加载完成后点击运行程序 运行程序后,CCS的Console窗口会打印相关信息,同时LCD会显示标题。 稍等片刻后,图像处理完成,LCD会显示直方图的统计结果。 实验结束后,先点击黄色按钮暂停程序运行,再点击红色按钮退出CCS与实验板的连接,最后实验箱断电即可。
  • 热度 6
    2023-11-1 17:28
    1728 次阅读|
    0 个评论
    使用Skydel API构建测试方案 凭借其现代、强大且直观的API,德思特Safran GNSS模拟引擎Skydel免费提供了Python、C#、C++和Labview的开源客户端库,它具有600多条命令,并且有完善的文档与记录。 随着Skydel软件更新添加新功能,API得到改进与软件的发展相同步。了解API的功能不需要具备编程技能,但具有编码经验的高级用户将能够简单的使用API命令并做深度开发,以创建自动化测试和GNSS模拟场景 使用Skydel构建SNMP代理 有一个例子可以很好的说明API的灵活性——通过使用外部OID命令,使用SNMP网络协议来远程驱动您的设备,定制您的系统。可以使用带有特定德思特Safran Skydel API命令的Python脚本构建SNMP子代理,该子代理将成为在系统(Linux或Windows操作系统)上运行的SNMP守护程序的网关,允许SNMP管理功能。 ● SNMP: SNMP,即简单网络管理协议(Simple Network Management Protocol),是一种广泛使用的应用层协议,用于管理和监控网络元素。它由互联网架构委员会根据RFC-1157规范文档定义,用于在网络设备之间交换管理信息,并且是TCP/IP协议的一部分。使用此协议的设备需要启用并配置SNMP代理,以便它们可以与网络管理系统(NMS)进行通信。SNMP代理还负责控制管理信息库(MIB)中定义的控制变量的数据库。 ● OID: OID,即对象标识符(Object Identifier),是一种用于唯一标识网络管理信息的标识符,它类似于一个树状结构,用于表示不同类型的管理信息,例如网络设备的参数、性能统计和配置数据。SNMP使用OID来定位和获取这些管理信息。 如果你想通过使用外部OID命令来远程驱动你的设备,你需要了解目标设备支持的OID,然后使用SNMP协议发送相应的请求,以获取或设置相关信息。OID通常以一种类似于点分割的数字串的形式表示,例如1.3.6.1.2.1.1.1表示系统的描述信息。 要使用SNMP协议来远程管理设备,你需要具备一定的SNMP知识,并使用合适的工具或编程语言来发送SNMP请求,以实现设备的定制和管理。 在此配置中,任何Skydel API命令都可以成为SNMP子代理的新OID(对象标识符)。这将使得任何NMS都能将Skydel命令“转换”为SNMP集,并通过网络获取请求来驱动您的Skydel系统。 如何使用德思特Safran GSG-7/8构建SNMP代理 在此配置中,工程师将能够通过SNMP监控Skydel引擎 ,该测试场景旨在能够通过SNMP检查Skydel引擎是否正常运行,通过独特的OID使用设置命令来启动和停止引擎。 德思特Safran提供了一个基本的SNMP入门套件(Skydel SNMP Stater套件),允许用户集成并通过SNMP管理其Skydel引擎。该套件可以通过添加多个新的API命令进行定制,这些命令将转换为新的SNMP OID,以增强监管能力。使用Skydel SNMP Stater套件远程连接到由Skydel软件驱动的外部笔记本电脑上运行的MIB浏览器。 Skydel SNMP Stater套件包含: skydel_snmp.py 发挥SNMP子代理角色(Skydel API命令和SNMP OID之间的桥梁)的Python脚本,可以由用户定制以添加功能。 snmp_pass.py 仅用于全局SNMP设置的Python脚本。对于简单的情况,添加新的OID不需要进行任何更改。 Install.sh 每次出于自定义目的更改Python脚本时都必须执行的“Makefile”命令。 snmpd.conf 附加到snmpd守护程序的配置文件。 SKYDEL-MIB.txt MIB文件示例基于Skydel标准架构构建,可用于与Python脚本中创建的新OID链接进行自定义。此MIB文件还可用于提供NMS或MIB浏览器来测试您的系统。 如果需要进一步了解德思特Safran Skydel的SNMP代理或需要下载相关文档,请联系德思特技术工程师。
  • 热度 5
    2023-10-8 15:52
    690 次阅读|
    0 个评论
    一、实验目的 本节视频的目的是学习LCD控制器的控制原理原理,并实现StarterWare开发环境下的LCD触摸控制。 二、实验原理1、LCD控制器 要实现LCD的显示与触摸,主要需要LCD驱动器和LCD控制器,LCD控制器一般又分为显示控制器和触摸控制器。通常情况下,LCD驱动器是集成在LCD屏幕上,而LCD控制器是由外部电路实现的。 2、LCD显示控制器 TMS320C6748 CPU内部就有对应的LCD显示控制器(光栅控制器). LCD 控制器由两个独立的控制器组成,即光栅控制器和 LCD 接口显示驱动器 (LIDD) 控制器。每个控制器独立于另一个控制器运行,并且在任何给定时间只有一个控制器处于活动状态。 3、LCD触摸控制器 触摸控制器由于是可选部分,一般会集成在实验底板上,这里用的是XPT2046控制器。通过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。 4、电阻式触摸屏的原理 当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在 X 和 Y 两个方向上的电压发生变化,产生信号,然后控制器读取信号,并计算出手指触摸的位置。 触摸屏都需要一个 AD 转换器,也就是要将电压变化读取出来,供主机求出触摸的位置。触摸芯片就是XPT2046。 5、XPT2046芯片 为4导线制触摸屏控制器,采用SPI模式进行通信 6、流程设计 程序流程设计中首先要进行外设使能配置,接着进行串口2初始化,用于输出触摸坐标值;然后进行LCD管脚复用配置和LCD中断配置,接着进行LCD显示和触摸的初始化。最后在循环中进行触摸检测,判断是否发生屏幕触摸,如果触摸屏幕则在串口输出触摸的所在位置的坐标值。 7、管脚复用源码 基于StarterWare控制外设时可调用对应的API接口,无需配置复杂的寄存器。 LCD管脚复用配置的函数源码可以查看LCD.c。 8、LCD中断使用流程 三、操作现象1、硬件连接 (1)使用RS232交叉串口母母线和USB转RS232串口线连接实验板的UART2和电脑的USB口。 (2)连接仿真器和电脑的USB接口。 (3)将拨码开关拨到DEBUG模式01111,连接实验箱电源,拨动电源开关上电。 2、软件操作 (1)先在设备管理器查看串口的端口号, (2)再设置串口调试工具,波特率设置为115200。 3、CCS相关操作 导入工程 编译工程 将CCS连接开发板并加载程序 点击运行程序 查看现象,在LCD屏幕上点击触摸任意点可以描画,同时串口调试工具输出触摸相应的坐标值。 实验结束后,先点击黄色按钮暂停程序运行,再点击红色按钮退出CCS与实验板的连接,最后实验箱断电即可。
  • 热度 2
    2023-9-20 10:57
    1225 次阅读|
    0 个评论
    一、实验目的 了解FFT的作用,掌握FFT 算法的算法原理、计算量和算法特点,实现FFT算法并通过CCS图形窗口查看结果。 官方网站:www.tronlongtech.com 二、实验原理1、傅里叶变换 傅里叶变换可以将一个信号从时域变换到频域。时域信号在经过傅立叶变换的分解之后,变为了不同正弦波信号的叠加,我们再去分析这些正弦波的频率,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。 2、离散傅里叶变换 离散傅里叶变换作为信号处理中最基本和最常用的运算,在信号处理领域占有基础性的地位,如果直接按照离散傅里叶变换的公式进行计算,求出N点X(k)需要N^2次复数运算、N(N-1)次复数加法,当N很大时,运算量是非常大的,这对于实时处理是无法接受的。 3、FFT算法 傅里叶快速算法的提出,使傅里叶变换成为一种真正实用的算法。根据傅立叶变换的对称性和周期性,我们可以将DFT运算中有些项合并。 在计算机上进行的DFT,使用的输入值是时域的信号值,输入采样点的数量决定了转换的计算规模。变换后的频谱输出包含同样数量的采样点,但是其中有一半的值是冗余的,通常不会显示在频谱中,所以真正有用的信息是N/2+1个点。FFT算法的原理是通过许多小的更加容易进行的变换去实现大规模的变换,降低了运算要求,提高了与运算速度。FFT不是DFT的近似运算,它们完全是等效的,FFT的过程大大简化了在计算机中进行DFT的过程。 4、程序流程 程序流程设计中首先产生测试信号,接着确定FFT基和旋转因子,然后进行FFT和FFT逆变换运算,最后输出FFT结果 5、数字信号处理库 本实验中的FFT算法是基于TI提供的数字信号处理库完成的。 DSPLIB 包含优化的、C语言可调用的通用信号处理例程,用于计算密集型实时应用程序。 调用这些例程的运行速度比直接用C语言编写的等效代码快得多,可以缩短应用程序开发时间。实验中使用的是 dsplib_c674x_3_4_0_0 。 6、dsplib_c674x_3_4_0_0 在CCS5.5 的安装路径安装DSPLIB后,会有相应的文件夹出现,包含组件库、头文件、测试示例和源码等。 7、函数源码FFT运算函数 程序使用DSPLIB 的库来进行FFT运算,调用的程序源码和使用说明可以安装DSPLIB后 查看。 调用的FFT函数中: 第一个参数是样本中FFT 的长度; 第二个参数是指向数据输入的指针; 第三个参数是指向复杂旋转因子的指针; 第四个参数是指向复杂输出数据的指针; 第五个参数是指向包含64 个条目的位反转表的指针。如果样本的FFT长度可以表示为 4 的幂; 第六个参数是4,否则 第六个参数是 2 ; 第五个参数是从主FFT开始的样本中的子 FFT偏移索引 。; 第六个参数是样本中主FFT的大小。 FFT逆变换函数 程序使用DSPLIB 的库来进行FFT逆变换,调用的程序源码和使用说明可以安装DSPLIB后查看。 调用的IFFT函数中: 第一个参数是样本中FFT 的长度; 第二个参数是指向数据输入的指针; 第三个参数是指向复杂旋转因子的指针; 第四个参数是指向复杂输出数据的指针; 第五个参数是指向包含64 个条目的位反转表的指针 ; 如果样本的FFT长度可以表示为 4 的幂,第六个参数是4,否则第六个参数是2 ; 第七个参数是从主FFT开始的复杂样本中的子FFT偏移索引 ; 第八个参数是样本中主FFT的大小。 8、二进制位翻转 FFT和FFT 逆变换函数中的第五个参数brev是指向包含64个表项的位反转表的指针,因此程序中需要提供64个表项,程序中的位反向表是计算出来的,可以通过代码提前转换的。 采用位反转的原因是因为FFT算法的蝶形内部两点交叉使数据以反转的方式输出而不是数字反转顺序。 二进制位翻转表的原理 首先确认二进制数的位数,64个数只需要有6位的二进制位数; 接着将二进制数分成两部分,前五位一部分,最后一位一部分; 最后进行二进制翻转,把最后一位放到最高位,剩下的五位进行翻转依次放入。 数组内存放的依次是0~63的二进制翻转结果,我们可以来看一个例子, (点击鼠标)以数字5为例,(点击鼠标)转换为二进制数是000101 (点击鼠标)接着进行二进制翻转,将“00010”看为一个部分,“1”看为一个部分,那么将“1”放到第一位,然后将后面的数据翻转过来进行放置即可 (点击鼠标)最后进行十六进制转换得到0x28,所以在数组的第6个数字为0x28。 三、操作现象 导入工程,选择Demo文件夹下的对应工程 编译工程,生成可执行文件 将CCS连接实验箱并加载程序 程序加载完成后点击运行程序 运行程序后,程序执行完成后会在断点处停下。 Single Time"选择单时域信号图,在弹出的界面设置相关参数,可查看DSP计算的FFT结果。 FFT Magnitude",在弹出的界面设置相关参数,可查看CCS计算的FFT结果。 对比后,可发现CCS和DSP计算的FFT结果相同, 实验结束后,点击红色按钮退出CCS与实验箱的连接,最后实验箱断电即可。
相关资源
  • 所需E币: 0
    时间: 2024-11-20 17:21
    大小: 10.11MB
    上传者: 明星
    《高等代数自学教程》(上册,贺昌亭主编,1983年)★经典教材
  • 所需E币: 1
    时间: 2024-8-20 18:12
    大小: 14.84MB
  • 所需E币: 1
    时间: 2024-8-19 16:10
    大小: 14.14MB
    上传者: milktea88
    第1章物联网与RFID技术第2章RFID系统的基本构成第3章物联网RFID系统架构第4章RFID使用的频率及电磁波的工作特点第5章天线基础第6章RFID中的天线技术第7章RFID电感耦合方式的射频前端第8章RFID电磁反向散射方式的射频前端 第9章编码与调制第10章数据的完整性与数据的安全性第11章电子标签的体系结构第12章读写器的体系结构第13章物联网RFID中间件第14章物联网RFID标准体系第15章物联网RFID在交通运输领域的应用第16章物联网RFID在制造与物流领域的应用第17章物联网RFID在防伪和公共安全领域的应用
  • 所需E币: 1
    时间: 2024-6-20 15:07
    大小: 6.32MB
    xilinx的zynq教程入门级,很实用
  • 所需E币: 5
    时间: 2024-6-20 15:17
    大小: 43.91MB
    zynq的sdk教程,很实用
  • 所需E币: 0
    时间: 2024-5-24 17:08
    大小: 2.93KB
    一、PyQT的概念PyQt是一个创建PythonGUI应用程序的工具包,是Qt和Python结合的一个产物,可以说是为了将Qt的功能用于Python开发的一个Qt的Python包装器。它是Python编程语言和Qt库的成功融合。PyQt的整个程序开发框架,主要包括如下部分:图形界面编辑的工具:QtDesigner不同部分信息交换机制:信号和槽界面操作的事件及捕获机制一套控制界面显示和数据存储分离以及映射的机制:Model/View架构通过这些重要的工具和框架机制,开发人员可以设计对应的GUI图形化界面、定义不同部件的操作及响应、捕获部件或应用的消息以及实现界面显示组件和数据存储组件的联动,从而构造完整的应用程序框架。PyQt实现了一个Python模块集。它有超过300类,将近6000个函数和方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。PyQt采用双许可证,开发人员可以选择GPL和商业许可。在此之前,GPL的版本只能用在Unix上,从PyQt的版本4开始,GPL许可证可用于所有支持的平台。二、OpenCVOpenCV项目最初由Intel于1999年启动,当时的目标是提供一个免费的计算机视觉库,并开放其源代码,以促进计算机视觉研究的发展。随后,OpenCV在2000年发布了第一个公开版本,从那时起,OpenCV迅速成为了计算机视觉领域最受欢迎的库之一。后来,OpenCV的开发由WillowGarage公司继续,随后由Itseez公司接管,直到今天,OpenCV的开发由OpenCV开发团队维护。核心功能和模块:OpenCV库包含了众多的模块,每个模块都提供了不同的功能,以下是一些核心的模块:2.1核心功能模块(CoreModule)这个模块提供了基本的数据结构和功能,包括图像数据类型、矩阵操作、文件IO等。图像操作:读取和保存图像:可以使用imread()函数读取图像文件,使用imwrite()函数保存图像到文件。图像属性访问:可以通过Mat对象的属性访问功能获取图像的尺寸、通道数、数据类型等信息。像素操作:可以直接访问和修改图像的像素值,或者使用像素迭代器遍历图像。图像通道操作:可以将多通道图像拆分成单通道图像,或者将单通道图像合并成多通道图像。创建矩阵:可以使用Mat类的构造函数或create()函数创建矩阵。矩阵运算:支持常见的矩阵运算,如加法、减法、乘法等。矩阵转换:可以对矩阵进行转置、仿射变换、透视变换等操作。2.2图像处理模块(ImageProcessingModule)OpenCV的图像处理模块提供了各种图像处理算法,包括图像滤波、边缘检测、图像变换等。这些算法可以帮助用户对图像进行预处理、增强、分析和特征提取等操作。下面是图像处理模块中常用的功能和算法:图像滤波(ImageFiltering):平滑滤波(SmoothingFilters):如均值滤波、高斯滤波、中值滤波等,用于去除图像中的噪声。锐化滤波(SharpeningFilters):如拉普拉斯滤波器、Sobel滤波器等,用于增强图像的边缘和细节。图像变换(ImageTransformations):几何变换(GeometricTransformations):如平移、旋转、缩放、仿射变换等,用于调整图像的尺寸和位置。透视变换(PerspectiveTransformation):用于校正图像中的透视失真。边缘检测(EdgeDetection):Sobel算子:Sobel算子通常用于灰度图像的边缘检测,其基本思想是利用图像中像素灰度值的变化情况来识别边缘。Sobel算子在水平和垂直方向上分别定义了两个卷积核(通常为3x3的矩阵),用于计算图像中每个像素点的水平和垂直方向的梯度值。Canny边缘检测:首先,对输入图像进行高斯滤波,以减少图像中的噪声。高斯滤波可以平滑图像,并模糊图像中的细节,从而有助于检测到真实的边缘。在经过高斯滤波的图像上,利用Sobel算子或其他梯度算子计算图像的梯度幅值和梯度方向。梯度方向可以帮助确定边缘的方向。对图像中的梯度幅值进行非极大值抑制,保留局部梯度幅值最大的像素点,以使得边缘变得更细化。利用双阈值检测策略对梯度幅值进行阈值处理,将图像中的像素点分为强边缘、弱边缘和非边缘三类。通常设置两个阈值,一个是高阈值(highthreshold),用于确定强边缘像素;另一个是低阈值(lowthreshold),用于确定弱边缘像素。通过连接强边缘像素,利用弱边缘像素进行边缘跟踪,得到完整的边缘。三、人工智能应用人工智能在生活中的应用有:1、虚拟个人助理,使用者可通过声控、文字输入的方式,来完成一些日常生活的小事;2、语音评测,利用云计算技术,将自动口语评测服务放在云端,并开放api接口供客户远程使用;3、无人汽车,主要依靠车内的以计算机系统为主的智能驾驶仪来实现无人驾驶的目标;4、天气预测,通过手机gprs系统,定位到用户所处的位置,在利用算法,对覆盖全国的雷达图进行数据分析并预测。
  • 所需E币: 0
    时间: 2024-6-5 15:12
    大小: 2.76KB
    一、前言在Kubernetes(K8s)中,Pod是最小的可调度单元。当Spark任务运行在K8s上时,无论是Driver还是Executor都由一个单独的Pod来表示。每个Pod都被分配了一个唯一的IP地址,并且可以包含一个或多个容器(Container)。Driver和Executor的JVM进程都是在这些Container中启动、运行和销毁的。当一个Spark作业被提交到K8s集群后,首先会被启动的是DriverPod。然后,Driver负责按需向Apiserver请求创建ExecutorPods。Executor负责执行具体的Task。一旦作业完成,Driver将负责清理所有已创建的ExecutorPods。二、在将Spark任务提交到K8s集群上时,不同的公司可能会采取不同的方法。以下是目前常见的几种做法以及我们在线上所采用的任务提交和管理方式。1、使用原生spark-submit原生的spark-submit命令可以直接提交作业,集成起来简单且符合用户习惯。然而,这种方法不便于作业状态跟踪和管理,无法自动配置SparkUI的Service和Ingress,并且在任务结束后不能自动清理资源。因此,在生产环境中并不适合使用这种方式。2、使用spark-on-k8s-operator这是目前较常用的一种提交作业方式,需要先在K8s集群中安装spark-operator。客户端通过kubectl提交yaml文件来运行Spark作业。本质上,这是对原生方式的扩展,提供了作业管理、Service/Ingress创建与清理、任务监控、Pod增强等功能。尽管此方法可在生产环境中使用,但它与大数据调度平台的集成性较差,对于不熟悉K8s的用户来说,学习曲线较为陡峭。3、使用spark-k8s-cli在我们的生产环境中,我们使用spark-k8s-cli来提交任务。spark-k8s-cli是一个可执行文件,基于阿里云emr-spark-ack提交工具进行了重构、功能增强和深度定制。它融合了spark-submit和spark-operator两种作业提交方式的优点,所有作业都能通过spark-operator管理,并支持交互式spark-shell和本地依赖的提交。同时,它的使用方式与原生spark-submit完全一致。三、sparkonk8s的优点和缺点优点:1.资源隔离:SparkonKubernetes可以更好地管理资源,实现资源隔离,避免不同应用之间的资源竞争。2.灵活性:Kubernetes支持弹性伸缩,可以根据应用的需求自动扩容或缩容。3.易于部署:使用Kubernetes集群部署Spark应用更加简单方便,不需要手动管理集群资源。缺点:1.性能开销:在Kubernetes上运行Spark会带来一定的性能开销,相比传统的YARN或Mesos部署方式可能会有性能损失。2.学习成本:需要对Kubernetes和Spark有一定的了解,对于初学者来说可能需要花费一定时间学习。3.依赖外部组件:可能需要额外的监控和调优工具来对Spark应用进行管理,增加了系统的复杂度。四、Spark的集群部署模式Spark官方提供了四种集群部署的模式:Standalone、YARN、Mesos、Kubernetes。Standalone需要常驻Master服务和Worker服务。它作为资源调度,只能去调度Spark做作业。同时它需要每个节点预先准备好Spark运行时环境,所以不太适合生产环境使用。YARN在传统的大数据体系下是一个比较好的调度器。它不需要常驻Spark相关的服务,YARN的容器内其实也是可以进行任何作业的,但是需要每个节点去事先准备好运行时环境,YARN其实是更贴近于我们的传统Hadoop生态,它也有一些调度上的优化,比如计算时会尽可能地去找数据所在的HDFS节点,不过在我们云原生的场景下就不太适用了。Mesos在Spark3.2版本后已经被标记为弃用了,所以我们就不过多谈它。Kubernetes也是无需常驻Spark相关服务,支持容器化运行任何作业,也不需要依赖节点运行时环境,它是更贴近于云原生生态的。五、Sparkonk8s如何运行首先Spark有一个客户端,客户端会构建好driverpod对象,向K8s的apiserver发送请求,去创建driverpod,Spark的driver进程运行在driverpod当中。Sparkdriver启动之后,会在driver内构建executorpod的对象,创建executorpod,并持续watchandlist去监听每一个executorpod的状态。当任务运行结束的时候,executorpod会被清理,driverpod会继续以completed的状态存在。这就是SparkonK8s的运行过程。六、关于spark配置使用spark难免会需要一些hdfs、hive-metastore等配置、xml等,把这些配置打到镜像里显然可以,但很不灵活。本地spark-submit进程创建pod时会将本地的spark配置作为configMap挂在到pod中,所以只要维护好本地提交的spark环境即可,可以先通过kubectldescribe pod**来找到对相应的configMap,然后通过kubectldescribe configmap来确认配置
  • 所需E币: 4
    时间: 2024-6-16 06:55
    大小: 30.57MB
    上传者: HanSom
    软考高级职称系统架构设计师教材,2023最新改版。
  • 所需E币: 0
    时间: 2024-6-3 14:35
    大小: 2.51KB
    Qt对OpenGL的支持是内建的,也就是说,只要你的Qt版本支持OpenGL,你就可以在你的Qt应用程序中使用OpenGL,无需额外安装OpenGL。然而,要在你的Qt应用程序中使用OpenGL,你的系统需要有一个支持OpenGL的图形驱动。这通常意味着你需要在你的系统上安装一个支持OpenGL的图形卡驱动。大多数现代的桌面系统(包括Windows、macOS和大多数Linux发行版)都自带了支持OpenGL的图形驱动,所以你通常不需要手动安装。如果你的系统没有支持OpenGL的图形驱动,或者你的图形驱动不支持你需要的OpenGL版本,你可能需要手动安装一个新的图形驱动。这通常涉及到从你的图形卡制造商的网站下载驱动程序,并按照他们的指示进行安装。请注意,虽然Qt支持OpenGL,但并不是所有的Qt功能都需要OpenGL。大多数Qt功能(包括QtWidgets和QtQuick2D)都可以在没有OpenGL的系统上运行。只有一些特定的功能(如QtQuick3D和一些Qt3D功能)需要OpenGL。一、Vulkan和OpenGL区别Vulkan和OpenGL区别,Vulkan与OpenGL相比,可以更详细的向显卡描述你的应用程序打算做什么,从而可以获得更好的性能和更小的驱动开销。Vulkan的设计理念与Direct3D12和Metal基本类似,但Vulkan作为OpenGL的替代者,它设计之初就是为了跨平台实现的,可以同时在Windows、Linux和Android开发。甚至在MacOS系统上,Khronos也提供了Vulkan的SDK,虽然这个SDK底层其实是使用MoltenVK实现的。Vulkan的最大任务不是竞争DirectX,而是取代OpenGL,所以重点要看和后者的对比。在高分辨率、高画质、需要GPU发挥的时候,Vulkan、OpenGL的速度基本差不多,但是随着分辨率的降低,CPU越来越重要,Vulkan逐渐体现了出来,尤其是看看GTX980Ti,最多可以领先OpenGL33%之多!二、OpenGL对象我们可以把OpenGL对象理解成一个状态的集合,它负责管理它下属的所有状态。当然,除了状态,OpenGL对象还会存储其他数据。注意。这些状态和上述context中的状态并不重合,只有在把一个OpenGL对象绑定到context上时,OpenGL对象的各种状态才会映射到context的状态。因此,这时如果我们改变了context的状态,那么也会影响这个对象,而相反地,依赖这些context状态的函数也会使用存储在这个对象上的数据。因此,OpenGL对象的绑定既可能是为了修改该对象的状态(大多数对象需要绑定到context上才可以改变它的状态),也可能是为了让context渲染时使用它的状态。三、OpenGL的工作方式首先,OpenGL一开始最难理解的部分我觉得在于创建整个程序上。虽然我已经有一些图形学基础,但是拿到OpenGL的时候完全是懵逼的,因为完全不知道其程序的运作方式。所以在这里,我觉得最先需要解释的就是OpenGL的整体工作方式:OpenGL是一个状态机,因此,其工作方式来自于上下文环境的切换,或者说是设定当前上下文环境(Context)。因此,不论是创建的shader,还是VAO,VBO,都是需要创建之后绑定进入当前上下文的。四、学习OpenGL常见难点: 难点1:不知道如何将单个例子,结合成一个完整的渲染引擎  难点2:不能把Shader和CPU的流程联立在一起,不知道某个资源/数据,是从哪里来的。就算知道他是什么时候送到GPU的,也不知道GPU如何定位某个资源/数据。  难点3:难以建立起并行计算的思维方式  难点4:难以理解各种模板如何在多个批次之间发生作用。不能具象的去理解混合,测试的过程。不能够理解,FrameBuffer的真正含义。  难点5:难以建立起空间想象,不知道矩阵变换,如何将顶点,或其他数据,变换到不同的空间进行统一计算。  难点6:难以理解从Vertex到Fragment是如何过度的。 五、构建OpenGL程序1、在项目的根目录下创建buildmkdirbuildcdbuild2、执行cmake指令,指定要构建的文件系统和使用的编译器cmake..-GNinja-DCMAKE_C_COMPILER=clang-DCMAKE_CXX_COMPILER=clang++3、执行ninjaninja编译完成之后就可以在build目录下找到可执行程序了,能够正常运行就说明OpenGL的开发环境搭建完成。
  • 所需E币: 0
    时间: 2024-5-20 14:19
    大小: 2.41KB
    上传者: 开心就很好了
    一、Playwright简介微软开源自动化测试工具Playwright,支持主流浏览器,包括:Chrome、Firefox、Safari等,同时支持以无头模式、有头模式运行,并提供了同步、异步的API,可以结合主流测试框架使用,并且支持浏览器端的自动化脚本录制等功能。二、playwright特性1、支持所有主流浏览器支持所有主流浏览器:基于Chromium内核的GoogleChrome和MicrosoftEdge浏览器),WebKit内核的AppleSafari和MozillaFirefox浏览器,不支持IE11。跨平台:Windows、Linux和macOS可用于模拟移动端WEB应用的测试,不支持在真机上测试。支持无头模式(默认)和有头模式 2、快速可靠的执行自动等待元素Playwright基于Websocket协议,可以接受浏览器(服务端)的信号。selenium采用的是HTTP协议,只能客户端发起请求。浏览器上下文并行:单个浏览器实例下创建多个浏览器上下文,每个浏览器上下文可以处理多个页面。有弹性的元素选择:可以使用文本、可访问标签选择元素。3、强大的自动化能力playwright是一个进程外自动化驱动程序,它不受页面内JavaScript执行范围的限制,可以自动化控制多个页面。强大的网络控制:Playwright引入了上下文范围的网络拦截来存根和模拟网络请求。现代web特性:支持ShadowDOM选择,元素位置定位,页面提示处理,WebWorker等WebAPI。覆盖所有场景:支持文件下载、上传、OOPIF(out-of-processiframes),输入、点击,暗黑模式等。三、同步和异步APIPlaywright支持同步和异步两种API,使用异步API需要导入asyncio库,它是一个可以用来实现Python协程的库,更详细介绍可参考Python协程。下面介绍如何使用python语言编写简单的playwright自动化脚本。一共有2条测试用例,用例1步骤如下:chrome浏览器打开百度搜索框输入“test”点击百度一下搜索点击搜索结果的第2页用例2步骤:chrome浏览器打开搜狗搜索搜索框输入“test”点击搜狗搜索点击搜索结果的第2页四、连接现有浏览器除了创建新的浏览器实例,Playwright还支持连接到一个已经存在的浏览器实例,这在许多浏览器自动化应用场景中非常有用。例如,可以在已经登录到需要双因素身份验证的帐户或者已经完成了一些手动操作的浏览器中继续自动化程序,或者将控制权交还给手动操作。让我们来看一下如何连接已经存在的Chrome浏览器。首先,我们需要打开Chrome浏览器的调试开关,这可以通过传递--remote-debugging-port参数来实现。在Windows上,你可以在命令提示符下运行以下命令:"C:\ProgramFiles\Google\Chrome\Application\chrome.exe"--remote-debugging-port=9222接着,在打开的浏览器的地址栏中输入:127.0.0.1:9222/json/version五、安装有两种方法来安装该软件。第一种方法是使用Node.js包管理器,如npm。如果选择这种方法,需要在电脑上安装Node.js。对于其他语言,Python使用pypi,Java使用Maven,C#可以使用"dotnetaddpackage"等.NETCLI命令来安装playwright的依赖项。第二种方法是安装VSCode的playwright扩展,它带有方便的安装命令。这种方法能够让整个过程更顺畅、更容易。Playwright的第一个特点(跨浏览器、跨平台和跨语言支持),我们可以说,它支持所有现代浏览器,在任何平台上都没有真正的限制。虽然它也支持流行的语言和技术,但支持的最好的语言是Typescript/Javascript。例如,如果你想在Java中使用Playwright,你需要选择你喜欢的测试运行器,如JUnit,并管理Playwright对象,如BrowserContext和Page。此外,你还需要为HTML报告找到一个解决方案。
  • 所需E币: 0
    时间: 2024-4-26 15:08
    大小: 2.61KB
    学AI绘图需要以下步骤:1.明确目标和需求:首先明确设计图的目的,是用于展示算法流程、模型结构还是其他目的。2.选择合适的工具:根据需求选择合适的绘图工具,如Visio、PowerPoint、AdobeIllustrator等。3.绘制草图:在开始正式绘图之前,可以先用铅笔或草图工具绘制大致的框架和布局。4.添加细节:在草图基础上,逐步添加具体的元素、箭头、文本框等,以展示AI系统的各个组成部分和流程。5.审查和修改:完成初稿后,仔细检查设计图是否符合要求,并进行必要的修改。6.导出和分享:将设计图导出为适当的格式(如PDF、JPG等),并与团队成员或利益相关者分享。学习AI绘画对于个人而言,可以带来一些潜在的好处。首先,AI绘画可以扩展你的创作能力和表达方式,使你能够尝试新的艺术风格和创意。其次,通过学习AI绘画,你可以了解到最新的技术趋势和创新应用,有助于提升你在艺术领域的竞争力。学ai绘画需要哪些基础知识?一、数学与算法知识是必不可少的基础AI绘画的实现离不开数学与算法知识的支撑。例如,实现图像的自动填充、风格转化等功能就需要掌握图像处理、数值优化、深度学习等相关算法。此外,对于生成对抗网络(GANs)的理解也是十分必要的,只有对网络原理、架构及其实现方式有深入了解,才能更好地掌握AI绘画。二、艺术知识也不容忽视尽管AI绘画的实现离不开数学与算法,但在艺术创作过程中,艺术语言和色彩语言也是至关重要的。因此,学习AI绘画必须具备一定的艺术知识,包括色彩搭配、构图、氛围表达等方面的技能,只有深入理解艺术表现形式的规律,才能更好地利用AI工具进行创作。三、动手实践是唯一的捷径了解了AI绘画的基本知识之后,最重要的就是动手实践,跟着艺术家们的步伐,深入尝试,不断优化自己的作品。这样的实践,将在某些方面增强你的艺术创造力和审美水平,提升你在AI绘画领域的专业素养。目前主流的画图软件有Midjourney和stablediffusion,Midjourney需要翻,而且要付费,虽然Midjourney的可调节范围多不过对于我们普通玩家来说,还是开源、不墙和免费的stablediffusion更受用。作为AI绘画领域的实习生,你需要掌握以下技术技能和技巧:1.机器学习和深度学习:了解机器学习和深度学习的基本原理、常用算法和模型结构。掌握常见的神经网络架构(如卷积神经网络、生成对抗网络等)以及它们在图像处理和生成方面的应用。2.图像处理与特征提取:学习图像处理的基础知识,包括滤波、边缘检测、图像增强等常用技术。熟悉常见的特征提取方法,如局部二值模式(LBP)、尺度不变特征变换(SIFT)、主成分分析(PCA)等,并了解它们在图像生成中的应用。3.编程与工具使用:熟练掌握至少一种编程语言(如Python),并熟悉相关的机器学习和图像处理库(如TensorFlow、PyTorch、OpenCV)。具备良好的编码能力,能够实现和调试AI绘画相关的算法和模型。4.数据处理与预处理:掌握图像数据的收集、清洗、转换和标注方法。了解数据增强技术,以增加训练数据的多样性。学习图像预处理技术,如图像归一化、降噪、旋转和裁剪等,以提高模型的鲁棒性和效果。5.模型训练和调优:了解模型训练的基本流程和技巧。学会构建适用于AI绘画任务的模型,并进行超参数调优、正则化和优化方法选择等工作。掌握评估指标的计算和结果分析方法。6.图像生成与风格迁移:学习图像生成模型(如GAN、VAE)的原理和实现方法。探索不同的生成模型架构和损失函数设计,以实现高质量的图像生成效果。熟悉图像风格迁移技术,能够将一个图像的风格应用到另一个图像上。7.学术文献阅读与写作:培养阅读和理解学术文献的能力,关注AI绘画领域的最新研究进展。学习撰写清晰、准确的技术报告和研究论文,能够表达自己的研究思路和成果。8.创造力与艺术感知:尽可能培养自己的艺术感知和审美能力。了解绘画和艺术的基本原理,学习欣赏和分析不同风格的艺术作品。
  • 所需E币: 0
    时间: 2024-5-9 09:32
    大小: 2.65KB
    上传者: 开心就很好了
    Solidity简介Solidity是一种静态类型、面向合约的高级编程语言,专门为编写智能合约而设计,它被用于eth和其他兼容区块链平台。Solidity语言受到了C++、Python和JavaScript等语言的影响,旨在提供一种安全、易于理解的方式来创建和管理智能合约。特点静态类型:Solidity是一种静态类型语言,这意味着所有变量的类型在编译时都必须明确指定。面向合约:Solidity中的主要构建块是合约(Contracts),它们类似于面向对象编程中的类。合约可以包含状态变量、函数、事件、修饰符等。继承:Solidity支持多重继承,允许合约继承其他合约的属性和行为。兼容EVM:Solidity编写的智能合约被编译成EVM(虚拟机)字节码,这使得它们可以在eth网络上部署和执行。什么是智能合约?智能合约(Smartcontract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由NickSzabo首次提出。智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。简单地说,智能合约可以理解为一个自执行的协议。智能合约可以自动处理协议的履行、管理、以及支付。例如,可以编写这样一个智能合约:本月底之前,老王转账给小张1个以太币,这个智能合约部署后,就会在月底之前,自动把老王的1个以太币转账给小张,无需人为干预。关键零件:1.逻辑:Solidity允许使用if-else语句、for和while循环以及其他逻辑运算符,如and、or、not。2.作用域:Solidity具有全局、契约和函数级别的作用域。每个变量或函数都有一个特定的范围,在该范围内可以访问或修改它。3.模式:Solidity具有可用于编写智能合约的通用设计模式,例如Open-ClosePrinciple和PullPayment模式。4.函数:Solidity支持内部和外部函数。内部函数只能被同一合约内的其他函数调用,而外部函数可以被任何合约或外部调用。5.结构:Solidity允许创建自定义数据结构,例如结构和数组。6.库:Solidity支持库的使用,库是可以被多个合约调用的可重用代码块。让我们亲自动手,使用代码示例和解释来解释这些关键组件中的每一个。以下是用Solidity编写的逻辑示例。functioncheckAge(uintage)publicpurereturns(bool){  if(age>=18){ //thislinechecksiftheinputageisgreaterthanorequalto18    returntrue;  //iftheaboveconditionismet,itreturnstrue  }else{    returnfalse; //iftheaboveconditionisnotmet,itreturnsfalse  }}该函数具有public和pure可见性,这意味着它不读取或修改状态变量,仅使用传递给它的参数或其中存在的局部变量返回值。它可以在编译期间从外部调用而不会产生任何副作用。如果年龄大于或等于18岁,则该函数还返回一个布尔值true,否则返回一个布尔值false。很简单,对吧?现在让我们在下面的示例中编写一些Solidity范围。contractEnitandev{  uintprivateage=25; //thislinedeclaresaprivatevariableoftypeuintcalledageandassignsitthevalue25  functiongetAge()publicviewreturns(uint){ //thisfunctionispublicandread-only    returnage; //thislinereturnsthevalueoftheprivatevariableage  }}Solidity值类型布尔(bool):可能的取值为字符常量值true或false整型(int/uint):分别表示有符号和无符号的不同位数的整型变量;支持关键字uint8到uint256(无符号,从8位到256位)以及int8到int256,以8位为步长递增定长浮点型(fixed/ufixed):表示各种大小的有符号和无符号的定长浮点型;在关键字ufixedMxN和fixedMxN中,M表示该类型占用的位数,N表示可用的小数位数地址(address):存储一个20字节的值(以太坊地址大小)定长字节数组:关键字有bytes1,bytes2,bytes3,…,bytes32枚举(enum):一种用户可以定义类型的方法,与C语言类似,默认从0开始递增,一般用来模拟合约的状态函数(function):一种表示函数的类型
  • 所需E币: 0
    时间: 2024-5-14 13:34
    大小: 2.1KB
    在现代软件开发中,图形用户界面(GUI)是用户与程序交互的重要组成部分。Qt框架提供了一种强大的方式来构建跨平台的GUI应用程序,其中QML(QtMeta-ObjectLanguage)和C++的交互是一个重要的主题。本篇博文将深入探讨如何在QML中创建和操作C++对象,实现双向的交互。在Qt中,任何QML代码都可以访问QObject派生类实例的属性、方法和信号。以下是一个简单的C++类CppObject,演示了如何在QML中创建并操作该类的对象。由于QML引擎与Qt元对象系统的集成,可以从QML中访问任何从QObject继承的类的属性、方法和信号,C++代码既可以在应用中集成,也可以在插件中集成。QML访问C++数据主要有三种方法:1、将C++类的属性暴露给QML;2、从C++定义QML类型;3、用Context属性在QML中嵌入C++对象;自定义数据类型16种基础数据类型以外的其它数据类型是QML所无法识别的,可将它定义为复杂数据类型,结构体数据类型属于复杂数据类型中的一种。由于QObject子类都可以注册为QML对象类型,所以构造结构体对应的自定义类来与QML交互是可行的。创建自定义对象在Qt中,我们可以使用QObject作为基类创建自定义对象。首先,我们需要在C++中定义一个继承自QObject的类,并将其注册到QML中,使得QML可以访问到这个对象。具体的步骤如下:创建一个新的C++类,例如MyObject,并继承自QObject。在MyObject类中声明需要在QML中访问的属性和函数,并使用Q_PROPERTY和Q_INVOKABLE宏进行标记。在MyObject类中添加需要在QML中访问的信号,并使用Q_SIGNAL宏进行标记。在MyObject类中添加相应的槽函数,并在函数实现中处理信号的逻辑。在Qt的主程序中,使用qmlRegisterType函数将MyObject类注册到QML引擎中。如何实现可以被QML访问的C++类C++类要想被QML访问,首先必须满足两个条件:一是派生自QObject类或QObject类的子类,二是使用Q_OBJECT宏。QObject类是所有Qt对象的基类,作为Qt对象模型的核心,提供了信号与槽机制等很多重要特性。Q_OBJECT宏必须在private区(C++默认为private)声明,用来声明信号与槽,使用Qt元对象系统提供的内容,位置一般在语句块首行。下面例子在QtCreator3.1.2中创建,Projects选择QtQuickApplication,工程名为Gemini,Component选择QtQuick2.2,然后在自动生成的文件中添砖加瓦。QML访问C++一个C++类要想被QML访问,必须满足两个条件:1、从QObject类或QObject类的子类派生继承2、使用Q_OBJECT宏这和使用信号与槽的前提条件是一样的。QObject类是所有Qt对象的基类,作为Qt对象模型的核心,提供了信号与槽机制等很多重要特性。这两个条件是为了让一个类能够进入Qt强大的元对象系统(meta-objectsystem)中,而使用元对象系统,一个类的某些方法或属性才可能通过字符串形式的名字来调用。我们知道,QML其实是对JavaScript的扩展,融合了QtObject系统,它是一种新的解释型的语言,QML引擎虽然由QtC++实现,但QML对象的运行环境,说到底和C++对象的上下文环境是不同的,是平行的两个世界。如果你想在QML中访问C++对象,那么必然要找到一种途径来在两个运行环境之间建立沟通桥梁。Qt提供了两种在QML环境中使用C++对象的方式:(1)在C++中实现一个类,注册到QML环境中,QML环境中使用该类型创建对象。(2)在C++中构造一个对象,将这个对象设置为QML的上下文属性,在QML环境中直接使用该属性。
  • 所需E币: 5
    时间: 2024-3-14 20:35
    大小: 657.66KB
    上传者: 丙丁先生
    Rd-03模组的固件烧录教程。固件烧录是一个相对复杂的过程,涉及到特定的烧录工具、软件以及硬件连接等步骤。为了确保烧录过程的准确性和安全性,建议您参考安信可官方提供的Rd-03模组固件烧录教程或相关文档。
  • 所需E币: 3
    时间: 2024-3-16 21:44
    大小: 622.79KB
    上传者: 电子阔少
    IAR图文教程430.pdf,MSP430,单片机,TI单片机,德州仪器
  • 所需E币: 5
    时间: 2024-3-16 21:37
    大小: 19.95MB
    上传者: 电子阔少
    AutoCAD2010绘图技能实用教程教学课件ppt作者朱向丽.pdf
  • 所需E币: 0
    时间: 2024-3-21 15:55
    大小: 3.09KB
    Go微服务系统精讲Go-Zero全流程实战即时通讯(IM)——随着微服务技术的快速发展,其在各个领域都形成了一系列事实标准,在Kubernetes和容器技术加持下,云原生微服务已经成为了主流解决方案。而Go语言作为云原生领域最受欢迎的开发语言,正被越来越多的企业作为微服务开发的首选语言,其中比较流行的包括Go-micro、Go-zero、Dubbo-go等。作为Dubbo微服务体系中多语言实现的一员,在2022年Dubbo-go以微服务领跑者的角色积极拥抱云原生标准,探索了ProxylessMesh形态,配合适配Pixiu云原生网关,形成了完善的Dubbo-go微服务生态矩阵。一、微服务什么是微服务(microservice)?这是企业界正在向计算界提出的问题。一个产品的可持续性取决于它的可修改程度。大型产品如果不能正常维护,就需要在某个时间点停机维护。而微服务架构用细化的服务取代了传统的单体服务,这些服务定义了明确的RPC或消息驱动的API边界。微服务架构有别于更为传统的单体式方案,可将应用拆分成多个核心功能。每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作(和出现故障)时不会相互影响。微服务带来了以下好处:每个服务都可以由专注于此服务的团队独立开发。小团队可以通过在一组小的功能上工作来进行并行迭代。开发人员可以自由选择开发技术,对新的开发人员来说,可扩展性很强。微服务架构可以使每个微服务独立部署。对系统的单个组件支持持续集成(CI)和持续交付(CD)。微服务架构使得每个服务都可独立扩展。利用松耦合的架构提供更轻松的软件替换。微服务架构不与特定的技术相联系。二、单体架构与微服务架构的区别下图描绘了单体架构和微服务架构的结构图。图的左边就是单体架构的示意图,如图所示:单体架构将所有的功能(如UI、日志、数据层、系统逻辑、数据库等)都集成在一个系统中,像是一个紧耦合的架构。相反,微服务是独立的实体,每个功能都是单独的服务,如日志服务、文件服务、系统逻辑服务等,更易于修改和替换,每个服务都可以通过各种远程传输机制进行沟通,如HTTP、REST或者RPC。服务之间的交换的数据格式可以是JSON或者Protocolbuffers,微服务还可以处理各种请求点,如UI和API客户端。三、微服务框架go-zero的基本介绍go-zero是一个集成了各种工程实践的web和rpc框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。go-zero中的api,rpc,数据库等涉及的代码,都可以给我们一键生成,无需耗费我们什么精力只需要在生成的代码中填入自己的配置以及逻辑即可,咱们使用go-zero可以轻松做到如下效果:轻松获得支撑千万日活服务的稳定性内建级联超时控制、限流、自适应熔断、自适应降载等微服务治理能力,无需配置和额外代码微服务治理中间件可无缝集成到其它现有框架使用极简的API描述,一键生成各端代码自动校验客户端请求参数合法性大量微服务治理和并发工具包go-zerogo-zero整体上做为一个稍重的微服务框架,提供了微服务框架需要具备的通用能力,同时也只带一部分的强约束,例如针对web和rpc服务需要按照其定义的DSL的协议格式进行定义,日志配置、服务配置、apm配置等都要按照框架定义的最佳实践来走。社区建设:go-zero已经是CNCF项目,做为一个后起的微服务框架,不得不说在国内社区生态建设和维护上,完美适配国内开源的现状,在微信群、公众号、各种大会等多渠道进行推广,社区也时常有文章指导实践。go-kratosgo-kratos整体上做为一个轻量级的微服务框架,B站开源项目;web和rpc服务的DSL协议直接采用protobuf和grpc进行定义,采用wire做依赖注入、自动生成代码。框架定位于解决微服务的核心诉求。社区建设:社区建设和维护上,算是做的中规中矩,官网更新一般,有公众号和微信群问题解答tarsgotarsgo做为tars这个大的C++重量级微服务框架下的go语言服务框架,腾讯开源项目;对于有个好爹的这个事情,总是喜忧参半的;好处在于很多能力不用从头开始做起,直接依托母体;劣势就是独立性相对较差,要选用这个tarsgo的前提,就是要先选用tars这个大的框架。社区建设:Tars已经是linux基础会项目,社群上做的还算可以,毕竟tars作为腾讯开源影响力最大的项目之一,有QQ、微信群。dubbo-godubbogo做为dubbo这个大的Java重量级微服务框架下的go语言服务框架,阿里开源项目;优劣基本跟tarsgo一样社区建设:dubbo已经是apache基础会项目,社群上做的还算可以,有钉钉群。go-mircogo-micro是一个轻量级的微服务框架,做为一个在2015年就开源的项目,在当时那个市面上开源的微服务框架稀少的年代,它是为数不多的选择。主要槽点就是作者重心做云服务去啦,相应的社区维护力度较弱。社区建设:弱
  • 所需E币: 2
    时间: 2024-3-26 21:24
    大小: 1.44MB
    上传者: 电子阔少
    Inventor2021安装教程.pdf
  • 所需E币: 3
    时间: 2024-3-24 22:15
    大小: 9.49MB
    上传者: 电子阔少
    ABB-ROBOT基础教程.ppt
  • 所需E币: 0
    时间: 2024-2-27 15:17
    大小: 2.5KB
    一、为什么选择C#C#是一种新式、创新、开放源代码、跨平台,面向对象的编程语言,是GitHub上排在前列的5种编程语言之一。是否拥有JavaScript、Java或C++开发经验?你会立即发现C#用起来十分熟悉,并会乐于看到推出不断变化的功能,包括类型安全、泛型、模式匹配、异步、记录等。我们希望你从按下第一个按键起,便爱上C#。二、版本VisualStudio适用于Windows和Mac。VisualStudioforMac的许多功能与VisualStudioforWindows相同,并针对开发跨平台应用和移动应用进行了优化。本文重点介绍VisualStudio的Windows版本。VisualStudio有三个版本:社区版、专业版和企业版。请参阅比较VisualStudio版本,了解各个版本支持的功能。三、C#可以开发哪些类型的应用程序c#可以用于开发各种类型的应用程序,包括但不限于以下几种:桌面应用程序:使用C#和.NETFramework,你可以开发Windows桌面应用程序。这些应用程序可以提供丰富的用户界面和交互功能,适用于各种领域,如办公软件、图像处理工具、游戏等。Web应用程序:C#可以与ASP.NET和ASP.NETCore等Web开发框架结合使用,用于构建Web应用程序。你可以创建动态网站、电子商务平台、后台管理系统等,并通过浏览器访问。移动应用程序:通过使用Xamarin或Unity等跨平台开发工具,你可以使用C#开发移动应用程序,包括iOS、Android和WindowsPhone。这使得开发人员可以在多个平台上共享代码,加快开发速度。云和分布式应用程序:使用C#和相关技术,例如ASP.NETCore、Azure等,你可以构建云应用程序和分布式系统。这包括构建基于云平台的Web应用程序、微服务架构、消息队列和分布式数据库等。游戏开发:C#在游戏开发中非常受欢迎,特别是在使用Unity游戏引擎的情况下。你可以使用C#编写游戏逻辑、控制脚本和用户界面,开发各种类型的游戏,包括2D和3D游戏。数据库应用程序:C#与各种数据库系统(如SQLServer、MySQL)紧密集成,可以用于开发数据库应用程序。通过ADO.NET和EntityFramework等技术,你可以连接到数据库、执行查询、处理数据和构建数据驱动的应用程序。四、程序结构C#中的关键组织结构概念包括程序、命名空间、类型、成员和程序集。程序声明类型,而类型则包含成员,并被整理到命名空间中。类型示例包括类、结构和接口。成员示例包括字段、方法、属性和事件。编译完的C#程序实际上会打包到程序集中。程序集的文件扩展名通常为.exe或.dll,具体视其分别实现的是应用程序还是库_***而定。五、代码实战将以下代码粘贴到Main()方法主体中。//someWordsisastringarray.string[]someWords={  "the",  "quick",  "brown",  "fox",  "jumps"};string[]moreWords={  "over",  "the",  "lazy",  "dog"};//Alphabeticallysortthewords.IEnumerable<string>query=fromwordinsomeWords              orderbyword              selectword;若要使用IntelliSense文字自动完成插入单词query的剩余部分,请按Tab。完成后,代码块如以下代码所示。你可以通过输入cw,然后按Tab两次来生成Console.WriteLine语句,从而进一步练习代码片段。foreach(stringstrinquery){  Console.WriteLine(str);}六、总结: 抛开商业的角度,无论是简洁性,还是上手的容易程度来说,c#都是不错的一个愿意。大家没有必要带有成见去看待c#这样的语言,只要快速开发出软件,保质保量满足客户的需求,这就是好语言,没必要从底层到上层、事事亲力亲为,做好自己擅长的领域,掌握核心模块的开发竞争力其实就可以了。