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

Open CASCADE学习|刚体沿曲线运动实现方法

在三维几何建模中,刚体沿参数化曲线的运动模拟是机械运动仿真、机器人路径规划等领域的核心需求。本文基于Open Cascade几何内核,系统阐述刚体沿曲线运动的实现方法,重点解析标架构建、坐标变换及鲁棒性控制等关键技术。


一、基于标架的刚体运动原理

1.1 运动学基础

刚体的空间运动由平移和旋转两个分量构成。在Open Cascade中,通过gp_Ax3标架定义物体的局部坐标系,其包含原点位置、主方向轴(Z轴)和参考方向轴(X轴)。刚体变换的本质是将物体从初始标架映射到目标标架的坐标系转换。

数学表达式为:
T = [ R t 0 1 ] \mathbf{T} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \\ \mathbf{0} & 1 \end{bmatrix} T=[R0t1]
其中 R \mathbf{R} R为旋转矩阵, t \mathbf{t} t为平移向量,通过gp_Trsf类实现。

1.2 标架生成策略

沿曲线运动的标架生成有两种典型方法:

  • Frenet标架:基于曲线微分几何特性,通过导数计算切线、法线和副法线
  • 并行传输标架:通过最小化旋转量保持标架连续性,适用于高曲率变化路径

二、Frenet标架构建关键技术

2.1 曲线导数计算

通过Geom_Curve的微分计算接口获取参数点的一阶、二阶导数:

curve->D2(t, P, d1, d2); // P:位置, d1:一阶导, d2:二阶导
2.2 标架向量计算
  • 切线向量 T :对位置向量 P 关于参数 t 求一阶导数并进行归一化处理
    T = d P / d t ∣ d P / d t ∣ \mathbf{T} = \frac{d\mathbf{P}/dt}{|d\mathbf{P}/dt|} T=dP/dtdP/dt

  • 法线向量 N :基于曲率向量来计算,先求位置向量 P 关于弧长 s 的二阶导数,再除以一阶导数模长的平方得到曲率向量 κ,当曲率非零时,对 κ 进行归一化得到法线向量
    κ = d 2 P / d s 2 ∣ d P / d s ∣ 2 N = κ ∣ κ ∣ ( 曲率非零时 ) \kappa = \frac{d^2\mathbf{P}/ds^2}{|d\mathbf{P}/ds|^2} \quad \mathbf{N} = \frac{\kappa}{|\kappa|} \quad (\text{曲率非零时}) κ=dP/ds2d2P/ds2N=κκ(曲率非零时)

  • 副法线向量 B :通过切线向量 T 和法线向量 N 的叉乘得到
    B = T × N \mathbf{B} = \mathbf{T} \times \mathbf{N} B=T×N

2.3 零曲率处理

当曲率接近零时(如直线段),采用投影法生成法线:

gp_Vec N_vec = defaultDir - (defaultDir.Dot(T)) * T; // 投影到垂直平面
if (N_vec.Magnitude() < eps) // 退化情况处理N_vec = alternateDir - (alternateDir.Dot(T)) * T;
N = N_vec.Normalized();

三、刚体变换的鲁棒性实现

3.1 坐标变换矩阵

通过gp_Trsf::SetTransformation建立标架间变换关系:

trsf.SetTransformation(targetFrame, initialFrame); // 从初始到目标的变换
3.2 异常处理机制
  • 零导数检测:若导数模长小于设定阈值 ε,则跳过当前参数点,避免因导数接近零导致计算异常
  • 标架正交性验证:通过计算切线向量 T 与法线向量 N 的叉乘结果与 Y 轴的夹角,确保标架的正交性,防止出现非正交标架导致后续计算偏差
  • 法线退化处理:当法线向量出现退化时,采用双重备选投影方向策略,优先选择 Y 轴作为投影方向,若 Y 轴不可用则切换至 Z 轴,保证计算的稳定性和连续性
