基于红外感应的远距离智能跟随小车,自动跟随小车

2023-11-04

跟随原理

下面介绍红外感应的跟随小车的自动跟随部分。

基本原理:在小车上安装一个红外接收器(能测量红外入射角的感应器),人手持一个红外发射模块。

根据不同的入射角,调整小车前进方向。若入射角在右边,就控制小车右转,若入射角在左边,就控制小车左转。

 效果展示

 百度网盘链接:https://pan.baidu.com/s/1PGTwDxvUbdksDmyfcXAMOw?pwd=vddg

提取码:vddg

代码

以ESP32芯片(Arduino开发环境)为例。

void loop() {

if (millis() - Run_Time > 200) {
    Run_Time = millis();
    LeftSpeed = 0; RightSpeed = 0;
    PineMotorRun(0);
  }

GetIRData(&Angle, &Distance);

if (Distance > 30 && Angle > 0 && Angle < 180) {
      LeftSpeed = 50 - (Angle - 90) * 0.5;
      RightSpeed = 50 + (Angle - 90) * 0.5;
      PineMotor_Run(LeftSpeed, RightSpeed);
      Run_Time = millis();
      OutStr = "L/R speed:" + String(LeftSpeed) + "," + String(RightSpeed);
     

 }

}

 红外感应代码 "IRSensor.h"

#ifndef __IRSENSOR_H__
#define __IRSENSOR_H__

#define IRPINCOUNT 7
#define MaxIRShotCount  300
#define MaxHistoryCount 10
#define InValidAngle -360.0

struct IRSENSOR_DATA{
  uint16_t IRCount[IRPINCOUNT];//红外感应器接受的脉冲数
  uint16_t IRValidCount[IRPINCOUNT];//红外感应器接受的有效脉冲数(脉冲间隔时间满足一定的范围)
  int IRTimeHistory[IRPINCOUNT][MaxIRShotCount];//红外感应器接受到脉冲时的时刻,单位为微秒
  long FirstTime[IRPINCOUNT];//单个感应器的首次脉冲时刻,单位为微秒
  long LastTime[IRPINCOUNT];  //单个感应器的最后脉冲时刻,单位为微秒
  long IRFirstTime, IREndTime;//整组感应器的首次,最后脉冲时刻,单位为微秒

  uint8_t ValidPinCount;//接受到有效信息的红外感应器个数
  double IRZone;
  double IRDistance;  
};

//红外感应器初始化
void iniIR();
static void IRPinCallBack(uint8_t i);
void DisableIRInterrupt();
void ResetIRSensorData();
void ResetIRData();

void ResetIRSensorData();
long GetFirstIRTime_ms();
long GetFinalIRTime_ms();
double CalculateAngleMovingMean(uint8_t LastCount);

void SumIRDataLoop();
void GetIRDataFromPin();//NotConfirmTime
double GetIRAngle();
void GetIRData(double *angle, int *distance);
String GetIRSignalStatus();


uint8_t GetHighLevelPinCount(uint16_t IRCount[], uint16_t LL);
void AnalysisIRValues_OneSide(IRSENSOR_DATA* mData, uint8_t Angle[]);



void RecordIRData(double Currentdata);

void GetValidCount(IRSENSOR_DATA* mData);

void Record_DoubleArray(double DArray[], double mydata, uint8_t * index, uint8_t Length);
void Push_DoubleArray(double History[], int Length);
void Reset_Array16(uint16_t IRCount[], int Length);


#endif

 红外感应代码 “IRSensor.cpp”

#include <Arduino.h>

#include "IRSensor.h"

struct IRSENSOR_DATA mIRData;

int  LineCount, Count2 = 0;
bool IsIniIRPin = false, IsReceivedIRData = false;

char strIR[140], Head[] = {"Angle:"};

//IR, Pin从左到右,角度从大到小
uint8_t IRPin[] = {33, 32, 34, 35, 23, 21, 19}; //
uint8_t Angle_Pin[] = {165, 140, 115, 90, 65, 40, 15};

bool IsHaveIRData = false, IsInNearArea = false;

double IRAngleHistory[MaxHistoryCount];
uint8_t IRRecordIndex = MaxHistoryCount - 1;

char IRs[256];
String IRStatus, AngleStatus, IRResponseTime_String, IRTimeStatus;

