机器人制作开源方案 | “校园卫士”-智能巡检机器人

作者:程训聪、柳贺凯、赵坤峰、叶智超、高仁伟

单位:黑龙江科技大学

指导老师:邵文冕、李杨

1. 摘要

       针对校园巡检需求设计机器人本体结构,借助Arduino作为控制核心的巡检机器人控制系统构建方法研究了巡检机器人在校园环境下的导航、控制、多传感器融合等问题。

       结果表明:该套系统的研发有效解决了校园巡检机器人的攀爬障碍、火灾检测、智能人脸检测、佩戴口罩识别等问题,通过采用分布式结构,保障了整个系统的实时性,实现了机器人复杂的人机交互和环境交互,同时提高了机器人控制系统的自适应性,为巡检机器人的智能化研究提供了一种高效可靠的方法。

2. 项目研发背景

      随着近年来社会经济的发展,由于校园面积大、场地分散,学生众多等特点,在校园生活中也会存在一系列的安全隐患,所以我们应该对校园安全给予更多的重视,对学校进行定期的巡检以保证学校工作正常运行显得尤为重要。自动化巡检需求日趋迫切,在这一样的环境下而催生的一种新型机器人-智能巡检机器人。

2.1 校园暴力伤害案件发生的安保隐患

      校园是一个和谐、安宁的地方,可近年来大学校园中频发的人生伤害事件引起了社会的广泛关注。经调查,学生在校园内受的伤害主要集中在交通事故、酗酒滋事、打架斗殴等,成为了能够对学生造成伤害的重要隐患。尤其值得一提的是,大学生自杀所带来的人身伤害。随着学习、就业等各方面压力的增大,许多大学生不能正确地调整自己的心理状态,受一时冲动的情绪控制而导致人身伤害的事件越来越多。

2.2 不规范用电的造成的消防隐患

      据不完全统计,校园火灾多发于教学楼、办公楼、实验室、食堂、体育馆、学生宿舍、教职员工宿舍等,几乎涉及到校园内的各种场所。校园火灾事故的原因大多为用火用电不规范,如:

      ① 点燃蜡烛、酒精、吸烟者乱扔未熄灭的烟头和火柴点燃易燃物引发起火。

      ② 宿舍内违规使用大功率电器或不合格插排造成火灾。

      ③ 教学楼内电路长时间不检修,电线绝缘老化、漏电短路等引起火灾等。

2.3 校园存在的防疫隐患

    第一个方面,学校特别是高校人员规模比较大,相对来讲疫情防控的资源比较不足。

    第二个方面,师生每天都要进出校园,特别是在特殊情况下需要对校门进行管控,如何能够让二者有序推进,这也是一个具体的困难。同时学生的课外活动、校外活动的范围也难以有效及时的掌握。

     第三个方面,校园场所密闭和我们需要减少聚集这方面的要求有时候也会出现一些冲突。

3. 国内外研究现状

3.1 国内研究现状

      国内巡检机器人真正的研究开始于20世纪90年代,中国科学院、沈阳自动化研究所、中国科学院等单位参与了巡检机器人的研究工作,取得了许多重大成果。在国家“十五”、“十一五”等计划的前提下,中国科学院沈阳系统化研究所开展“AApe”系统巡检机器人系统的研发。该系列机器人能够在超高压环境下完成自主控制的巡检任务,这些机器人的成功研究攻克了关于电磁兼容,机械架构承重等物理难题,以及实现了数据和图像的稳定传输等软件功能。在东北电力产品质量检测进行了超过五十场的现场实地测试和检验,成功实现各种功能的检测。

3.2 国外研究现状

      国外巡检机器人的发展起步于20世纪80年代,东京电力有限公司的泽田教授在1988年研发了一款巡检机器人。这个巡检机器人有一个可以跨越障碍物移动主体结构,能够很轻松的跨越障碍,其机械结构包括一对运动轮子和一对夹。当这个巡检机器人接触到塔架时,会模仿人类的行为,用机械手攀爬。机械臂和两边的地面线连接成导轨。当巡检机器人的运动轮夹紧两边的地线后,伸缩臂可以跨越障碍物。

