当前位置: 首页 > news >正文

FOC算法开环控制基础

1. 为什么要有FOC算法

先看看从有刷电机到无刷电机的简单介绍,如下图1,通电螺线圈会产生磁场,这个磁场会产生N级和S级,然后这个电磁铁就可以吸引永磁体,S级吸引N级,N级吸引S级,通俗的来说,电机的原理就是固定其中一个来让另一个旋转,固定永磁体,让电磁铁旋转或者固定电磁铁,让永磁体旋转,转的那个东西叫转子,不转的那个东西叫定子,不管哪种情况都需要使电磁铁的磁极周期性的翻转,这样就会使产生的磁场方向也翻转,周而复始电机就诞生了,具体的物理图以及更深层次的东西就不在这里说了。
在这里插入图片描述
图1 电磁铁驱动永磁体

如果永磁体做定子,电磁铁做转子,因为电磁铁需要连接导线,所以要让电磁铁旋转的话必须得解决导线的问题,同时还能让电流反向,如下图2,这个电刷起到了导线的作用,同时由于转子的结构特点,随着转子的旋转,作为转子的电磁铁产生的磁场方向也在变化,由于这个电刷的存在,所以这中电机叫做直流有刷电机。所以这种电机被称为有刷电机,
请添加图片描述
图2 直流有刷电机

如果永磁体做转子,电磁铁做定子,如下图3,那就要使得施加在电磁铁上的电压遵循一定的规律,从而产生周期变化的磁场来驱动作为转子的永磁体转动,产生符合条件的电压的算法之一就是FOC算法。
请添加图片描述
图2 直流无刷电机
具体的转动原理去参考网上的其他资料,我这里写的太粗糙了。

2. FOC基本原理

请添加图片描述
图3 FOC算法流程图
FOC算法的简要流程就是上图这样的,要想控制电机旋转就需要给电机输入旋转的参数,就是电机的转矩,然后通过两个变换来转换为电机的三相输入信号,可以是输入的电压,也可以是输入的电流,称为相电压和相电流,相电压等于相电流乘以相电阻,所以二者是完全的正比例关系,可以相互转换,后面所有的公式变换对于这个电流和电压都是完全相同的,公式推导时使用电流,考虑物理意义时根据情况选择,所以实际的情况是一个反着来的过程,要想确定输入给电机的信号就需要根据输入的三路信号反推出输入给它的信号,然后由这个信号进一步推出应该输入什么样的转矩,所以核心就是这两个变换,下面开始介绍这两个变换。

2.1 克拉克变换

2.1.1 克拉克变换的推导