long LastTime_AnalysisData;
bool IsFinishAnalysis;
long SimulatedTime;



//

static void IRPinCallBack(uint8_t i) {
  long CurrentTime = micros();

  if (!IsHaveIRData) {
    mIRData.IRFirstTime = CurrentTime;

  }

  if (IsFinishAnalysis) {
    IsFinishAnalysis = false;
  }

  mIRData.IREndTime = CurrentTime;

  if (mIRData.IRCount[i] < MaxIRShotCount) {

    if (mIRData.IRCount[i] == 0) {
      mIRData.FirstTime[i] = CurrentTime;
      mIRData.IRTimeHistory[i][mIRData.IRCount[i]] = 0;
      mIRData.LastTime[i] = CurrentTime;
    } else {
      mIRData.IRTimeHistory[i][mIRData.IRCount[i]] = CurrentTime - mIRData.LastTime[i];
    }
    mIRData.LastTime[i] = CurrentTime;

    mIRData.IRCount[i]++;
  } else {
    mIRData.IRCount[i] = 0;
  }

  IsHaveIRData = true;
}
//


///
void IRAM_ATTR IntCallbackIR0() {
  uint8_t i = 0;
  IRPinCallBack(i);
}

void IRAM_ATTR IntCallbackIR1() {
  uint8_t i = 1;
  IRPinCallBack(i);
}

void IRAM_ATTR IntCallbackIR2() {
  uint8_t i = 2;
  IRPinCallBack(i);
}

void IRAM_ATTR IntCallbackIR3() {
  uint8_t i = 3;
  IRPinCallBack(i);
}

void IRAM_ATTR IntCallbackIR4() {
  uint8_t i = 4;
  IRPinCallBack(i);
}

void IRAM_ATTR IntCallbackIR5() {
  uint8_t i = 5;
  IRPinCallBack(i);
}

void IRAM_ATTR IntCallbackIR6() {
  uint8_t i = 6;
  IRPinCallBack(i);
}
///

void SumIRDataLoop() {

  if (IsHaveIRData && !IsFinishAnalysis && (millis() - GetFirstIRTime_ms() > 30)) {
    //一个发射周期是200毫秒,一个脉冲105*2微妙,共25个脉冲,共5.26毫秒。 在30毫秒后分析数据
    LastTime_AnalysisData = millis();
    GetIRDataFromPin();
    IsFinishAnalysis = true;
  }

  if (millis() - LastTime_AnalysisData > 200) {
    ResetIRData();
  }

}


void GetIRDataFromPin() {
  String IRstr = "";
  IRStatus = "";

  //SimulateIRData();

  if ( GetHighLevelPinCount(mIRData.IRCount, MaxHistoryCount) >= 6) {
    IsInNearArea = true;
    //Serial.printf("近距离\n");
  }

  AnalysisIRValues_OneSide(&mIRData, Angle_Pin);

  char SS[256];
  sprintf(SS, "Angle:%.2f\r\n", mIRData.IRZone);
  IRstr = String(SS);

  if (IsInNearArea) {
    IRstr += "IRD:30\r\n";
    mIRData.IRDistance = 30;
  } else {
    IRstr += "IRD:500\r\n";
    mIRData.IRDistance = 500;
  }

  IRstr += IRStatus;

  //Serial.print(IRstr);

  ResetIRSensorData();
}



double CalculateAngleMovingMean(uint8_t LastCount) {
  double sum = 0, validcount = 0;
  uint8_t i;

  if (LastCount > MaxHistoryCount) LastCount = MaxHistoryCount;


  for (i = 1; i <= LastCount; i++) {
    if (0 <= IRAngleHistory[MaxHistoryCount - i] && IRAngleHistory[MaxHistoryCount - i] <= 180 ) {
      sum += IRAngleHistory[MaxHistoryCount - i];
      validcount++;
    }
  }

  if (validcount > 1) {
    return sum / validcount;
  } else {
    return -1;
  }


}

String GetIRSignalStatus() {
  return IRStatus;
}

String GetIRResponseTime() {
  return IRResponseTime_String;
}

double GetIRAngle() {
  return mIRData.IRZone;
}

void GetIRData(double *angle, int *distance) {
  *angle =  mIRData.IRZone;
  *distance =  mIRData.IRDistance;
}