4. 机器人本体技术路线说明

4.1 整体技术说明

      智能巡检机器人是一个具有一定移动感知能力的执行平台,在多种传感器的帮助下,检测特定状态,开展定制服务,能够实现更多的编程操作。事实上智能巡检机器人的类型有很多种,可以代替人工完成难以完成的巡检工作。

      智能巡检机器人主要以智能化移动四驱底盘为基础,集成了驱动、供电、通信、主控等多个单元和模块。以控制板为控制中心,通过摄像头捕捉的图像信息,进行图像传输共享;对现有的路径进行规划,使其结构创新,配合模块的使用,使其具有台阶攀爬、障碍避让、监测图像传输、危险预警等功能,完成对校园安全隐患的监控和预警,节约人力和物力资源,实现人工无法胜任的工作。

4.2 使用零件说明

4.2.1 标准舵机

      舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。舵机主要适用于那些需要角度不断变化并可以保持的控制系统,本机器人共采用了两个舵机。一个位于机器人前端,负责控制前轮的抬起与降落,主要参与爬坡任务。另一个位于支撑轮部分。负责控制支撑轮的抬起与降落。   

4.2.2 直流电机

      直流电机是将直流电能转换为机械能的电动机。因其良好的调速性能而在得到广泛应用。本机器人采用了四个电机,分别驱动四个轮子,控制机器人的前进、后退,并且可以利用控制电机的差速来实现机器人的左、右转。

4.2.3 超声波测距模块

      HC-SR04 超声波测距模块可提供2cm-400cm 的非接触式距离感测功能,测距精度可达高到3mm; 本机器人采用一个超声波测距模块,主要负责测量机器人与障碍物之间的距离,以便机器人及时做出反应。

4.2.4 控制模块

      arduino是开源的控制板,非常适合爱好电子制作的朋友制作互动作品,但对于一些不熟悉电子技术的爱好者,要在arduino控制板上添加电路是一个比较麻烦是事,所以我们设计了一个专用于简单机器人的扩展板,能将大部分传感器轻松地和arduino控制板连接。

      通过BigFish扩展板连接的电路可靠稳定,上面还扩展了伺服电机接口、8*8Led点阵、直流电机驱动及一个通用扩展接口,可以说的arduino控制板的必备配件。这是机器人的核心,负责协调控制机器人上的各种零件,以便实现智能巡检、疫情防控、火情报警等任务。

4.2.5 摄像头模块

      摄像头(webcam)一般具有视频摄像/传播和静态图像捕捉等基本功能,它是借由镜头采集图像后,由摄像头内的感光组件电路及控制组件对图像进行处理并转换成电脑所能识别的数字信号,然后借由并行端口或USB连接输入到电脑后由软件再进行图像还原。

      在本机器人的作用是接受机器人所到之处的实时画面,并将数据传输给检测人员。

4.2.6 履带片

      将履带片安装在行进轮上可以尽可能的增大机体与地面的摩擦力,使车体可以适应更多地形,提高智能巡检机器人的工作能力。

​4.2.7 火焰识别模块

      火焰传感器是机器人专门用来搜寻火源的传感器,本传感器对火焰特别灵敏。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号,输入到中央处理器中,中央处理器根据信号的变化做出相应的程序处理。利用该模块来对巡检机器人周围的环境进行判断是否有明火产生,当其发现明火时,立刻发出警报。

4.2.8 LED模块

      LED模块由集成有多行、多列的发光二极管四边形模块构成,所述的四边形模块至少一边为带有一组以上凹凸槽块的边缘。本机器人使用两个LED模块。对周围行人进行提醒。

5. 示例程序

main.ino

#include <math.h>

#include <Arduino.h>

#include<Servo.h>

#include<Wire.h>

#define Servo_Pin0 3

#define Servo_Pin1 4

#define Servo_Pin2 7

#define RMotorPin_D5 5

#define RMotorPin_D6 6

#define LMotorPin_D9 9

#define LMotorPin_D10 19

#define ECHOPIN A0

#define TRIGPIN A1

int Speed;

int LSpeed;

