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

超声波传感器模块

欢迎来到 破晓的历程的 博客

⛺️不负时光,不负己✈️

文章目录

    • 1.`HC-SR04`介绍
    • 2.`HC-SR04`原理介绍
      • 2.1原理概述
        • 3.2原理详解
    • 4驱动代码编写
      • 4.1写前思考
      • 4.2硬件连线
    • 5.总结
      • hcsr04.h
      • hcsr04.c

1.HC-SR04介绍

超声波传感器有很多种类的型号:HC-SR04、UC-025、UC-026、UC-015、US-100等等,但是他们都大同小异。他们的主要区别是工作参数有点不一样,像是工作的电压或者温度,探测距离或精度有点差别。引脚是一样的,都是4个引脚(us-100多了一个GND引脚),引脚的工作和作用也是一样的。

image-20250513180231393

其中我们最常用的为

image-20250513180319082

接线如下:

HC-SR04STM32备注
VCC3.3V/5V外接直流电源
Trig任意一个GPIO输入端
ECHO任意一个GPIO输出端
GNDGND接地

2.HC-SR04原理介绍

2.1原理概述

超声波测距的工作原理其实很简单,传感器发送超声波,超声波碰到障碍物反弹回来,被传感器接收到。芯片算出发送和接收的时间间隔,再利用公式:s=vxt,看下面示意图,所以实际距离=测量距离/2= 速度 x时间/2。
顺便一提,超声波在空气中的传播速度大概是 343m/,传播速度受到环境条件的影响,如温度、湿度和气压等

image-20250513182145684

超声波模块有两个超声波探头,一个是发送端,负责发送超声波,一个是接受端,负责接收超声波。

3.2原理详解

接下来我们用时序图的方式来介绍超声波发送和接收的过程以及如何计算距离的。

  • 正常测距时的时序:
image-20250513182520277
  1. 单片机会给超声波模块发送大于10us的高电平的触发信号;
  2. 超声波模块接收到触发信号后 Trig端发送8个40KHz的超声波脉冲。
  3. Echo端由低电平转为高电平,并同时开始发送超声波。
  4. 超声波模块接收到返回信号后,Echo端由高电平转为低电平。
  5. Echo的高电平宽度即为超声波发出的时间。

4驱动代码编写

明白了超声波测距的原理,我们知道了超声波测距的重点是测量超声波在空气中的时间。接下来我们来写超声波传感器的驱动代码。

4.1写前思考

我们计算差超声波往返所需时间,然后乘于超声波的速度,计算出距离,所以我们需要一个类似于秒表的东西,来测我们的时间。

所以我们可以先用定时器来做一个以微妙为单位的计时。为了方便使用,我们再封装若干个使用函数以便于我们使用这个定时器。

程序如下:

// TIM2 初始化句柄
TIM_HandleTypeDef tim2_handle;/*** @brief TIM2 定时器初始化函数*        设置定时器基本参数,并调用 HAL 库进行初始化*/
void tim2_init(void)
{// 指定定时器实例为 TIM2(即使用 TIM2 作为定时器)tim2_handle.Instance = TIM2;// 设置分频器:72-1 = 71// 如果主频为 72MHz,那么定时器时钟频率为 72MHz / 72 = 1MHz// 即定时器每计数一次所需时间为 1 微秒tim2_handle.Init.Prescaler = 72 - 1;// 设置自动重装载值(ARR):65536-1 = 65535// 当定时器计数到 65535 后溢出,重新从 0 开始// 若计数频率为 1MHz,则溢出周期为 65536 微秒(即 65.536 毫秒)tim2_handle.Init.Period = 65536 - 1;// 向上计数模式(从0计数到ARR)tim2_handle.Init.CounterMode = TIM_COUNTERMODE_UP;// 关闭自动重装载寄存器的预装载功能tim2_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 调用 HAL 库函数初始化定时器 TIM2HAL_TIM_Base_Init(&tim2_handle);
}/*** @brief TIM2 的 MSP(MCU Support Package)初始化函数*        一般用于配置定时器的时钟及中断* @param htim TIM句柄指针*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{// 判断当前初始化的是不是 TIM2if(htim->Instance == TIM2){// 使能 TIM2 定时器时钟__HAL_RCC_TIM2_CLK_ENABLE();}
}/*** @brief 启动 TIM2 定时器*/
void tim2_start(void)
{// 启动基础定时器,不带中断HAL_TIM_Base_Start(&tim2_handle);
}/*** @brief 停止 TIM2 定时器*/
void tim2_stop(void)
{// 停止基础定时器HAL_TIM_Base_Stop(&tim2_handle);
}/*** @brief 获取当前 TIM2 定时器计数器的值* @return 当前计数器的值(0~65535)*/
uint16_t tim2_get_cnt(void)
{// 使用 HAL 宏获取定时器当前计数器值return __HAL_TIM_GetCounter(&tim2_handle);
}/*** @brief 设置 TIM2 定时器计数器的值* @param val 要设置的计数器值*/
void tim2_set_cnt(uint16_t val)
{// 使用 HAL 宏设置定时器的当前计数器值__HAL_TIM_SetCounter(&tim2_handle, val);
}