void ResetIRData() {

  mIRData.IRZone = InValidAngle;
  mIRData.IRDistance = 0;
  IRStatus = "";
  IRResponseTime_String = "";
  IsReceivedIRData = false;
}

void ResetIRSensorData() {
  uint8_t i;


  for (i = 0; i < IRPINCOUNT; i++) {
    mIRData.IRCount[i] = 0;
  }

  long TempTime;
  TempTime = micros();
  for (i = 0; i < IRPINCOUNT; i++) {
    mIRData.IRTimeHistory[i][0] = 0;

    uint16_t j;
    for (j = 0; j < MaxIRShotCount; j++) {
      mIRData.IRTimeHistory[i][j] = 0;
    }

    mIRData.LastTime[i] = TempTime + 20 * 1000;
    mIRData.FirstTime[i] = TempTime + 20 * 1000;

  }
  mIRData.ValidPinCount = 0;

  IsHaveIRData = false;
  IsInNearArea = false;
}


uint8_t GetHighLevelPinCount(uint16_t IRCount[], uint16_t LL) {

  uint8_t i, Count = 0;
  for (i = 0; i < IRPINCOUNT; i++) {
    if (IRCount[i] > LL) {
      Count++;
    }
  }
  return Count;
}




void AnalysisIRValues_OneSide(IRSENSOR_DATA *mData, uint8_t Angle[]) {

  uint16_t i, j;
  boolean IsAbnormal = false;
  double AngleMean = InValidAngle, AngleSum = 0.0;  //arduino无float型数据
  int CountSum = 0, ValidCountSum = 0;
  String IRStr = "", SideStr = "";

  SideStr = "IR:";
  IRStr = SideStr;


  for (i = 0; i < IRPINCOUNT; i++) {
    IRStr += String(mData->IRCount[i]) + ",";
    CountSum += mData->IRCount[i];
  }

  IRStr += "Valid:";
  if (CountSum <= 4) {  //偶尔几个脉冲,无需理会
    for (i = 0; i < IRPINCOUNT; i++) {
      mData->IRValidCount[i] = 0;
      IRStr +=  "0,";

    }
    IRStr += "\r\n";
    IRStatus += IRStr;
    //Serial.println(IRStatus);
    mData->IRZone = InValidAngle;
    //Serial.println("No IR Signal.");
    return;
  }

  //  Serial.printf("Signal Count: %d \n", CountSum);
  boolean isCheckPulseTime = false;
  String strOut;

  if (isCheckPulseTime) {
    GetValidCount(mData);
  } else {
    for (i = 0; i < IRPINCOUNT; i++) {
      mData->IRValidCount[i] = mData->IRCount[i];
    }
  }

  ValidCountSum = 1;//相除时,不会是0
  for (i = 0; i < IRPINCOUNT; i++) {
    IRStr += String(mData->IRValidCount[i]) + ",";
    ValidCountSum += mData->IRValidCount[i];
  }
  IRStr += "\r\n";

  IRStatus += IRStr;

  //  Serial.println(IRStr);

  for (i = 0; i < IRPINCOUNT; i++) {
    if ( mData->IRCount[i] > 100) {  //脉冲太多,是干扰信号
      IsAbnormal = true;
      mData->IRZone = InValidAngle;
      break;
    }
  }

  if (CountSum / ValidCountSum >= 3) {  //少于33%的有效脉冲,极有可能是干扰信号
    IsAbnormal = true;
    mData->IRZone = InValidAngle;
  }

  if (IsAbnormal) {
    Reset_Array16(mData->IRCount, IRPINCOUNT);

    //Serial.printf("abnormal\n");
    return;
  }


  //加权平均

  //  Serial.println("");

  AngleMean = 0;    AngleSum = 0;
  mData->ValidPinCount = 0;
  ValidCountSum = 0;

  for (i = 0; i < IRPINCOUNT; i++) {
    if (mData->IRValidCount[i] < 1) {    //脉冲数量少,认为是干扰,就置0
      mData->IRValidCount[i] = 0;
    } else {
      (mData->ValidPinCount)++;
    }

    AngleSum += Angle[i]  * mData->IRValidCount[i];
    ValidCountSum += mData->IRValidCount[i];
  }

  if (ValidCountSum > 0) {
    AngleMean = AngleSum / ValidCountSum;
  } else {
    AngleMean = InValidAngle;
  }

  sprintf(IRs, " Zone: %.2f Valid Signal Count: %d \n", AngleMean, ValidCountSum);

  strOut = SideStr + String(IRs);

  AngleStatus += strOut;

  mData->IRZone = AngleMean;
  Record_DoubleArray(IRAngleHistory, AngleMean, &IRRecordIndex, MaxHistoryCount);

}