int RSpeed;

boolean IsForward=true;

unsigned long Time[2];

int Reciver;

Servo myServo[3];

void setup() {

  hbr640.open();

  Wire.begin();

  Serial.begin(9600);

     myServo[0].attach(Servo_Pin0);    //舵机初始化

     myServo[0].write(90);

     myServo[1].attach(Servo_Pin1);

     myServo[1].write(75);

     myServo[2].attach(Servo_Pin2);

     myServo[2].write(90);

     pinMode(LMotorPin_D9,OUTPUT);     //直流电机初始化调速

     pinMode(LMotorPin_D10,OUTPUT);

     pinMode(RMotorPin_D5,OUTPUT);

     pinMode(RMotorPin_D6,OUTPUT);

     LSpeed=MotorSpeedSet(14);

     RSpeed=MotorSpeedSet(13);

     pinMode(ECHOPIN, INPUT);

     pinMode(TRIGPIN, OUTPUT);

     delay(2000);

     pinMode(ECHOPIN, INPUT);

     pinMode(TRIGPIN, OUTPUT);

     pinMode(A2,OUTPUT);                 //LED 亮

     pinMode(A3,OUTPUT);

     pinMode(A4,OUTPUT);

     pinMode(A5,OUTPUT);

     digitalWrite(A2,HIGH);

     digitalWrite(A3,LOW);

     digitalWrite(A4,HIGH);

     digitalWrite(A5,LOW);

     hbr640.open();

}

void loop(){

     Reciver=Serial.read();     //接收树莓派串口通信

     ServoSet(60,1);         //下辅支架

     delay(500);

     ServoSet(50,0);

     delay(1000);  

     GoAhead(200);            //预计前进0.2秒后停止

     ServoSet(90,0);

     ServoSet(75,1);

     delay(500);           

     analogWrite(LMotorPin_D9,LSpeed);

     analogWrite(LMotorPin_D10,0);

     analogWrite(RMotorPin_D5,RSpeed);

     analogWrite(RMotorPin_D6,0);

     ServoSet(55,1);

     ServoSet(75,1);

     analogWrite(LMotorPin_D9,0);

     analogWrite(LMotorPin_D10,0);

     analogWrite(RMotorPin_D5,0);

     analogWrite(RMotorPin_D6,0);

     ServoSet(50,0);

     GoAhead(1500);

     TurnRight();

     GoAhead(1000);

     delay(3000);

     GoAhead(2000);

     TurnRight();

     GoAhead(3000);

}

int MotorSpeedSet(int x){

  int MotorSpeed=map(x,1,20,0,255);           //利用映射函数将直流电机速度分成20级,根据需要进行调整

  return MotorSpeed;

}

int ServoSet(int y,int b){                   //将舵机分成100级一步一步缓慢转至目标,以免速度过大使车身不稳发生倾倒。

  int a=0;

  int x=TheOld(b);

  while(a<100){

  int ServoAngle=y-(y-x)*(100-a)/100;

  myServo[b].write(ServoAngle);

  a=a+1;

  delay(30);

  }

}

int TheOld(int x){                       //记录舵机角度的旧值

  int value=myServo[x].read();

  return value;

}

int GoAhead(int c){                      //固定前进时间函数    输入单位:毫秒

  while(boolean T=true){

    int t;

    int s=1;

    Time[0]=micros();

    if(s=1) t=Time[0];

    analogWrite(LMotorPin_D9,LSpeed);

    analogWrite(LMotorPin_D10,0);

    analogWrite(RMotorPin_D5,RSpeed);

    analogWrite(RMotorPin_D6,0);

    Time[1]=micros();

    if(Time[1]-t >= c*1000){           

    analogWrite(LMotorPin_D9,0);

    analogWrite(LMotorPin_D10,0);

    analogWrite(RMotorPin_D5,0);

    analogWrite(RMotorPin_D6,0);

    break;

    }

    s++;

}

}