4.2硬件连线

HC-SR04C8T6
VCCVCC
GNDGND
TrigPB6
echoPB7

因为我们涉及到对个别引脚的使用,所以我们需要对引脚进行一些简单的配置(为了方便对引脚进行修改,我们对引脚进行了一些简单的宏定义):

hcsrc04.h:

#define TRIG_PORT  GPIOB
#define TRIG_PIN   GPIO_PIN_6 
#define TRIG_GPIO_CLK_ENABLE()  __HAL_RCC_GPIOB_CLK_ENABLE()
#define TRIG_HIGH()         HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_SET)
#define TRIG_LOW()          HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_RESET)#define ECHO_PORT GPIOB
#define ECHO_PIN  GPIO_PIN_7
#define ECHO_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define ECHO_STATUS()     HAL_GPIO_ReadPin(ECHO_PORT,ECHO_PIN)

hcsrc04.c

/*** @brief 初始化 HC-SR04 超声波模块所使用的 GPIO 引脚*        Trig 为输出模式,用于发出超声波脉冲*        Echo 为输入模式,用于接收返回的超声波信号*/
void hcsr04_gpio_init(void)
{// 定义 GPIO 初始化结构体,用于配置引脚属性GPIO_InitTypeDef gpio_initstruct;// 使能 Trig 引脚所在 GPIO 端口的时钟TRIG_GPIO_CLK_ENABLE();// 使能 Echo 引脚所在 GPIO 端口的时钟ECHO_GPIO_CLK_ENABLE();/*************** 配置 Trig 引脚 ***************/// 设置 Trig 引脚号(例如 GPIO_PIN_1)gpio_initstruct.Pin = TRIG_PIN;// 设置为推挽输出模式(用于产生控制信号)gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;// 上拉电阻(防止悬空引起不稳定)gpio_initstruct.Pull = GPIO_PULLUP;// 设置 IO 速度为中速(可根据需要选择低、中、高)gpio_initstruct.Speed = GPIO_SPEED_MEDIUM;// 初始化 Trig 引脚所在端口HAL_GPIO_Init(TRIG_PORT, &gpio_initstruct);/*************** 配置 Echo 引脚 ***************/// 设置 Echo 引脚号(例如 GPIO_PIN_2)gpio_initstruct.Pin = ECHO_PIN;// 设置为输入模式(用于接收超声波返回信号)gpio_initstruct.Mode = GPIO_MODE_INPUT;// Echo 通常不需要特别配置上拉/下拉,默认即可(如需设置可加上)// gpio_initstruct.Pull = GPIO_NOPULL;// 初始化 Echo 引脚所在端口HAL_GPIO_Init(ECHO_PORT, &gpio_initstruct);
}