void GetValidCount(IRSENSOR_DATA *mData) {
  int CL = 500; uint8_t Error = 50;
  int IRTime;
  uint16_t i, j;


  //用于调试程序
  String IRStr = "", strOut;
  for (j = 0; j < IRPINCOUNT; j++) {
    IRStr = String(j) + ":";
    for (i = 0; i < mData->IRCount[j]; i++) {
      IRStr += String(mData->IRTimeHistory[j][i]) + " ";
    }
    //    Serial.println(IRStr);
  }



  for (j = 0; j < IRPINCOUNT; j++) {
    mData->IRValidCount[j] = 0;
    for (i = 0; i < MaxIRShotCount; i++) {

      IRTime = (mData->IRTimeHistory[j][i] + CL / 2) % CL + CL / 2;
      if (CL - Error < mData->IRTimeHistory[j][i] && CL - Error < IRTime  &&  IRTime < CL + Error) {
        mData->IRValidCount[i]++;
      }
    }

  }

}



long GetFirstIRTime_ms() {
  return mIRData.IRFirstTime / 1000;
}

long GetFirstIRTime_us() {
  return mIRData.IRFirstTime;
}

long GetFinalIRTime_ms() {
  return mIRData.IREndTime / 1000;
}

//


//
void iniIR() {
  uint8_t i;
  uint8_t Model = FALLING; //CHANGE

  if (!IsIniIRPin) {

    for (i = 0; i < IRPINCOUNT; i++) {
      pinMode(IRPin[i], INPUT_PULLUP);
    }

    i = 0;
    attachInterrupt(digitalPinToInterrupt(IRPin[i]), IntCallbackIR0, Model);//FALLING

    i++;
    attachInterrupt(digitalPinToInterrupt(IRPin[i]), IntCallbackIR1, Model);

    i++;
    attachInterrupt(digitalPinToInterrupt(IRPin[i]), IntCallbackIR2, Model);

    i++;
    attachInterrupt(digitalPinToInterrupt(IRPin[i]), IntCallbackIR3, Model);

    i++;
    attachInterrupt(digitalPinToInterrupt(IRPin[i]), IntCallbackIR4, Model);

    i++;
    attachInterrupt(digitalPinToInterrupt(IRPin[i]), IntCallbackIR5, Model);

    i++;
    attachInterrupt(digitalPinToInterrupt(IRPin[i]), IntCallbackIR6, Model);


    ResetIRSensorData();
    IRStatus = "";
    AngleStatus = "";
    IRResponseTime_String = "";
    IRTimeStatus = "";
    IsIniIRPin = true;
  }

}

void DisableIRInterrupt() {
  uint8_t i;
  for (i = 0; i < IRPINCOUNT; i++) {
    detachInterrupt(digitalPinToInterrupt(IRPin[i]));

  }
  IsIniIRPin = false;
}


//
void Reset_Array16(uint16_t IRCount[], int Length) {
  int i;
  for (i = 0; i < Length; i++) {
    IRCount[i] = 0;
  }

}


void Record_DoubleArray(double DArray[], double mydata, uint8_t * index, uint8_t Length) {

  DArray[*index] = mydata;
  (*index)++;
  if ((*index) >= Length) {
    Push_DoubleArray(DArray, Length);
    *index = Length - 1;
  }

}


void Push_DoubleArray(double History[], int Length) {
  int i;
  for (i = 0; i < Length - 1; i++) {
    History[i] = History[i + 1];
  }

}

//

 采购清单

序号

物品

数量

备注

1

小车底座(含1块亚克力板,2个马达,2个车轮,1个万向轮,1个电池盒)

1

2

电路板

1

3

ESP32芯片

1

4

Mico-USB线

1

5

红外感应器

1

https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111debsOkWHG&ft=t&id=674576373037

6

马达驱动板(L298N)

1

7

充电板

1

8

18650锂电池

1

9

红外发射器