int TurnRight(){                      //默认右转电机运转时间为0.5秒

  while(boolean T=true){

    int t;

    int s=1;

    Time[0]=micros();

    if(s=1) t=Time[0];

    analogWrite(LMotorPin_D9,LSpeed);

    analogWrite(LMotorPin_D10,0);

    analogWrite(RMotorPin_D5,0);

    analogWrite(RMotorPin_D6,RSpeed);

    Time[1]=micros();

    if(Time[1]-t >= 500000){           

    analogWrite(LMotorPin_D9,0);

    analogWrite(LMotorPin_D10,0);

    analogWrite(RMotorPin_D5,0);

    analogWrite(RMotorPin_D6,0);

    break;

    }

    s++;

}

}

Voice_PUT.ino

#include "HBR640.h" ;

HBR640 hbr640;     

#define Numbers_of_Voece 2

#define Voice_Time 2700

unsigned char b = 0xC8;

unsigned char c = 0x00;

unsigned char a[Numbers_of_Voece] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};

void setup() {

  // put your setup code here, to run once:

  hbr640.open();

  delay(2000);

}

void Get_Mode(byte character[] ,unsigned char s,unsigned char d,int Num)

{

  unsigned char _YuYin[3];

  _YuYin[0] =   s; _YuYin[1] = character[0]; _YuYin[2] =d;

  for(int i=0;i<Num;i++){

    Serial.write(_YuYin,3);

    delay(Voice_Time);

  }

}

void loop() {

  if(hbr640.isHeard()) /

  {  

    int value = hbr640.getSentence();

    switch (value)

   {

    case 0: Get_Mode( a+0, b , c ,1); hbr640.open(); break;

    case 1: Get_Mode( a+1, b , c ,1); hbr640.open(); break;

    default:   break;

    }  

  }  

}

void serialEvent()

{

  hbr640.lisen();                             //在串口接收事件中调用语音识别的监听指令

}

树莓派部分.py

# -*- coding: utf-8 -*-

"""

Created on Sat Dec 10 23:13:07 2022

@author: 86138

"""

import RPi.GPIO as GPIO #( 导入模块 )

import sys

import time

import numpy as np

import cv2

import serial

import time

Trig=2 #第3号针,GPIO2

Echo=3 #第5号针,GPIO3

port = "/dev/ttyAMA0"

ser = serial.Serial(port,9600,timeout=1)   #   打开串口,连接到Arduino上

ser.flushInput() #                             清空输入缓冲区

       

cap=cv2.VideoCapture(1)  

#一下cap.set(),可以注释掉#

cap.set(3,320)#摄像头采集图像的宽度320

cap.set(4,240)#摄像头采集图像的高度240

cap.set(5,30) #摄像头采集图像的帧率fps为30

#查看采集图像的参数

print(cap.get(3))

print(cap.get(4))

print(cap.get(5))

while(True):

ret,color_frame=cap.read()

img1=cv2.flip(color_frame,0)   #翻转图像,0垂直翻转,1水平翻转,-1水平垂直翻转

cv2.imshow('color_frame',img1)   #展示每一帧

if cv2.waitKey(1)&0xff==ord('q'): #按Q键退出,可以改成任意键

break

cap.release()

cv2.destroyAllWindows()

fourcc =cv2.VideoWriter_fourcc(*'XVID')

out =cv2.VideoWriter('output2.avi',fourcc,20.0,(640,480))

while(cap.isOpened()):

    ret,frame=cap.read()

   

    if ret==True:

        out.write(frame)

        cv2.imshow('frame',frame)

        if cv2.waitKey(1) &0xff==ord('q'):

            break     

    else:

        break

   

cap.release()

out.release()

cv2.destroyAllWindows()

#超声波测距

def get_HYSRF05():

        #发出触发信号

        GPIO.output(Trig,GPIO.HIGH)#gaodianpin

        #保持10us以上(我选择15us)

        time.sleep(0.000015)

        GPIO.output(Trig,GPIO.LOW)

        while not GPIO.input(Echo):

                pass

        #发现高电平时开时计时

        t1 = time.time()

        while GPIO.input(Echo):

                pass

        #高电平结束停止计时

        t2 = time.time()

        #返回距离,单位为米

        return (t2-t1)*340/2

   

print(get_HYSRF05())