3.3 运动连续性控制
  • 参数 t 采用自适应步长调整策略:
    Δ t = min ⁡ ( 0.01 , 0.1 / ∣ κ ∣ ) \Delta t = \min(0.01, 0.1/|\kappa|) Δt=min(0.01,0.1/∣κ)
    该公式表示步长根据曲率 κ 动态调整,当曲率较大时减小步长以捕捉细节,曲率较小时增大步长以提高计算效率
  • 为消除旋转过程中的突变现象,采用四元数插值技术对旋转进行平滑处理,确保运动轨迹的自然流畅性

四、代码

#include <Geom_BezierCurve.hxx>
#include <Geom_Curve.hxx>
#include <gp_Ax3.hxx>
#include <gp_Trsf.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <TopoDS_Shape.hxx>
#include <Precision.hxx>
#include <TColgp_Array1OfPnt.hxx>
#include <fstream>
#include <iomanip>#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKBRep.lib")// 日志记录辅助函数
void WriteLogHeader(std::ofstream& logFile) {logFile << std::left<< std::setw(8) << "Time(t)"<< std::setw(25) << "Position(X,Y,Z)"<< std::setw(25) << "Tangent(T)"<< std::setw(25) << "Normal(N)"<< std::setw(15) << "FrameStatus"<< std::setw(25) << "TransformResult"<< "Remarks\n";
}void LogTransformInfo(std::ofstream& logFile,Standard_Real t,const gp_Pnt& P,const gp_Dir& T,const gp_Dir& N,const Standard_Boolean frameValid,const Standard_Boolean transformOK)
{logFile << std::fixed << std::setprecision(4)<< std::setw(8) << t << " "<< "(" << std::setw(6) << P.X() << ", "<< std::setw(6) << P.Y() << ", "<< std::setw(6) << P.Z() << ") "<< "(" << std::setw(6) << T.X() << ", "<< std::setw(6) << T.Y() << ", "<< std::setw(6) << T.Z() << ") "<< "(" << std::setw(6) << N.X() << ", "<< std::setw(6) << N.Y() << ", "<< std::setw(6) << N.Z() << ") ";logFile << std::setw(15) << (frameValid ? "Valid" : "Invalid");logFile << std::setw(25) << (transformOK ? "Transformation OK" : "Transformation Failed");logFile << "\n";
}int main(int argc, char* argv[])
{std::ofstream logFile("movement_log.txt");if (!logFile.is_open()) {return 1;}WriteLogHeader(logFile);// 创建测试曲线(三次贝塞尔曲线)TColgp_Array1OfPnt controlPoints(1, 4);controlPoints.SetValue(1, gp_Pnt(0, 0, 0));controlPoints.SetValue(2, gp_Pnt(2, 3, 1));controlPoints.SetValue(3, gp_Pnt(5, 4, 2));controlPoints.SetValue(4, gp_Pnt(7, 0, 3));Handle(Geom_BezierCurve) curve = new Geom_BezierCurve(controlPoints);// 创建初始刚体(立方体)BRepPrimAPI_MakeBox boxMaker(1.0, 1.0, 1.0);boxMaker.Build();if (!boxMaker.IsDone()) {logFile << "Error: Failed to create initial box\n";logFile.close();return 1;}const TopoDS_Shape& originalShape = boxMaker.Shape();// 获取初始标架gp_Ax3 initialFrame(gp_Pnt(0.5, 0.5, 0.5), gp::DZ(), gp::DX());// 沿曲线参数遍历Standard_Integer stepCount = 0;Standard_Integer successCount = 0;for (Standard_Real t = 0.0; t <= 1.0; t += 0.02){stepCount++;gp_Pnt P;gp_Vec d1, d2;curve->D2(t, P, d1, d2);// 记录原始数据logFile << "\nStep " << stepCount << " (t=" << t << "):\n";logFile << "  Raw Data - d1: (" << d1.X() << ", " << d1.Y() << ", " << d1.Z() << ")\n";logFile << "           d2: (" << d2.X() << ", " << d2.Y() << ", " << d2.Z() << ")\n";// 处理零导数if (d1.Magnitude() < Precision::Confusion()) {logFile << "  Warning: Zero derivative at t=" << t << ", skipping\n";continue;}// 计算切向量gp_Dir T = d1.Normalized();// 计算曲率向量Standard_Real ds_dt = d1.Magnitude();gp_Vec k = (ds_dt > Precision::Confusion()) ?(d2 - d1 * (d1.Dot(d2) / (ds_dt * ds_dt))) / (ds_dt * ds_dt) :gp_Vec(0, 0, 0);// 计算法线gp_Dir N;Standard_Boolean normalFromCurvature = Standard_True;if (k.Magnitude() > Precision::Confusion()) {N = gp_Dir(k.Normalized());}else {normalFromCurvature = Standard_False;gp_Dir defaultDir(0, 1, 0);gp_Vec N_vec = defaultDir.XYZ() - (defaultDir.XYZ().Dot(T.XYZ())) * T.XYZ();if (N_vec.Magnitude() < Precision::Confusion()) {defaultDir = gp_Dir(0, 0, 1);N_vec = defaultDir.XYZ() - (defaultDir.XYZ().Dot(T.XYZ())) * T.XYZ();}if (N_vec.Magnitude() > Precision::Confusion()) {N = gp_Dir(N_vec.Normalized());}else {logFile << "  Error: Failed to calculate normal at t=" << t << "\n";continue;}}// 构建当前标架gp_Ax3 currentFrame(P, T, N);// 验证标架正交性Standard_Real orthoCheck = T.Crossed(N).Dot(gp_Dir(currentFrame.YDirection()));if (Abs(orthoCheck) < 0.9) {logFile << "  Warning: Non-orthogonal frame at t=" << t<< " (orthogonality factor: " << orthoCheck << ")\n";}// 生成变换gp_Trsf trsf;trsf.SetTransformation(currentFrame, initialFrame);// 应用变换BRepBuilderAPI_Transform transformer(originalShape, trsf, Standard_False);Standard_Boolean transformOK = transformer.IsDone();// 记录变换后位置gp_Pnt transformedOrigin = initialFrame.Location().Transformed(trsf);logFile << "  Transformed Origin: (" << transformedOrigin.X() << ", "<< transformedOrigin.Y() << ", " << transformedOrigin.Z() << ")\n";// 记录摘要信息LogTransformInfo(logFile, t, P, T, N, Standard_True, transformOK);if (transformOK) {successCount++;TopoDS_Shape transformedShape = transformer.Shape();// 此处可添加形状分析代码}}// 统计信息logFile << "\n\n=== Execution Summary ===\n";logFile << "Total steps attempted: " << stepCount << "\n";logFile << "Successful transformations: " << successCount << "\n";logFile << "Success rate: "<< std::setprecision(1) << (successCount * 100.0 / stepCount) << "%\n";logFile.close();return 0;
}

