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

STM32实现九轴IMU的卡尔曼滤波

在嵌入式系统中,精确的姿态估计对于无人机、机器人和虚拟现实等应用至关重要。九轴惯性测量单元(IMU)通过三轴加速度计、陀螺仪和磁力计提供全面的运动数据。然而,这些传感器数据常伴随噪声和漂移,单独使用无法满足高精度需求。卡尔曼滤波作为一种强大的传感器融合算法,能够有效结合多传感器数据,估计系统状态。

九轴IMU通常由以下三部分组成:

  • 三轴加速度计:测量线性加速度,可用于确定重力方向和线性运动
  • 三轴陀螺仪:测量角速度,用于检测旋转运动
  • 三轴磁力计:测量地磁场,提供绝对方向参考

这些传感器的互补特性使得传感器融合成为必要。融合算法通过结合各传感器数据,克服单一传感器的局限性,提供更准确的姿态估计。

由于各传感器存在固有缺陷(如陀螺仪漂移、加速度计噪声、磁力计干扰),单独使用无法提供可靠的姿态估计。传感器融合通过数学模型整合多传感器数据,生成更精确的估计结果。常用的融合算法包括互补滤波和卡尔曼滤波,其中卡尔曼滤波因其理论最优性广泛应用于姿态估计。

卡尔曼滤波是一种递归算法,用于从噪声测量中估计动态系统的状态。它假设系统是线性的,噪声为高斯分布。卡尔曼滤波包括两个主要步骤:

  • 预测步骤:根据系统模型预测下一时刻的状态和协方差。
  • 更新步骤:利用新测量值修正预测状态,计算卡尔曼增益以平衡预测和测量。

对于卡尔曼滤波的原理,我们不再细究,网上有很多资料,本篇文章主要讲解嵌入式工程师如何使用代码实现卡尔曼滤波。

在STM32微控制器上实现九轴IMU的卡尔曼滤波需要选择一款支持浮点运算单元(FPU)的STM32微控制器(如STM32F4系列),以高效处理矩阵运算。将九轴IMU(如MPU9250)通过I2C或SPI接口连接到STM32开发板。确保电源稳定,通信线路正确连接。

以下是九轴IMU卡尔曼滤波的核心实现:

// 状态向量:[q0, q1, q2, q3, bgx, bgy, bgz]
float state[7];// 状态协方差矩阵 P (7x7)
float P[49];// 过程噪声协方差矩阵 Q (7x7)
float Q[49];// 观测噪声协方差矩阵 R (6x6):3个加速度计和3个磁力计
float R[36];// 状态转换矩阵 F (7x7)
float F[49];// 观测矩阵 H (6x7)
float H[42];// 卡尔曼增益 K (7x6)
float K[42];// 预测状态
float state_pred[7];// 预测协方差
float P_pred[49];// 残差
float y[6];// S = H*P*H^T + R
float S[36];// 初始状态
void init_state(float initial_q[4], float initial_bg[3]) {// 初始化状态向量memcpy(state, initial_q, 4*sizeof(float));memcpy(state+4, initial_bg, 3*sizeof(float));// 初始化协方差矩阵 Pmemset(P, 0, 49*sizeof(float));P[0] = 0.01f; P[7] = 0.01f; P[14] = 0.01f; P[21] = 0.01f; // q的方差P[28] = 0.01f; P[35] = 0.01f; P[42] = 0.01f; // bg的方差// 初始化过程噪声协方差 Qmemset(Q, 0, 49*sizeof(float));Q[0] = 0.001f; Q[7] = 0.001f; Q[14] = 0.001f; Q[21] = 0.001f; // q的噪声Q[28] = 0.0001f; Q[35] = 0.0001f; Q[42] = 0.0001f; // bg的噪声// 初始化观测噪声协方差 Rmemset(R, 0, 36*sizeof(float));R[0] = 0.1f; R[7] = 0.1f; R[14] = 0.1f; // 加速度计噪声R[21] = 0.1f; R[28] = 0.1f; R[35] = 0.1f; // 磁力计噪声
}// 预测步骤
void predict(float gyro[3], float dt) {// 计算角速度四元数float omega[4] = {0, gyro[0], gyro[1], gyro[2]};float theta = sqrt(omega[1]*omega[1] + omega[2]*omega[2] + omega[3]*omega[3]) * dt;float axis[3];if (theta > 1e-6) {axis[0] = omega[1]/theta;axis[1] = omega[2]/theta;axis[2] = omega[3]/theta;} else {axis[0] = 0;axis[1] = 0;axis[2] = 0;}float dq[4] = {cos(theta/2), axis[0]*sin(theta/2), axis[1]*sin(theta/2), axis[2]*sin(theta/2)};// 预测四元数float q[4];quaternion_multiply(state, dq, q);quaternion_normalize(q);memcpy(state_pred, q, 4*sizeof(float));// 陀螺仪偏置保持不变memcpy(state_pred+4, state+4, 3*sizeof(float));// 计算状态转换矩阵 F// (这里简化为恒等矩阵,实际应用中需要正确计算)memset(F, 0, 49*sizeof(float));for(int i=0; i<7; i++) F[i*8] = 1.0f;// P_pred = F*P*F^T + G*Q*G^T// (这里简化为P_pred = P + Q)for(int i=0; i<49; i++) P_pred[i] = P[i] + Q[i];// 更新状态和协方差memcpy(state, state_pred, 7*sizeof(float));memcpy(P, P_pred, 49*sizeof(float));
}// 更新步骤
void update(float acc[3], float mag[3], float ref_mag[3]) {// 计算期望的加速度计测量值float q_inv[4];quaternion_conjugate(state, q_inv);float expected_acc[4] = {0, 0, 0, -1};quaternion_multiply(state, expected_acc, expected_acc);quaternion_multiply(expected_acc, q_inv, expected_acc);expected_acc[1] /= expected_acc[0];expected_acc[2] /= expected_acc[0];expected_acc[3] /= expected_acc[0];// 计算期望的磁力计测量值float expected_mag[4];quaternion_multiply(state, ref_mag, expected_mag);quaternion_multiply(expected_mag, q_inv, expected_mag);expected_mag[1] /= expected_mag[0];expected_mag[2] /= expected_mag[0];expected_mag[3] /= expected_mag[0];// 组合观测向量float z[6] = {acc[0], acc[1], acc[2],mag[0], mag[1], mag[2]};float h[6] = {expected_acc[1], expected_acc[2], expected_acc[3],expected_mag[1], expected_mag[2], expected_mag[3]};// 计算残差for(int i=0; i<6; i++) y[i] = z[i] - h[i];// 计算观测矩阵 H// (这里简化为恒等矩阵,实际应用中需要正确计算)memset(H, 0, 42*sizeof(float));for(int i=0; i<6; i++) H[i*8 + i] = 1.0f;// 计算 S = H*P*H^T + R// (这里简化为 S = H*P*H^T + R)memset(S, 0, 36*sizeof(float));for(int i=0; i<6; i++) {for(int j=0; j<7; j++) {if (H[i*7 + j] == 0) continue;for(int k=0; k<6; k++) {if (H[k*7 + j] == 0) continue;S[i*6 + k] += H[i*7 + j] * P[j*7 + k] * H[k*7 + j];}}}for(int i=0; i<36; i++) S[i] += R[i];// 计算卡尔曼增益 K = P*H^T*S^{-1}// (这里简化为 K = P*H^T / (H*P*H^T + R))memset(K, 0, 42*sizeof(float));for(int i=0; i<7; i++) {for(int j=0; j<6; j++) {float sum = 0;for(int k=0; k<7; k++) {sum += P[i*7 + k] * H[j*7 + k];}K[i*6 + j] = sum / S[j*6 + j];}}// 更新状态for(int i=0; i<7; i++) {float sum = 0;for(int j=0; j<6; j++) {sum += K[i*6 + j] * y[j];}state[i] += sum;}// 更新协方差memset(P, 0, 49*sizeof(float));for(int i=0; i<7; i++) {for(int j=0; j<7; j++) {float sum = 0;for(int k=0; k<6; k++) {sum += K[i*6 + k] * H[k*7 + j];}P[i*7 + j] = (1 - sum) * P_pred[i*7 + j];}}
}