6. 功能及创新点介绍

6.1 功能介绍

      ① 当巡检机器人在正常行驶过程中,前方遇到台阶或者某种障碍物时,超声波模块进行感应,并实时测量车体与障碍物之间距离,当到达一定距离时,巡检机器人开始越障。

      前体与后体连接舵机向上转动,前体和后体形成一定角度,支撑轮舵机向下转动,将前轮撑起越过台阶线:

      后轮向前行进,支撑轮配合后轮被动转动,机器人向前移动,前体与后体连接舵机向下转动,前轮落在台阶上。支撑轮舵机向上转动,使支撑轮越过台阶线,行进轮向前转动,支撑轮落在台阶上。

支撑轮舵机向下转动,支撑起后轮,前轮向前转动,支撑轮配合后轮被动转动,后轮登上台阶。

② 随后机器人攀上台阶,在下台阶时,前体与后体连接舵机向上转动,支撑轮多级向上转动。机器人整体高度变小,使其机身稳定。

行走轮向前滚动,前轮下台阶,支撑轮越过台阶界限,转动支撑轮舵机,使其借助向前的反作用力,完成下台阶指令。

下台阶过程巡检机器人机身平稳灵活,不容易发生侧翻。

③ 通过摄像头的观察与反馈,遇到前方无法翻越的障碍和行人时,做到及时自主避让,按照所规划的路线绕道前进。

      ④ 如果遇到的行人没有佩戴口罩,巡检机器人将停止前进,滞留5五秒左右的时间,为其提供口罩,并通过机器人自带的语音模块进行戴口罩提醒。

⑤ 当在巡逻中,机器人发现明火时通过语音模块发出警报声音,并迅速将实时图像与警报信号反馈给检测人员。

6.2 校园巡检机器人的创新点

     ① 智能路径规划:自主定位,智能避障,规划最优路径,预防错检、漏检等现象。

     ② AI视频图像分析:拍摄人脸、车辆、仪表设备等视频图像,综合分析研判,确保场所安全。

     ③ 环境感知:高清视频全景监控,遇火灾险情及时报警,安全问题可防可控。

     ④ 终端协同:监控视频回传终端,实现决策与执行同步,并支持实时录制和回放等功能。

     ⑤ 感知警示:对危险、可疑物进行识别警示,实时传达至后台。

     ⑥ 定制设计:大负载,多接口,可加载各种设备;系统架构可扩展,满足不同行业定制化需求。

7. 存在问题及解决方法

7.1 校园中楼梯、台阶较多巡检机器人行进受阻

     巡检机器人在校园中进行日常巡逻时,经常会遇到楼梯、台阶等障碍物,普通的四轮驱动车无法进行上下楼梯等操作,工作场景受限从而降低了巡检机器人在校园中的巡检质量。

     解决办法:本巡检机器人在四轮驱动的前提,新增了一对小的支撑轮。并将前轮与后轮分成两个可单独旋转的部分。通过支撑轮的支撑过度,便可轻松实现上下楼梯的功能,工作稳定可靠。

7.2 现有摄像头画面不清晰

     因为在校园的部分地区,在一些位置较高的地方,巡检机器人无法到达,便需使用摄像头来进行勘察,距离太远可能会导致摄像头图像模糊,不能做到有效的信息收集,工作人员在操作的过程中没办法看清其记录中的数据。

巡检机器人配备有可变焦的高清摄像头,而采用变焦镜头则能够根据应用环境具体调整焦距以保证最佳的画面效果。

7.3 恶劣天气干扰巡检机器人正常工作

     在冬季,雨雪天气频繁的北方地区,例如哈尔滨,校园巡检机器人会受到道路结冰或下雪的影响。会导致巡检机器人发生打滑现象从而造成其巡检质量下降,甚至不能完成指定巡检任务等情况的发生。因此,需改善巡检机器人在大雪、尤其是道路结冰等恶劣天气下的行进能力。

     解决办法:我们在巡检机器人的四个轮子上均安装有履带。随着受力面积和摩擦力的增加,抓地力变好,相对于地面的压力减小,不容易造成车轮陷车。且结构简单,坚固耐用。而且履带板有花纹,所以在雨雪冰冻或上坡等路面上可以牢牢抓地,不会打滑。