为了方便我们使用,我们也需要封装一个函数,这个函数名我们定义为:hcsr04_get_length,相信大家通过这个函数名就可以知道这个函数的作用,在前文中,我们介绍了超声波是如何发出的,四个 引脚的作用有什么不同。简单梳理一下:

  1. 单片机给Trig引脚至少10us长的一个高电平。
  2. ECHO引脚从低电平到高电平,表示开始发送波;波发出的那一刻,开启软件定时器(开始计时)。
  3. ECHO引脚,由高电平转为低电平,表示波回来了,此时我们停止计时器,计算经过时长。
  4. 获取经过的时间,并根据计算公式算出距离。

基于此,我们写出:

/*** @brief 获取 HC-SR04 超声波测距模块测得的距离(单位:厘米)* @return 距离值(cm)*/
float hcsr04_get_length(void)
{// 用于保存 Echo 信号持续的时间(单位:微秒)uint16_t totol_time = 0;// 用于保存最终计算出的距离值(单位:厘米)float distance = 0;/*************** 第1步:发送Trig脉冲 ***************/// 给 Trig 引脚发送一个 10 微秒以上的高电平脉冲,触发超声波发射TRIG_HIGH();       // 设置 Trig 引脚为高电平delay_us(15);      // 延迟至少 10us,这里用 15us 更加保险TRIG_LOW();        // 设置 Trig 引脚为低电平,发送完成/*************** 第2步:等待 Echo 信号拉高(开始接收) ***************/// 当 Echo 引脚由低电平变为高电平时,表示超声波已经发射出去// 此时开始计时while(ECHO_STATUS() == GPIO_PIN_RESET);  // 等待 Echo 变为高电平tim2_start();        // 启动定时器tim2_set_cnt(0);     // 将定时器计数清零/*************** 第3步:等待 Echo 信号拉低(接收到回波) ***************/// 当 Echo 引脚由高电平变为低电平时,表示回波已经接收完成// 此时停止计时while(ECHO_STATUS() == GPIO_PIN_SET);    // 等待 Echo 变为低电平tim2_stop();         // 停止定时器/*************** 第4步:获取 Echo 高电平持续时间 ***************/// 获取定时器计数值(单位是 us,取决于定时器配置)totol_time = tim2_get_cnt();/*************** 第5步:根据声速计算距离 ***************/// 声速约为 34300 cm/s,即 0.0343 cm/us// 因为往返距离,所以除以 2// distance = (totol_time × 0.0343) / 2 ≈ totol_time * 0.01715distance = totol_time * 0.01715f;// 返回测得的距离(单位:cm)return distance;
}

5.总结

本文章中,我们介绍了超声波传感器的原理,并以其中较为经典的 HC-SR04为例,给出了驱动代码。现将完整代码粘贴如下:

hcsr04.h

#ifndef __HCSR04_H__#define __HCSR04_H__#define TRIG_PORT  GPIOB
#define TRIG_PIN   GPIO_PIN_6 
#define TRIG_GPIO_CLK_ENABLE()  __HAL_RCC_GPIOB_CLK_ENABLE()
#define TRIG_HIGH()         HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_SET)
#define TRIG_LOW()          HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_RESET)#define ECHO_PORT GPIOB
#define ECHO_PIN  GPIO_PIN_7
#define ECHO_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define ECHO_STATUS()     HAL_GPIO_ReadPin(ECHO_PORT,ECHO_PIN)
void hcsr04_init(void);
float hcsr04_get_length(void);
#endif 

hcsr04.c