根据上面的图2可以知道要想实现无刷电机的转动控制需要确定三路的输入电流,也就是无刷电机的三相电控制,要表达每一路的电压或者电流需要三个方程,而无刷电机定子有三个绕组(即使不是三个也可以简化为三个),每个绕组发出一个相电压。由于这三个绕组在位置上等分了一个圆周,即彼此相差 2 π / 3 2\pi/3 2π/3,导致三相电压的幅度变化不一致,而是存在一个延时,这个延时是旋转1/3圆周的时间,也就是说三相电相互之间的相位差相差 2 π / 3 2\pi/3 2π/3,从物理学的角度来看,整个系统的自由度就是2,所以方程就可以简化为2个,而电机转动的时候均匀的,所以三相电流之间的幅值和频率是相同的,所以假设三相电流的定义如下:
{ i a = i m a x c o s ( w t ) i b = i m a x c o s ( w t + 2 π 3 ) i c = i m a x c o s ( w t − 2 π 3 ) \begin{cases} i_a = i_{max}cos(wt)\\ i_b = i_{max}cos(wt+\frac{2\pi}{3}) \\ i_c = i_{max}cos(wt-\frac{2\pi}{3}) \end{cases} ia=imaxcos(wt)ib=imaxcos(wt+32π)ic=imaxcos(wt32π)
在电机定子上建立实轴平行于 i a i_a ia的复数坐标系, i a , i b , i c i_a,i_b,i_c iaibic三者夹角为 2 π 3 \frac{2\pi}{3} 32π i a i_a ia没有变化, i b i_b ib变为 i b e 2 π j 3 i_be^{\frac{2\pi j}{3}} ibe32πj i c i_c ic变为 i c e − 2 π j 3 i_ce^{\frac{-2\pi j}{3}} ice32πj(Tips:对一个复数乘以 e j θ e^{j\theta} ejθ表示将这个复数表示的向量旋转 θ \theta θ度, θ \theta θ为正表示逆时针旋转, θ \theta θ为负表示顺时针旋转),将三者分别投影到实轴( α \alpha α轴)和虚轴( β \beta β轴)以后并相加可以得到下面的结果:
{ i α = i a + i b cos ⁡ ( 2 π 3 ) + i c cos ⁡ ( − 2 π 3 ) = i a − 1 2 ( i b + i c ) i β = i b sin ⁡ ( 2 π 3 ) + i c sin ⁡ ( − 2 π 3 ) = 3 2 ( i b − i c ) \begin{cases} i_\alpha = i_a + i_b \cos\left(\frac{2\pi}{3}\right) + i_c \cos\left(-\frac{2\pi}{3}\right) = i_a - \frac{1}{2}(i_b + i_c) \\ i_\beta = i_b \sin\left(\frac{2\pi}{3}\right) + i_c \sin\left(-\frac{2\pi}{3}\right) = \frac{\sqrt{3}}{2}(i_b - i_c) \end{cases} {iα=ia+ibcos(32π)+iccos(32π)=ia21(ib+ic)iβ=ibsin(32π)+icsin(32π)=23 (ibic)
用矩阵的形式写出来就是下面这样:
[ i α i β ] = [ 1 − 1 2 − 1 2 0 3 2 − 3 2 ] [ i a i b i c ] \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} = \begin{bmatrix} 1 & -\frac{1}{2} & -\frac{1}{2} \\ 0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \end{bmatrix} \begin{bmatrix} i_a \\ i_b \\ i_c \end{bmatrix} [iαiβ]=[102123 2123 ] iaibic
这个变换就叫克拉克变换,所以克拉克变换的数学本质就是将三个复数向量合并成为一个,实部和虚部分开运算的转换矩阵就是克拉克变换,物理本质就是将三相的电流或电压降维变成二维,转换前后的结果都是随时间变化的。

2.1.2 等幅值克拉克变换

将前面的三路电流相加并化简可得:
i Σ = i a + i b + i c = 3 2 i m a x e − j w t i_{\Sigma} = i_a+i_b+i_c = \frac{3}{2}i_{max}e^{-jwt} iΣ=ia+ib+ic=23imaxejwt
可以看出克拉克变换前后的电流幅值变大了,成了原来的 3 2 \frac32 23倍,为了方便处理,需要让 i a i_a ia i α i_\alpha iα在变换前后相同,所以 i m a x i_{max} imax要变为原来的 2 3 \frac23 32 i m a x i_{max} imax变了意味着三路电流都需要变为原来的 2 3 \frac23 32,所以等幅值的克拉克变换形式就是下面这样,多了个系数 2 3 \frac23 32
[ i α i β ] = 2 3 [ 1 − 1 2 − 1 2 0 3 2 − 3 2 ] [ i a i b i c ] \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} = \frac23\begin{bmatrix} 1 & -\frac{1}{2} & -\frac{1}{2} \\ 0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \end{bmatrix} \begin{bmatrix} i_a \\ i_b \\ i_c \end{bmatrix} [iαiβ]=32[102123 2123 ] iaibic
把基尔霍夫定律代入等式右边就可以进一步化简等幅值克拉克变换:
[ i α i β ] = [ 1 0 1 3 2 3 ] [ i a i b ] \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ \frac{1}{\sqrt{3}} & \frac{2}{\sqrt{3}} \end{bmatrix} \begin{bmatrix} i_a \\ i_b \end{bmatrix} [iαiβ]=[13 103 2][iaib]
这个系数矩阵的行列式值是 2 3 \frac{2}{\sqrt{3}} 3 2,所以这是一个满秩矩阵,所以这个系数矩阵的逆矩阵就是克拉克逆变换矩阵,完整的克拉克逆变换如下:
[ i a i b ] = [ 1 0 − 1 2 3 2 ] [ i α i β ] \begin{bmatrix} i_a \\ i_b \end{bmatrix} =\begin{bmatrix} 1 & 0 \\ -\frac{1}{2} & \frac{\sqrt{3}}{2} \end{bmatrix} \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} [iaib]=[121023 ][iαiβ]
i c i_c ic的计算可以通过 i a i_a ia i b i_b ib和基尔霍夫电流定律得到。

2.2 帕克变换