7.4 无法自主充电

     智能巡检机器人在开展工作的时候,智能巡检机器人会一直工作,直到电量耗尽。当电量耗尽,为了继续工作就需要带回去充电,不仅浪费精力,还浪费了时间,操作人员的工作量大幅上升。

     解决办法:为此我们在校园的部分地区布置了地面充电器接口。当巡检机器人电量不足时,通过控制板控制,巡检机器人会寻找一个距离自己位置较近的充电接口,待充满电后,继续工作。也可采用更大容量的电池以增加其续航。

8. 产品的市场应用预测及效益

8.1 产品的市场应用预测

8.1.1 产品的政策扶持

     政策大力扶持,奠定⾏业健康基础:我国政府⾼度重视特种机器⼈技术研究与开发,近年来国家相关部⻔不断加⼤对机器⼈产业的扶持⼒度。《国家中长期科学和技术发展规划纲要(2006-2020 年)》明确将智能服务机器⼈技术作为重要发展⽅向之⼀,要求以服务机器 ⼈和危险作业机器⼈应⽤需求为重点,研究设计⽅法、制造⼯艺、智能控制和应⽤系统集成等共性基础技术。

8.1.2 产品的市场优势

     智能巡检机器人以智能化技术为基础,具有可编程性,随着技术发展,智能巡检机器人的功能逐步完善,使得其在应用过程中模拟人工操作,替代了传统人工巡检。这种巡检方式较为灵活,受到外界气候、环境等因素影响较小,适用于各种巡检工作。智能巡检机器人本身携带有火焰感应器等相关设备,可以在巡检过程中进行自动与手动巡检环境因素的识别和把控、火警预警与消防等。总之,其功能逐步趋于完善,比传统人工巡检具有更大优势,应用前景广阔。

8.1.3 产品需求预测

     校园服务机器人的核心技术包括导航及路径规划、交互感知、运动控制、人工智能等,具体涉及电机控制、机器人视觉、自然语言处理、大数据及物联网等领域,通过信息自动化或半自动化的输入、处理及反馈,实现机器人适应性的自主智能服务。随着5G通信、物联网、云计算、人工智能算法等领域的技术进步,服务机器人将不断融入新技术,拓展应用场景,简化使用难度,增强应用兼容性,提供更广泛的多样化的智能服务,市场前景广阔。

8.1.4 市场上巡检机器人的占比

      特种机器人(专业服务机器人)包括国防机器人、农场机器人、医疗机器人、电力机器人等。智能巡检机器人属于特种机器人范畴。近年来,世界各国主要研发的专业服务机器人重点在医疗、物流、军事、极限环境等特殊领域。考虑到特殊领域的工作环境条件往往比较恶劣或者具有危险性,对专业服务机器人具有需求刚性。因此,未来特殊工作环境的应用场景将会不断催生出专业服务机器人新品种,当前特种机器人市场规模相比工业和狭义服务机器人较小,但其作用和意义重大,未来潜力巨大,2013 年至今,全球特种机器人销售额始终保持两位数增长。根据IFR 的预测,至 2022年,全球特种机器人市场规模预计达到 49.5 亿美元。

8.2 产品效益

8.2.1 市场效益

      校园巡检机器人的发展,广义上机器人属于这一范畴,校园巡检机器人的发展是机器人智能化改造重点方向。因此,社会上对巡检机器人的需求呈刚性,叠加较高的准入门槛,导致行业整体毛利率达60%以上,盈利水平较高。