以下是完整的STM32实现框架:

#include "stm32f10x.h"// 定义MPU9250和HMC5883L的I2C地址
#define MPU9250_ADDR 0x68
#define HMC5883L_ADDR 0x1E// MPU9250寄存器定义
#define PWR_MGMT_1 0x6B
#define SMPLRT_DIV 0x19
#define CONFIG 0x1A
#define GYRO_CONFIG 0x1B
#define ACCEL_CONFIG 0x1C
#define INT_ENABLE 0x38
#define PWR_MGMT_2 0x3B// HMC5883L寄存器定义
#define HMC5883L_CTRL_REG_A 0x0A
#define HMC5883L_CTRL_REG_B 0x0B// 状态向量:[q0, q1, q2, q3, bgx, bgy, bgz]
float state[7];// 状态协方差矩阵 P (7x7)
float P[49];// ... 其他变量声明// I2C写操作
void i2c_write(uint8_t addr, uint8_t reg, uint8_t value) {// 实现I2C写操作
}// I2C读操作
uint8_t i2c_read(uint8_t addr, uint8_t reg) {// 实现I2C读操作
}// 四元数乘法
void quaternion_multiply(float *q1, float *q2, float *result) {// 实现四元数乘法
}// 四元数归一化
void quaternion_normalize(float *q) {// 实现四元数归一化
}// 四元数共轭
void quaternion_conjugate(float *q, float *result) {// 实现四元数共轭
}// MPU9250初始化
void mpu9250_init(void) {// 实现MPU9250初始化
}// 从MPU9250读取加速度计数据
void read_accel(float *accel) {// 从MPU9250读取加速度计数据
}// 从MPU9250读取陀螺仪数据
void read_gyro(float *gyro) {// 从MPU9250读取陀螺仪数据
}// 从HMC5883L读取磁力计数据
void read_magnet(float *magnet) {// 从HMC5883L读取磁力计数据
}// 初始化卡尔曼滤波器
void init_kalman(float initial_q[4], float initial_bg[3]) {// 初始化卡尔曼滤波器
}// 卡尔曼滤波预测步骤
void kalman_predict(float gyro[3], float dt) {// 实现卡尔曼滤波预测步骤
}// 卡尔曼滤波更新步骤
void kalman_update(float accel[3], float magnet[3], float ref_magnet[3]) {// 实现卡尔曼滤波更新步骤
}int main(void) {// 初始化STM32外设// ...// 初始化MPU9250mpu9250_init();// 初始化卡尔曼滤波器float initial_q[4] = {1, 0, 0, 0}; // 初始姿态为0角度float initial_bg[3] = {0, 0, 0}; // 初始陀螺仪偏置为0init_kalman(initial_q, initial_bg);// 参考地磁场值(根据实际位置确定)float ref_magnet[3] = {0, 0, -1}; // 南极指向地心float gyro[3], accel[3], magnet[3];while(1) {// 读取传感器数据read_gyro(gyro);read_accel(accel);read_magnet(magnet);// 预测步骤float dt = 0.01; // 10ms采样周期kalman_predict(gyro, dt);// 更新步骤kalman_update(accel, magnet, ref_magnet);// 处理滤波结果// ...// 延时Delay_Ms(10);}
}

如果不想自己手写代码,可以使用STMicroelectronics的MotionFX库。

它是X-CUBE-MEMS1软件扩展的一部分,内置优化的卡尔曼滤波算法,支持6轴和9轴IMU融合。该库针对STM32微控制器优化,适合快速开发。

MotionFX库在不同STM32平台上的性能效果如下:

在STM32上实现九轴IMU的卡尔曼滤波是嵌入式系统中实现高精度姿态估计的有效方法。通过理解IMU的工作原理、卡尔曼滤波的理论以及系统建模,开发者可以从头实现EKF算法。或者,利用ST的MotionFX库可以显著简化开发流程,同时保持高性能。 