正如前面克拉克变换结束的时候所说,克拉克变换前后的电压和电流都是随着时间变化的,我们要想控制电机必须在合适的时间给合适的电压,对于高频变化的信号很显然是很不方便的,甚至是不现实的,所以我们需要想办法把我们的控制参数中的时间给去掉,这样对于后续处理就会方便很多,在高中物理学过正弦交流电的发电原理,发电机发出的正弦交流电 U = A sin ⁡ ( w t + φ ) U=A\sin(wt+\varphi) U=Asin(wt+φ)的角频率 w w w和发电机转子的角速度是正比例的,比例系数是极对数除以2,所以在这里我们也可以合理的猜测对于极对数为1的电机转动的角速度与正弦电压的角频率是相同的,同时考虑到角速度的公式 w = d θ d t w=\frac{\mathrm{d}\theta}{\mathrm{d}t} w=dtdθ,可以在转子上建立局地坐标系, d \mathrm{d} d轴方向与转子内磁场方向重合,纵坐标 q \mathrm{q} q轴垂直于 d \mathrm{d} d轴,符合右手螺旋定则,如下图所示,克拉克变换的前后坐标系是绝对坐标系,也就是说固定在转子上的这个坐标系是相对于绝对坐标系旋转的。
在这里插入图片描述
当电机转过的角度为 θ \theta θ的时候,克拉克逆变换后得到是一个复数 i α β = i m a x e − j w t i_{\alpha\beta}=i_{max}e^{-jwt} iαβ=imaxejwt,这个复数在转子坐标系下的极角应该比原本的定子坐标系的极角小 θ \theta θ,所以转子坐标系的极角应该是定子坐标系的极角减去 θ \theta θ,所以 i d q = i m a x e − j ( w t + θ ) i_{\mathrm{d}\mathrm{q}}=i_{max}e^{-j(wt+\theta)} idq=imaxej(wt+θ),将他们分别在实轴和虚轴展开可得:
{ i α = i m a x c o s ( w t ) i β = − i m a x s i n ( w t ) i d = i m a x c o s ( w t + θ ) i q = − i m a x s i n ( w t + θ ) \begin{cases} i_\alpha =i_{max}cos(wt) \\ i_\beta = -i_{max}sin(wt)\\ i_\mathrm{d} =i_{max}cos(wt+\theta) \\ i_\mathrm{q}= -i_{max}sin(wt+\theta) \end{cases} iα=imaxcos(wt)iβ=imaxsin(wt)id=imaxcos(wt+θ)iq=imaxsin(wt+θ)
然后利用余弦的和角公式将后两个式子展开,将前两个代入就可以得到如下变换(已转换为矩阵形式):
[ i d i q ] = [ c o s θ s i n θ − s i n θ c o s θ ] [ i α i β ] \begin{bmatrix} i_\mathrm{d} \\ i_\mathrm{q} \end{bmatrix} =\begin{bmatrix} \mathrm{cos}\theta & \mathrm{sin}\theta \\ -\mathrm{sin}\theta & \mathrm{cos}\theta \end{bmatrix} \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} [idiq]=[cosθsinθsinθcosθ][iαiβ]
这个矩阵的行列式的值等于1,所以这是一个全等变换,(说句题外话,全等变换有对称,平移和旋转,这里就是旋转,这个转换矩阵就叫做帕克变换,实际上这个矩阵在数学,物理和工程领域的应用数不胜数,遍地都是它的例子),可以注意到帕克变换后的电流分量一个平行于转子转动方向 q \mathrm{q} q,一个平行于转子转动方向 d \mathrm{d} d,这样问题就简单很多了。 θ \theta θ可以通过编码器实时测量得到,这样我们通过控制 i q i_{\mathrm{q}} iq i d i_{\mathrm{d}} id就可以控制定子产生的磁场。安培力表示通电导线在磁场的受力情况,表达式是 F = B I L s i n θ F=BILsin\theta F=BILsinθ θ \theta θ是电流和磁场的夹角,所以 θ = π 2 \theta=\frac{\pi}{2} θ=2π的时候导线受力最大,在这里就是转子提供的转矩最大,所以一般设置 i d = 0 i_{\mathrm{d}}=0 id=0,只需要设置 i q i_{\mathrm{q}} iq就可以决定电机三相电流的大小,所以我们实际应用需要的是帕克逆变换,根据 i q i_{\mathrm{q}} iq i d i_{\mathrm{d}} id来计算 i α i_{\mathrm{\alpha}} iα i β i_{\mathrm{\beta}} iβ,帕克逆变换如下:
[ i α i β ] = [ c o s θ − s i n θ s i n θ c o s θ ] [ i d i q ] \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} =\begin{bmatrix} \mathrm{cos}\theta & -\mathrm{sin}\theta \\ \mathrm{sin}\theta & \mathrm{cos}\theta \end{bmatrix} \begin{bmatrix} i_\mathrm{d} \\ i_\mathrm{q} \end{bmatrix} [iαiβ]=[cosθsinθsinθcosθ][idiq]