8.2.2 社会效益

      ① 实现智慧工厂,提升整体管理水平

      将先进的智能技术、检测方法和手段运用于校园巡检中,使在安全校园领域高效地开展生产工作、交流生产运行经验、共享生产运行方法,提升竞争力,也为校园安全提供一份稳定的保障。

      ② 提升经济,带动产业与技术发展

      由于智能巡检机器人属于高技术密集型产品,它的生产制造可以提高地区经济发展水平,提升产品层次,带动相关产业与技术发展,为其它行业提供技术支持和业务合作创造了机会。

      ③ 打造行业标杆,提升社会形象

      智能巡检机器人的推广应用,将成为校园信息化建设的一个亮点,有助于带动科技水平的提升,获得良好的社会形象和社会效益。

      ④ 其他应用

      随着服务机器人技术的迅速发展,其应用也逐渐扩展到各个领域。巡逻机器人是随着社会经济的发展,超级商场、物流仓库等大型人流、物流场所规模和数量不断扩大,保安自动化需求日趋迫切这一环境下智能巡检机器人将被应用到更多场景,前景广阔。

9. 作品展示

更多详情请见:【S040】“校园卫士”-智能巡检机器人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/258534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:图解手撕B-树以及B树的优化和索引

文章目录 为什么需要引入B-树&#xff1f;B树是什么&#xff1f;B树的插入分析B树和B*树B树B*树分裂原理 B树的应用 本篇总结的内容是B-树 为什么需要引入B-树&#xff1f; 回忆一下前面的搜索结构&#xff0c;有哈希&#xff0c;红黑树&#xff0c;二分…等很多的搜索结构&a…

Maven仓库上传jar和mvn命令汇总

目录 导入远程仓库 命令结构 命令解释 项目pom 输入执行 本地仓库导入 命令格式 命令解释 Maven命令汇总 mvn 参数 mvn常用命令 web项目相关命令 导入远程仓库 命令结构 mvn deploy:deploy-file -Dfilejar包完整名称 -DgroupIdpom文件中引用的groupId名 -Dartifa…

使用 Node.js 删除文件 - 完整步骤教程

引言 在 Node.js 中处理文件尤其是移除文件&#xff0c;对于维护高效应用程序至关重要。储存和秩序当道的今天&#xff0c;删除不必要或冗余的文件能力显得尤为关键。本文深入探讨你会想要使用这个强大功能的时刻和原因&#xff0c;并通过各种案例展示了这个概念&#xff0c;同…

JavaScript基础(数组+正则表达+字符串)

目录 1.数组 1.1创建数组 1.2字面量创建数组 1.3length函数 1.4遍历数组1 1.5遍历数组2语法糖 1.6增删改查 1push 2pop 3unshift("x",x) 4shift() 5数组的截取 slice() splice() 6concat 7reverse 2.内置对象 2.1data 2.2Math对象 2.3字符串 1c…

2023年12月20日历史上的今天大事件早读

1722年12月20日 康熙皇帝驾崩 1803年12月20日 法国正式将新奥尔良移交给美国 1860年12月20日 南卡罗来纳州宣布脱离美国 1917年12月20日 全俄肃反委员会成立 1928年12月20日 国民党与英国签订中英关税条约 1939年12月20日 德“施佩伯爵”号遭英舰围困自沉 1945年12月20日…

Poi实现复杂Excel导出,理解POI操作Excel思路!!!

前言 对于简单excel报表导出&#xff0c;有很多简单的工具如easypoi&#xff0c;而且现在网上已经有很多工具类整合easypoi使用起来非常方便。但是简单的弊端往往无法适配一些负责场景&#xff0c;而我们实际生产中面临的都是客户自定以的一个负责报表导出&#xff0c;这是利用…

搭建 ElasticSearch 集群环境

安装基础环境 我们用虚拟机创建出3台机器&#xff0c;查看centos版本为7.9 [roots1 ~]# cat /etc/centos-release CentOS Linux release 7.9.2009 (AltArch)下载相关命令 yum -y install vim* yum -y install net-tools yum -y install lsof yum -y install wget yum -y ins…

对GPU进行压力测试

GPU压力测试工具安装指导&#xff08;RHEL8.2&#xff09; - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/443165016 1、下载gpu-burn工具 下载地址&#xff1a;https://github.com/wilicc/gpu-burn 2、上传到系统后安装 # unzip gpu-burn-master.zip # cd gpu-burn-mas…

关于MQ,你了解多少?(干货分享之二)