五、实验验证与调试方法

5.1 日志记录系统

通过文件日志记录关键运动参数:

时间戳 | 位置坐标 | 切向量 | 法向量 | 标架状态 | 变换结果 | 备注
0.0500 | (1.23,2.34,3.45) | (0.87,0.44,0.21) | (-0.12,0.89,0.43) | Valid | Success | -
5.2 验证指标
  • 位置连续性:相邻帧之间位移差应满足一定条件,即位移差需小于最大速度与时间间隔的乘积
    ∣ Δ P ∣ < v m a x Δ t |\Delta \mathbf{P}| < v_{max} \Delta t ∣ΔP<vmaxΔt

  • 方向平滑性:旋转轴变化率需符合设定的最大角速度变化率
    d ω d t < ω m a x \frac{d\mathbf{\omega}}{dt} < \omega_{max} dtdω<ωmax

  • 成功率统计:有效变换帧占比应超过 95%,以确保整体计算的可靠性和稳定性


六、应用扩展与优化方向

6.1 性能优化
  • 标架预计算:提前生成参数化标架查找表
  • 多线程加速:并行计算不同参数点的变换
6.2 高级应用
  • 运动约束:添加关节限制、碰撞规避
  • 动力学耦合:结合物理引擎实现力反馈
  • 多刚体协同:实现机构链式运动
6.3 替代标架方案
  • 并行传输标架:通过迭代法保持标架连续
  • 最小扭转标架:优化标架扭转量分布

结论