2.3 FOC算法基本原理总结

所谓FOC的过程,就是输入需求的电机力矩,最后得到对应的真实世界电机输出力矩的过程,如下图所示。而其中最核心的数学过程,就是帕克逆变换和克拉克逆变换,而这两个变换的数学公式就是下图中框图上面的公式,其中帕克变换可以对用户输入的 i q i_{q} iq进行变换,根据电角度算出 i α i_\alpha iα i β i_\beta iβ,接着,通过克拉克逆变换,求出三相电流 i a , i b , i c i_a, i_b, i_c ia,ib,ic,最后 i a , i b , i c i_a, i_b, i_c ia,ib,ic能够用作控制指令输入到电机控制器硬件中进行电机的控制。
在这里插入图片描述
在通过 i q i_q iq得到 i a , i b , i c i_a, i_b, i_c ia,ib,ic让电机顺利转起来以后还需要进行调节,经过这一系列的过程以后电机的实际工作情况是否和我们预期的一样是不知道的,所以需要对电机的电流,速度和位置数据进行采集,然后通过PID控制将预设值对实际值进行动态调节,让电机的实际运动与预期相同。

3. FOC闭环控制

下面是PID算法的基本表达式,也是FOC闭环控制的理论基础
u ( t ) = k p e ( t ) + k i ∫ 0 t e ( τ ) d τ + k d d e ( t ) d t u(t) = k_pe(t)+k_i\int_{0}^{t}e(\tau)\mathrm{d}\tau+k_d\frac{\mathrm{d}e(t)}{\mathrm{d}t} u(t)=kpe(t)+ki0te(τ)dτ+kddtde(t)
对应的离散形式是这样的:
u ( t ) = k p e ( t ) + k i ∑ j = 0 t e ( j ) + k d [ e ( t ) − e ( t − 1 ) ] u(t) = k_pe(t)+k_i\sum_{j=0}^{t}e(j)+k_d[e(t)-e(t-1)] u(t)=kpe(t)+kij=0te(j)+kd[e(t)e(t1)]
三项的基本含义如下:

  1. 比例项直接反映当前误差的实时大小,通过比例系数 k p k_p kp对误差进行放大或缩小,快速调整控制量以减少偏差。例如,若当前误差较大,比例项会立即输出较强的控制信号以缩小误差。比例项能迅速减小误差,但对稳态误差(静差)无法完全消除;
  2. 积分项通过积分常数 T i T_i Ti( k i = k p T T i k_i = \frac{k_pT}{Ti} ki=TikpT,T为采样周期)累积历史误差,消除比例控制无法处理的稳态误差。例如,若误差长期存在,积分项会持续累积误差值并增强控制作用,直至误差归零。积分项的主要作用就是彻底消除系统稳态误差;
  3. 微分项通过微分常数 T d T_d Td( k d = k p T d T k_d = \frac{k_pT_d}{T} kd=TkpTd,T为采样周期)预测误差的变化趋势(即误差的导数),提前抑制超调并加快系统响应速度。例如,若误差快速增大,微分项会提前输出反向控制量以减缓变化速度。微分项住主要特点​​有抑制超调​​:微分作用可提高系统阻尼,减少超调量和调节时间。噪声敏感​​:微分对高频噪声敏感,可能放大干扰信号,需配合滤波措施。

3.1 FOC位置闭环

3.2 FOC速度闭环

3.3 FOC电流闭环

4. 参考资料

  1. https://dengfoc.com/
  2. https://www.bilibili.com/video/BV1cj411M7Xu
  3. https://blog.csdn.net/lanxiaoke123/article/details/90410560
  4. https://blog.csdn.net/weixin_42164589/article/details/95330403

相关文章:

FOC算法开环控制基础

1. 为什么要有FOC算法 先看看从有刷电机到无刷电机的简单介绍,如下图1,通电螺线圈会产生磁场,这个磁场会产生N级和S级,然后这个电磁铁就可以吸引永磁体,S级吸引N级,N级吸引S级,通俗的来说&…...

进程间通信——管道

概念 进程间通信(Inter-Process Communication,简称 IPC)是指在不同进程之间进行数据交换和信息传递的机制。它的目的主要有4种: 数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间…...

五一作业-day02

文章目录 1. 每日基操2. 模拟故障2.1 **remove regular empty file 是否删除普通文件(空的)?**2.2 **is a directory xxx是一个目录**2.3 **xxx not a directory 不是一个目录**2.4 Cant open file for writing2.5 **No write since last change** 3. 习题4. **进阶习题** 1. …...

Springclound常用五大组件及其使用原理