相关文章:

STM32实现九轴IMU的卡尔曼滤波

在嵌入式系统中&#xff0c;精确的姿态估计对于无人机、机器人和虚拟现实等应用至关重要。九轴惯性测量单元&#xff08;IMU&#xff09;通过三轴加速度计、陀螺仪和磁力计提供全面的运动数据。然而&#xff0c;这些传感器数据常伴随噪声和漂移&#xff0c;单独使用无法满足高精…...

JS DOM操作与事件处理从入门到实践

对于前端开发者来说&#xff0c;让静态的 HTML 页面变得生动、可交互是核心技能之一。实现这一切的关键在于理解和运用文档对象模型 (DOM) 以及 JavaScript 的事件处理机制。本文将带你深入浅出地探索 DOM 操作的奥秘&#xff0c;并掌握JavaScript 事件处理的方方面面。 目录 …...

Hive表JOIN性能问

在处理100TB的Hive表JOIN性能问题时&#xff0c;需采用分层优化策略&#xff0c;结合数据分布特征、存储格式和计算引擎特性。以下是系统性优化方案&#xff1a; 1. 数据倾斜优化&#xff08;Skew Join&#xff09; 1.1 识别倾斜键 方法&#xff1a;统计JOIN键的分布频率&…...

关键点检测--使用YOLOv8对Leeds Sports Pose(LSP)关键点检测

目录 1. Leeds Sports Pose数据集下载2. 数据集处理2.1 获取标签2.2 将图像文件和标签文件处理成YOLO能使用的格式 3. 用YOLOv8进行训练3.1 训练3.2 预测 1. Leeds Sports Pose数据集下载 从kaggle官网下载这个数据集&#xff0c;地址为link&#xff0c;下载好的数据集文件如下…...

2025年客运从业资格证备考单选练习题

客运从业资格证备考单选练习题 1、从事道路旅客运输活动时&#xff0c;应当采取必要措施保证旅客的人身和财产安全&#xff0c;发生紧急情况时&#xff0c;首先应&#xff08; &#xff09;。 A. 抢救财产 B. 抢救伤员 C. 向公司汇报 答案&#xff1a;B 解析&#xff1a;…...

QMK自定义4*4键盘固件创建教程:最新架构详解

QMK自定义4*4键盘固件创建教程&#xff1a;最新架构详解 前言 通过本教程&#xff0c;你将学习如何在QMK框架下创建自己的键盘固件。QMK是一个强大的开源键盘固件框架&#xff0c;广泛用于DIY机械键盘的制作。本文将详细介绍最新架构下所需创建的文件及其功能。 准备工作 在…...

获取conan离线安装包

1、获取conan离线安装包 # apt-get install python3.12-venv pip #缓存的安装存放在/var/cache/apt/archives目录 # mkdir /myenv && cd /myenv #创建虚拟环境目录 # python3 -m venv myenv #创建虚拟环境 # source myenv/bin/activate #激活虚拟环境&#xff…...

【Java ee初阶】网络原理

应用层 由于下面的四层都是系统已经实现好了的&#xff0c;但是应用层是程序员自己写的&#xff0c;因此应用层是程序员最重要的一层。 应用层中&#xff0c;程序员通常需要定义好数据传输格式&#xff0c;调用传输层api&#xff08;socket api&#xff09;进行真正的网络通信…...

Makefile中 链接库,同一个库的静态库与动态库都链接了,生效的是哪个库

Makefile中 链接库&#xff0c;同一个库的静态库与动态库都链接了&#xff0c;生效的是哪个库 在 Makefile 中同时链接同一个库的静态库&#xff08;.a&#xff09;和动态库&#xff08;.so&#xff09;时&#xff0c;具体哪个库生效取决于链接顺序和编译器行为。以下是详细分析…...

【AI提示词】金字塔模型应用专家

