GRBL运动控制算法(四)加减速运算
前言
在数控系统和运动控制领域,GRBL 作为一款高效、轻量化的开源固件,因其卓越的性能和简洁的架构被广泛应用于各类嵌入式运动控制场景。GRBL加减速算法的实现尤为关键——它直接决定了运动控制的精度、效率与设备稳定性。
本文深入解析加减速运算的核心机制,速度规划帮助读者掌握动态速度调整与实时控制的关键技术。
一.GRBL加减速速度计算
1 .加减速流程
/* --------------------------------------------------------------------------------- 根据入口和出口速度计算新规划块的速度曲线,或者如果规划器已更新它,则重新计算部分完成的规划块的曲线。对于命令强制减速(如进给保持),覆盖规划器速度并减速到目标出口速度。*/prep.mm_complete = 0.0; // 默认速度曲线在块末端0.0mm处完成float inv_2_accel = 0.5/pl_block->acceleration;if (sys.state & (STATE_HOLD|STATE_MOTION_CANCEL|STATE_SAFETY_DOOR)) { // [强制减速到零速度]// 计算进给保持进行中的速度曲线参数。此曲线覆盖规划块曲线,强制减速到零速。prep.ramp_type = RAMP_DECEL;// 计算相对于块末端的减速距离float decel_dist = pl_block->millimeters - inv_2_accel*pl_block->entry_speed_sqr;if (decel_dist < 0.0) {// 整个规划块都在减速。进给保持的结束不在此块中。prep.exit_speed = sqrt(pl_block->entry_speed_sqr-2*pl_block->acceleration*pl_block->millimeters);} else {prep.mm_complete = decel_dist; // 进给保持的结束prep.exit_speed = 0.0;}} else { // [正常操作]// 计算或重新计算预装规划块的速度曲线参数prep.ramp_type = RAMP_ACCEL; // 初始化为加速斜坡prep.accelerate_until = pl_block->millimeters; prep.exit_speed = plan_get_exec_block_exit_speed(); float exit_speed_sqr = prep.exit_speed*prep.exit_speed;float intersect_distance =0.5*(pl_block->millimeters+inv_2_accel*(pl_block->entry_speed_sqr-exit_speed_sqr));if (intersect_distance > 0.0) {if (intersect_distance < pl_block->millimeters) { // 梯形或三角形类型// 注意:对于加速-匀速和仅匀速类型,以下计算将为0.0prep.decelerate_after = inv_2_accel*(pl_block->nominal_speed_sqr-exit_speed_sqr);if (prep.decelerate_after < intersect_distance) { // 梯形类型prep.maximum_speed = sqrt(pl_block->nominal_speed_sqr);if (pl_block->entry_speed_sqr == pl_block->nominal_speed_sqr) { // 匀速-减速或仅匀速类型prep.ramp_type = RAMP_CRUISE;} else {// 全梯形或加速-匀速类型prep.accelerate_until -= inv_2_accel*(pl_block->nominal_speed_sqr-pl_block->entry_speed_sqr); }} else { // 三角形类型prep.accelerate_until = intersect_distance;prep.decelerate_after = intersect_distance;prep.maximum_speed = sqrt(2.0*pl_block->acceleration*intersect_distance+exit_speed_sqr);} } else { // 仅减速类型prep.ramp_type = RAMP_DECEL;prep.maximum_speed = prep.current_speed;}} else { // 仅加速类型prep.accelerate_until = 0.0;prep.maximum_speed = prep.exit_speed;}} }
用于根据入口和出口速度计算运动块的速度曲线,处理正常运动和强制减速两种情况。
变量定义:
变量 | 含义 | 单位 |
---|---|---|
v0 | 进口速度 (entry speed) | mm/min |
ve | 出口速度 (exit speed) | mm/min |
vm | 额定速度 (nominal speed) | mm/min |
a | 加速度 (acceleration) | mm/min² |
S | 总距离 (millimeters) | mm |
Sa | 末端到加速结束点距离 (accelerate_until) | mm |
Se | 末端到减速结束点距离 (decelerate_after) | mm |
t | 时间 | min |
整体流程:
强制减速流程:
正常运动流程:
2 .强制减速计算
速度-时间关系图:
判断减速到零所需距离:
S d = S − v 0 2 2 a \begin{align} S_{\text{d}} &=S - \frac{v_0^2}{2a} \\ \end{align} Sd=S−2av02
出口速度(当减速距离不足时,即 Sd<0):
V e = V 0 2 − 2 a S \begin{align} V_{\text{e}} &=\sqrt{ V_0^2 - 2 a S} \end{align} Ve=V02−2aS
出口速度(当减速距离足够时,即 Sd>0):
S c = S d V e = 0 \begin{align} S_{\text{c}} &=S_{\text{d}} \\ V_{\text{e}} &=0 \\ \end{align} ScVe=Sd=0
3 .交点距离计算
速度-时间关系图:
速度-位移关系:
V max 2 − V 0 2 = 2 a S 1 V max 2 − V e 2 = 2 a S 2 S 1 + S 2 = S \begin{align} V_{\text{max}}^2 - V_0^2 &= 2a S_{\text{1}} \\ V_{\text{max}}^2 - V_e^2 &= 2a S_{\text{2}} \\ S_{\text{1}} + S_{\text{2}} &= S \\ \end{align} Vmax2−V02Vmax2−Ve2S1+S2=2aS1=2aS2=S
联立(5-7)可得 Vmax:
V max 2 = 2 a S + V 0 2 + V e 2 2 \begin{align} V_{\text{max}}^2 &= \frac{2 a S + V_0^2 + V_e^2}{2} \\ \end{align} Vmax2=22aS+V02+Ve2
交点距离 S_intersect:
S intersect = V max 2 − V e 2 2 a = 2 a S + V 0 2 − V e 2 4 a = 1 2 ( S + V 0 2 − V e 2 2 ) \begin{align} S_{\text{intersect}} &= \frac{V_{\text{max}}^2- V_e^2 }{2a} = \frac{2aS + V_0^2 - V_e^2}{4a} = \frac{1}{2}\left(S + \frac{V_0^2 - V_e^2}{2}\right) \end{align} Sintersect=2aVmax2−Ve2=4a2aS+V02−Ve2=21(S+2V02−Ve2)
或者
S intersect = V max 2 − V 0 2 2 a = 2 a S − V 0 2 + V e 2 4 a = 1 2 ( S + V e 2 − V 0 2 2 ) \begin{align} S_{\text{intersect}} &= \frac{V_{\text{max}}^2- V_0^2 }{2a} = \frac{2aS - V_0^2 + V_e^2}{4a} = \frac{1}{2}\left(S + \frac{V_e^2 - V_0^2}{2}\right) \end{align} Sintersect=2aVmax2−V02=4a2aS−V02+Ve2=21(S+2Ve2−V02)
4 .仅加速类型
特点:整个运动块都在加速,没有减速阶段
速度-时间关系图:
判断条件:
S intersect < = 0 \begin{align} S_{\text{intersect}} &<=0 \end{align} Sintersect<=0
参数设置:
S a = 0 V max = V e \begin{align} S_{\text{a}} &=0 \\ V_{\text{max}} &= V_e \end{align} SaVmax=0=Ve
5 .仅减速类型
特点:整个运动块都在减速,没有加速阶段
速度-时间关系图:
判断条件:
S intersect > = S \begin{align} S_{\text{intersect}} &>=S \end{align} Sintersect>=S
参数设置:
V max = V m \begin{align} V_{\text{max}} &= V_m \end{align} Vmax=Vm
6 .三角形类型
特点:先加速到最大速度后立即减速,没有匀速阶段
速度-时间关系图:
判断条件:
0 < S intersect < S S e > S intersect \begin{align} 0<S_{\text{intersect}} &<S \\ S_e > S_{\text{intersect}} \end{align} 0<SintersectSe>Sintersect<S
参数设置:
S a = S intersect S e = S intersect V max = 2 a S intersect + V e 2 \begin{align} S_{\text{a}} &=S_{\text{intersect}} \\ S_{\text{e}} &= S_{\text{intersect}} \\ V_{\text{max}} &=\sqrt{2 a S_{\text{intersect}} + V_e^2} \end{align} SaSeVmax=Sintersect=Sintersect=2aSintersect+Ve2
7 .梯形类型
特点:全梯形:有加速、匀速和减速阶段;加速-匀速:加速后直接进入匀速;匀速-减速:从匀速开始减速;仅匀速:整个块都是匀速运动;
速度-时间关系图:
判断条件:
0 < S intersect < S S e < S intersect \begin{align} 0<S_{\text{intersect}} &<S \\ S_e < S_{\text{intersect}} \end{align} 0<SintersectSe<Sintersect<S
参数设置:
S temp = v m 2 − v 0 2 2 a V max = V m 2 S a = S − S temp \begin{align} S_{\text{temp}} &= \frac{v_m^2 - v_0^2}{2a} \\ V_{\text{max}} &=\sqrt{ V_m^2} \\ S_{\text{a}} &= S - S_{\text{temp}} \end{align} StempVmaxSa=2avm2−v02=Vm2=S−Stemp
二.GRBL段生成计算
1 .段生成定义
/*------------------------------------------------------------------------------------通过确定在段时间DT_SEGMENT内行进的总距离来计算这个新段的平均速度。以下代码首先尝试基于当前斜坡条件创建一个完整的段。如果段时间在斜坡状态变化处终止时不完整,代码将继续循环通过进展中的斜坡状态以填充剩余的段执行时间。然而,如果一个不完整的段在速度曲线末端终止,尽管执行时间被截断小于DT_SEGMENT,该段仍被视为完成。速度曲线总是假设通过斜坡序列进展:加速斜坡、匀速状态和减速斜坡。每个斜坡的行进距离可以从零到块的长度不等。速度曲线可以在规划块末端结束(典型)或在强制减速(如进给保持)的块中间结束。*/float dt_max = DT_SEGMENT; // 最大段时间float dt = 0.0; // 初始化段时间float time_var = dt_max; // 时间工作变量float mm_var; // 毫米距离工作变量float speed_var; // 速度工作变量 float mm_remaining = pl_block->millimeters; // 从块末端开始的新段距离float minimum_mm = mm_remaining-prep.req_mm_increment; // 保证至少一步if (minimum_mm < 0.0) { minimum_mm = 0.0; }do {switch (prep.ramp_type) {case RAMP_ACCEL: // 注意:加速斜坡仅在第一个do-while循环中计算speed_var = pl_block->acceleration*time_var;mm_remaining -= time_var*(prep.current_speed + 0.5*speed_var);if (mm_remaining < prep.accelerate_until) { // 加速斜坡结束// 加速-匀速、加速-减速斜坡连接点或块结束mm_remaining = prep.accelerate_until; // 注意:在EOB处为0.0time_var = 2.0*(pl_block->millimeters-mm_remaining)/(prep.current_speed+prep.maximum_speed);if (mm_remaining == prep.decelerate_after) { prep.ramp_type = RAMP_DECEL; }else { prep.ramp_type = RAMP_CRUISE; }prep.current_speed = prep.maximum_speed;} else { // 仅加速prep.current_speed += speed_var;}break;case RAMP_CRUISE: // 注意:mm_var用于保留不完整段time_var计算的最后一个mm_remaining// 注意:如果maximum_speed*time_var值太低,舍入可能导致mm_var不改变。// 为了防止这种情况,只需在规划器中强制执行最小速度阈值。mm_var = mm_remaining - prep.maximum_speed*time_var;if (mm_var < prep.decelerate_after) { // 匀速结束// 匀速-减速连接点或块结束time_var = (mm_remaining - prep.decelerate_after)/prep.maximum_speed;mm_remaining = prep.decelerate_after; // 注意:在EOB处为0.0prep.ramp_type = RAMP_DECEL;} else { // 仅匀速mm_remaining = mm_var; } break;default: // case RAMP_DECEL:// 注意:mm_var用作杂项工作变量,以防止在接近零速时出错speed_var = pl_block->acceleration*time_var; // 用作速度增量(毫米/分钟)if (prep.current_speed > speed_var) { // 检查是否达到或低于零速// 计算从段末端到块末端的距离mm_var = mm_remaining - time_var*(prep.current_speed - 0.5*speed_var); // (毫米)if (mm_var > prep.mm_complete) { // 仅减速mm_remaining = mm_var;prep.current_speed -= speed_var;break; // 段完成。退出switch-case语句。继续do-while循环。}} // 块结束或强制减速结束time_var = 2.0*(mm_remaining-prep.mm_complete)/(prep.current_speed+prep.exit_speed);mm_remaining = prep.mm_complete; }dt += time_var; // 将计算的斜坡时间添加到总段时间if (dt < dt_max) { time_var = dt_max - dt; } // **不完整** 在斜坡连接点else {if (mm_remaining > minimum_mm) { // 检查零步的非常慢的段// 增加段时间以确保段中至少一步。覆盖并循环// 通过距离计算直到minimum_mm或mm_completedt_max += DT_SEGMENT;time_var = dt_max - dt;} else { break; // **完成** 退出循环。段执行时间达到最大}}} while (mm_remaining > prep.mm_complete); // **完成** 退出循环。曲线完成
运动路径被划分为一系列“块(block)”,每个块代表一段直线路径。为了实现平滑运动,每个块被进一步划分为“段(segment)”,每个段执行时间固定:DT_SEGMENT。
变量定义:
变量 | 含义 |
---|---|
dt_max | 段最大时间(初始化为 DT_SEGMENT) |
dt | 当前段累计时间 |
time_var | 当前迭代中分配给斜坡段的时间(会逐步减小) |
mm_remaining | 当前段还剩的距离 |
minimum_mm | 保证至少移动的最小距离 |
speed_var | 速度变化量 |
2 .加速阶段
加速阶段流程图:
速度增量计算:
Δ v = a ⋅ Δ t \begin{align} \Delta v = a \cdot \Delta t \end{align} Δv=a⋅Δt
距离计算公式(基于初始速度 + 加速度):
Δ s = v 0 ⋅ Δ t + 1 2 a ⋅ ( Δ t ) 2 \begin{align} \Delta s = v_0 \cdot \Delta t + \frac{1}{2} a \cdot (\Delta t)^2 \end{align} Δs=v0⋅Δt+21a⋅(Δt)2
更新当前速度:
v new = v old + Δ v \begin{align} v_{\text{new}} = v_{\text{old}} + \Delta v \end{align} vnew=vold+Δv
走完加速段(mm_remaining < accelerate_until), 则重新计算时间段到这个连接点的时间:
t = 2 ⋅ s v start + v end \begin{align} t = \frac{2 \cdot \text{s} }{v_{\text{start}} + v_{\text{end}}} \end{align} t=vstart+vend2⋅s
平均速度计算时间的公式:
t = s v 1 + v 2 2 = 2 s v 1 + v 2 \begin{align} t = \frac{s}{\frac{v_1 + v_2}{2}} = \frac{2s}{v_1 + v_2} \end{align} t=2v1+v2s=v1+v22s
3 .匀速阶段
匀速阶段流程图:
匀速距离计算:
Δ s = v ⋅ Δ t \begin{align} \Delta s = v \cdot \Delta t \end{align} Δs=v⋅Δt
判断是否走完匀速段:
若 mm_var < decelerate_after,说明匀速段结束,需要进入减速;否则,更新 mm_remaining 并继续。
4 .减速阶段
加速阶段流程图:
减速过程中的距离计算:
Δ s = v 0 ⋅ Δ t − 1 2 a ⋅ ( Δ t ) 2 \begin{align} \Delta s = v_0 \cdot \Delta t - \frac{1}{2} a \cdot (\Delta t)^2 \end{align} Δs=v0⋅Δt−21a⋅(Δt)2
减速后的速度为:
v new = v old − a ⋅ Δ t \begin{align} v_{\text{new}} = v_{\text{old}} - a \cdot \Delta t \end{align} vnew=vold−a⋅Δt
若该段已达终点(即减速结束):
t = 2 ⋅ s v start + v end \begin{align} t = \frac{2 \cdot s}{v_{\text{start}} + v_{\text{end}}} \end{align} t=vstart+vend2⋅s
相关文章:
GRBL运动控制算法(四)加减速运算
前言 在数控系统和运动控制领域,GRBL 作为一款高效、轻量化的开源固件,因其卓越的性能和简洁的架构被广泛应用于各类嵌入式运动控制场景。GRBL加减速算法的实现尤为关键——它直接决定了运动控制的精度、效率与设备稳定性。 本文深入解析加减速运算的核…...
CSS 学习提升网站或者项目
有几个不错的开源项目可以帮助你练习和提升CSS技能: CSS-Tricks CSS-Tricks 提供了很多关于CSS的技巧和教程,可以通过实践它们来提高CSS技能。你可以在CSS-Tricks上找到很多有趣的项目和代码示例。 Frontend Mentor Frontend Mentor 是一个非常适合练习…...
PolarDB 读已提交事务隔离级别 select ... for update, where条件未用索引,查不到数据的时候不会锁表
由于没有给字段设置唯一性,所以改为通过查询语句加锁确保唯一性,但是发现select count(*) 为0时,不会加锁,所以在insert方法后面需要加锁二次查询确保唯一性。 在 PolarDB 的读已提交事务隔离级别下,SELECT ... FOR UP…...
Python基础——Matplotlib库
绘图基础 Matplotlib 库太大,画图通常仅仅使用其中的核心模块 matplotlib.pyplot,并给其一个别名 plt,即 import matplotlib.pyplot as plt。为了使图形在展示时能很好的嵌入到 Jupyter 的 Out[ ] 中,需要使用%matplotlib inline…...
群晖Hyper Backup备份的东西怎么还原?
一、背景 前面写了一篇文章关于群晖NAS中最简单的备份方案,Hyper Backup 方案 群晖NAS最简单的备份教程(只备份需要的目录到不同的硬盘),留了个尾,即怎么还原备份的东西,这里完结一下。 二、还原方案 2.…...
记录IBM服务器检测到备份GPT损坏警告排查解决过程
服务器设备:IBM x3550 M4 Server IMM默认IP地址:192.168.70.125 用户名:USERID 密码:PASSW0RD(注意是零0) 操作系统:Windows Hyper-V Server 2016 IMM Web System Status Warning࿱…...
蓝桥杯嵌入式十五届模拟二(串口DMA,占空比的另一种测量方式)
一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹&#…...
22 | 如何继续提升 Go 开发技术?
提示: 所有体系课见专栏:Go 项目开发极速入门实战课;欢迎加入 云原生 AI 实战营 星球,12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力(聚焦于 Go、云原生、AI Infra)。 「Go 项目开发极速…...
一文详解OpenCV环境搭建:Windows使用CLion配置OpenCV开发环境
在计算机视觉和图像处理领域,OpenCV 是一个不可或缺的工具。其为开发者提供了一系列广泛的算法和实用工具,支持多种编程语言,并且可以在多个平台上运行。对于希望在其项目中集成先进视觉功能的开发者来说,掌握如何配置和使用OpenC…...
云原生周刊:深入探索 kube-scheduler-simulator
开源项目推荐 mcp-server-kubernetes mcp-server-kubernetes 是一个实现了模型上下文协议(MCP)的服务器,旨在通过自然语言与 K8s 集群进行交互。它支持连接到 K8s 集群,列出所有 Pod、服务、部署和节点,创建、描述、…...
总结一下常见的EasyExcel面试题
说一下你了解的POI和EasyExcel POI(Poor Obfuscation Implementation):它是 Apache 软件基金会的一个开源项目,为 Java 程序提供了读写 Microsoft Office 格式文件的功能,支持如 Excel、Word、PowerPoint 等多种文件格…...
【Java设计模式】第2章 UML急速入门
2-1 本章导航 UML类图与时序图入门 UML定义 统一建模语言(Unified Modeling Language):第三代非专利建模语言。特点:开放方法,支持可视化构建面向对象系统,涵盖模型、流程、代码等。UML分类(2.2版本) 结构式图形:系统静态建模(类图、对象图、包图)。行为式图形:事…...
Excel处理控件Spire.XLS系列教程:C# 设置 Excel 中的数字格式
在 Excel 工作表中,原始数据通常显示为缺乏直观性的普通数字。通过设置数字格式,可以将这些数字转换成更容易理解的形式。例如,将销售额数据设置为货币格式,即添加货币符号和千位分隔符,可使所代表的金额一目了然。将市…...
脚本启动 Java 程序
如果你想在后台启动一个 Java 程序,并在终端窗口中显示一个自定义的名字,可以通过编写一个简单的脚本来实现。以下是一个基于 Linux/macOS 的解决方案,使用 Bash 脚本启动 Java 程序,并在终端窗口中显示自定义标题。 示例脚本 创建…...
UniappX动态引入在线字体图标,不兼容css时可用。
优缺点 优点:不需要占用本地存储,可直接在线同步库图标,不用再手动引入ttf文件,不用手动添加键值对对应表。 缺点:受网速影响,字体库cdn路径可能会更改,ios端首次加载,可能会无图标…...
机器学习 | 强化学习基本原理 | MDP | TD | PG | TRPO
文章目录 📚什么是强化学习🐇监督学习 vs 强化学习🐇马尔科夫决策过程(MDP)📚基本算法(value-based & policy-based)🐇时序差分算法(TD)🐇SARSA和Q-learning🐇策略梯度算法(PG)🐇REINFORCE和Actor-Critic🐇信任区域策略优化算法(TRPO)学习视频…...
k8s之Service类型详解
1.ClusterIP 类型 2.NodePort 类型 3.LoadBalancer 类型 4.ExternalName 类型 类型为 ExternalName 的 Service 将 Service 映射到 DNS 名称,而不是典型的选择算符, 例如 my-service 或者 cassandra。你可以使用 spec.externalName 参数指定这些服务…...
AI平台如何实现推理?数算岛是一个开源的AI平台(主要用于管理和调度分布式AI训练和推理任务。)
数算岛是一个开源的AI平台,主要用于管理和调度分布式AI训练和推理任务。它基于Kubernetes构建,支持多种深度学习框架(如TensorFlow、PyTorch等)。以下是数算岛实现模型推理的核心原理、架构及具体实现步骤: 一、数算岛…...
linux开发环境
1.虚拟机环境搭建 在 Ubuntu 系统中,打开(如图中显示的窗口 )常见快捷键有: Ctrl Alt T:这是最常用的打开终端的快捷键组合 ,按下后会快速弹出一个新的终端窗口。 在 VMware 虚拟机环境中,若…...
OSPF复习
OSPF OSPF---开放最短路径优先协议 动态路由判定依据:选路,收敛速度,占用资源 OSPFV2和RIPV2的相同点: 1.都是无类别的路由协议; 2.都是通过组播来传播信息的;(RIP:224.0.0.9&am…...
AWS S3深度剖析:云存储的瑞士军刀
1. 引言 在当今数据驱动的世界中,高效、可靠、安全的数据存储解决方案至关重要。Amazon Simple Storage Service (S3)作为AWS生态系统中的核心服务之一,为企业和开发者提供了一个强大而灵活的对象存储平台。本文将全面解析S3的核心特性,帮助读者深入理解如何充分利用这一&q…...
pyTorch中 tensorboard的使用
目录 01.导包、 transforms数据转化、torchvision数据集、创建dataloaders、展示图片的封装函数 02定义模型 03定义损失函数与优化器 1.tensorboard的安装 2.tensorboard的使用 2.1添加图片 2.2 添加模型结构图 2.3 添加损失的变化 #pyTorch中的tensorboard 与 tens…...
Android audio(2)-audioservice
AudioService是Android的系统服务(systemservice),由SystemServer负责启动。提供Android APK 所需的非数据通路(playback/capture)相关的audio 功能实现,是binder通信中的server端,与之对应的 C…...
星城幻境:科技与千年文脉的交响诗-长沙
故事背景 故事发生在中国湖南长沙,通过六个充满未来感的城市景观,展现人工智能修复古建筑、生态摩天楼、全息水幕许愿等场景,描绘科技赋能下历史文脉与未来城市的共生图景。 故事内容 从岳麓书院清晨的智能修复到湘江夜空的数字烟花ÿ…...
记录学习的第二十三天
老样子,每日一题开胃。 我一开始还想着暴力解一下试试呢,结果不太行😂 接着两道动态规划。 这道题我本来是想用最长递增子序列来做的,不过实在是太麻烦了,实在做不下去了。 然后看了题解,发现可以倒着数。 …...
sql-labs靶场 less-1
文章目录 sqli-labs靶场less 1 联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
AI-人工智能-基于LC-MS/MS分子网络深度分析的天然产物成分解析的新策略
Anal Chem∣张卫东教授团队开发基于LC-MS/MS分子网络深度分析的天然产物成分解析的新策略 2024年9月23日,海军军医大学张卫东教授团队在Analytical Chemistry(IF6.7)上发表了题为“In-Depth Analysis of Molecular Network Based on Liquid …...
IntelliJ IDEA使用技巧(json字符串格式化)
文章目录 一、IDEA自动格式化json字符串二、配置/查找格式化快捷键 本文主要讲述idea中怎么将json字符串转换为JSON格式的内容并且有层级结构。 效果: 转换前: 转换后: 一、IDEA自动格式化json字符串 步骤一:首先创建一个临…...
【Java设计模式】第8章 单列模式讲解
8-1 单例模式讲解 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点。类型:创建型模式。适用场景 需要确保任何情况下绝对只有一个实例。实际应用: 网站计数器(单服务)。应用配置、线程池、数据库连接池。优点 减少内存开销(仅一个实例)。避免资源多重占…...
【Java设计模式】第4章 简单工厂讲解
4. 简单工厂模式 4.1 简单工厂讲解 定义:由一个工厂对象决定创建哪种产品类的实例,属于创建型模式,但不属于GoF 23种设计模式。适用场景: 工厂类负责创建的对象较少。客户端仅需传入参数,无需关心对象创建逻辑。优点: 客户端只需传入参数即可获取对象,无需知道创建细节…...
Spring Boot 常用依赖介绍
依赖总括 1. 核心依赖:Spring Web、Spring Data JPA、MySQL Driver。 2. 开发工具:Lombok、Spring Boot DevTools。 3. 安全与权限:Spring Security。 4. 测试与文档:Spring Boot Starter Test、Swagger。 5. 性能优化&#…...
判断矩阵A是否可以相似对角化
【例题1】 【例题2】...
第三方软件测试公司进行安全性测试有哪些好处?
在信息技术飞速发展的今天,软件已成为各行业运作的核心组成部分。然而,伴随而来的软件安全问题也愈发显著,因此软件产品安全性测试不容忽视。随着软件市场的激烈竞争,企业为了更好的专心产品开发,会将安全性测试服务交…...
下一代楼宇自控的中枢神经:ARM终端的生态
某跨国半导体工厂的洁净车间突然触发气体泄漏报警。此时,ARM应急广播终端在200毫秒内完成全楼宇语音播报,同步联动门禁系统解锁逃生通道,指挥中心大屏自动弹出事故区域监控画面——这套价值27万元的预警系统,在投产首年就避免了可…...
R语言进行判别分析
Fisher判别法、距离判别法、Bayes判别法基本理论、方法: Fisher判别法 理论基础: Fisher判别法旨在通过选择合适的投影方向,最大化不同类别之间的类间差异性,同时最小化类内差异性。这种投影方向使得在低维空间中样本点的类别可…...
Nacos 服务发现的流程是怎样的?客户端如何获取最新的服务实例列表?
服务发现是微服务架构的核心组件,它允许一个服务(消费者)动态地找到它需要调用的另一个服务(提供者)的网络地址(IP 和端口),而无需硬编码这些地址。 整体流程概览: 服务提供者 (Pr…...
Java全栈项目--校园快递管理与配送系统(5)
源代码续 <template><div class"app-container"><el-card class"box-card"><div slot"header" class"clearfix"><span>通知统计</span><div class"header-operations"><el-d…...
UE5 本地化
文章目录 打开本地化面板设置本地化翻译设置文本收集路径添加语言收集需要翻译的文本手动翻译导入导出编译 使用本地化启动代码修改语言 打开本地化面板 UE4: UE5: 设置本地化翻译 设置文本收集路径 UE5可以自动帮我们收集需要显示的文本ÿ…...
用c语言写一个linux进程之间通信(聊天)的简单程序
使用talk 用户在同一台机器上talk指令格式如下: talk 用户名ip地址 [用户终端号] 如果用户只登录了一个终端,那么可以不写用户终端号,如: talk userlocalhost可以使用who指令来查看当前有哪些用户登录,他的终端号…...
同时支持Vue2/Vue3的图片懒加载组件(支持懒加载 v-html 指令梆定的 html 内容)
🚀 vue-lazyload-imgs(LazyLoadImgs) 组件简介 详情见:https://npmjs.com/package/vue-lazyload-imgs 安装方法: npm i vue-lazyload-imgs(不要安装为开发依赖,应为产品依赖) 适用环…...
Qt容器类在元对象系统中使用
解释 “QVector没有被注册到Qt的元对象系统中”这句话的意思是:QVector<double>这种数据类型没有被Qt的元对象系统(Meta-Object System)识别和管理。Qt的元对象系统是Qt框架的核心部分,它提供了信号与槽机制、动态属性系统…...
Qt中的信号与槽及其自定义
信号源:哪个控件发的信号 信号的类型:用户进行不同的操作就会触发不同的信号 如点击按钮,在输入框移动光标,勾选一个复选框,选 择一个下拉框 信号的处理方式:槽(slot)----也就是函数,Qt中用con…...
【已完结STM32】--自学江协科技笔记汇总
以下学习笔记代码均来自b站江协科技视频 笔记汇总完结 文章笔记对应江科大视频新建工程【2-2】新建工程江科大STM32-GPIO输出 点亮LED,LED闪烁,LED流水灯,蜂鸣器(学习笔记)_unit32-t rcc-apb2periph-CSDN博客 【3-1】…...
科技快讯 | 索诺瓦携手清华大学共筑听力无障碍未来;中国探月工程总设计师:未来月球上能打电话;Shopify要求员工证明AI无法取代其工作
索诺瓦携手清华大学共筑听力无障碍未来 2024年末,60岁以上人口超3.1亿,听力损失比例高达11%。清华大学无障碍发展研究院与索诺瓦集团深化合作,共同推动听力无障碍环境建设。2023年9月,《无障碍环境建设法》实施,2024年…...
[实战] 天线阵列波束成形原理详解与仿真实战(完整代码)
天线阵列波束成形原理详解与仿真实战 1. 引言 在无线通信、雷达和声学系统中,波束成形(Beamforming)是一种通过调整天线阵列中各个阵元的信号相位和幅度,将电磁波能量集中在特定方向的技术。其核心目标是通过空间滤波增强目标方…...
北京自在科技:让万物接入苹果Find My网络的″钥匙匠″
在AirTag掀起全球防丢热潮的今天,越来越多的第三方产品开始接入苹果Find My网络——从充电宝到电动车,从行李箱到保温杯,用户只需打开iPhone的「查找」App,就能实时定位这些物品。 北京自在科技有限责任公司早在苹果推出Find My开…...
区块链是怎么存储块怎么找到前一个块
前言:学习区块链的过程中在想怎么管理区块链呢 📌 推荐项目回顾: 👉 Jeiwan 的 blockchain_go 项目 GitHub 地址:https://github.com/Jeiwan/blockchain_go ❓它是怎么存储区块 & 找前一个区块的? 项…...
聚类算法 ap 聚类 谱聚类
AP聚类(Affinity Propagation Clustering)是一种基于消息传递的聚类算法,由Brendan J. Frey和Delbert Dueck于2007年提出。与传统的聚类算法(如K-Means)不同,AP聚类不需要预先指定聚类数量,而是…...
习题与正则表达式
思路: 二分查找: left 1(最小可能距离),right L(最大可能距离)。 每次取 mid (left right) / 2,判断是否可以通过增设 ≤ K 个路标使得所有相邻路标的距离 ≤ mid。 贪心验证…...
数据库管理工具实战:IDEA 与 DBeaver 连接 TDengine(一)
一、引言 在当今数字化时代,数据如同企业的生命线,而数据库则是承载这些宝贵数据的关键基础设施。TDengine 作为一款高性能的时序数据库,在物联网、工业互联网、车联网、IT 运维等众多领域中发挥着举足轻重的作用。它以其卓越的性能、高效的…...