注册中心Eureka Eureka-Server:就是服务注册中心(可以是一个集群),对外暴露自己的地址。 提供者:启动后向Eureka注册自己信息(地址,服务名称等),并且定期进行服务续约 …...

Qt 显示QRegExp 和 QtXml 不存在问题

QRegExp 和 QtXml 问题 在Qt6 中 已被弃用; 1)QRegExp 已被弃用,改用 QRegularExpression Qt5 → Qt6 重大变更:QRegExp 被移到了 Qt5Compat 模块,默认不在 Qt6 核心模块中。 错误类型解决方法QRegExp 找不到改用 Q…...

开元类双端互动组件部署实战全流程教程(第4部分:后台配置系统与参数动态控制)

作者:曾经因为后台配置写错,导致全服进不去房的工程师 组件附带的后台管理系统为 PHP 编写,界面简洁但功能齐全。具备完整的模块划分与权限体系,支持动态参数下发、日志审计、行为数据统计等。 七、前端后台交互流程图与代码示例 …...

MySQL基础关键_008_DDL 和 DML(一)

目 录 一、DDL 1.创建表 (1)语法格式 (2)实例 2.查看建表语句 (1)语法格式 (2)实例 3.修改表名 (1)语法格式 (2)实例 4.新…...

基于SpringBoot + Vue 的火车票订票系统

包含: [1]源码✔ 数据库文件✔ [2]万字文档✔ [3]视频与图文配置教程✔ 功能描述: 本系统包含管理员、用户两个角色。 管理员:用户管理、新闻公告管理、车辆管理、车站及路线管理、留言建议管理、车次信息管理 用户:购票操作、查…...

飞致云开源社区月度动态报告(2025年4月)

自2023年6月起,中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》,旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况,以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…...

解决跨域的4种方法

00_跨域的概念 浏览器只允许请问具有相同的协议&#xff0c;域名&#xff0c;端口&#xff0c;进行请求&#xff0c;有一个不同&#xff0c;就会拒绝。 01.前后端协商jsonp //jsonp//jsonp 是 json with padding 的缩写&#xff0c;是一种通过 <script> 标签的 src 属性…...

C# 方法(局部函数和参数)

本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 局部函数 正如刚刚所解释的&…...

kotlin 02flow-sharedFlow 完整教程

一 sharedFlow是什么 SharedFlow 是 Kotlin 协程中 Flow 的一种 热流&#xff08;Hot Flow&#xff09;&#xff0c;用于在多个订阅者之间 共享事件或数据流。它适合处理 一次性事件&#xff08;如导航、弹窗、Toast、刷新通知等&#xff09;&#xff0c;而不是持续状态。 ✅ …...

数据库原理——E-R图的极速省流理解 例题解析

前言 数据库一节没听&#xff0c;一个小时看书给我大致看懂了 E-R概念模型极速省流版 E-R图的重点&#xff1a; 关系图&#xff0c;三要素——实体、属性、联系 图形标识——矩形、椭圆形、菱形 1.实体和属性也可以放一个框矩形框 2.菱形两层边&#xff1a;弱实体集的联…...

5.4 - 5.5Web基础+c语言拓展功能函数

StringBoot HTTP协议&#xff1a; 规定了浏览器与服务器之间数据传递的规则。 请求协议&#xff1a; 请求数据格式&#xff1a; 请求头和请求体之间有一个空行隔开 响应协议&#xff1a; 响应数据格式&#xff1a; 响应头和响应体之间存在空行隔开。 响应数据设置&#xff1…...

Java抽象类与接口详解

一、抽象类(Abstract Class) 1. 定义与基本使用 // 抽象类定义 public abstract class Animal {// 抽象方法(无实现)public abstract void makeSound();// 具体方法(有实现)public void sleep() {System.out.println("动物在睡觉");} }// 继承抽象类 class Dog ext…...

网络延时 第四次CCF-CSP计算机软件能力认证

就是求树的直径: 思路&#xff1a;函数代表当前根节点的最长距离 然后遍历保存当前树的所有孩子的最长距离 和次长距离 如果是叶子节点就返回0 在每次获得每个节点的次长距离和最长距离就更新全局直径 最后获得最长距离 Ac代码: #include <bits/stdc.h> using namespa…...

【C++进阶十】多态深度剖析

【C进阶十】多态深度剖析 1.多态的概念及条件2.虚函数的重写3.重写、重定义、重载区别4.C11新增的override 和final5.抽象类6.虚表指针和虚表6.1什么是虚表指针6.2指向谁调用谁&#xff0c;传父类调用父类&#xff0c;传子类调用子类 7.多态的原理8.单继承的虚表状态9.多继承的…...

