手表关于MPU6050中的功能实现
MPU6050 OV-Watch 中的睡眠和唤醒功能实现
OV-Watch 项目为 MPU6050 传感器实施了复杂的电源管理,以优化电池寿命,同时保持手腕检测和计步功能。以下是对睡眠和唤醒机制的详细分析:
内核休眠/唤醒功能实现
MPU6050 有两个主要功能来控制其电源状态:
void MPU_Sleep()
{ MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x48);//sleep=1,cycle=0,temp_dis=1,internal 8MHz
} void MPU_Wakeup()
{ //low power modes MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x28);//sleep=0,cycle=1,temp_dis=1,internal 8MHz
}
这些函数写入 MPU6050 的电源管理寄存器(MPU_PWR_MGMT1_REG,地址 0x6B)以配置:
- Sleep bit:控制设备是否处于睡眠模式 (1) 或不处于 (0)
- Cycle bit:启用 (1) 或禁用 (0) 循环模式,其中设备在睡眠和测量之间循环
- 温度传感器:禁用 (1) 以节省电量
- 时钟源:使用内部 8MHz 振荡器(位 0-2 = 0)
初始化过程
MPU6050配置为在初始化期间实现节能运行:
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X28); //SET the internal 8MHz,sleep=0,cycle=1,TEMP_DIS=1//low power modes
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X87); //enable accelerometer,disanable gyroscope,set the wake up frequence=20Hz
MPU_Set_Rate(50); //采样率50Hz
此初始配置:
- 将 MPU6050 设置为低功耗循环模式 (0x28)
- 在保持启用加速度计的同时禁用陀螺仪 (0x87)
- 将唤醒频率设置为 20Hz
- 配置 50Hz 采样率
DMP 运动处理配置
OV-Watch 通过数字运动处理器 (DMP) 功能进一步优化了功耗:
u8 mpu_dmp_init(void)
{ u8 res=0; MPU_Bus_Init(); if(mpu_init()==0) //初始化MPU6050 { res = mpu_lp_accel_mode(20); if(res)return -1; res=mpu_configure_fifo(INV_XYZ_ACCEL);//配置FIFO if(res)return 2; res=mpu_set_sample_rate(DEFAULT_MPU_HZ); //设置采样率 if(res)return 3; res=dmp_load_motion_driver_firmware(); //加载dmp固件 if(res)return 4; res=dmp_enable_feature(DMP_FEATURE_TAP| DMP_FEATURE_SEND_RAW_ACCEL| DMP_FEATURE_PEDOMETER);//使能dmp功能 if(res)return 6; res=dmp_set_fifo_rate(DEFAULT_MPU_HZ); //设置DMP输出速率(最大不超过200Hz) if(res)return 7; res=mpu_set_dmp_state(1); //使能DMP if(res)return 9; }else return 10; return 0;
}
此初始化:
- 将低功耗加速度计模式配置为 20Hz 唤醒频率
- 为加速度计数据设置 FIFO
- 加载 DMP 固件以进行高级运动处理
- 启用特定功能:点击检测、原始加速度数据和计步器
- 设置适当的数据速率
低功耗加速度计模式
mpu_lp_accel_mode 功能对于电源效率至关重要:
int mpu_lp_accel_mode(unsigned char rate)
{ unsigned char tmp[2]; if (rate > 40) return -1; if (!rate) { mpu_set_int_latched(0); tmp[0] = 0; tmp[1] = BIT_STBY_XYZG; if (i2c_write(st.hw->addr, st.reg->pwr_mgmt_1, 2, tmp)) return -1; st.chip_cfg.lp_accel_mode = 0; return 0; } /* For LP accel, we automatically configure the hardware to produce latched * interrupts. In LP accel mode, the hardware cycles into sleep mode before * it gets a chance to deassert the interrupt pin; therefore, we shift this * responsibility over to the MCU. */ mpu_set_int_latched(1);
#if defined MPU6050 //tmp[0] = BIT_LPA_CYCLE; tmp[0] = 0x28;
此功能:
- 设置低功耗作所需的锁存中断
- 使用 0x28 配置电源管理寄存器 (cycle=1, sleep=0, temp_dis=1)
sleep=1
:将设备置于睡眠模式cycle=0
:禁用循环模式(周期性唤醒)temp_dis=1
:禁用温度传感器以节省电量使用内部 8MHz 振荡器进行定时 - 根据请求的速率选择合适的唤醒频率
- 禁用陀螺仪以节省电量
手腕检测实现
OV-Watch 使用MPU6050进行手腕检测,以确定何时唤醒设备:
//MPU Check
if(HWInterface.IMU.wrist_is_enabled)
{ uint8_t hor; hor = MPU_isHorizontal(); if(hor && HWInterface.IMU.wrist_state == WRIST_DOWN) { HWInterface.IMU.wrist_state = WRIST_UP; Wrist_Flag = 1; //resume, go on } else if(!hor && HWInterface.IMU.wrist_state == WRIST_UP) { HWInterface.IMU.wrist_state = WRIST_DOWN; IdleTimerCount = 0; goto sleep; }
}
此机制:
- 检查是否启用了手腕检测
- 确定手表是否处于水平位置
- 更新手腕状态(UP 或 DOWN)
- 控制设备是应唤醒还是返回睡眠状态
水平位置检测使用加速度计数据来计算滚动和俯仰:
uint8_t MPU_isHorizontal(void)
{ float roll,pitch; MPU_Get_Angles(&roll,&pitch); if(roll<=0.50 && roll>=-0.50 && pitch<=0.50 && pitch>=-0.50) {return 1;} return 0;
}
硬件接口层
OV-Watch 实现了一个硬件抽象层来管理手腕检测:
void HW_MPU_Wrist_Enable(void)
{ #if HW_USE_IMU HWInterface.IMU.wrist_is_enabled = 1; #endif
} void HW_MPU_Wrist_Disable(void)
{ #if HW_USE_IMU HWInterface.IMU.wrist_is_enabled = 0; #endif
}
这些函数控制手腕检测功能是否处于活动状态,这直接影响何时调用 MPU6050 睡眠/唤醒函数。
笔记
-
OV-Watch 中的 MPU6050 实现通过以下方式最大限度地降低功耗:
- 在不需要时禁用陀螺仪
- 禁用温度传感器
- 使用循环模式而不是恒定作
- 仔细选择合适的唤醒频率
-
手腕检测功能允许手表保持睡眠模式,直到用户抬起手腕,在保持可用性的同时显着延长电池寿命。
-
数字运动处理器 (DMP) 可高效处理复杂的运动检测任务,使主处理器保持低功耗状态。
OV-Watch 智能手表使用 MPU6050 IMU 传感器来保持计步功能,即使设备处于睡眠模式也是如此。这种方法是手表能效战略的核心。
Power Mode 架构
OV-Watch 有三种不同的电源模式:
- 正常运行模式 - 功能齐全(消耗 70-80mA)
- 睡眠模式 - 当 MCU 处于停止模式(约 800μA)时,MPU6050继续计数步数
- 关断模式 - 完全断电,仅 RTC 处于活动状态 README_Eng.md:142-146
MPU6050 低功耗配置
在初始化期间,MPU6050 专门配置为在低功耗模式下运行,同时保持步数功能:
u8 mpu_dmp_init(void)
{ u8 res=0; MPU_Bus_Init(); if(mpu_init()==0)//初始化MPU6050 { res = mpu_lp_accel_mode(20); if(res)return -1; //... res=dmp_enable_feature(DMP_FEATURE_TAP| DMP_FEATURE_SEND_RAW_ACCEL| DMP_FEATURE_PEDOMETER);//enable dmp features if(res)return 6; //... } return 0;
}
关键部分是调用,它将 MPU6050 配置为在低功耗模式下以 20Hz 采样率运行。此功能专门将加速度计设置为继续运行,同时最大限度地降低功耗。mpu_lp_accel_mode(20)
睡眠模式实现
当设备进入睡眠模式时,MCU 进入 STOP 模式,同时保持 MPU6050 处于活动状态:
void StopEnterTask(void *argument)
{ //... if(osMessageQueueGet(Stop_MessageQueue,&Stopstr,NULL,0)==osOK) { //... //enter stop mode HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_STOPENTRY_WFI); //here is the sleep period //... } //...
}
值得注意的是,虽然 LCD 和 UART 等其他外设在进入睡眠模式之前被取消初始化,但 MPU6050 有意保持运行状态,允许它在 MCU 处于 STOP 模式时继续计算步数。
跨电源周期的步数持久性
步数通过 EEPROM 存储在整个休眠周期中保留:
void DataSaveTask(void *argument)
{ while(1) { //... RTC_DateTypeDef nowdate; HAL_RTC_GetDate(&hrtc,&nowdate,RTC_FORMAT_BIN); SettingGet(dat,0x20,3); if(dat[0] != nowdate.Date) { //... } else { uint16_t temp = HWInterface.IMU.GetSteps(); dat[0] = nowdate.Date; dat[2] = temp & 0xff; dat[1] = temp>>8 & 0xff; SettingSave(dat,0x20,3); } //... }
}
当系统初始化时,它会从 EEPROM 恢复上一步计数:
// EEPROM
EEPROM_Init();
if(!EEPROM_Check())
{ //... SettingGet(recbuf,0x20,3); if(recbuf[0] == nowdate.Date) { uint16_t steps=0; steps = recbuf[1]&0x00ff; steps = steps<<8 | recbuf[2]; if(!HWInterface.IMU.ConnectionError) dmp_set_pedometer_step_count((unsigned long)steps); }
}
步数计算实现
MPU6050 使用其 DMP(数字运动处理器)在内部计算步数。OV-Watch 仅在需要时检索此计数:
uint16_t HW_MPU_Get_Steps(void)
{ #if HW_USE_IMU unsigned long STEPS = 0; if(!HWInterface.IMU.ConnectionError) dmp_get_pedometer_step_count(&STEPS); return (uint16_t)STEPS; #endif return 0;
}
笔记
该项目需要对 MPU6050 DMP 库进行自定义修改,以实现低功耗。如 README 中所述:“MPU6050 不能直接使用 DMP 库。初始化后,功耗很高,需要进行一些修改以降低功耗。
这种实现方式允许 OV-Watch 在睡眠模式下保持连续计步,与正常工作时的 70-80mA 相比,实现了约 800μA 的极低功耗。
我将解释为什么以这种方式编写代码,以便从两个 8 位字节重新构造 16 位值。
了解步数检索中的字节作
查看 OV-Watch 项目中的相关代码:
steps = recbuf[1]&0x00ff; steps = steps<<8 | recbuf[2];
此代码从数组中存储的两个 8 位字节重建一个 16 位整数 (steps)。让我解释一下为什么它是这样写的:
准则的目的
此代码出现在硬件初始化任务中,系统正在从 EEPROM 内存中检索之前保存的步数。步数存储为 16 位值(可表示 0-65535 步),但作为两个独立的 8 位字节保存在 EEPROM 中。
重建如何运作
- 第一行:
steps = recbuf[1]&0x00ff;
- 这将获取高字节 (recbuf[1]) 并用 0x00FF 掩码它
- 掩码作 () 在技术上是多余的,因为 recbuf[1] 已经是一个 8 位值,但它确保只使用低 8 位
&0x00ff
- 第二行:
steps = steps<<8 | recbuf[2];
- 将高字节左移 8 位(为低字节腾出空间)
- 然后使用按位 OR 运算将其与低字节 (recbuf[2]) 组合
为什么以这种方式存储数据?
该器件中的 EEPROM 存储使用简单的字节可寻址格式。保存 16 位步数时,它被分成两个字节:
dat[0] = nowdate.Date;
dat[2] = temp & 0xff; // Low byte of step count
dat[1] = temp>>8 & 0xff; // High byte of step count
SettingSave(dat,0x20,3);
检索数据时,该过程将相反,以重建原始的 16 位值。
字节序注意事项
此实现使用 big-endian 格式进行存储(最高有效字节在前):
- 高字节存储在 recbuf[1] 中
- 低字节存储在 recbuf[2] 中
这是嵌入式系统中的常见约定,尤其是在 EEPROM 或其他字节可寻址存储中存储多字节值时。
完整上下文
此代码是设备初始化期间步数恢复过程的一部分。如果当前日期与存储的日期匹配,则系统会检索之前保存的步数并在MPU6050的计步器中进行设置:
if(recbuf[0] == nowdate.Date)
{ uint16_t steps=0; steps = recbuf[1]&0x00ff; steps = steps<<8 | recbuf[2]; if(!HWInterface.IMU.ConnectionError) dmp_set_pedometer_step_count((unsigned long)steps);
}
这可确保步数在设备重启或睡眠周期中保持不变,从而保持准确的每日步数。
笔记
代码可以更简洁地编写为:
steps = (recbuf[1] << 8) | recbuf[2];
但是,对于某些开发人员,尤其是那些不太熟悉按位运算的开发人员,两步方法可能更具可读性。
MPU6050 OV-Watch 中的点击检测功能
您询问的是为什么MPU6050(一个运动传感器)会有点击检测功能,而这看起来应该是触摸屏的功能。这是一个很好的问题,让我来解释一下。
MPU6050的点击检测功能
在OV-Watch项目中,MPU6050确实被配置为启用了点击检测(tap detection)功能。这可以在初始化代码中看到: inv_mpu.c:2974
这里启用了三个DMP功能:
DMP_FEATURE_TAP
- 点击检测DMP_FEATURE_SEND_RAW_ACCEL
- 原始加速度数据DMP_FEATURE_PEDOMETER
- 计步器功能
点击检测与触摸屏的区别
虽然OV-Watch确实有触摸屏(在功能列表中可以看到),但MPU6050的点击检测功能与触摸屏的触摸检测是完全不同的:
-
触摸屏检测:检测用户在屏幕表面的触摸动作,是基于电容或电阻变化的。
-
MPU6050点击检测:检测的是整个设备受到的物理冲击或敲击,是基于加速度传感器检测到的突然加速度变化。
MPU6050点击检测的工作原理
MPU6050的点击检测是通过其内置的DMP(数字运动处理器)实现的,它能够识别出特定的加速度模式,这些模式对应于设备被敲击或轻拍的动作。在代码中,这个功能被设置为检测X、Y、Z三个轴向的敲击: inv_mpu_dmp_motion_driver.c:1069
为什么需要这个功能?
在智能手表中,点击检测功能可以用于:
-
唤醒设备:当手表处于睡眠模式时,轻敲手表可以唤醒它,而不需要按按钮。
-
手势控制:可以通过不同方向的敲击来实现简单的手势控制,例如双击表面来确认操作。
-
节省电量:与持续监听触摸屏输入相比,使用加速度传感器检测敲击可能更省电。
在OV-Watch中的应用
在OV-Watch的低功耗设计中,MPU6050在手表睡眠模式下仍然保持活跃,以便继续计步和检测手腕动作: README_Eng.md:144-146
虽然最终OV-Watch项目选择使用RTC定时中断而不是MPU6050的运动检测来唤醒设备(因为需要较大的动作才能触发中断),但点击检测功能仍然被保留在代码中,可能用于其他交互功能。
笔记
-
OV-Watch同时拥有触摸屏和MPU6050的点击检测功能,它们服务于不同的用途。
-
虽然在提供的代码片段中没有明确看到MPU6050的点击检测功能被如何使用,但该功能在初始化时被启用,表明它可能在某些交互场景中被使用。
-
值得注意的是,MPU6050的DMP功能被特别优化以降低功耗,这对于电池供电的智能手表来说是非常重要的。
相关文章:
手表关于MPU6050中的功能实现
MPU6050 OV-Watch 中的睡眠和唤醒功能实现 OV-Watch 项目为 MPU6050 传感器实施了复杂的电源管理,以优化电池寿命,同时保持手腕检测和计步功能。以下是对睡眠和唤醒机制的详细分析: 内核休眠/唤醒功能实现 MPU6050 有两个主要功能来控制其…...
Qt中数据结构使用自定义类————附带详细示例
文章目录 C对数据结构使用自定义类1 QMap使用自定义类1.1 使用自定义类做key1.2 使用自定义类做value 2 QSet使用自定义类 参考 C对数据结构使用自定义类 1 QMap使用自定义类 1.1 使用自定义类做key QMap<key,value>中数据存入时会对存入key值的数据进行比较ÿ…...
深入浅出数据库的函数依赖关系
数据库的“恋爱关系”:函数依赖的那些事儿 在数据库的世界里,属性之间也存在“恋爱关系”。有些属性是“灵魂伴侣”,彼此绑定;有些是“单向奔赴”,只能依赖对方;还有些是“三角恋”,通过中间人…...
C语言易混淆知识点详解
C语言中容易混淆的知识点详解 C语言作为一门基础且强大的编程语言,有许多容易混淆的概念和特性。以下是C语言中一些常见易混淆知识点的详细解析: 1. 指针与数组 相似点: c 复制 下载 int arr[10]; int *ptr arr; 都可以使用[]运算符访…...
如何选择合适的光源?
目录 工业相机光源类型全面指南 1. 环形光源及其变体 高角度环形光源 优点 缺点 典型应用场景 低角度环形光源(暗场照明) 优点 缺点 典型应用场景 2. 条形光源与组合照明系统 技术特点 组合条形光源 优点 缺点 典型应用场景 3. 同轴光源…...
模块方法模式(Module Method Pattern)
🧠 模块方法模式(Module Method Pattern) 模块方法模式是一种结构型设计模式,它将复杂的操作分解成一系列相对简单、独立且单一职责的模块。每个模块负责完成一种具体的操作,其他模块或系统可以通过调用这些模块的公开…...
OpenCV第6课 图像处理之几何变换(仿射)
1.仿射变换 2. 平移 3 旋转 附录A 二维旋转矩阵 附录B 三维旋转矩阵与轴角表示 1.仿射变换 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够保持图像的平直性和平行性。 平直性是指图像经过仿射变换后,直线仍然是直线,平行性是指图像在…...
【中间件】brpc_基础_TimerThread
文章目录 TimerThread1 简介2 主要设计点2.1 数据结构:分层时间轮(Hierarchical Timing Wheel)2.2 线程模型2.3 任务管理 3 关键代码分析3.1 类定义(timer_thread.h)3.2 时间轮初始化(timer_thread.cpp&…...
拷贝多个Excel单元格区域为图片并粘贴到Word
Excel工作表Sheet1中有两个报表,相应单元格区域分别定义名称为Report1和Report2,如下图所示。 现在需要将图片拷贝图片粘贴到新建的Word文档中。 示例代码如下。 Sub Demo()Dim oWordApp As ObjectDim ws As Worksheet: Set ws ThisWorkbook.Sheets(&…...
网络原理(6)—— 应用层之HTTP协议
目录 一. 应用层 二. 重要应用层协议DNS(Domain Name System) 三. HTTP协议 3.1 HTTP抓包工具 3.2 HTTP格式 3.2.1 请求 3.2.2 响应 3.3 HTTP的工作过程 一. 应用层 应用层协议就像是人们之间的交流规则,它帮助不同的计算机程序(应用)…...
Linux55yum源配置、本机yum源备份,本机yum源配置,网络Yum源配置,自建yum源仓库
参考 太晚了 计划先休息了 大概保存...
250505_HTML
HTML 1. HTML5语法与基础标签1.1 HTML5特性1.1.1 空白折叠现象1.1.2 转义字符 1.2 HTML注释1.3 基础标签1.3.1 div标签1.3.2 标题标签1.3.3 段落标签1.3.1.3.1.3.1.3. 1. HTML5语法与基础标签 1.1 HTML5特性 1.1.1 空白折叠现象 1.1.2 转义字符 1.2 HTML注释 1.3 基础标签 1…...
1. 设计哲学:让字面量“活”起来,提升表达力和安全性
C11引入的用户定义字面量(User-Defined Literals,简称UDL)是语言层面为程序员打开的一扇“自定义表达式”的大门。它允许我们为字面量(比如数字、字符、字符串)添加自定义后缀,从而让代码更具语义化、更易读…...
【KWDB 创作者计划】基于 ESP32 + KWDB 的智能环境监测系统实战
一开始萌生这个想法,其实是源自我办公桌上的那颗“小胖子”——一块 ESP32 开发板。它陪我度过了不少调试夜,也让我对物联网有了真正的感知。恰逢 KaiwuDB 举办征文活动,我便想着,何不将我日常积攒下来的一些硬件和数据库实战经验…...
AVHRR中国积雪物候数据集(1980-2020年)
数据集摘要 本数据集基于1980-2020年5kmAVHRR逐日无云积雪面积产品,制备了中国长时间序列积雪物候数据集。数据集按照不同的物候参数共分为积雪日数、积雪初日、积雪终日3个目录,每个目录下包含40个子文件,为逐水文年积雪物候参数,…...
PCB设计中电感封装的选型
在PCB设计中,电感封装的选型直接影响电路性能、布局效率、热管理能力及系统可靠性。合理的封装选择不仅能优化空间利用率,还能提升电磁兼容性(EMC)和长期稳定性。以下从封装类型、尺寸参数、应用场景适配、布局协同设计、热管理策…...
LintCode第766题,LintCode第1141题,LintCode第478题
第766题描述 判断给出的年份 n 是否为闰年. 如果 n 为闰年则返回 true 闰年是包含额外一天的日历年. 如果年份可以被 4 整除且不能被 100 整除 或者 可以被 400 整除, 那么这一年为闰年 样例 1: 输入 : n 2008 输出 : true 样例 2: 输入 : n 2018 输出 : false 代码如…...
三十一、基于HMM的词性标注
基于HMM的中文词性标注 1 实验目标 理解HMM模型的原理和基本问题理解HMM的实现命名实体识别的具体步骤掌握HMM模型实现命名实体识别的方法 2 实验环境 HMM的中文词性标注的实验环境。 3 实验步骤 该项目主要由3个代码文件组成,分别为hmm.py、tagging.py和run.p…...
MCUboot 中的 BOOT_SWAP_TYPE_PERM 功能介绍
目录 概述 1 Image 数据结构 1.1 Image介绍 1.2 Swap info 2 BOOT_SWAP_TYPE_PERM 功能 2.1 功能定义 2.2 典型工作流程 3 BOOT_SWAP_TYPE_xx的其他功能 3.1 BOOT_SWAP_TYPE_REVERT 3.2 三中模式的比较 4 使用机制 4.1 实现细节 4.2 使用场景 4.3 开发者注意事…...
数学复习笔记 2
前言 朋友和我讨论了一个二重积分题,非常有意思。内容非常细致。整理如下: 二重积分 题目来源是 1000 上面的 16 题,积分区域是一个偏心圆,偏心圆的圆心在 y 轴上面,偏心圆是关于 y 轴对称的,可以看关于…...
从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 5 |地图匹配与轻量 SLAM:HMM/Viterbi 与简化图优化
Part 5 |地图匹配与轻量 SLAM:HMM/Viterbi 与简化图优化 在本章中,我们将在 ESP32-S3 这样的资源受限平台上,实现 地图匹配(Map Matching)和轻量级图优化(Lightweight SLAM)功能。通过 隐马尔可夫模型(HMM)+ Viterbi 算法,以及简化的图优化思路,校正定位轨迹,提升…...
Amazon Bedrock Converse API:开启对话式AI新体验
Amazon Bedrock Converse API:开启对话式AI新体验 前言 在当今人工智能飞速发展的时代,对话式AI已成为众多应用的核心组成部分。从智能客服到智能助手,对话式AI为用户带来了便捷且高效的交互体验。而Amazon Bedrock Converse API的出现&…...
软考 系统架构设计师系列知识点之杂项集萃(54)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(53) 第87题 某银行系统采用Factory Method方法描述其不同账户之间的关系,设计出的类图如下所示。其中与Factory Method的“Creator”角色对应的类是(ÿ…...
第三章 - 软件质量工程体系
1 概述 系统工程学的思想 系统工程学是为了研究多个子系统构成的整体系统所具有的多种不同目标的相互协调,以期系统功能的最优化、最大限度地发挥系统组成部分的能力而发展起来的一门科学。 软件质量工程体系的建立 建立和实施质量管理体系的方法 确定顾客和其…...
#基础Machine Learning 算法(上)
机器学习算法的分类 机器学习算法大致可以分为三类: 监督学习算法 (Supervised Algorithms):在监督学习训练过程中,可以由训练数据集学到或建立一个模式(函数 / learning model),并依此模式推测新的实例。…...
【YOLO11改进】改进Conv、颈部网络STFEN、以及引入PIOU用于小目标检测!
改进后的整体网络架构 改进一:RFD模块(Conv) YOLOv11模型的跨步卷积下采样虽然快速聚合了局部特征,并且实现了较高的计算效率,但其固有的信息压缩机制会导致细粒度特征的不可逆丢失。针对特征保留与计算效率的平衡问题,本文采用RFD模块替换跨步卷积下采样模块。RFD模块通…...
算法之上的权力——空域治理的政治哲学
当AI算法成为空域资源分配的核心机制,我们不得不直面一个核心问题:谁拥有算法,谁控制算法,谁审查算法?调度系统表面上是中立技术,实则承载了深刻的价值判断与权力结构。本章提出“算法即治理”命题…...
虚幻引擎作者采访
1万小时编程_哔哩哔哩_bilibili https://www.youtube.com/watch?v477qF6QNSvc 提姆斯温尼是一位传奇性的视频游戏程序员,Epic Games 的创始人兼首席执行官。 该公司开发了虚幻引擎、堡垒之夜、战争机器、虚幻竞技场等许多开创性和有影响力的视频游戏。 他哥哥…...
CodeBlocks25配置wxWidgets3.2
一、下载CodeBlocks 25.03版本 1.去Sourceforge.net Code::Blocks - Browse /Binaries/25.03/Windows at SourceForge.net 下载codeblocks-25.03mingw-nosetup.zip 2.解压到d盘,并把目录改为codeblocks 二、.下载wxWidgets 3.2.8 1. 去Sourceforge.net wxWidg…...
Python 整理3种查看神经网络结构的方法
1. 网络结构代码 import torch import torch.nn as nn# 定义Actor-Critic模型 class ActorCritic(nn.Module):def __init__(self, state_dim, action_dim):super(ActorCritic, self).__init__()self.actor nn.Sequential(# 全连接层,输入维度为 state_dim…...
【Bootstrap V4系列】学习入门教程之 组件-卡片(Card)
Bootstrap V4系列 学习入门教程之 组件-卡片(Card) 卡片(Card)一、Example二、Content types 内容类型2.1 Body 主体2.2 Titles, text, and links 标题、文本和链接2.3 Images 图片2.4 List groups 列表组2.5 Kitchen sink 洗涤槽…...
AI Agent开发第50课-机器学习的基础-线性回归如何应用在商业场景中
开篇 虽然我们这个系列主讲AI Agent,但是这个系列是一个喂饭式从0到深入的全AI类计算机教程系列,它主要面向的是培养出一个个AI时代的程序员,不是像外部那种很水的只是做做套壳、聊天、绘图小工具的急功近利式教学。而机器学习是现代AI的基础与基石,一些机器学习、深度学习…...
代码随想录第34天:动态规划7(打家劫舍问题:链式、环式、树式房屋)
一、背包问题小结 1.递推公式: 1.问能否能装满背包(或者最多装多少):dp[j] max(dp[j], dp[j - nums[i]] nums[i]) 2.问装满背包有几种方法:dp[j] dp[j - nums[i]] 3.问背包装满最大价值:dp[j] max…...
网络安全自动化:找准边界才能筑牢安全防线
数字时代,企业每天要面对成千上万的网络攻击。面对庞大的服务器群、分散的团队和长期不重启的设备,很多企业开始思考:哪些安全操作适合交给机器自动处理?哪些必须由人工把关?今天我们就用大白话聊聊这件事。 一、这些事…...
ctfshow——web入门361~368
最近练习ssti 当 Web 应用程序使用模板引擎动态生成 HTML 页面或其他类型的输出时,如果用户输入未经过充分验证或转义就被直接嵌入到模板中,就可能发生 SSTI 攻击。攻击者可以利用这个弱点注入恶意模板代码,该代码将在服务器端执行。 常见的…...
备忘录模式(Memento Pattern)
🧠 备忘录模式(Memento Pattern) 备忘录模式 是行为型设计模式之一。它通过将对象的状态存储在一个备忘录中,允许对象在不暴露其内部结构的情况下,保存和恢复自己的状态。该模式允许将对象的状态保存到备忘录中&#…...
五一假期作业
sub_process.c #include <stdio.h> // 标准输入输出库 #include <pthread.h> // POSIX线程库 #include <sys/ipc.h> // IPC基础定义(如消息队列/共享内存) #include <sys/msg.h> // 消息队列操作相关…...
Multi Agents Collaboration OS:专属多智能体构建—基于业务场景流程构建专属多智能体
背景 随着人工智能技术的飞速发展,大型语言模型(LLM)的能力不断突破,单一智能体的能力边界逐渐显现。为了应对日益复杂的现实世界任务,由多个具备不同能力、可以相互协作的智能体组成的多智能体系统 (Multi-Agent Sys…...
数据库的二级索引
二级索引 10.1 二级索引作为额外的键 表结构 正如第8章提到的,二级索引本质上是包含主键的额外键值对。每个索引通过B树中的键前缀来区分。 type TableDef struct {// 用户定义的部分Name stringTypes []uint32 // 列类型Cols []string // 列名Indexes …...
湖北理元理律师事务所:债务法律服务的民生价值重构
当前我国居民杠杆率达62.3%(央行2023年数据),债务问题已从经济议题演变为社会议题。湖北理元理律师事务所通过构建覆盖咨询、备案、规划的全链条服务,试图在法律框架内探索债务危机的社会化解决方案。 民生导向的服务设计 1.阶梯…...
DotNetBrowser 3.2.0 版本发布啦!
包含来自 Chromium 135 的安全修复支持自定义用户代理客户端提示(User Agent Client Hints)在 Avalonia 离屏渲染模式中支持拖放(Drag & Drop)功能 🔗 点击此处了解更多详情。 🆓 免费试用 30 天。...
PyTorch 张量与自动微分操作
笔记 1 张量索引操作 import torch # 下标从左到右从0开始(0->第一个值), 从右到左从-1开始 # data[行下标, 列下标] # data[0轴下标, 1轴下标, 2轴下标] def dm01():# 创建张量torch.manual_seed(0)data torch.randint(low0, high10, size(4, 5))print(data->,…...
C语言数据在内存中的存储详解
在 C 语言的编程世界里,理解数据在内存中的存储方式是非常重要的,它能帮助我们更好地掌握数据类型、内存管理和程序性能优化等内容。今天,我就来给大家详细讲解数据在内存中的存储,包括整数、大小端字节序和浮点数的存储方式&…...
【AI大模型】SpringBoot整合Spring AI 核心组件使用详解
目录 一、前言 二、Spring AI介绍 2.1 Spring AI介绍 2.2 Spring AI主要特点 2.3 Spring AI核心组件 2.4 Spring AI应用场景 2.5 Spring AI优势 2.5.1 与 Spring 生态无缝集成 2.5.2 模块化设计 2.5.3 简化 AI 集成 2.5.4 支持云原生和分布式计算 2.5.5 安全性保障…...
linux-文件操作
在 Linux 系统中,文件操作与管理是日常使用和系统管理的重要组成部分。下面将详细介绍文件的复制、移动、链接创建,以及文件查找、文本处理、排序、权限管理等相关知识。 一、文件的复制 在 Linux 里,cp 命令可用于复制文件或目录ÿ…...
丢失的数字 --- 位运算
目录 一:题目 二:算法原理 三:代码实现 一:题目 题目链接: 268. 丢失的数字 - 力扣(LeetCode) 二:算法原理 三:代码实现 class Solution { public:int missingNumb…...
从Rtos到Linux:学习的策略
这里目的只是为了学习,哪天工作需要用上了能更顺利的上手,写文章的目的是为了记录和便于查询。工作的前两年主要是以mcu裸机为主,目的是压缩资源以最少的ram和flash实现最多的功能,后来五年做的东西越来越复杂的跑的rtosÿ…...
BUUCTF——Mark loves cat
BUUCTF——Mark loves cat 进入靶场 简单的看了一下功能点 扫一下目录吧 扫目录发现一个.git 下一下源码看看 找到个flag.php和index.php <?php$flag file_get_contents(/flag);再看看index.php(代码有点长,所以只留了后面有用的) &…...
C/C++滑动窗口算法深度解析与实战指南
C/C滑动窗口算法深度解析与实战指南 引言 滑动窗口算法是解决数组/字符串连续子序列问题的利器,通过动态调整窗口边界,将暴力解法的O(n)时间复杂度优化至O(n)。本文将系统讲解滑动窗口的核心原理、C/C实现技巧及经典应用场景,助您掌握这一高…...
Webug4.0靶场通关笔记15- 第19关文件上传(畸形文件)
目录 第19关 文件上传(畸形文件) 1.打开靶场 2.源码分析 (1)客户端源码 (2)服务器源码 3.渗透实战 (1)构造脚本 (2)双写绕过 (3)访问脚本 本文通过《…...