#include "hcsr04.h"
#include "sys.h"
#include "delay.h"
TIM_HandleTypeDef tim2_handle = {0};//定时器初始化函数
void tim2_init(void)
{tim2_handle.Instance = TIM2;tim2_handle.Init.Prescaler = 72-1;tim2_handle.Init.Period = 65536-1;tim2_handle.Init.CounterMode = TIM_COUNTERMODE_UP;tim2_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;HAL_TIM_Base_Init(&tim2_handle);}//msp函数
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){__HAL_RCC_TIM2_CLK_ENABLE();}
}void tim2_start(void)
{HAL_TIM_Base_Start(&tim2_handle);
}
void tim2_stop(void)
{HAL_TIM_Base_Stop(&tim2_handle);
}
uint16_t tim2_get_cnt(void)
{return __HAL_TIM_GetCounter(&tim2_handle);
}
void tim2_set_cnt(uint16_t val)
{__HAL_TIM_SetCounter(&tim2_handle,val); 
}/******************************************************** */
/*初始化超声波传感器*/
void hcsr04_gpio_init(void)
{GPIO_InitTypeDef gpio_initstruct;//打开时钟TRIG_GPIO_CLK_ENABLE();ECHO_GPIO_CLK_ENABLE();gpio_initstruct.Pin=TRIG_PIN;gpio_initstruct.Mode=GPIO_MODE_OUTPUT_PP;gpio_initstruct.Pull=GPIO_PULLUP;gpio_initstruct.Speed=GPIO_SPEED_MEDIUM;HAL_GPIO_Init(TRIG_PORT,&gpio_initstruct);gpio_initstruct.Pin=ECHO_PIN;gpio_initstruct.Mode=GPIO_MODE_INPUT;HAL_GPIO_Init(ECHO_PORT,&gpio_initstruct);
}
void hcsr04_init(void)
{tim2_init();hcsr04_gpio_init();}
float hcsr04_get_length(void)
{uint16_t totol_time=0;float distance=0;//1Trig引脚,给Trig引脚至少10us的高电平TRIG_HIGH();delay_us(15);TRIG_LOW();//2ECHO引脚,由低电平跳转到高电平,表示开始发送波,波发出去的那一下,开启定时器while(ECHO_STATUS()==GPIO_PIN_RESET);tim2_start();tim2_set_cnt(0);//3ECHO,由高电平条转低电平,表示波回来了,波回来的那一下,我们开始停止定时器,计算出中间经过//多长时间while(ECHO_STATUS()==GPIO_PIN_SET);tim2_stop();//4.计算出中间经过的时间totol_time=tim2_get_cnt();//5.距离=速度(343m/s)*时间/2;distance=totol_time*0.01715;return distance;}

相关文章:

超声波传感器模块

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 1.HC-SR04介绍2.HC-SR04原理介绍2.1原理概述3.2原理详解 4驱动代码编写4.1写前思考4.2硬件连线 5.总结hcsr04.hhcsr04.c 1.HC-SR04介绍 超声波传感器有很多种类的型号:HC-SR04、UC-025、…...

使用scp命令拷贝hadoop100中文件到其他虚拟机中

以下是使用 scp 命令将 hadoop100 主机中的文件拷贝到其他虚拟机的操作步骤(假设其他主机名为 hadoop101 、 hadoop102 ,系统为 Linux): 1. 基本语法 bash scp [选项] 源文件路径 目标主机用户名目标主机IP:目标路径 - 选…...

Linux基础 -- 用户态Generic Netlink库高性能接收与回调框架

用户态Generic Netlink库高性能接收与回调框架 一、概述 在 Linux 系统中,Netlink 是用户态与内核态通信的强大机制。libnl 是一个专为简化 Netlink 编程而设计的库,提供了接收和处理 Netlink 消息的高级接口。libnl-genl 是其通用 Netlink (Generic N…...

java中的Optional

在 Java 8 中,Optional 是一个用于处理可能为 null 的值的容器类,旨在减少空指针异常(NullPointerException)并提升代码的可读性。以下是 Optional 的核心用法和最佳实践: 1. 创建 Optional 对象 1.1 常规创建方式 Op…...

原型和原型链

原型(Prototype) 和 原型链(Prototype Chain) 是 JavaScript 中非常重要的概念,它们是 JavaScript 实现继承和共享属性和方法的核心机制。理解原型和原型链可以帮助你更好地掌握 JavaScript 的面向对象编程&#xff08…...

解锁Python TDD:从理论到实战的高效编程之道(9/10)

引言 在 Python 开发的广袤天地中,确保代码质量与稳定性是每位开发者的核心追求。测试驱动开发(TDD,Test-Driven Development)作为一种强大的开发理念与实践方法,正逐渐成为 Python 开发者不可或缺的工具。TDD 强调在…...

OpenMCU(七):STM32F103开发环境搭建

概述 本文主要讲述了使用Keil软件搭建STM32F103嵌入式开发环境的步骤,主要面向想从事嵌入式行业的入门同学,如果下面的讲述过程中有不对的地方,欢迎大家给我留言。 本文主要讲述了Keil 5.43的安装教程,主要用于学习交流&#xf…...

六、Hive 分桶

作者:IvanCodes 日期:2025年5月13日 专栏:Hive教程 在 Hive 中,除了常见的分区(Partitioning),分桶(Bucketing)是另一种重要且有效的数据组织和性能优化手段。它允许我们…...

INFINI Console 纳管 Elasticsearch 9(一):指标监控、数据管理、DSL 语句执行

Elasticsearch v9.0 版本最近已发布,而 INFINI Console 作为一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台,是否支持最新的 Elasticsearch v9.0 集群管理呢?本文以 INFINI Console v1.29.2 为例,从指标监控、数…...

ansible进阶版01

ansible进阶版01 欢迎使用Markdown编辑器最佳实践保持简单 保持井然有序(有组织的)经常测试 git工作原理 chapter 2编写ymal格式的主机清单 欢迎使用Markdown编辑器 最佳实践 保持简单 使用yaml的原生语法使用自带模块尽量使用专用模块,不…...

python文件打包成exe文件

✅ 一、安装 PyInstaller 打开cmd,输入以下代码 pip install pyinstaller✅ 二、打包指令 比如说你有如下的文件需要打包。 首先复制你的文件所在目录,比如我的是C:\Users\Administrator\Desktop\BearingSearchSystem 在cmd中切换到该目录来&#xf…...

人脸识别系统中的隐私与数据权利保障

首席数据官高鹏律师创作 如今人脸识别技术以其高效、便捷的特性广泛应用于各个领域,从安防监控到移动支付,从门禁系统到社交媒体。然而,这项技术在为我们的生活带来诸多便利的同时,也引发了一系列关于隐私与数据权利的深刻担忧。…...

电脑关机再开机会换IP吗?深入解析分配机制

在日常使用电脑时,许多用户可能会好奇:‌关机后再开机,IP地址会不会变化?‌ 这个问题看似简单,但实际上涉及多个因素。本文将详细解析电脑IP地址的变化机制,帮助大家理解其中的原理,并提供相关的…...

经典中的经典-比特币白皮书中文版

AI是一切假的集合,如果任凭AI如此聪明下去,所有的人都将被AI愚弄与股掌之间,那么能限制AI的只有区块链这个让一切数据都无处遁形的真神,而比特币作为区块链的鼻祖,开创了公开账本的先河,当互联网上所有的信…...

Spring事务失效的全面剖析

文章目录 1. Spring事务基础1.1 什么是Spring事务1.2 Spring事务的实现原理1.3 `@Transactional`注解的主要属性1.4 使用Spring事务的简单示例2. Spring事务失效的常见场景及解决方案2.1 方法不是public的问题描述问题示例解决方案技术原理解释2.2 自调用问题(同一个类中的方法…...

本地的ip实现https访问-OpenSSL安装+ssl正式的生成(Windows 系统)

1.下载OpenSSL软件 网站地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 安装: 一直点击下一步就可以了 2.设置环境变量 在开始菜单右键「此电脑」→「属性」→「高级系统设置」→「环境变量」 在Path 中添加一个: xxxx\OpenSSL-…...

【go】binary包,大小端理解,read,write使用,自实现TCP封包拆包案例

binary.LittleEndian 是 Go 语言 encoding/binary 包中的一个常量,用于指定字节序(Byte Order)。字节序是指多字节数据在内存中存储的顺序,有两种主要方式: 小端序(Little Endian):…...

[万字]qqbot开发记录,部署真寻bot+自编插件

这是我成功部署真寻bot以及实现一个自己编写的插件(连接deepseek回复内容)的详细记录,几乎每一步都有截图。 正文: 我想玩玩qqbot。为了避免重复造轮子,首先选一个github的高星项目作为基础吧。 看了一眼感觉真寻bot不…...

国内USB IP商业解决方案新选择:硬件USB Server

在数字化办公日益普及的今天,USB OVER NETWORK技术,即USB IP技术,为企业带来了前所未有的便捷与高效。作为这一领域的佼佼者,朝天椒USB Server以其卓越的性能和贴心的设计,正逐步成为众多中国企业的首选USB IP商业解决…...

百度导航广告“焊死”东鹏特饮:商业底线失守,用户安全成隐忧

近日,百度地图因导航时植入“广告”的问题登上社交媒体热搜,并引发广泛争议。 截图自微博 导航途中出现“焊死”在路面的广告 安全隐患引争议 多位网友发帖称,在使用百度地图导航时,导航界面中的公路路面上出现了“累了困了喝东…...

yolo11n-obb训练rknn模型

必备: 准备一台ubuntu22的服务器或者虚拟机(x86_64) 1、数据集标注: 1)推荐使用X-AnyLabeling标注工具 2)标注选【旋转框】 3)可选AI标注,再手动补充,提高标注速度 …...