网络传输中字节序

在小端字节序主机发送数据 0x1234 的情况下,(单字节没有字节序)我们可以分步骤来分析接收端如何解析这个数据: 1. 小端字节序主机的存储方式 在小端字节序中,低地址存储低字节,高地址存储高字节。 数据 0x1234 的字节表示为: 低字节:0x34 高字节:0x12 因此,在小端字…...

前端- ElementPlus入门

1.介绍 Element&#xff1a;是饿了么公司前端开发团队提供的一套基于 Vue3 的网站组件库&#xff0c;用于快速构建网页。 Element 提供了很多组件供我们使用。例如 超链接、按钮、图片、表格等等。 官方网站&#xff1a;一个 Vue 3 UI 框架 | Element Plus 2.步骤 1.安装E…...

AI Agent 要用到的技术

AI 发展是大趋势&#xff0c;以下是目前要用到的一些技术项 不论你从事哪个方向&#xff0c;这个技术栈都有必要学习 LangChainTransformersMicrosoft Semantic KernelLangflowLangGrphLangSmith 学习网站 以下是 LangChain、Transformers、Microsoft Semantic Kernel 的学习…...

# 从零构建一个简单的卷积神经网络:手写数字识别

从零构建一个简单的卷积神经网络&#xff1a;手写数字识别 在深度学习的世界里&#xff0c;卷积神经网络&#xff08;CNN&#xff09;是处理图像数据的强大工具。今天&#xff0c;我们将通过一个简单的例子&#xff0c;从零开始构建一个CNN模型&#xff0c;用于手写数字识别。…...

【RK3588嵌入式图形编程】-Cairo-Cairo图形库支持后端

Cairo图形库支持后端 文章目录 Cairo图形库支持后端1、PNG图像后端2、PDF文件后端3、SVG文件后端4、GTK窗口支持Cairo库支持多种后端。在本文中,我们使用Cairo创建PNG图像、PDF文件、SVG文件,并在GTK窗口上绘制。 1、PNG图像后端 在第一个示例中,我们创建一个 PNG 图像。 …...

LCD,LED

本文来源 &#xff1a; 腾讯元宝 LCD(Liquid Crystal Display)液晶显示器 LCD本身并不能发光&#xff0c;而是控制光的传输。 LCD内充满了棒状的液态分子&#xff08;液晶&#xff09;&#xff0c;这些分子可以形成扭转的螺旋线&#xff0c;弯曲来自显示器背后光源产生的光线或…...

HTML 元素

什么是 HTML 元素&#xff1f; HTML 元素&#xff08;Element&#xff09;是构成 HTML 文档的基本单位&#xff0c;它由开始标签、内容和结束标签组成&#xff0c;用于定义网页的结构和内容。元素是 HTML 标记语言的核心概念&#xff0c;每个元素都有特定的语义和用途。 元素…...

(undone) MIT6.S081 2023 学习笔记 (Day11: LAB10 mmap)

url: https://pdos.csail.mit.edu/6.1810/2023/labs/mmap.html 任务0&#xff1a;讲义如下 (完成) mmap和munmap系统调用允许UNIX程序对其地址空间进行精细控制。它们可用于进程间共享内存、将文件映射到进程地址空间&#xff0c;并作为用户级页面错误处理方案的一部分&#x…...

7400MB/s5050TBW完美结合,全新希捷酷玩530R SSD体验评测

7400MB/s&5050TBW完美结合&#xff0c;全新希捷酷玩530R SSD体验评测 哈喽小伙伴们好&#xff0c;我是Stark-C~ 说到希捷酷玩530 SSD&#xff0c;很多硬核进阶玩家应该都知道&#xff0c;或者说正在使用&#xff08;比如说我~&#xff09;。 作为希捷大厂旗下高性能SSD的…...

【数据结构与算法】同余计算 哈希表与前缀和问题特征和模板化思路

加减乘负的类同余计算 加乘模情况 两数和模 : (a b) mod m (a mod m b mod m) mod m乘积模 : (a * b) mod m ((a mod m) * (b mod m)) mod m 加模证明如下 : a q1 * m r1 , b q2 * m r2则 a mod m r1 , b mod m r2(a b) mod m ((q1 q2) * m (r1 r2)) mod m …...

TS 交叉类型

很类似于接口继承啊 哈哈哈 使用type关键字声明交叉类型 // 声明交叉类型 type PersonDetail person & Contactlet theshy:PersonDetail { name:the shy,phone:马头 }交叉类型和接口实现对对象的类型注解的区别与联系 如果在接口继承时发生同名属性冲突会报不兼容的错…...