导语 本文梳理笔者 MQ 知识&#xff0c;从消息中间件的基础知识讲起&#xff0c;在有了基础知识后&#xff0c;对市面上各主流的消息中间件进行详细的解析&#xff0c;包括 RabbitMQ、RocketMQ、Kafka、Pulsar&#xff0c;最后再横向对比这几款主流的消息中间件。本篇是系列文…

Maven——如何快速生成bean的get、set方法,Lombok依赖引入和使用!!!

Lombok依赖引入和使用 1、项目pom.xml文件引入如下依赖&#xff1a;2、引入之后还要在idea中安装对应lombok插件:file–>plugins–>搜索框搜索lombok安装3、重启之后&#xff0c;便可以在实体类bean中使用提供注解快速生成对应的方法了 总结 本文介绍如何快速生成实体bea…

基于YOLOv5的姿态估计

一、基于YOLOV5的姿态估计与实现 相关论文&#xff1a; YOLO-Pose: Enhancing YOLO for Multi Person Pose Estimation Using Object Keypoint Similarity Loss 相关源码 edgeai-yolov5-yolo-pose 二、数据集 The dataset needs to be prepared in YOLO format so that the…

Sanic:Python中的高性能异步Web框架详解

概要 在众多Python Web框架中&#xff0c;Sanic以其高性能和易用性脱颖而出。它是一个异步Web框架&#xff0c;允许使用Python 3.6的新异步/等待语法编写代码&#xff0c;使得创建快速的HTTP响应成为可能。本文将深入探讨Sanic框架的核心特性、基本用法、路由管理、中间件处理…

【MATLAB第83期】基于MATLAB的LSTM代理模型的SOBOL全局敏感性运用

【MATLAB第83期】基于MATLAB的LSTM代理模型的SOBOL全局敏感性运用 引言 在前面几期&#xff0c;介绍了敏感性分析法&#xff0c;本期来介绍lstm作为代理模型的sobol全局敏感性分析模型。 【MATLAB第31期】基于MATLAB的降维/全局敏感性分析/特征排序/数据处理回归问题MATLAB代…

软件测试面试题及答案(史上最全)

以下是软件测试相关的面试题及答案&#xff0c;欢迎大家参考! 1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&…

界面控件DevExpress WPF Dock组件,轻松创建类Visual Studio窗口界面!

本文主要为大家介绍DevExpress WPF控件中的Dock组件&#xff0c;它能帮助用户轻松创还能受Microsoft Visual Studio启发的Dock窗口界面。 P.S&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress …

使用Python将OSS文件免费下载到本地:第三步 提供一个从ECS中下载和删除文件的接口

大家好&#xff0c;我是水滴~~ 本文将介绍了使用的知识点、以及利用 Flask 框架提供从 ECS 中下载和删除的文件接口代码、并对该代码进行详细解析、最后给出部署方案&#xff0c;希望能对你有所帮助&#xff01; 《Python入门核心技术》专栏总目录・点这里 文章目录 1. 本文知…

【Unity】运行时创建曲线(贝塞尔的运用)

[Unity]运行时创建线&#xff08;贝塞尔的运用&#xff09; 1. 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线。 2. 原理介绍 2.1 曲线的创建 unity建立网格曲线可以参考Unity程序化网格体的实现方法。主要分为顶点&#xff0c;三角面&#xff0c…

msal auzer 强制刷新获取令牌

背景&#xff1a;msal auzer token 过期时间微软默认事60至90分钟&#xff0c;普遍取中间值&#xff0c;现渗透测试部分&#xff08;Qtester&#xff09;要求30分token 过期。且不可使用msal的安全机制。 解决方案&#xff1a;‘ 后端&#xff0c;解析token 获取发证时间 ia…

【C++入门到精通】 原子性操作库(atomic) C++11 [ C++入门 ]

阅读导航 引言一、原子性操作库简介二、原子变量1. 原子类型2. 原子类型函数3. 使用示例 三、总结温馨提示 引言 当谈及并发编程时&#xff0c;确保数据的安全性和一致性是至关重要的。在C11中引入的原子性操作库&#xff08;atomic&#xff09;为我们提供了一种有效且可靠的方…