提示说明 专业运用金字塔原理优化信息结构与逻辑表达&#xff0c;实现高效精准的思维传达。 提示词 # Role: 金字塔模型应用专家 ## Profile - **language**: 中文/英文 - **description**: 专业运用金字塔原理优化信息结构与逻辑表达&#xff0c;实现高效精准的思维传…...

电子电器架构 --- 车载以太网拓扑

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

使用FastAPI微服务在AWS EKS上实现AI会话历史的管理

架构概述 本文介绍如何使用FastAPI构建微服务架构&#xff0c;在AWS EKS上部署两个微服务&#xff1a; 服务A&#xff1a;接收用户提示服务B&#xff1a;处理对话逻辑&#xff0c;与Redis缓存和MongoDB数据库交互 该架构利用AWS ElastiCache(Redis)实现快速响应&#xff0c;…...

Flutter PIP 插件 ---- 为iOS 重构PipController, Demo界面,更好的体验

接上文 Flutter PIP 插件 ---- 新增PipActivity&#xff0c;Android 11以下支持自动进入PIP Mode 项目地址 PIP&#xff0c; pub.dev也已经同步发布 pip 0.0.3&#xff0c;你的加星和点赞&#xff0c;将是我继续改进最大的动力 在之前的界面设计中&#xff0c;还原动画等体验一…...

vue开发用户注册功能

文章目录 一、开发步骤二、效果图三、搭建页面创建views/Login.vue在App.vue中导入Login.vue 四、数据绑定五、表单校验六、访问后端 API 接口&#xff0c;完成注册七、完整的Login.vue代码八、参考资料 一、开发步骤 二、效果图 三、搭建页面 创建views/Login.vue 完整内容在…...

Qt中的RCC

Qt资源系统(Qt resource system)是一种独立于平台的机制&#xff0c;用于在应用程序中传输资源文件。如果你的应用程序始终需要一组特定的文件(例如图标、翻译文件和图片)&#xff0c;并且你不想使用特定于系统的方式来打包和定位这些资源&#xff0c;则可以使用Qt资源系统。 最…...

muduo源码解析