FreeRTOS学习系列·二值信号量

目录 1. 信号量的基本概念 2. 二值信号量 3. 应用场景 4. 运作机制 5. 信号量控制块 6. 常用信号量函数接口API 6.1 创建二值信号量 xSemaphoreCreateBinary() 6.2 信号量删除函数 vSemaphoreDelete() 6.3 信号量释放函数 6.3.1 xSemaphoreGive() 6.3.2 …...

二叉搜索树 AVL树 红黑树 的性质

二叉搜索树 如何判断一棵树是否是二叉搜索树&#xff1f; 1.方法一 左子树的所有节点值 < 当前节点值&#xff0c;右子树的所有节点值 > 当前节点值&#xff0c;左右子树也必须满足 。 2.方法二 中序遍历&#xff0c;得到的序列是有序的 红黑树 红黑树的性质 1.根…...

分析 Docker 磁盘占用

以下是分析 Docker 磁盘占用的详细步骤和工具指南&#xff0c;帮助开发者快速定位和清理冗余数据&#xff1a; 1. 查看 Docker 磁盘使用概览 docker system df 输出说明&#xff1a; TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 15 …...

LLM提示词设计及多轮对话优化策略在心理健康咨询场景中的应用研究

多轮对话策略:设计LLM提示词并优化多轮对话输出 LLM提示词设计及多轮对话优化策略在心理健康咨询场景中的应用研究 摘要 本文针对大语言模型(LLM)在心理健康问题咨询对话场景中的应用,系统研究提示词设计方法及多轮对话优化策略。通过分析提示词核心原理,构建包含任务指…...

Kubernetes(k8s)学习笔记(七)--KubeSphere 最小化安装

前情提要 可视化操作面板对于开发、运维绝对是提升工作效率的一大利器&#xff0c;因此很有必要搭建一套可视化操作来管理Kubernetes。 可视化面板有多种&#xff1a; 1.Kubernetes官方提供的默认面板&#xff1a;dashboard&#xff0c;用处不大&#xff0c;放弃&#xff1b…...

面向对象与过程介绍

一、面向对象具体介绍 &#xff08;1&#xff09;基本概念 1.对象 在面向对象编程中&#xff0c;对象是对现实世界中事物的抽象&#xff0c;它具有状态&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;。在 TypeScript 中&#xff0c;我们可以通过类、接口等…...

UniGetUI 使用指南:轻松管理 Windows 软件(包括CUDA)

UniGetUI&#xff08;前身为 WingetUI&#xff09;是一款专门为 Windows 10&#xff08;x64&#xff09;和 Windows 11 系统打造的图形化包管理器界面工具。它集成了 Winget、Scoop、Chocolatey、Npm、Pip、Cargo、vcpkg、.NET Tool 和 PowerShell 等多种常用包管理器的功能&am…...

使用 NGINX 实现 HTTP Basic 认证ngx_http_auth_basic_module 模块

一、前言 在 Web 应用中&#xff0c;对部分资源进行访问控制是十分常见的需求。除了基于 IP 限制、JWT 验证、子请求校验等方式外&#xff0c;最经典也最简单的一种方式便是 HTTP Basic Authentication。NGINX 提供的 ngx_http_auth_basic_module 模块支持基于用户名和密码的基…...

014枚举之指针尺取——算法备赛

枚举是数据结构与算法中基本的操作&#xff0c;常用于解决序列的区间问题。算法界将"双指针"视为其重要分支&#xff0c;类似地当然还有"三指针"&#xff0c;“四指针”&#xff0c;最常见的还是“双指针”&#xff0c;我认为它们应统称为“指针尺取”。 双…...

Python小酷库系列:bidict,可以双向查询的dict

bidict&#xff0c;可以双向查询的dict 基本使用创建双向字典正向查找&#xff08;key → value&#xff09;反向查找&#xff08;value → key&#xff09;添加新项删除项 进阶功能使用 ~ &#xff08;.inverse&#xff09;获取逆映射使用 namedbidict 创建具名双向字典批量更…...

Android Compose 中 CompositionLocal 的全面解析与最佳实践

CompositionLocal 在 Android Compose 中的详细总结 核心概念 CompositionLocal 是 Jetpack Compose 提供的一种隐式数据传递机制&#xff0c;允许数据在组件树中向下传递&#xff0c;而无需显式地通过每个 Composable 函数的参数传递。 两种创建方式 1. staticComposition…...

Qt开发:容器组控件的介绍和使用

