自学FOC系列分享--SVPWM和clark 逆变换及代码实战
自学FOC系列分享--SVPWM和clark 逆变换
- 1 说在前面
- 2 回顾clarke 和 park的变换和逆变换
- 2.1 概述
- 2.2 公式说明
- 3 SVPWM是如何写的
- 3.1 简单说明
- 3.2 重要对比
- 4、代码实战
- 4.1 代码构成说明
- 4.2 全部代码
- 4.3 测试代码
- 4.4 测试结果
- 4.5 结果分析
- 总结
1 说在前面
如前一篇文章所述的系统框架图如下:
此处,我将红色部分标红,对这个地方进行一个进一步的描述。
结论是: svpwm的计算过程中,包含了 clarke 逆变换
2 回顾clarke 和 park的变换和逆变换
2.1 概述
将电机的控制分为 检测 和 控制两部分
- 检测:
- ia ib ic -> iα & iβ : 三相到两相 ---------------------- clarke 变换
- iα & iβ + θ -> id & iq : 静止=》旋转坐标系 ---------------------park 变换
- 控制:
- Iq_in Id_in , id & iq -> PI 控制-> id_target & iq_target
- id_target & iq_target -> uα & uβ ---------------------park 逆变换
- 方案1: uα & uβ + θ -> ua ub uc ---------------------- clarke 逆 变换
- 方案2: uα & uβ + θ -> ta tb tc -----svpwm 变换
2.2 公式说明
-
clark变换
-
park变换
-
park逆变换
-
clarke逆变换
3 SVPWM是如何写的
我主要参考这篇文章:
https://blog.csdn.net/qq_35947329/article/details/115483413?spm=1001.2014.3001.5501
3.1 简单说明
SVPWM的主要作用就是clark 逆变换,在α-β 轴和 ua ub uc变换。
参考上图:
- 我们已经得到了Uα 和 Uβ , 我们需要得到ua,ub,uc。
- ua,ub,uc 又可以通过4 6 2 3 1 5 0 7 这几个矢量来表示
- 4 6 2 3 1 5 0 7 这几个适量又可以通过三相桥的开关状态和开关的时间的长短来表示(请参考文章) 相当于这几个矢量是ua ,ub,uc的另一种表达方式,通过这几个矢量的任意叠加,可得到任意方向矢量
为了真切的让大家感受到为什么svpwm就是clarke 逆变换,我们需要实际的计算:
假设Uθ在第一扇区:
假设Uθ 在第二扇区:
以此类推,我们可得到一个特点就是:
如果令:
3.2 重要对比
clark 逆变换和 我们计算作用时间时候的公式是相同的
4、代码实战
4.1 代码构成说明
使用python脚本,实现开环SPWM和SVPWM代码
代码将详细说明
函数有如下几个:
- clark() 和iclark()
- park() 和ipark()
- update_theta(): 更新最新的目标角度
- svpwm() : 具体svpwm的实现
- iclark2pwm(): 替代svpwm的SPWM
4.2 全部代码
class FOC:def __init__(self): # 初始化变量self.u_d = 0.0self.u_q = 0.0self.u_theta = 0.0self.u_alpha = 0.0self.u_beta = 0.0self.t_a = 0.0self.t_b = 0.0self.t_c = 0.0self.i_a = 0.0self.i_b = 0.0self.i_c = 0.0self.i_alpha = 0.0self.i_beta = 0.0self.i_d = 0.0self.i_q = 0.0self.sine = 0.0self.cosine = 0.0self.u_a=0.0self.u_b = 0.0self.u_c = 0.0def clark(self):"""Clarke 变换:将三相电流 (i_a, i_b, i_c) 转换为两相静止坐标系 (i_alpha, i_beta)"""self.i_alpha = self.i_aself.i_beta = (self.i_a + 2 * self.i_b) * 0.57735 # 1/sqrt(3) ≈ 0.57735def park(self):"""Park 变换:将两相静止坐标系 (i_alpha, i_beta) 转换为旋转坐标系 (i_d, i_q)"""self.i_d = self.i_alpha * self.cosine + self.i_beta * self.sineself.i_q = -self.i_alpha * self.sine + self.i_beta * self.cosinedef ipark(self):"""逆 Park 变换:将旋转坐标系 (u_d, u_q) 转换为两相静止坐标系 (u_alpha, u_beta)"""self.u_alpha = self.u_d * self.cosine - self.u_q * self.sineself.u_beta = self.u_d * self.sine + self.u_q * self.cosinedef iclark(self):self.u_a = self.u_alphaself.u_b = -0.5 * self.u_alpha + (np.sqrt(3) / 2) * self.u_betaself.u_c = -0.5 * self.u_alpha - (np.sqrt(3) / 2) * self.u_betadef iclark2pwm(self):self.t_a=self.u_aself.t_b=self.u_bself.t_c=self.u_cdef svpwm(self):"""空间矢量脉宽调制 (SVPWM):将两相静止坐标系 (u_alpha, u_beta) 转换为三相 PWM 信号 (t_a, t_b, t_c)"""ts = 1.0 # PWM 周期u1 = (self.u_beta)u2 = -0.8660254037844386 * self.u_alpha - 0.5 * self.u_beta # -sqrt(3)/2 ≈ -0.866u3 = 0.8660254037844386 * self.u_alpha - 0.5 * self.u_beta # sqrt(3)/2 ≈ 0.866# 扇区判断sector = (u1 > 0.0) + ((u2 > 0.0) << 1) + ((u3 > 0.0) << 2)if sector == 5:t4 = u3t6 = u1sum_t = t4 + t6if sum_t > ts:k = ts / sum_tt4 *= kt6 *= kt7 = (ts - t4 - t6) / 2self.t_a = t4 + t6 + t7self.t_b = t6 + t7self.t_c = t7elif sector == 1:t2 = -u3t6 = -u2sum_t = t2 + t6if sum_t > ts:k = ts / sum_tt2 *= kt6 *= kt7 = (ts - t2 - t6) / 2self.t_a = t6 + t7self.t_b = t2 + t6 + t7self.t_c = t7elif sector == 3:t2 = u1t3 = u2sum_t = t2 + t3if sum_t > ts:k = ts / sum_tt2 *= kt3 *= kt7 = (ts - t2 - t3) / 2self.t_a = t7self.t_b = t2 + t3 + t7self.t_c = t3 + t7elif sector == 2:t1 = -u1t3 = -u3sum_t = t1 + t3if sum_t > ts:k = ts / sum_tt1 *= kt3 *= kt7 = (ts - t1 - t3) / 2self.t_a = t7self.t_b = t3+t7self.t_c = t1 + t3 + t7elif sector == 6:t1 = u2t5 = u3sum_t = t1 + t5if sum_t > ts:k = ts / sum_tt1 *= kt5 *= kt7 = (ts - t1 - t5) / 2self.t_a = t5 + t7self.t_b = t7self.t_c = t1 + t5 + t7elif sector == 4:t4 = -u2t5 = -u1sum_t = t4 + t5if sum_t > ts:k = ts / sum_tt4 *= kt5 *= kt7 = (ts - t4 - t5) / 2self.t_a = t4 + t5 + t7self.t_b = t7self.t_c = t5+t7def update_theta(self, theta):"""更新角度 theta,并计算 sine 和 cosine"""self.u_theta = thetaself.sine = math.sin(theta)self.cosine = math.cos(theta)
4.3 测试代码
# 示例用法
if __name__ == "__main__":foc = FOC()# 设置输入电流t_a_wave = [];t_b_wave = [];t_c_wave = [];u_a_wave = [];u_b_wave = [];u_c_wave = [];u_ab_wave = [];u_bc_wave = [];u_ca_wave = [];n_mid_wave = [];# 设置角度 thetafor i in np.arange(0,7,0.001):theta = i # 30 度转换为弧度foc.update_theta(theta)# 设置 d-q 轴电压foc.u_d = 1foc.u_q = 0.0# 执行 Clarke 变换#foc.clark()#print(f"Clarke 变换结果: i_alpha = {foc.i_alpha}, i_beta = {foc.i_beta}")# 执行 Park 变换#foc.park()#print(f"Park 变换结果: i_d = {foc.i_d}, i_q = {foc.i_q}")# 执行逆 Park 变换foc.ipark()print(f"逆 Park 变换结果: u_alpha = {foc.u_alpha}, u_beta = {foc.u_beta}")# 执行 SVPWM,# t_a, t_b, t_c 是实际a , b , c 端电压:端子与母线GND的压差,a、b、c点伏秒电压,foc.svpwm()# foc.iclark()# foc.iclark2pwm()print(f"SVPWM 结果: t_a = {foc.t_a}, t_b = {foc.t_b}, t_c = {foc.t_c}")#执行得到 U_a U_b Uc的实际值# 其是线电压波形, 三次谐波被消除掉,# a 的相电压u_a= foc.t_a - 0.5 * (foc.t_b + foc.t_c);u_b = foc.t_b - 0.5 * (foc.t_a + foc.t_c);u_c = -(u_a+u_b)# 线电压计算:u_ab_wave.append(u_a-u_b);u_bc_wave.append(u_b - u_c);u_ca_wave.append(u_c-u_a);n=0.5 * (foc.t_b + foc.t_c);u_a_wave.append(u_a);u_b_wave.append(u_b);u_c_wave.append(u_c);t_a_wave.append(foc.t_a);t_b_wave.append(foc.t_b);t_c_wave.append(foc.t_c);# 绘制散点图plt.subplot(3,1,1)plt.scatter(range(len(u_ab_wave)), u_ab_wave, color='red', marker='.') # 使用索引作为X轴,数据作为Y轴plt.scatter(range(len(u_bc_wave)), u_bc_wave, color='green', marker='.') # 使用索引作为X轴,数据作为Y轴plt.scatter(range(len(u_ca_wave)), u_ca_wave, color='blue', marker='.') # 使用索引作为X轴,数据作为Y轴plt.title("line voltage") # 添加标题plt.xlabel("Index") # 添加X轴标签plt.ylabel("Value") # 添加Y轴标签plt.grid(True) # 添加网格#plt.show() # 显示图形#plt.subplot(3, 1, 2)plt.scatter(range(len(t_a_wave)), t_a_wave, color='red', marker='o') # 使用索引作为X轴,数据作为Y轴plt.scatter(range(len(t_b_wave)), t_b_wave, color='green', marker='o') # 使用索引作为X轴,数据作为Y轴plt.scatter(range(len(t_c_wave)), t_c_wave, color='blue', marker='o') # 使用索引作为X轴,数据作为Y轴plt.title("endpoint voltage") # 添加标题plt.xlabel("Index") # 添加X轴标签plt.ylabel("Value") # 添加Y轴标签plt.grid(True) # 添加网格#plt.show() # 显示图形# ## # 绘制散点图plt.subplot(3, 1, 3)plt.scatter(range(len(u_a_wave)), u_a_wave, color='red', marker='o') # 使用索引作为X轴,数据作为Y轴plt.scatter(range(len(u_b_wave)), u_b_wave, color='green', marker='o') # 使用索引作为X轴,数据作为Y轴plt.scatter(range(len(u_c_wave)), u_c_wave, color='blue', marker='o') # 使用索引作为X轴,数据作为Y轴plt.title("xiang voltage") # 添加标题plt.xlabel("Index") # 添加X轴标签plt.ylabel("Value") # 添加Y轴标签plt.grid(True) # 添加网格plt.show() # 显示图形#
## 1.引入库
代码如下(示例):```c
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
4.4 测试结果
4.5 结果分析
相电压、线电压、端电压的概念:
https://zhuanlan.zhihu.com/p/448123274
对于控制电机旋转的电流的波形: 正弦
对应的相电压:正弦
对应的线电压为ua-ub: 正弦+ 正弦=》正弦
端电压:a点到母线参考GND的波形=》马鞍形
为什么形成了马鞍形??
参考这个博主对正格6个扇区分别的计算,可以算出来其是每个扇区分别对应了马鞍形的几个分段
https://www.bilibili.com/video/BV1wvWoeSErL/?spm_id_from=333.1391.0.0&vd_source=08330a8c02f0c1cbea0eb7eea17e1e8d
那么为什么这个马鞍形代表了端电压?
我的理解如下,实际上,马鞍形的绘制,我是直接使用a b c 三个线圈在一个周期内的导通的时间长度来绘制的,也就是a , b,c 三相电压的平均值,所以相当于a点对于gnd 的电压变化
根据端电压,如何得到相电压呢?:
从向量图角度理解:
ua,ub,uc 的端电压知道,对应的方向也是知道的,求得相电压如下:
Uoa=Ua-ubcos(60°)-Uccos(60°)
Uob=Ub-uacos(60°)-Uccos(60°)
Uoc=Uc-uacos(60°)-Ubcos(60°)=-(Uoa+Uob)
如上如果用电流的方式理解大概如下:
(1) 电机的三相电流,同一个时刻只有一个流入或者只有一个流出。
如下的计算公式:
u_a= foc.t_a - 0.5 * (foc.t_b + foc.t_c);
u_b = foc.t_b - 0.5 * (foc.t_a + foc.t_c);
u_c = -(u_a+u_b)
用上图的基尔霍夫定律来说明,以a相距离:
a流入,a导通了foc.ta的时间, b和c 分别反向抵消了了一部分
这个地方我还是不确定该如何理解?
如何得到线电压呢?
有了端电压Ua Ub Uc ,我们先求Uab Ubc Uca 相减即可
总结
如上我们讲解SVPWM的基本原理,给出了撰写过程,以及我的理解方式
相关文章:
自学FOC系列分享--SVPWM和clark 逆变换及代码实战
自学FOC系列分享--SVPWM和clark 逆变换 1 说在前面2 回顾clarke 和 park的变换和逆变换2.1 概述2.2 公式说明 3 SVPWM是如何写的3.1 简单说明3.2 重要对比 4、代码实战4.1 代码构成说明4.2 全部代码4.3 测试代码4.4 测试结果4.5 结果分析 总结 1 说在前面 如前一篇文章所述的系…...
LeetCode-524. 通过删除字母匹配到字典里最长单词
1、题目描述: 给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。 如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在&#x…...
浅谈网络 | 容器网络之Cilium
目录 Cilium介绍Cilium是什么Cilium 主要功能特性为什么用Cilium? 功能概述组件概况BPF 与 XDPeBPF (Extended Berkeley Packet Filter)XDP (eXpress Data Path) Cilium介绍 Cilium是什么 Cilium 是一个开源网络和安全项目,专为 Kubernetes、Docker 和…...
armv7l
在 **ARMv7l** 中,最后的字符是字母 **“l”**(小写字母 “L”),而不是数字 **“1”**。 --- ### 1. **ARMv7l 的含义** - **ARMv7**:指的是 **ARM 架构的第 7 代版本**,是一种广泛应用于嵌入式系统&…...
从零开始构建一个小型字符级语言模型的完整详细教程(基于Transformer架构)
最近特别火的DeepSeek,是一个大语言模型,那一个模型是如何构建起来的呢?DeepSeek基于Transformer架构,接下来我们也从零开始构建一个基于Transformer架构的小型语言模型,并说明构建的详细步骤及内部组件说明。我们以构建一个字符级语言模型(Char-Level LM)为例,目标是通…...
期权帮|股指期货交割日为啥会大跌?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 股指期货交割日为啥会大跌? 股指期货交割日股市可能会大跌,主要原因有以下几点: 1.交割日时多空双方需要平仓或转仓,若多头急于平仓…...
B树和B+树
1. B树 1.1 定义 B树是一种多路平衡查找树,具有以下性质: 每个节点最多包含 m 个子节点(m 阶 B树)。 根节点至少有两个子节点(除非它是叶子节点)。 每个内部节点(非根和非叶子节点ÿ…...
分布式事务核心理论:CAP与BASE
一、引言:分布式系统的挑战 在互联网应用中,随着业务规模的扩大,单机数据库已无法满足高并发和海量数据存储需求。分布式系统将数据拆分到不同节点,但随之带来了数据一致性的难题。CAP与BASE理论为分布式事务提供了重要的设计指导…...
【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记
本文内容为重写上一节课中的单链表,将其重构成更易于用户使用的链表,实现多种操作链表的方法。 1. 重构单链表SLList 在上一节课中编写的 IntList 类是裸露递归的形式,在 Java 中一般不会这么定义,因为这样用户可能需要非常了解…...
记录一个ES分词器不生效的解决过程
问题背景 商城项目,其中商品查询检索使用的是ES, 但存在某些商品查询不到的问题 例如:某商品名包含AA_BBB这样的关键词,但是搜索"AA"不能查询到该商品,但是将商品名修改为AA BBB后就能查询到了. 怀疑是分词的问题,但看代码,在创建ES索引时在对应字段上也定义了分词器…...
Jeecg+vue3去掉JInput组件默认模糊查询的配置方式
遇见的问题:input查询带**号 情况1、使用schemas配置的表单项 添加type""属性,默认type为like,去掉模糊则配置为空 文档链接 jeecg文档说明JInput 2、直接调用组件则在属性上直接添加type""属性...
Could not initialize class io.netty.util.internal.Platfor...
异常信息: Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjec…...
什么是业务流程分类框架
业务流程分类框架是一个用于组织和系统化地分类业务流程的结构化方法。它旨在帮助企业理解、管理、分析和改进其运营流程。 可以把它想象成一个图书馆的图书分类系统,帮助快速找到和理解不同类型的书籍。对于业务流程来说,分类框架帮助快速了解不同类型的…...
向量的点乘的几何意义
源自AI 向量的点乘(Dot Product)在几何和图形学中有重要的意义。它不仅是数学运算,还可以用来描述向量之间的关系。以下是点乘的几何意义及其应用: 1. 点乘的定义 对于两个向量 a 和 b,它们的点乘定义为:…...
达梦数据库应用开发_JDBC接口介绍_yxy
达梦数据库应用开发_JDBC接口介绍 1 JDBC是什么?2 JDBC主要类或接口介绍2.1 建立与 DM 数据库的连接2.2 转接发送 SQL 语句到数据库2.3 处理并返回语句执行结果 3 JDBC基本使用3.1 前期准备3.2 增删改查代码示例3.3 绑定变量操作示例3.4 大字段操作示例 1 JDBC是什么…...
在ubuntu上用Python的openpyxl模块操作Excel的案例
文章目录 安装模块读取Excel数据库取数匹配数据和更新Excel数据 在Ubuntu系统的环境下基本职能借助Python的openpyxl模块实现对Excel数据的操作。 安装模块 本次需要用到的模块需要提前安装(如果没有的话) pip3 install openpyxl pip3 install pymysql在操作前,需…...
RabbitMQ介绍以及基本使用
文章目录 一、什么是消息队列? 二、消息队列的作用(优点) 1、解耦 2、流量削峰 3、异步 4、顺序性 三、RabbitMQ基本结构 四、RabbitMQ队列模式 1、简单队列模式 2、工作队列模式 3、发布/订阅模式 4、路由模式 5、主题模式 6、…...
搭建 Hadoop 3.3.6 伪分布式
搭建 Hadoop 3.3.6 伪分布式 IP 192.168.157.132 初始化操作 更改yum源 # 1_1.安装Wget yum install wget# 1_2.备份CentOS-Base.repo文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak# 2.下载阿里yum源配置 wget -O /etc/yum.repos.d/Cen…...
进程控制(靠原语实现)
什么是进程控制? 进程控制的主要功能是:对系统中的所有进程实施有效管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。 简化理解:进程控制就是要实现进程状态转换。 知识一览: 如何实现进程控制&#…...
linux5-多任务--进程fork()
一.多任务:让系统具备同时处理多个任务的能力 1.如何实现多任务 1.1进程:操作系统上正在运行的程序,需要消耗内存和CPU 1.1.1 进程的生存周期:创建、调度、消亡 1.1.1.1进程的创建:每个进程被创建时,操作…...
【蓝桥】二分法
1、简介 1.1 定义: 通过将问题的搜索范围一分为二,迭代地缩小搜索范围,直到找到目标或确定目标不存在 1.2 适用: 有序数据集合,且每次迭代可以将搜索范围缩小一半 1.3 本质: 枚举:利用数据结构…...
linux查看程序占用的本地端口
ss是Socket Statistics的缩写,用来替代旧的netstat工具,功能更强大,执行更快。它用于查看系统的网络连接情况,包括TCP、UDP等协议的信息。 一. 命令解析: sudo ss -tulwnpss (Socket Statistics):替代 ne…...
统计函数运行时间的python脚本
这是一个统计函数运行时间的实用脚本,其中用到了函数的嵌套、链式传输参数,以及修饰器。 import time# 定义一个装饰器timer,用于计算被装饰函数的运行时间 def timer(func):print("执行了timer")def wrapper(*args, **kwargs):st…...
百度搜索和文心智能体接入DeepSeek满血版——AI搜索的新纪元
在当今数字化时代,搜索引擎作为互联网信息获取的核心工具,正经历着前所未有的变革。据悉,2025年2月16日,百度搜索和文心智能体平台宣布全面接入DeepSeek和文心大模型的最新深度搜索功能,搜索用户可免费使用DeepSeek和文…...
快速入门Springboot+vue——MybatisPlus快速上手
学习自哔哩哔哩上的“刘老师教编程”,具体学习的网站为:6.MybatisPlus快速上手_哔哩哔哩_bilibili,以下是看课后做的笔记,仅供参考。 第一节 ORM介绍 ORM对象关系映射,为了解决面向对象与关系数据库存在的互补匹配现象…...
在C#中动态访问对象属性时,用表达式树可以获得高效性能
在C#中如何用表达式树动态访问对象属性的问题。用户可能已经知道反射的基本用法,但想用表达式树来提高性能,因为表达式树编译后的委托执行速度比反射快。 首先,表达式树的基本概念。表达式树允许在运行时构建代码,并编译成可执行的…...
性能:React 实战优化技巧 之 函数闭包
子组件使用了 React.memo ,为什么 “prop 值未发生改变”,子组件依然被重新渲染了? 🚧 示例:点击子组件中按钮,获取 input 数据进行提交(常见于表单) index.tsx import Author f…...
蓝桥杯学习大纲
(致酷德与热爱算法、编程的小伙伴们) 在查阅了相当多的资料后,发现没有那篇博客、文章很符合我们备战蓝桥杯的学习路径。所以,干脆自己整理一篇,欢迎大家补充! 一、蓝桥必备高频考点 我们以此为重点学习…...
Windows11切换回Windows10风格右键菜单
参考文章:Win11新版右键菜单用不惯?一键切换回Win10经典版!-CSDN博客 以管理员权限运行命令行cmd 切换为经典旧版右键菜单,执行 reg.exe add “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServe…...
Python 爬虫selenium
1.selenium自动化 selenium可以操作浏览器,在浏览器页面上实现:点击、输入、滑动 等操作。 不同于selenium自动化,逆向本质是: 分析请求,例如:请求方法、请求参数、加密方式等。用代码模拟请求去实现同等…...
Linux常用操作
软件安装 CentOS系统使用: yum [install remove search] [-y] 软件名称 install 安装 remove 卸载 search 搜索 -y,自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装 remove 卸载 search 搜索 -y,自动确认 yum 和 apt 均需要root权限 syste…...
Note25022001_Excel表格如何在文字的中间或者后边插入当前日期
Excel表格如何在文字的中间或者后边插入当前日期 关键字: EXCEL;当前日期;文字中间 如图所示: 其中一种实现方法如下: 打开表格,在某一个表格中输入: "项目计划管理表(厂内&…...
Django5 实用指南(四)URL路由与视图函数
4.1 Django5的URL路由系统 Django 的 URL 路由系统是其核心组件之一,它负责将用户的 HTTP 请求(即 URL)映射到相应的视图函数上。每当用户在浏览器中访问某个 URL 时,Django 会根据项目的 URL 配置文件(urls.py&#…...
Unity3D 基于 GPU 动画和 Compute Shader 的大批量动画渲染详解
引言 在现代游戏开发中,渲染大量动画角色是一个常见的需求,尤其是在大规模战斗场景、开放世界游戏或 VR/AR 应用中。传统的 CPU 动画计算和渲染方式在面对大批量角色时,往往会遇到性能瓶颈。为了优化性能,开发者可以利用 GPU 的强…...
遥感影像目标检测:从CNN(Faster-RCNN)到Transformer(DETR)
我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…...
什么是DeFi (去中心化金融)
DeFi (去中心化金融) 概述 💰 1. DeFi 基础概念 1.1 什么是 DeFi? DeFi 是建立在区块链上的金融服务生态系统,它: 无需中心化中介开放且透明无需许可即可参与代码即法律 1.2 DeFi 的优势 开放性:任何人都可以参与…...
深入解析 sudo -l 命令的输出内容
在 Linux 系统中,sudo 命令允许普通用户以超级用户(root)权限执行命令。sudo -l 命令用于查看当前用户在 sudoers 配置文件中的权限,以及与 sudo 相关的安全策略。本文将详细解析 sudo -l 输出的各个部分,包括 用户权限…...
DeepSeek 助力 Vue 开发:打造丝滑的瀑布流布局(Masonry Layout)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
linux学习【7】Sourc Insight 4.0设置+操作
目录 1.Source Insight是什么?2.需要哪些配置?3.怎么新建项目4.一些问题的解决1.中文乱码问题 按照这个设置就可以了,下面的设置会标明设置理由。 1.Source Insight是什么? 阅读源码,编辑源码,不能编译&am…...
OpenCV形态学操作
1.1. 形态学操作介绍 初识: 形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如: 腐蚀&…...
使用Python中的`gensim`库构建LDA(Latent Dirichlet Allocation)模型来分析收集到的评论
下面为你详细介绍如何使用Python中的gensim库构建LDA(Latent Dirichlet Allocation)模型来分析收集到的评论。LDA是一种主题模型,它可以将文档集合中的文本按照主题进行分类。 步骤概述 数据预处理:对收集到的评论进行清洗、分词…...
【STM32】外部时钟|红外反射光电开关
1.外部时钟 单片机如何对外部触发进行计数?先看一下内部时钟,内部时钟是接在APB1和APB2时钟线上的,APB1,APB2来自stm32单片机内部的脉冲信号,也叫内部时钟。我们用来定时。同样我们可以把外部的信号接入单片机,来对其…...
Visual Studio Code 集成 Baidu Comate
文章目录 安装Baidu Comate插件 安装Baidu Comate插件 从左主侧栏中 点击 【扩展】这个图标,然后在上方输入栏中输入 baidu comate —>选中列出的Bai Comate —>点击 【安装】按钮,等待安装完毕…...
数据结构者
数据(data):可被计算机接受处理的符号总称 数据元素(data element):数据的基本单位,常作为一个整体进行考虑和处理 一个数据元素可以由若干个数据项(data item)组成 数…...
论文阅读 DOES END-TO-END AUTONOMOUS DRIVING REALLY NEED PERCEPTION TASKS?
端到端的强势来袭,好久了~~~ 简单翻译:端到端真的需要感知任务嘛? code https://github.com/PeidongLi/SSR. https://arxiv.org/pdf/2409.18341 1. 摘要 端到端自动驾驶(E2EAD)方法通常依赖于监督式感知任务来提取显…...
总结UML类图几种关系画法
最近在公司需要画类图,有些遗忘,于是重新学习并并总结了一下: 继承:实线空心三角箭头。A继承B,A指向B。A是一种B。实现:虚线空心三角箭头。A实现B,A指向B。A实现B接口。关联:实线普…...
python-leetcode 40.二叉树的层序遍历
题目: 给定二叉树的根节点root,返回其节点值得层序遍历(即逐层从左到右访问所有节点) 方法:广度优先搜索 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNon…...
安利:外文文献翻译插件
沉浸式翻译 好用吹爆!!!!!!!! 任务 2.谷歌学术 复制外文的标题搜索 3.进入文献所在,登录对应机构 4.可以看到都翻译好了 5.然后复制到文档,改改格式巴…...
Python——生成AIGC图像
文章目录 一、背景介绍 二、效果图展示 三、完整代码 四、分步解释 五、实用建议 1)提示词技巧 2)性能优化 3)常见问题处理 4)扩展功能建议 六、注意事项 1. 硬件要求 2. 法律合规 3. 模型安全 一、背景介绍 AIGC&a…...
OpenGL(2)基于Qt做OpenGL开发
文章目录 一、基于Qt做OpenGL开发1、环境准备2、创建OpenGL窗口3、绘制基本图形 一、基于Qt做OpenGL开发 1、环境准备 确保你已经安装了 Qt 开发环境(包含 Qt Creator),并且支持 OpenGL 开发。在创建 Qt 项目时,选择 “Qt Widget…...