GNU Screen 曝多漏洞:本地提权与终端劫持风险浮现

SUSE安全团队全面审计发现,广泛使用的终端复用工具GNU Screen存在一系列严重漏洞,包括可导致本地提权至root权限的缺陷。这些问题同时影响最新的Screen 5.0.0版本和更普遍部署的Screen 4.9.x版本,具体影响范围取决于发行版配置。 尽管GNU Sc…...

无人机避障——如何利用MinumSnap进行对速度、加速度进行优化的轨迹生成(附C++python代码)

🔥轨迹规划领域的 “YYDS”——minimum snap!作为基于优化的二次规划经典,它是无人机、自动驾驶轨迹规划论文必引的 “开山之作”。从优化目标函数到变量曲线表达,各路大神疯狂 “魔改”,衍生出无数创新方案。 &#…...

2025 3D工业相机选型及推荐

3D工业相机是专门为工业应用设计的三维视觉采集设备,能够获取物体的三维空间信息,在智能制造、质量检测、机器人引导等领域有广泛应用。 一、主要类型 1.结构光3D相机 通过投射特定光斑或条纹图案并分析变形来重建三维形状 典型代表:双目结构…...

芋道(yudao-cloud)项目,后端接口报401-账号未登录解决方案

一、需求 最近公司有新的业务需求,调研了一下,决定使用芋道(yudao-cloud)框架,于是从github(https://github.com/YunaiV/yudao-cloud)上克隆项目,选用的是jdk17版本的。根据项目启动手册&#…...

动态域名服务ddns怎么设置?如何使用路由器动态域名解析让外网访问内网?

设置路由器的动态域名解析(DDNS),通常需先选择支持 DDNS 的路由器和提供 DDNS 服务的平台,然后在路由器管理界面中找到 DDNS 相关设置选项,填入在服务平台注册的账号信息,完成配置后保存设置并等待生效。 …...

论文《Collaboration-Aware Graph Convolutional Network for Recommender Systems》阅读

论文《Collaboration-Aware Graph Convolutional Network for Recommender Systems》阅读 论文概况Introduction and MotivationMethodologyLightGCN 传播形式CIRCAGCNImplementation Experiments 论文概况 论文《Collaboration-Aware Graph Convolutional Network for Recomm…...

Codis集群搭建和集成使用的详细步骤示例

以下是Codis集群搭建和集成使用的详细步骤示例: 环境准备 安装Go语言环境 下载并安装适配操作系统的Go语言版本。配置环境变量GOROOT和GOPATH。 安装ZooKeeper 下载ZooKeeper压缩包,解压并进入目录。复制conf/zoo_sample.cfg为conf/zoo.cfg。启动ZooKe…...

利用比较预言机处理模糊的偏好数据

论文标题 ComPO:Preference Alignment via Comparison Oracles 论文地址 https://arxiv.org/pdf/2505.05465 模型地址 https://huggingface.co/ComparisonPO 作者背景 哥伦比亚大学,纽约大学,达摩院 动机 DPO算法直接利用标注好的数据来做偏好对…...

《数据库原理》部分习题解析

《数据库原理》部分习题解析 1. 课本pg196.第1题。 (1)函数依赖 若对关系模式 R(U) 的任何可能的关系 r,对于任意两个元组 t₁ 和 t₂,若 t₁[X] t₂[X],则必须有 t₁[Y] t₂[Y],则称属性集 Y 函数依赖…...

【HCIA】浮动路由

前言 我们通常会在出口路由器配置静态路由去规定流量进入互联网默认应该去往哪里。那么,如果有两个运营商的路由器都能为我们提供上网服务,我们应该如何配置默认路由呢?浮动路由又是怎么一回事呢? 文章目录 前言1. 网络拓扑图2. …...

基于机器学习的卫星钟差预测方法研究HPSO-BP

摘要 本文研究了三种机器学习方法(BP神经网络、随机森林和支持向量机)在卫星钟差预测中的应用。通过处理GPS和GRACE卫星的钟差数据,构建了时间序列预测模型,并比较了不同方法的预测性能。实验结果表明,优化后的BP神经…...

机器学习中分类模型的常用评价指标

评价指标是针对模型性能优劣的一个定量指标。 一种评价指标只能反映模型一部分性能,如果选择的评价指标不合理,那么可能会得出错误的结论,故而应该针对具体的数据、模型选取不同的的评价指标。 本文将详细介绍机器学习分类任务的常用评价指…...

AI 检测原创论文:技术迷思与教育本质的悖论思考

当高校将 AI 写作检测工具作为学术诚信的 "电子判官",一场由技术理性引发的教育异化正在悄然上演。GPT-4 检测工具将人类创作的论文误判为 AI 生成的概率高达 23%(斯坦福大学 2024 年研究数据),这种 "以 AI 制 AI&…...

langchain学习

无门槛免费申请OpenAI ChatGPT API搭建自己的ChatGPT聊天工具 https://nuowa.net/872 基本概念 LangChain 能解决大模型的两个痛点,包括模型接口复杂、输入长度受限离不开自己精心设计的模块。根据LangChain 的最新文档,目前在 LangChain 中一共有六大…...

蓝桥杯 10. 全球变暖

全球变暖 原题目链接 题目描述 你有一张某海域 N x N 像素的照片: . 表示海洋# 表示陆地 例如如下所示: ....... .##.... .##.... ....##. ..####. ...###. .......在照片中,“上下左右”四个方向上连在一起的一片陆地组成一座岛屿。例…...

OpenTiny icons——超轻量的CSS图标库,引领图标库新风向

我们非常高兴地宣布 opentiny/icons 正式发布啦! 源码:https://github.com/opentiny/icons(欢迎 Star ⭐) 官网:https://opentiny.github.io/icons/ 图标预览:https://opentiny.github.io/icons/brow…...

python使用OpenCV 库将视频拆解为帧并保存为图片

python使用OpenCV 库将视频拆解为帧并保存为图片 import cv2 import osdef video_to_frames(video_path, output_folder, frame_prefixframe_, interval1, target_sizeNone, grayscaleFalse):"""将视频拆分为帧并保存为图片参数:video_path (str): 视频文件路径…...

[论文阅读]ControlNET: A Firewall for RAG-based LLM System

ControlNET: A Firewall for RAG-based LLM System [2504.09593] ControlNET: A Firewall for RAG-based LLM System RAG存在数据泄露风险和数据投毒风险。相关研究探索了提示注入和投毒攻击,但是在控制出入查询流以减轻威胁方面存在不足 文章提出一种ai防火墙CO…...

机器学习 --- 数据集

机器学习 — 数据集 文章目录 机器学习 --- 数据集一,sklearn数据集介绍二,sklearn现实世界数据集介绍三,sklearn加载数据集3.1 加载鸢尾花数据集3.2 加载糖尿病数据集3.3 加载葡萄酒数据集 四,sklearn获取现实世界数据集五&#…...

在Ubuntu服务器上部署Label Studio

一、拉取镜像 docker pull heartexlabs/label-studio:latest 二、启动容器 &#xff08;回到用户目录&#xff0c;例&#xff1a;输入pwd&#xff0c;显示 /home/<user>&#xff09; docker run -d --name label-studio -it -p 8081:8080 -v $(pwd)/mydata:/label-st…...

机器学习07-归一化与标准化

归一化与标准化 一、基本概念 归一化&#xff08;Normalization&#xff09; 定义&#xff1a;将数据缩放到一个固定的区间&#xff0c;通常是[0,1]或[-1,1]&#xff0c;以消除不同特征之间的量纲影响和数值范围差异。公式&#xff1a;对于数据 ( x )&#xff0c;归一化后的值…...

用vue和go实现登录加密

前端使用CryptoJS默认加密方法&#xff1a; var pass CryptoJS.AES.encrypt(formData.password, key.value).toString()使用 CryptoJS.AES.encrypt() 时不指定加密模式和参数时&#xff0c;CryptoJS 默认会执行以下操作 var encrypted CryptoJS.AES.encrypt("明文&quo…...

服务器制造业中,L2、L6、L10等表示什么意思

在服务器制造业中&#xff0c;L2、L6、L10等是用于描述服务器生产流程集成度的分级体系&#xff0c;从基础零件到完整机架系统共分为L1-L12共12个等级。不同等级对应不同的生产环节和交付形态&#xff0c;以下是核心级别的具体含义&#xff1a; L2&#xff08;Level 2&#xf…...

mysql8常用sql语句

查询结果带行号 -- 表名为 mi_user&#xff0c; 假设包含列 id &#xff0c;address SELECT ROW_NUMBER() OVER (ORDER BY id) AS row_num, t.id, t.address FROM mi_user t ; SELECT ROW_NUMBER() OVER ( ) AS row_num, t.id, t.address FROM mi_user t ; 更新某列数…...

多模态RAG与LlamaIndex——1.deepresearch调研

摘要 关键点&#xff1a; 多模态RAG技术通过结合文本、图像、表格和视频等多种数据类型&#xff0c;扩展了传统RAG&#xff08;检索增强生成&#xff09;的功能。LlamaIndex是一个开源框架&#xff0c;支持多模态RAG&#xff0c;提供处理文本和图像的模型、嵌入和索引功能。研…...

汽车工厂数字孪生实时监控技术从数据采集到三维驱动实现

在工业智能制造推动下&#xff0c;数字孪生技术正成为制造业数字化转型的核心驱动力。今天详细介绍数字孪生实时监控技术在汽车工厂中的应用&#xff0c;重点解析从数据采集到三维驱动实现的全流程技术架构&#xff0c;并展示其在提升生产效率、降低成本和优化决策方面的显著价…...

深度解码双重订阅用户:高价值流量池的掘金指南

在流量红利消退的当下&#xff0c;内容平台与电商平台的竞争已进入白热化阶段。数据显示&#xff0c;2023年全球用户平均每日切换应用频次超过200次&#xff0c;但仅有3%的用户愿意为多个平台持续付费。这3%的群体——“双重订阅用户”&#xff0c;正成为商业价值最高的流量金矿…...

MATLAB Simulink在Autosar和非Autosar工程下的开发流程

软件开发有两种方法&#xff1a;自上而下和自下而上。自上而下就是从整体出发去设计各个模块和模块间的接口&#xff0c;要求架构设计人员对产品功能非常清楚&#xff1b;自下而上就是从一个一个模块出发去设计&#xff0c;进而组成一个整体。自下而上可能会带来冗余代码过多和…...

使用DevEco Studio性能分析工具高效解决鸿蒙原生应用内存问题

目录 一、内存问题的识别与初步判断 1.1 内存问题的常见表现 1.2 使用 DevEco Profiler 的实时监控功能 1.2.1 打开 Profiler 工具 1.2.2 监控内存变化 1.2.3 判断内存异常 1.2.4 示例代码:模拟内存泄漏 二、内存问题的定界与定位 2.1 使用 Snapshot/Allocation 模板分…...