文章目录 一、Group Box&#xff08;分组框&#xff09;1.1 QGroupBox 简介1.2 基本用法1.3 设置为可勾选&#xff08;可启用/禁用子控件&#xff09;1.4 信号与槽连接&#xff08;监控勾选状态&#xff09;1.5 布局示例&#xff08;完整&#xff09; 二、Scroll Area&#xff…...

JS逆向入门案例1——集思录登录

JS逆向入门案例1——集思录登录 前言声明网站流程分析总结 前言 由于这段时间本职工作比较繁忙&#xff0c;没有很多空余的时间去研究各大厂的加密风控了&#xff0c;想起来自己刚接触js逆向走过坎坷&#xff0c;所以决定出一期js入门案例分析&#xff0c;为刚接触js逆向的小伙…...

ARM子程序和栈

微处理器中的栈由栈指针指向存储器中的栈顶来实现&#xff0c;当数据项入栈时&#xff0c;栈 指针向上移动&#xff0c;当数据项出栈时&#xff0c;栈指针向下移动。 实现栈时需要做出两个决定&#xff1a;一是当数据项进栈时是向低位地址方向向上生 长&#xff08;图a和图b&a…...

笔试专题(十五)

文章目录 排序子序列题解代码 消减整数题解代码 最长公共子序列(二)题解代码 排序子序列 题目链接 题解 1. 贪心 模拟 2. 1 2 3 2 2 应该是有两个排列子序列的&#xff0c;所以i n-1时ret 3. 把水平的位置和上升部分&#xff0c;水平位置和下降部分分为一个排列子序列 代…...

使用OpenCV 和 Dlib 进行卷积神经网络人脸检测

文章目录 引言1.准备工作2.代码解析2.1 导入必要的库2.2 加载CNN人脸检测模型2.3 加载并预处理图像2.4 进行人脸检测2.5 绘制检测结果2.6 显示结果 3.完整代码4.性能考虑5.总结 引言 人脸检测是计算机视觉中最基础也最重要的任务之一。今天我将分享如何使用dlib库中的CNN人脸检…...

某信服EDR3.5.30.ISO安装测试(一)

一、前言 1.某信服EDR3.5.30 以下简称“EDR3.5”&#xff0c;即统一端点安全管理系统aES(终端检测响应EDR)&#xff0c; 官网最新版&#xff1a;aES6.0.1R2&#xff0c;可下载的最低版本&#xff1a;EDR3.7.11R3&#xff0c; 下载地址&#xff1a;统一端点安全管理系统aES-…...

Dify 快速构建和部署基于LLM的应用程序

本文先对Dify做一个初步的认识&#xff0c;然后以一个实际的简单金融问答案例&#xff0c;配置chatflow 工作流。 一、Dify简介 如果你是第一次接触Dify&#xff0c;可以先创建一个简单的聊天助手&#xff0c;初步感觉一下&#xff0c;Dify在构建聊天问答类应用的过程。 比如…...

精益数据分析(40/126):移动应用商业模式的关键指标与盈利策略

精益数据分析&#xff08;40/126&#xff09;&#xff1a;移动应用商业模式的关键指标与盈利策略 在创业和数据分析的探索之路上&#xff0c;我们持续挖掘不同商业模式的内在规律&#xff0c;以寻求更好的发展机遇。今天&#xff0c;我们依旧秉持共同进步的理念&#xff0c;深…...

JavaScript 实现输入框的撤销功能

在 Web 开发中&#xff0c;为输入框添加撤销功能可以极大地提升用户体验&#xff0c;方便用户快速回滚到之前的输入状态。本文将通过一段简单的 HTML、CSS 和 JavaScript 代码&#xff0c;详细介绍如何实现输入框的撤销功能。 整体实现思路 利用 JavaScript 监听输入框的inpu…...

【C++】类和对象(一)

前言 类和对象第一部分知识包括定义访问限定符类域实例化this指针 本人其他文章&#xff1a;恋风诗 文章中的源码[gitte]&#xff1a;mozhengy 类和对象&#xff08;一&#xff09; 前言1. 类的定义引例1.1 类定义格式1.2 类的访问限定符1.3 类域 2. 实例化2.1 实例化概念2.2 …...

【Vue】Vue3源码解析与实现原理

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Vue 文章目录 1. Vue 3 架构概览1.1 模块化设计1.2 整体流程 2. 响应式系统2.1 响应式原理2.2 ref 和 reactive2.3 依赖收集与触发更新 3. 渲染系统3.1 虚拟DOM设计3.2 渲染管线3.3 Patch算法与Diff优化 4. 组件系统4.1 组件创建…...