本文提出的基于Open Cascade的刚体运动控制方法,通过严谨的微分计算和鲁棒性处理,实现了复杂曲线路径下的稳定运动。实验表明,该方法在典型测试案例中成功率可达94%以上,日志系统为运动分析提供了有效工具。未来可结合并行计算与高级标架生成算法,进一步提升复杂工况下的运动质量。

相关文章:

Open CASCADE学习|刚体沿曲线运动实现方法

在三维几何建模中&#xff0c;刚体沿参数化曲线的运动模拟是机械运动仿真、机器人路径规划等领域的核心需求。本文基于Open Cascade几何内核&#xff0c;系统阐述刚体沿曲线运动的实现方法&#xff0c;重点解析标架构建、坐标变换及鲁棒性控制等关键技术。 一、基于标架的刚体运…...

工作流引擎-03-聊一聊什么是流程引擎(Process Engine)?

前言 大家好&#xff0c;我是老马。 最近想设计一款审批系统&#xff0c;于是了解一下关于流程引擎的知识。 下面是一些的流程引擎相关资料。 工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎&#x…...

centos7 p8p1使用ip addr查看时有的时候有两个ip,有的时候只有一个ip,有一个ip快,有一个ip慢

在CentOS 7系统中&#xff0c;网络接口 p8p1 出现IP地址数量变化且访问速度不一致的问题&#xff0c;通常与以下原因相关。以下是逐步排查与解决方案&#xff1a; 1. 检查网络配置文件 可能原因&#xff1a;存在多个配置文件或重复配置&#xff08;如静态IP与DHCP冲突&#xf…...

回溯算法——排列篇