1.对类进行禁止拷贝 class noncopyable {public:noncopyable(const noncopyable&) delete;void operator(const noncopyable&) delete;protected:noncopyable() default;~noncopyable() default; }; 2.日志 使用枚举定义日志等级 enum LogLevel{TRACE,DEBUG,IN…...

Qt QCheckBox 使用

1.开发背景 Qt QCheckBox 是勾选组件&#xff0c;具体使用方法可以参考 Qt 官方文档&#xff0c;这里只是记录使用过程中常用的方法示例和遇到的一些问题。 2.开发需求 QCheckBox 使用和踩坑 3.开发环境 Window10 Qt5.12.2 QtCreator4.8.2 4.功能简介 4.1 简单接口 QChec…...

【工具记录分享】提取bilibili视频字幕

F12大法 教程很多 但方法比较统一 例快速提取视频字幕&#xff01;适用B站、AI字幕等等。好用 - 哔哩哔哩 无脑小工具 哔哩哔哩B站字幕下载_在线字幕解析-飞鱼视频下载助手 把链接扔进去就会自动生成srt文件 需要txt可以配合&#xff1a; SRT转为TXT...

设计模式【cpp实现版本】

文章目录 设计模式1.单例模式代码设计1.饿汉式单例模式2.懒汉式单例模式 2.简单工厂和工厂方法1.简单工厂2.工厂方法 3.抽象工厂模式4.代理模式5.装饰器模式6.适配器模式7.观察者模式 设计模式 1.单例模式代码设计 ​ 为什么需要单例模式&#xff0c;在我们的项目设计中&…...

Python数据分析案例74——基于内容的深度学习推荐系统(电影推荐)

背景 之前都是标准的表格建模和时间序列的预测&#xff0c;现在做一点不一样的数据结构的模型方法。 推荐系统一直是想学想做的&#xff0c;以前读研时候想学没多少相关代码&#xff0c;现在AI资源多了&#xff0c;虽然上班没用到这方面的知识&#xff0c;但是还是想熟悉一下…...

C PRIMER PLUS——第8节:字符串和字符串函数

目录 1. 字符串的定义与表示 2. 获取字符串的两种方式 3.字符串数组 4. 字符串输入函数 4.1 gets()&#xff08;不推荐使用&#xff0c;有缓冲区溢出风险&#xff09; 4.2 fgets()&#xff08;推荐使用&#xff09; 4.3 scanf() 4.4 gets_s()&#xff08;C11 标准&…...

Dia浏览器:AI驱动浏览网页,究竟怎么样?(含注册申请体验流程)

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、Dia浏览器简介1. 什么是Dia浏览器2. 开发背景与公司简介3. 与传统浏览器的区别 …...

milvus+flask山寨复刻《从零构建向量数据库》第7章

常规练手&#xff0c;图片搜索山寨版。拜读罗云大佬著作&#xff0c;结果只有操作层的东西可以上上手。 书中是自己写的向量数据库&#xff0c;这边直接用python拼个现成的milvus向量数据库。 1. 创建一个向量数据库以及对应的相应数据表&#xff1a; # Milvus Setup Argume…...

【大数据技术-HBase-关于Hmaster、RegionServer、Region等组件功能和读写流程总结】

Hmaster的作用 负责命名空间、表的创建和删除等一些DDL操作、region分配和负载均衡,并不参与数据读写,相比与其他大数据组件,如hdfs的namenode,在hbase中,Hmaster的作用是比较弱化的,即使挂掉,也暂时不影响现有表的读写。 RegionServer的作用 一个机器上一个regionse…...

用c语言实现——一个交互式的中序线索二叉树系统,支持用户动态构建、线索化、遍历和查询功能

知识补充&#xff1a;什么是中序线索化 中序遍历是什么 一、代码解释 1.结构体定义 Node 结构体&#xff1a; 成员说明&#xff1a; int data&#xff1a;存储节点的数据值。 struct Node* lchild&#xff1a;该节点的左孩子 struct Node* rchild&#xff1a;该节点的右孩子…...

Pale Moon:速度优化的Firefox定制浏览器

Pale Moon是一款基于Firefox浏览器的定制版浏览器&#xff0c;专为追求速度和性能的用户设计。它使用开放源代码创建&#xff0c;经过高度优化&#xff0c;适用于现代处理器&#xff0c;提供了更快的页面加载速度和更高效的脚本处理能力。Pale Moon不仅继承了Firefox的安全性和…...

广东省省考备考(第七天5.10)—言语:逻辑填空(每日一练)

错题 解析 第一空&#xff0c;搭配“各个环节”&#xff0c;根据“我国已经形成了相对完善的中药质量标准控制体系”可知&#xff0c;横线处应体现“包含”之意&#xff0c;C项“涵盖”指包括、覆盖&#xff0c;D项“囊括”指把全部包罗在内&#xff0c;均与“各个环节”搭配得…...

Gartner《Container发布与生命周期管理最佳实践》学习心得

近日&#xff0c;Gartner发布了《Best Practices for Container Release and Life Cycle Management》&#xff0c; 报告为技术专业人士提供了关于容器发布和生命周期管理的深入指导。这份报告强调了容器在现代应用开发和部署中的核心地位&#xff0c;并提供了一系列最佳实践&…...

内存、磁盘、CPU区别,Hadoop/Spark与哪个联系密切

1. 内存、磁盘、CPU的区别和作用 1.1 内存&#xff08;Memory&#xff09; 作用&#xff1a; 内存是计算机的短期存储器&#xff0c;用于存储正在运行的程序和数据。它的访问速度非常快&#xff0c;比磁盘快几个数量级。在分布式计算中&#xff0c;内存用于缓存中间结果、存储…...

SpringCloud之Eureka基础认识-服务注册中心

0、认识Eureka Eureka 是 Netflix 开源的服务发现组件&#xff0c;后来被集成到 Spring Cloud 生态中&#xff0c;成为 Spring Cloud Netflix 的核心模块之一。它主要用于解决分布式系统中​​服务注册与发现​​的问题。 Eureka Server 有必要的话&#xff0c;也可以做成集群…...

MySQL 中如何进行 SQL 调优?

在MySQL中进行SQL调优是一个系统性工程&#xff0c;需结合索引优化、查询改写、性能分析工具、数据库设计及硬件配置等多方面策略。以下是具体优化方法及案例说明&#xff1a; 一、索引优化&#xff1a;精准提速的关键 索引类型选择 普通索引&#xff1a;加速频繁查询的列&…...

Linux平台下SSH 协议克隆Github远程仓库并配置密钥

目录 注意&#xff1a;先提前配置好SSH密钥&#xff0c;然后再git clone 1. 检查现有 SSH 密钥 2. 生成新的 SSH 密钥 3. 将 SSH 密钥添加到 ssh-agent 4. 将公钥添加到 GitHub 5. 测试 SSH 连接 6. 配置 Git 使用 SSH 注意&#xff1a;先提前配置好SSH密钥&#xff0c;然…...

Android平台FFmpeg音视频开发深度指南

一、FFmpeg在Android开发中的核心价值 FFmpeg作为业界领先的多媒体处理框架&#xff0c;在Android音视频开发中扮演着至关重要的角色。它提供了&#xff1a; 跨平台支持&#xff1a;统一的API处理各种音视频格式完整功能链&#xff1a;从解码、编码到滤镜处理的全套解决方案灵…...

QSFP+、QSFP28、QSFP-DD接口分别实现40G、100G、200G/400G以太网接口

常用的光模块结构形式&#xff1a; 1&#xff09;QSFP等效于4个SFP&#xff0c;支持410Gbit/s通道传输&#xff0c;可通过4个通道实现40Gbps传输速率。与SFP相比&#xff0c;QSFP光模块的传输速率可达SFP光模块的四倍&#xff0c;在部署40G网络时可直接使用QSFP光模块&#xf…...

MySQL事务和JDBC中的事务操作

一、什么是事务 事务是数据库操作的最小逻辑单元&#xff0c;具有"全有或全无"的特性。以银行转账为例&#xff1a; 典型场景&#xff1a; 从A账户扣除1000元 向B账户增加1000元 这两个操作必须作为一个整体执行&#xff0c;要么全部成功&#xff0c;要么全部失败…...

Linux系统下安装mongodb

1. 配置MongoDB的yum仓库 创建仓库文件 sudo vi /etc/yum.repos.d/mongodb-org.repo添加仓库配置 根据系统版本选择配置&#xff08;以下示例为CentOS 7和CentOS 9的配置&#xff09;&#xff1a; CentOS 7&#xff08;安装MongoDB 5.0/4.2等旧版本&#xff09;&#xff1a; In…...

JavaScript篇:async/await 错误处理指南:优雅捕获异常,告别失控的 Promise!

大家好&#xff0c;我是江城开朗的豌豆&#xff0c;一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术&#xff0c;并深入掌握Vue、React、Uniapp、Flutter等主流框架&#xff0c;能够高效解决各类前端开发问题。在我的技术栈中&#xff0c;除了…...

智能时代下,水利安全员证如何引领行业变革?

当 5G、AI、物联网等技术深度融入水利工程&#xff0c;传统安全管理模式正经历颠覆性变革。在这场智能化浪潮中&#xff0c;水利安全员证扮演着怎样的角色&#xff1f;又将如何重塑行业人才需求格局&#xff1f; 水利工程智能化转型对安全管理提出新挑战。无人机巡检、智能监测…...

使用FastAPI和React以及MongoDB构建全栈Web应用03 全栈开发快速入门

一、什么是全栈开发 A full-stack web application is a complete software application that encompasses both the frontend and backend components. It’s designed to interact with users through a web browser and perform actions that involve data processing and …...

NHANES稀有指标推荐:HALP score

文章题目&#xff1a;Associations of HALP score with serum prostate-specific antigen and mortality in middle-aged and elderly individuals without prostate cancer DOI&#xff1a;10.3389/fonc.2024.1419310 中文标题&#xff1a;HALP 评分与无前列腺癌的中老年人血清…...

软考错题集

一个有向图具有拓扑排序序列&#xff0c;则该图的邻接矩阵必定为&#xff08;&#xff09;矩阵。 A.三角 B.一般 C.对称 D.稀疏矩阵的下三角或上三角部分包含非零元素&#xff0c;而其余部分为零。一般矩阵这个术语太过宽泛&#xff0c;不具体指向任何特定性 质的矩阵。对称矩阵…...

llama.cpp无法使用gpu的问题

使用cuda编译llama.cpp后&#xff0c;仍然无法使用gpu。 ./llama-server -m ../../../../../model/hf_models/qwen/qwen3-4b-q8_0.gguf -ngl 40 报错如下 ggml_cuda_init: failed to initialize CUDA: forward compatibility was attempted on non supported HW warning: n…...

[面试]SoC验证工程师面试常见问题(五)TLM通信篇

SoC验证工程师面试常见问题(五) 摘要:UVM (Universal Verification Methodology) 中的 TLM (Transaction Level Modeling) 通信是一种用于在验证组件之间传递事务(Transaction)的高层次抽象机制。它通过端口(Port)和导出(Export)实现组件间的解耦通信,避免了信…...

Spring循环依赖问题

个人理解&#xff0c;有问题欢迎指正。 Spring 生命周期中&#xff0c;首先使用构造方法对 bean 实例化&#xff0c;实例化完成之后才将不完全的 bean放入三级缓存中提前暴露出 bean&#xff0c;然后进行属性赋值&#xff0c;此时容易出现循环依赖问题。 由此可见&#xff0c;…...

AtCoder Beginner Contest 405(CD)

C - Sum of Product 翻译&#xff1a; 给你一个长为N的序列。 计算的值。 思路&#xff1a; 可使用前缀和快速得到区间和&#xff0c;在遍历 i 即可。&#xff08;前缀和&#xff09; 实现&#xff1a; #include<bits/stdc.h> using namespace std; using ll long lon…...

MindSpore框架学习项目-ResNet药物分类-模型优化

目录 5.模型优化 5.1模型优化 6.结语 参考内容&#xff1a; 昇思MindSpore | 全场景AI框架 | 昇思MindSpore社区官网 华为自研的国产AI框架&#xff0c;训推一体&#xff0c;支持动态图、静态图&#xff0c;全场景适用&#xff0c;有着不错的生态 本项目可以在华为云modelar…...

C. scanf 函数基础

scanf 函数 1. scanf 函数基础1.1 函数原型与头文件1.2 格式化输入的基本概念2.1 常见格式说明符整数格式说明符浮点数格式说明符字符和字符串格式说明符其他格式说明符2.2 格式说明符的高级用法宽度修饰符精度修饰符跳过输入字段宽度组合修饰符对齐修饰符实际应用示例3.2 精度…...

《C++探幽:模板从初阶到进阶》

文章目录 :red_circle:一、模板基础&#xff1a;开启泛型编程之门&#xff08;一&#xff09;泛型编程的必要性&#xff08;二&#xff09;函数模板1. 函数模板概念2. 函数模板定义格式3. 函数模板原理4. 函数模板实例化5. 模板参数匹配原则 &#xff08;三&#xff09;类模板1…...

画立方体软件开发笔记 js three 投影 参数建模 旋转相机 @tarikjabiri/dxf导出dxf

gitee&#xff1a; njsgcs/njsgcs_3d mainwindow.js:4 Uncaught SyntaxError: The requested module /3dviewport.js does not provide an export named default一定要default吗 2025-05-10 14-27-58 专门写了个代码画立方体 import{ scene,camera,renderer} from ./3dviewp…...

LVGL图像导入和解码

LVGL版本&#xff1a;8.1 概述 在LVGL中&#xff0c;可以导入多种不同类型的图像&#xff1a; 经转换器生成的C语言数组&#xff0c;适用于页面中不常改变的固定图像。存储系统中的外部图像&#xff0c;比较灵活&#xff0c;可以通过插卡或从网络中获取&#xff0c;但需要配置…...