1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于红外感应的远距离智能跟随小车,自动跟随小车 的相关文章

  • Arduino:字符串到整数得到奇怪的值

    我想转换一个String to an int 我所能找到的就是你必须将 String 转换为 char 数组 然后将该数组转换为int 但我的代码产生奇怪的值 我无法弄清楚问题是什么 void ledDimm String command
  • Arduino Python3 脚本

    我正在尝试使用 Python3 脚本来控制 Arduino Mega 这是一个简单的脚本 用于从键盘获取一行并通过 Arduino 回显它 我从一个可用的 Python 2 脚本开始http petrimaki wordpress com
  • printf 的包装

    我在Arduino下编码 我想开发串行打印格式化功能 所以我尝试使用sprintf未知大小的缓冲区 基本上 我们可以避免谈论 Arduino 及其串行输出 并考虑将文本写入缓冲区 然后使用printf 我试过这个 include
  • 蓝牙 HC-05 发送错误 1F 仅适用于 INQ 命令

    我的新蓝牙 HC 05 模块有问题 在 AT 模式下 它可以与我需要的所有命令完美配合 除了 INQ 我已经尝试事先发送一大堆其他命令 AT INIT OK AT ORGL OK AT ROLE 1 OK AT CLASS 0 OK 他们都
  • DCF77 解码器与噪声信号

    我几乎完成了我的开源 DCF77 解码器项目 当我注意到标准 Arduino DCF77 库在噪声信号上表现非常差时 这一切就开始了 特别是当天线靠近计算机或洗衣机正在运行时 我永远无法从解码器中获取时间 我的第一个方法是向输入信号添加 数
  • 如何通过蓝牙在Raspberry Pi 4和Arduino Nano BLE之间进行读写?

    我能够通过 Rpi4 的 bluepy 和 Arduino Nano BLE 的 ArduinoBLE h 连接 Raspberry Pi 4 和 Arduino Nano BLE 不幸的是 当我尝试从 Rpi4 写入 Arduino Na
  • 同时使用 GPRS 和 GSM

    我正在尝试使用 GSM GPRS 调制解调器的 GPRS 功能将数据发送到远程服务器 但我无法这样做 我在 Arduino 论坛上发布了一个问题 但没有得到任何回复 这是问题的链接 https robotics stackexchange
  • ESP32 Arduino-ide如何获取唯一id

    我试图自动为每个 esp32 设置一个唯一的 id 在我使用提供该方法的 ESP IDF 框架对设备进行编程之前esp efuse mac get default 这将返回一个 8 字节值 该值在我手上的所有设备上都是唯一的 在arduin
  • 在Python中快速绘制数据

    我正在尝试使用 arduino 绘制来自 mpu6050 imu 的数据 MPU6050 发送数据的速度比绘图快 Arduino 代码从串口提供 6 个数据 即偏航 俯仰 滚动 轴 ay 和 az 我需要快速情节的建议 Python代码 i
  • 是否有通用 I2C 命令来查看设备是否仍然存在于总线上?

    是否有通用的 I2C 命令来查看设备在初始化一次后是否仍然存在于总线上 例如 OLED 显示器 我问这个的原因是为了避免主程序由于库代码中存在无限循环而冻结 当设备断开连接时 例如 Wire 库 在 MCU 启动时 我想检查设备是否可用 并
  • HM10 ble改变特征值AT命令Arduino

    谁能帮我用AT命令写入特征值 或者如何使用Hm10模块将数据从arduino发送到另一个ble设备 HM10发送AT START后 会通告数据包 并且可以检测服务和特征 但特征值是默认的0x00 如何更改 多次检查数据表 但找不到能够执行相
  • Arduino - 高效地迭代 C 数组

    我有以下数组 PROGMEM prog uint16 t show hide info 4216 8900 4380 580 500 600 500 580 1620 580 500 600 500 580 500 600 480 600
  • 使用串口通过 Arduino 将多个值发送到 Raspberry

    我有一个关于 Arduino 和 Raspberry Pi 之间串行通信的问题 事实上 我想使用 Arduino 将 2 个变量发送到 Raspberry Pi 并以不同的方式使用它们 这是我的 Arduino 草图 int one 1 i
  • 为什么使用 libnfc 和 PN532 SHIELD 时“找不到 NFC 设备”

    我在 ArchLinux 上安装了 libnfc 并通过我的 Adafruit PN532 arduino SHIELD 使用它 nfc list返回消息 未找到 NFC 设备 我在 etc nfc devices d pn532 conf
  • 编译器:如果条件始终为真/假怎么办

    我想到了条件和编译器 我正在为 Arduino 编写一个应用程序 因此我需要该应用程序尽可能快 在我的代码中我有这个 define DEBUG false if DEBUG String pinName pinName Pin pinNam
  • 如何使用基于HM-10蓝牙模块的BLE Shield?

    我是 arduino 项目的新手 我想请你帮忙 我从 http imall iteadstudio com development platform arduino shields im130704001 html http imall i
  • 尽管给出了供应商 ID,Web 串行 api 显示“未找到兼容设备”

    Windows 8 1 Chrome v91 0 4472 164 我已根据设备管理器验证了供应商和产品 ID 该设备是使用 Ch340 驱动程序的 Arduino UNO 它在设备管理器中的端口 COM 和 LPT 下列为 USB SER
  • 如何将 Android 应用程序正确连接到支持蓝牙的 Arduino 微控制器上的 RFCOMM 套接字?

    我正在与我大学的一些学生合作开发一个简单的蓝牙 Android 应用程序 该应用程序将用于与连接有蓝牙模块的 Arduino 微控制器进行串行通信 RFCOMM 据我所知 我正在使用正确的蓝牙地址和 UUIDRFCOMM SPP 00001
  • 是否值得为 EEPROM 实现小型文件系统

    我买了一个I2C EEPROM 我想存储传感器和电压数据 我假设该值可以大于一个字节 并且可以有很多数据 在这种情况下是否值得实现具有小文件分配表的文件系统 例如 这会让我更容易查看 EEPROM 我发现 EEPROM 上出现 FAT 有两
  • 无法访问超过 255 个的 Modbus 寄存器 SimpleModbus

    我是法国学生 我已经使用 SimpleModbus 1 周了 它工作得很好 直到我尝试实现一个具有大量寄存器 1000needed 使用从站 1 无法访问超过 255 个的寄存器 无论我做什么 一旦寄存器读数超过 255 我就会收到超时错误