目录 一、全排列 二、全排列II 一、全排列 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; class Solution {List<List<Integer>> resultnew ArrayList<>();LinkedList<Integer> pathnew LinkedList<>();boolean[] used;public List<…...

Unity中SRP Batcher使用整理

SRP Batcher 是一种绘制调用优化,可显著提高使用 SRP 的应用程序的性能,SRP Batcher 减少了Unity为使用相同着色器变体的材质准备和调度绘制调用所需的CPU 时间。 工作原理: 传统优化方法通过减少绘制调用次数提升性能,而SRP Batcher的核心理念在于降低绘制调用间的渲染状…...

【JAVA学习】泛型

传统方法不能对加入到集合ArrayList中的数据类型进行约束&#xff0c;遍历的时候需要进行类型转换&#xff0c;如果集合中的数据量较大&#xff0c;对效率有影响。泛型又称参数化类型&#xff0c;是JDK5.0出现的新特性&#xff0c;解决数据类型的安全性问题&#xff0c;在类声明…...

实验分享|基于千眼狼sCMOS科学相机的流式细胞仪细胞核成像实验

实验背景 流式细胞仪与微流控技术&#xff0c;为细胞及细胞核成像提供新的路径。传统流式细胞仪在细胞核成像检测方面存在检测通量低&#xff0c;荧光信号微弱等局限&#xff0c;故某光学重点实验室开发一种基于高灵敏度sCMOS科学相机并集成在自组荧光显微镜的微流控细胞核成像…...

MySQL中的JSON_CONTAINS函数用法

MySQL中的JSON_CONTAINS函数用于检查一个JSON文档&#xff08;目标&#xff09;是否包含另一个JSON文档&#xff08;搜索值&#xff09;。以下是其详细用法&#xff1a; 函数语法​ JSON_CONTAINS(target_json, search_json [, path]) ​target_json​&#xff1a;要检查的目…...

如何在 Windows 11 或 10 上将 DNS 更改为 Cloudflare提供的 DNS 服务

域名解析服务(DNS)对于互联网来说至关重要,因为它使我们能够轻松地通过在浏览器中输入域名来访问网站。DNS 的作用是将域名解析为 IP 地址;你可以将其视为互联网上的电话簿。这是因为互联网上的计算机或服务器是通过 IPv4 或 IPv6(数字格式)来识别的,然而,要用户去记住…...

解除diffusers库的prompt长度限制(SDXL版)

2025-5-21 注&#xff1a;本文只提供思路&#xff0c;没有解决“权重识别”、“BREAK”问题。 要想实现与webui一样的绘图效果与无限prompt&#xff0c;可参考diffusers/examples/community/lpw_stable_diffusion_xl.py 1、上代码 from diffusers import StableDiffusionXLP…...

RISC-V 开发板 MUSE Pi Pro CSI测试,一把点亮ov5647摄像头

视频讲解&#xff1a; RISC-V 开发板 MUSE Pi Pro CSI测试&#xff0c;一把点亮ov5647摄像头 手上正好有一颗ov5674&#xff0c;看了下接口排线都是一致的&#xff0c;硬件条件满足的情况下&#xff0c;剩下的就是驱动软件的问题&#xff0c;直接接上CSI排线 https://bianbu-li…...

Word2Vec模型学习和Word2Vec提取相似文本体验

文章目录 说明Word2Vec模型核心思想两种经典模型关键技术和算法流程优点和局限应用场景 Word2Vec提取相似文本完整源码执行结果 说明 本文适用于初学者&#xff0c;体验Pytorch框架在自然语言处理中的使用。简单了解学习Word2Vec模型&#xff0c;体验其使用。 Word2Vec模型 …...

[测试_3] 生命周期 | Bug级别 | 测试流程 | 思考

目录 一、软件测试的生命周期&#xff08;重点&#xff09; 1、软件测试 & 软件开发生命周期 &#xff08;1&#xff09;需求分析 &#xff08;2&#xff09;测试计划 &#xff08;3&#xff09;测试设计与开发 &#xff08;4&#xff09;测试执行 &#xff08;5&am…...

epoll_wait未触发的小Bug

上次看了一下epoll监听的原理&#xff0c;在Android Jni里使用epoll&#xff0c;来监听Gpio口的变化事件&#xff0c;具体代码如下&#xff1a; 打开 GPIO 文件描述符&#xff0c;因为该文件是内核虚拟出来的&#xff0c;不是实际文件&#xff0c;所以无法使用FileObserver来监…...

Unity异步加载image的材质后,未正确显示的问题

简述&#xff1a; 此问题涉及到Unity的UI刷新机制 问题描述&#xff1a; 如图所示&#xff0c;想要实现在打开新的界面时候&#xff0c;通过修改材质的方式&#xff0c;修改image的显示内容。 明明已经给image添加上材质了&#xff0c;可还是一片空白&#xff1f; 先看看代…...

Python----循环神经网络(Word2Vec)

一、Word2Vec Word2Vec是word to vector的简称&#xff0c;字面上理解就是把文字向量化&#xff0c;也就是词嵌入 的一种方式。 它的核心就是建立一个简单的神经网络实现词嵌入。 其模型仅仅包括输入层、隐藏层和输出层&#xff0c;模型框架根据输入输出的不同&#xff0c;主要…...

Oracle Enqueue Names

Oracle Enqueue Names Enqueue&#xff08;排队锁&#xff09;是Oracle数据库中用于协调多进程并发访问共享资源的锁机制。 This appendix lists Oracle enqueues. Enqueues are shared memory structures (locks) that serialize access to database resources. They can be…...

微服务中API网关作用(统一入口、路由转发、协议转换、认证授权、请求聚合、负载均衡、熔断限流、监控日志)

文章目录 在微服务架构中&#xff0c;API网关主要有以下作用1. 统一入口&#xff1a;作为所有客户端请求的单一入口点&#xff0c;隐藏后端服务的复杂性2. 路由转发&#xff1a;将客户端请求准确路由到适当的微服务&#xff08;如图中的服务A、B、C&#xff09;3. 协议转换&…...

Linux `cat` 命令深度解析与高阶应用指南

Linux `cat` 命令深度解析与高阶应用指南 一、核心功能解析1. 基本作用2. 与类似命令对比二、选项系统详解1. 常用选项矩阵2. 组合使用技巧三、高阶应用场景1. 数据流处理2. 系统维护操作3. 开发调试应用四、安全与权限管理1. 访问控制策略2. 二进制文件处理五、性能优化策略1.…...

融云 uni-app IMKit 上线,1 天集成,多端畅行

融云 uni-app IMKit 正式上线&#xff0c;支持一套代码同时运行在 iOS、Android、H5、小程序主流四端&#xff0c;集成仅需 1 天&#xff0c;并可确保多平台的一致性体验。 融云 uni-app IMKit 在 Vue 3 的高性能加持下开发实现&#xff0c;使用 Vue 3 Composition API&#x…...

VLA模型:自动驾驶与机器人行业的革命性跃迁,端到端智能如何重塑未来?

当AI开始操控方向盘和机械臂&#xff0c;人类正在见证一场静默的产业革命。 2023年7月&#xff0c;谷歌DeepMind抛出一枚技术核弹——全球首个视觉语言动作模型&#xff08;VLA&#xff09;RT-2横空出世。这个能将“把咖啡递给穿红衣服的阿姨”这类自然语言指令直接转化为机器人…...

IP地址详解

IP地址详解(技术向) 一、核心定义 IP地址(Internet Protocol Address)是 网络层逻辑地址,用于在网络中唯一标识设备。本质上是 32位(IPv4)或128位(IPv6)二进制数。 本机的地址为127.0.0.1,主机名:localhost192.168.0.0-192.168.255.255为私有地址,属于非注册地址,…...

C++网络编程入门学习(四)-- GDB 调试 学习 笔记

GDB 调试 学习 笔记 GDB 调试 学习 笔记调试准备启动和退出gdbgdb中启动程序退出gdb查看代码断点调试命令继续运行gdb手动打印信息 自动打印信息单步调试step 可简写 snext 可简写成 nfinish 可简写成 finuntil 可简写成 u 设置变量值 GDB 调试 学习 笔记 学习地址&#xff1a…...

C#面:Server.UrlEncode、HttpUtility.UrlDecode的区别

在C#编程中&#xff0c;Server.UrlEncode 和 HttpUtility.UrlDecode 是两个常用的方法&#xff0c;用于处理URL编码和解码操作。理解它们的区别对于确保数据在Web应用程序中的正确传输和解析至关重要。 Server.UrlEncode 和 HttpUtility.UrlDecode的区别 Server.UrlEncode 和…...

kafka配置SASL_PLAINTEXT简单认证

Kafka ZooKeeper 开启 SASL_PLAINTEXT 认证&#xff08;PLAIN机制&#xff09;最全实战教程 &#x1f4a1; 本教程将手把手教你如何为 Kafka 配置基于 SASL_PLAINTEXT PLAIN 的用户名密码认证机制&#xff0c;包含 Kafka 与 ZooKeeper 的全部配置&#xff0c;适合入门。 &…...

Flink SQL 计算实时指标同比的实现方法

在 Flink SQL 中计算实时指标的同比(Year-on-Year),核心是通过时间窗口划分周期(如日、月、周),并关联当前周期与去年同期的指标值。以下是结合流数据处理特性的具体实现方法,包含数据准备、窗口聚合、历史数据关联等关键步骤。 一、同比的定义与场景 同比指当前周期指…...

Vue Router动态路由与导航守卫实战

在 Vue Router 中&#xff0c;动态路由与导航守卫的结合使用能够实现复杂的路由控制逻辑&#xff0c;例如权限验证、动态路由加载、数据预取等功能。以下是一个结合实战的详细说明&#xff1a; 一、动态路由基础 动态路由通过路径参数&#xff08;:&#xff09;实现动态匹配&a…...

数据库健康监测器(BHM)实战:如何通过 HTML 报告识别潜在问题

在数据库运维中,健康监测是保障系统稳定性与性能的关键环节。通过 HTML 报告,开发者可以直观查看数据库的运行状态、资源使用情况与潜在风险。 本文将围绕 数据库健康监测器(Database Health Monitor, BHM) 的核心功能展开分析,结合 Prometheus + Grafana + MySQL Export…...

Oracle基础知识(二)

目录 1.聚合函数 2.COUNT(1)&COUNT(*)&COUNT(字段)区别&#xff08;面试常问&#xff09; 3.分组聚合——group by 4.去重&#xff1a;DISTINCT 、GROUP BY 5.聚合函数的过滤HAVING 6.oracle中having与where的区别 (面试常问) 7.ROUND与TRUNC函数 8.ROLLUP上卷…...

轻量化MEC终端 特点

MEC&#xff08;多接入边缘计算&#xff09;解决方案通过将计算能力下沉至网络边缘&#xff0c;结合5G网络特性&#xff0c;已在多个行业实现低延迟、高可靠、高安全的应用部署。以下从技术架构、核心优势及典型场景三方面进行总结&#xff1a; 一、技术架构 分层设计‌ MEC架…...

Git 提交大文件 this exceeds GitHub‘s file size limit of 100.00 MB

报错核心&#xff1a; File …/encoder-epoch-99-avg-1.int8.onnx is 173.47 MB File …/encoder-epoch-99-avg-1.onnx is 314.79 MB this exceeds GitHub’s file size limit of 100.00 MB 正确做法&#xff1a;使用 Git LFS 上传大文件 GitHub 对 单个文件最大限制是 100MB&…...

前后端的双精度浮点数精度不一致问题解决方案,自定义Spring的消息转换器处理JSON转换

在 Java 中&#xff0c;Long 是一个 64 位的长整型&#xff0c;通常用于表示很大的整数。在后端&#xff0c;Long 类型的数据没有问题&#xff0c;因为 Java 本身使用的是 64 位的整数&#xff0c;可以表示的范围非常大。 但是&#xff0c;在前端 JavaScript 中&#xff0c;Lo…...

C语言—Linux环境下CMake设置库(动态/静态)

1. Yesterday Once More 由于昨日我们在VSCode设置了如何使用CMake构建与编译c语言项目&#xff0c;如有疑问&#xff0c;请看以下链接&#xff0c;今日根据昨天的配置来进一步完成项目的构建。 c语言- 如何构建CMake项目&#xff08;Linux/VSCode&#xff09;-CSDN博客 2. 动态…...

C语言---内存函数

memcpy函数的使用及模拟实现 memcpy的功能和strcpy类似&#xff0c;都是用来拷贝数据的。与strcpy不同的是&#xff0c;memcpy的适用性更广并且是以字节为单位来拷贝的。 void * memcpy ( void * destination, const void * source, size_t num ) memcpy函数的作用就是拷贝从so…...

vue项目启动报错(node版本与Webpack)

一、问题 因为项目需要将node版本从v14.17.0升级到v20.9.1了&#xff0c;然后启动项目报错 报错有些多&#xff0c;直接省略部分 building 2/2 modules 0 activeError: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:79:19) …...

Vite + Vue 工程中,为什么需要关注 `postcss.config.ts`?

&#x1f4dc; 前言&#xff1a;当传统 CSS 遇见现代工程 在 Vue 项目开发中&#xff0c;CSS 管理一直是一个容易被忽视但极其重要的环节。传统的 CSS 编写方式&#xff08;如手动处理浏览器兼容性、全局样式污染&#xff09;已无法适应现代前端工程的需求。而 PostCSS 作为 C…...

LeetCode热题100:Java哈希表中等难度题目精解

49. 字母异位词分组 题目描述 给定一个字符串数组&#xff0c;要求将字母异位词组合在一起。可以按任意顺序返回结果列表。 字母异位词是由重新排列源单词的所有字母得到的一个新单词。 示例 示例 1: 输入: strs ["eat", "tea", "tan", &…...

设计模式1 ——单例模式

定义 在 C 里&#xff0c;单例模式是一种常用的设计模式&#xff0c;其目的是保证一个类仅存在一个实例&#xff0c;并且为该实例提供一个全局访问点。 实现 1 饿汉式 class Singleton { private:static Singleton instance;Singleton() default;~Singleton() default;Si…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(26):のは ・ のが ・ のを

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(26):のは ・ のが ・ のを 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)復習:(2)のは ・ のが ・ のを3、单词(1)日语(2)日语片假名单词4、相近词练习5、单词辨析记录6、总结1、前言 (1)情况说明…...