随机推荐

  • 5.自动装配:autowire=“byName“ or “byType“ + 使用注解【@Autowired 、@Qualifier、 @Resource】

    文章目录 自动装配说明 本博客环境搭建 自动装配 autowire byName 按名称自动装配 autowire byType 按类型自动装配 使用注解 1 Autowired 按类型自动转配的 不支持id匹配 2 Qualifier 不
  • hypertable管理当前rangserver和历史rangserver

    purge old log files void OperationRecoveryBlocker execute HT INFOF Entering RecoveryBlocker lld threadid d Lld header id
  • Docker安装

    镜像 Docker 镜像 Image 就是一个只读的模板 镜像可以用来创建 Docker 容器 一个镜像可以创建很多容器 它也相当于是一个root文件系统 比如官方镜像 centos 7 就包含了完整的一套 centos 7 最小系统的 r
  • ns2编程小技巧(转)

    1 tcl脚本传入一个int变量给c 代码在command解析里 int nodenum atoi argv 2 printf d nodenum 2 在nam中输出结果 Tcl instance evalf ns trace annota
  • Ubuntu下配置VScode及LeetCode,开始撸代码

    Ubuntu20 04下配置VScode及LeetCode 开始撸代码 一 配置VScode环境 1 软件下载 2 软件安装及启动 3 C 基础插件的安装 4 配置软件内部Debug 5 配置内部Debug工具时的异常 正常请跳过此步 6
  • JS获取本地图片和网络图片的宽高尺寸和存储大小

    最新更新时间 2020年07月08日09 13 28 猛戳 查看我的博客地图 总有你意想不到的惊喜 本文内容 图片作为一种记录信息的载体 比文本更加生动 比视频更加精简 在日常生活中的用处很大 作为前端开发人员 操作图片的场景非常多 本文记
  • 跨域产生原因和跨域解决方案

    一 为什么会出现跨域问题 出于浏览器的同源策略限制 同源策略是一种约定 它是浏览器最核心也就是最基本的安全功能 如果缺少了同源策略 浏览器的正常功能会受到影响 可以说WEB是构建在同源策略基础之上的 浏览器只是针对同源策略的一种实现 同源策
  • 有限元方法的核心思想是什么?

    有限元方法的核心思想是什么 有限元方法似乎是在不断地简化着什么 请问有限元方法的核心思想是什么 在哪些层面对方程做了简化 每一次简化的依据和思路是什么 2 条评论 按投票排序 按时间排序 31 个回答 菲兹 睡眠厌倦患者 138 人赞同 有
  • vue3+ts+setup获取全局变量getCurrentInstance

    前言 vue3的 setup中是获取不到this的 为此官方提供了特殊的方法 让我们可以使用this 达到我们获取全局变量的目的 但是在使用typescript的时候 就会有一些新的问题产生 这里来做一个整理 vue3官方提供的方法 1 引
  • ChatGPT、New Bing、文心一言、通义千问等 AI 工具到底哪个更AI? - 第二期

    文章目录 前言 选手介绍 ChatGPT New Bing 文心一言 钉钉的文档AI 通义千问 Stable Diffusion 文心一格 前言 本次是上次文章的后续 经历了这么久的时间 我也是在几个月前拿到了通义千问的测试资格 本次参加的
  • 密码爆破漏洞详解——黑客必修入门操作( 建议收藏 )

    隔壁老张 狗剩啊 隔壁xx村的王姐家的女娃好漂亮 我想盗她qq啊 你帮我个忙呗 狗剩 我不会呀 村里大妈 那个狗剩啊 连盗个qq号都不会 他妈还好意思说他是学网络安全当黑客的 密码爆破介绍 密码爆破又叫 暴力猜解 简单来说就是将密码逐个尝试
  • 第四章:进击,拿到Web最高权限

    1 根据前关已经得到了cookie 现在需要修改cookie达到登录系统的目的 2 打开网站 以谷歌浏览器为例 F12打开控制台 找到Application 对图中3 4的值进行修改 修改的内容为你获取到的cookie的内容 3 4分别对应
  • Unity XCode 拨号和一键加群

    拨号 void CallPhone const char iphone NSString nsIphone NSString stringWithFormat tel s iphone NSLog nsIphone NSURL url NS
  • centos如何查看linux内核,版本号

    root localhost uname a Linux localhost localdomain 3 10 0 957 el7 x86 64 1 SMP Thu Nov 8 23 39 32 UTC 2018 x86 64 x86 64
  • CSDN博客的RSS订阅---使用foxmail订阅

    CSDN博客有RSS订阅 使用foxmail订阅 好处是可以第一时间邮件通知 订阅自己的博客可以作为备份 foxmail订阅方法 CSDN博客有RSS订阅 使用foxmail订阅 好处是可以第一时间邮件通知 订阅自己的博客 可以作为备份 f
  • Python爬虫教程:包图网免费付费素材爬取【附源码】

    包图网大家都知道吧 集齐海量设计素材 十分好用 可惜太贵了 今天就带大家使用Python 爬虫爬取这些素材并且保存到本地 抓取一个网站的内容 我们需要从以下几方面入手 1 如何抓取网站的下一页链接 2 目标资源是静态还是动态 视频 图片等
  • LeetCode - 回文类问题总结

    子串与子序列 1 字符子串 指的是字符串中连续的n个字符 如abcdefg中 ab cde fg等都属于它的字串 2 字符子序列 指的是字符串中不一定连续但先后顺序一致的n个字符 即可以去掉字符串中的部分字符 但不可改变其前后顺序 如abc
  • moudo网络库剖析

    muduo简介 muduo是陈硕大神在Linux平台下基于C C 开发的高性能网络库 在此基础上可以很方便的扩展 进行二次开发编写如http服务器 muduo网络库的核心框架 one thread per thread Reactor模式
  • Font Awesome 的使用

    之前一直使用的是 iconfont 阿里巴巴出品的一个字体图标库 但是最近 iconfont 不再支持 CDN 引入 只能本地下载 这样一来修改图标就非常的麻烦 于是 就找了一个类似的图标库 现在使用的比较多的一个国外字体图标库 使用方式和
  • 基于红外感应的远距离智能跟随小车,自动跟随小车

    跟随原理 下面介绍红外感应的跟随小车的自动跟随部分 基本原理 在小车上安装一个红外接收器 能测量红外入射角的感应器 人手持一个红外发射模块 根据不同的入射角 调整小车前进方向 若入射角在右边 就控制小车右转 若入射角在左边 就控制小车左转