第18天-NumPy + Pandas + Matplotlib多维度直方图

示例1:带样式的柱状图 python 复制 下载 import numpy as np import pandas as pd import matplotlib.pyplot as plt# 生成数据 df = pd.DataFrame(np.random.randint(10, 100, size=(8, 4)),columns=[Spring, Summer, Autumn, Winter],index=[2015, 2016, 2017, 2018, 20…...

Qt初识.

认识 QLabel 类&#xff0c;能够在界面上显示字符串. 通过 setText 来设置的。参数 QString (Qt 中把 C 里的很多容器类&#xff0c;进行了重新封装。历史原因) 内存泄露 / 文件资源泄露对象树. Qt 中通过对象树&#xff0c;来统一的释放界面的控件对象. Qt 还是推荐使用 new 的…...

linux系统查看硬盘序列号

Linux系统查看硬盘信息指南 方法一&#xff1a;hdparm工具 sudo hdparm -i /dev/sda输出示例&#xff1a;在返回信息中查找"SerialNo"字段为序列号&#xff0c;"Model"字段为硬盘型号注意&#xff1a;必须使用root权限&#xff0c;普通用户需在命令前加s…...

用户栈的高效解析逻辑

一、背景 在之前的博客 内核逻辑里抓取用户栈的几种方法-CSDN博客 里&#xff0c;介绍了使用内核逻辑进行用户栈的函数地址的抓取逻辑&#xff0c;但是并没有涉及如何解析出函数符号的逻辑。 就如perf工具一样&#xff0c;它也是分为两个步骤&#xff0c;一个步骤是内核态抓取…...

【713. 乘积小于 K 的子数组】

Leetcode算法练习 笔记记录 713. 乘积小于 K 的子数组 713. 乘积小于 K 的子数组 此题和 209题什么区别&#xff0c;没有什么区别&#xff0c;关键时理解滑动窗口的作用。 public int numSubarrayProductLessThanK(int[] nums, int k) {if (k < 1){return 0;}int left 0;in…...

springboot 1.x2.x依赖spring版本

springboot 1.x&2.x依赖spring版本 Spring Boot 1.x 系列版本主要依赖于 Spring Framework 4.x。具体对应关系如下&#xff1a; Spring Boot 1.0.x → Spring Framework 4.0.xSpring Boot 1.1.x → Spring Framework 4.0.xSpring Boot 1.2.x → Spring Framework 4.1.xSp…...

TYUT-企业级开发教程-第9章

考点不多&#xff0c;不会考大题 异步任务 异步任务通常用于耗时较长或者不需要立即得到执行结果的业务&#xff0c;在 Spring 中&#xff0c;可以使用 Async 注解实现异步任务&#xff0c;被Async 注解标注的方法称之为异步方法&#xff0c;异步方法将在执行的时候&#xff…...

独占内存访问指令LDXR/STXR

一、原子操作的介绍 在计算机领域里&#xff0c;如果要在多线程的情况下要保持数据的同步&#xff0c;需要引入称作Load-Link&#xff08;LL&#xff09;和Store-Conditional&#xff08;SC&#xff09;的操作&#xff0c;通常简称为LL/SC。 LL操作返回一个内存地址上当前存储…...

FlashAttention:传统自注意力( Self-Attention)优化加速实现

摘要 FlashAttention 是一套专为 GPU 优化的精确自注意力&#xff08;Self-Attention&#xff09;实现&#xff0c;通过“输入/输出感知”&#xff08;IO-awareness&#xff09;和块化&#xff08;Tiling&#xff09;策略&#xff0c;利用片上 SRAM 缓存大幅降低对高带宽显存&…...

DSP定时器的计算

以下是 0 到 F 的十六进制数对应的四位二进制表示的对照表&#xff1a; 十六进制二进制00000100012001030011401005010160110701118100091001A1010B1011C1100D1101E1110F1111 定时器周期&#xff1a; 我们先将 0x1742 转换成二进制形式&#xff1a; 0x1742 0001 0111 0100 …...

2025.05.21华为暑期实习机考真题解析第二题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 灾区物资调度路径规划 问题描述 在一次严重的自然灾害后,LYA负责协调救援物资的配送工作。救援区域包含多个受灾乡镇和一个物资集结点,各个地点之间的道路状况各异,有些甚至…...