91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

零知開源——ESP8266結(jié)合ICM20948實(shí)現(xiàn)高精度姿態(tài)解算

PCB56242069 ? 來源:PCB56242069 ? 作者:PCB56242069 ? 2025-03-07 14:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

零知實(shí)驗(yàn)室發(fā)布新版ICM20948模塊,可以非常方便的應(yīng)用在零知各個(gè)系列開發(fā)板或其他類似MCU,它可以作為已經(jīng)停產(chǎn)的MPU9250的替代品,下面演示它在零知ESP8266上的使用。

一、ICM20948深度解析:九軸傳感器的核心技術(shù)

1.1 什么是IMU?

IMU(Inertial Measurement Unit)即慣性測(cè)量單元,是融合加速度計(jì)、陀螺儀和磁力計(jì)的核心傳感器。ICM20948作為新一代九軸IMU,具備以下技術(shù)特性:

參數(shù) 規(guī)格 技術(shù)優(yōu)勢(shì)
加速度測(cè)量范圍 ±2g/±4g/±8g/±16g 16位ADC,0.98mg/LSB@±16g
陀螺儀量程 ±250/±500/±1000/±2000 dps 0.0038°/s/LSB@±250dps
磁力計(jì)量程 ±4900μT 16位分辨率,0.15μT/LSB
數(shù)據(jù)輸出速率 最高1125Hz 支持SPI/I2C接口
工作電壓 1.71V-3.6V 超低功耗模式<5μA

1.2 硬件架構(gòu)解析

芯片內(nèi)部采用三層堆疊結(jié)構(gòu):

wKgZPGfKjYyASdcTAAElvoPR1Zw19.jpegwKgZO2fKh2WANM0GAAEXnILISKw454.png

MEMS傳感層:包含三軸加速度計(jì)和陀螺儀

ASIC處理層:集成數(shù)字運(yùn)動(dòng)處理器(DMP)

磁力計(jì)層:AK09916磁力計(jì)通過I2C從接口連接

1.3 九軸數(shù)據(jù)融合原理

姿態(tài)解算通過傳感器融合算法實(shí)現(xiàn):

姿態(tài)矩陣=加速度計(jì)校準(zhǔn)?陀螺儀積分?磁力計(jì)補(bǔ)償

典型算法對(duì)比:

算法 計(jì)算復(fù)雜度 精度 適用場(chǎng)景
互補(bǔ)濾波 一般 低速運(yùn)動(dòng)
卡爾曼濾波 動(dòng)態(tài)環(huán)境
Mahony 中等 較高 嵌入式系統(tǒng)

二、硬件系統(tǒng)搭建

2.1 物料清單

組件 型號(hào)
主控板 零知ESP8266
九軸傳感器 ICM20948
連接線 杜邦線
電源 USB適配器

2.2 電路連接詳解

零知ESP8266和ICM20948九軸加速度傳感器的接線圖:

零知ESP8266 ICM20948
3.3V VCC
GND GND
SCL SCL
SDA SDA

wKgZPGfKh7mAYtalAAQhqhel-rk212.pngESP8266和ICM20948接線圖

三、軟件系統(tǒng)開發(fā)

3.1 校準(zhǔn)驗(yàn)證代碼

??// 在setup()中添加的校準(zhǔn)驗(yàn)證
if(SerialDebug) {
  Serial.println("Post-Calibration Accel Bias (mg):");
  Serial.print(1000*myIMU.accelBias[0]); 
  Serial.print(" ");
  Serial.print(1000*myIMU.accelBias[1]);
  Serial.print(" ");
  Serial.println(1000*myIMU.accelBias[2]);
}

將加速度偏置轉(zhuǎn)換為mg單位(1g=1000mg)

X/Y軸偏置應(yīng)<50mg,Z軸接近0(理想值)

確保校準(zhǔn)過程有效,避免硬件安裝誤差

3.2 動(dòng)態(tài)零位補(bǔ)償

?static int calibration_cnt = 0;
if(calibration_cnt < 1000 && abs(myIMU.gx)

前1000次采樣持續(xù)修正加速度偏置

0.001為學(xué)習(xí)率系數(shù),控制校準(zhǔn)速度

實(shí)現(xiàn)動(dòng)態(tài)自適應(yīng),消除溫度漂移影響

3.3傳感器數(shù)據(jù)預(yù)處理

1.加速度計(jì)處理

myIMU.ax = (float)myIMU.accelCount[0] * myIMU.aRes - myIMU.accelBias[0];
myIMU.ay = (float)myIMU.accelCount[1] * myIMU.aRes - myIMU.accelBias[1];
myIMU.az = (float)myIMU.accelCount[2] * myIMU.aRes - myIMU.accelBias[2];

數(shù)據(jù)處理流程

accelCount:原始ADC值

aRes:分辨率計(jì)算(例如±16g量程時(shí)為2048 LSB/g)

減去校準(zhǔn)偏置消除零位誤差

關(guān)鍵參數(shù)

量程設(shè)置:建議初始化時(shí)配置為±8g

分辨率公式:aRes = 16.0 / 32768.0 (16位ADC)

2.陀螺儀處理

?myIMU.gx = (float)myIMU.gyroCount[0] * myIMU.gRes - myIMU.gyroBias[0];
myIMU.gy = (float)myIMU.gyroCount[1] * myIMU.gRes - myIMU.gyroBias[1]; 
myIMU.gz = (float)myIMU.gyroCount[2] * myIMU.gRes - myIMU.gyroBias[2];

漂移控制

典型偏置值應(yīng)<1°/s

溫度每升高1℃,零偏變化約0.01°/s

改進(jìn)建議:添加溫度補(bǔ)償函數(shù)

3.磁力計(jì)數(shù)據(jù)融合

float mx_raw = (float)myIMU.magCount[1] * myIMU.mRes; // X/Y交換
float my_raw = (float)myIMU.magCount[0] * myIMU.mRes;
float mz_raw = -(float)myIMU.magCount[2] * myIMU.mRes; // Z反轉(zhuǎn)

myIMU.mx = (mx_raw - myIMU.magBias[1]) * myIMU.magScale[1];
myIMU.my = (my_raw - myIMU.magBias[0]) * myIMU.magScale[0];
myIMU.mz = (mz_raw - myIMU.magBias[2]) * myIMU.magScale[2];

magBias:硬鐵干擾補(bǔ)償

magScale:軟鐵畸變校正

注意:校準(zhǔn)數(shù)據(jù)需對(duì)應(yīng)新坐標(biāo)系

3.4姿態(tài)解算核心算法

1.Mahony濾波器調(diào)用

MahonyQuaternionUpdate(
  myIMU.ay,  // 加速度Y→X
  myIMU.ax,   // 加速度X→Y 
  -myIMU.az,  // 加速度Z反轉(zhuǎn)
  myIMU.gy * DEG_TO_RAD, // 陀螺Y→X
  myIMU.gx * DEG_TO_RAD, // 陀螺X→Y
  -myIMU.gz * DEG_TO_RAD,// 陀螺Z反轉(zhuǎn)
  myIMU.mx, 
  myIMU.my,
  myIMU.mz,
  myIMU.deltat
);

2.歐拉角轉(zhuǎn)換

?      myIMU.yaw   = atan2(2.0f * (*(getQ()+1) * *(getQ()+2) + *getQ()
                    * *(getQ()+3)), *getQ() * *getQ() + *(getQ()+1)
                    * *(getQ()+1) - *(getQ()+2) * *(getQ()+2) - *(getQ()+3)
                    * *(getQ()+3));
      myIMU.pitch = -asin(2.0f * (*(getQ()+1) * *(getQ()+3) - *getQ()
                    * *(getQ()+2)));
      myIMU.roll  = atan2(2.0f * (*getQ() * *(getQ()+1) + *(getQ()+2)
                    * *(getQ()+3)), *getQ() * *getQ() - *(getQ()+1)
                    * *(getQ()+1) - *(getQ()+2) * *(getQ()+2) + *(getQ()+3)
                    * *(getQ()+3));
      myIMU.pitch *= RAD_TO_DEG;
      myIMU.yaw   *= RAD_TO_DEG;

      // Declination of SparkFun Electronics (40°05'26.6"N 105°11'05.9"W) is
      // 	8° 30' E  ± 0° 21' (or 8.5°) on 2016-07-19
      // - http://www.ngdc.noaa.gov/geomag-web/#declination
      myIMU.yaw  -= 8.5;
      myIMU.roll *= RAD_TO_DEG;

3.5數(shù)據(jù)輸出

串口協(xié)議設(shè)計(jì)

//打印格式與processing端格式一致
  Serial.print("Or: ");
  Serial.print(myIMU.yaw, 2);
  Serial.print(" ");
  
  Serial.print(myIMU.pitch, 2);
  Serial.print(" ");

  Serial.print(myIMU.roll, 2);
  Serial.println(" ");

3.6Processing 3D可視化驗(yàn)證

將代碼庫(kù)文件安裝包解壓到C:UsersAdministratorDocumentsProcessinglibraries,然后在Processing中選擇開發(fā)板對(duì)應(yīng)的串口號(hào),就可以看到我們的3D模型根據(jù)九軸的姿態(tài)進(jìn)行變化啦:

import processing.serial.*;

// 傳感器數(shù)據(jù)
float roll, pitch, yaw;
PVector accelerometer = new PVector();
PVector gyroscope = new PVector();
PVector magneticField = new PVector();

// 3D模型
PShape model;
PImage bgImage;

// 串口配置
Serial port;
String[] serialPorts;
int selectedPort = 0;
boolean printSerial = false;

void setup() {
  size(1024, 800, P3D);
  frameRate(60);
  
  // 加載資源
  bgImage = loadImage("background.png");
  model = loadShape("biplane.obj"); // 確保使用標(biāo)準(zhǔn)OBJ格式
  model.scale(30);
  
  // 初始化串口
  serialPorts = Serial.list();
  if(serialPorts.length > 0) connectSerial(serialPorts[0]);
}

void draw() {
  background(bgImage);
  
  // 3D場(chǎng)景設(shè)置
  pushMatrix();
  translate(width/2, height/2, 0);
  lights();
  
  // 應(yīng)用旋轉(zhuǎn)
  rotateX(radians(pitch));
  rotateY(radians(yaw));
  rotateZ(radians(roll));
  
  // 繪制模型
  shape(model);
  popMatrix();
  
  // 顯示數(shù)據(jù)
  displaySensorData();
}

void serialEvent(Serial p) {
  try {
    String rawData = p.readStringUntil('n').trim();
    if(printSerial) println(rawData);
    
    String[] parts = split(rawData, ' ');
    if(parts.length >= 4) {
      switch(parts[0]) {
        case "Or:": // 歐拉角格式:Or: yaw pitch roll
          yaw = float(parts[1]);
          pitch = float(parts[2]);
          roll = float(parts[3]);
          break;
        case "Accel:":
          accelerometer.set(float(parts[1]), float(parts[2]), float(parts[3]));
          break;
        case "Gyro:":
          gyroscope.set(float(parts[1]), float(parts[2]), float(parts[3]));
          break;
        case "Mag:":
          magneticField.set(float(parts[1]), float(parts[2]), float(parts[3]));
          break;
      }
    }
  } catch(Exception e) {
    println("Serial Error: " + e.getMessage());
  }
}

void displaySensorData() {
  fill(0, 255, 0);
  textSize(16);
  textAlign(LEFT, TOP);
  String data = "Accelerometer(g): " 
    + nfp(accelerometer.x,1,2) + ", " 
    + nfp(accelerometer.y,1,2) + ", " 
    + nfp(accelerometer.z,1,2) + "n"
    + "Gyroscope(deg/s): " 
    + nfp(gyroscope.x,1,2) + ", "
    + nfp(gyroscope.y,1,2) + ", " 
    + nfp(gyroscope.z,1,2) + "n"
    + "Orientation: n"
    + "Yaw: " + nfp(yaw,1,1) + "°n"
    + "Pitch: " + nfp(pitch,1,1) + "°n"
    + "Roll: " + nfp(roll,1,1) + "°";
  text(data, 20, 20);
}

void connectSerial(String portName) {
  if(port != null) port.stop();
  try {
    port = new Serial(this, portName, 115200);
    port.bufferUntil('n');
    println("Connected to: " + portName);
  } catch(Exception e) {
    println("Connection failed: " + e.getMessage());
  }
}

void keyPressed() {
  // 切換串口
  if(key == ' ') {
    selectedPort = (selectedPort + 1) % serialPorts.length;
    connectSerial(serialPorts[selectedPort]);
  }
  // 切換調(diào)試輸出
  if(key == 'P' || key == 'p') printSerial = !printSerial;
  // 重置視角
  if(key == 'R' || key == 'r') {
    yaw = pitch = roll = 0;
  }
}

四、實(shí)現(xiàn)結(jié)果分析

觀察串口打印輸出的DMP姿態(tài)解算數(shù)據(jù)如下:

wKgZPGfKjEeAbnDtAAEXLhFsW3k087.png

Processing 3D可視化驗(yàn)證:https://www.bilibili.com/video/BV1n3RPYWE8E/?share_source=copy_web&vd_source=75d3b293c1933aa8dc6757ac429e12da

?

五、項(xiàng)目資源匯總

5.1 參考資料

ICM20948數(shù)據(jù)手冊(cè)

ESP8266技術(shù)參考

5.2 源碼獲取

https://github.com/Leeri1y/ICM20948-ESP8266

參考Github倉(cāng)庫(kù)

??

64位Windows系統(tǒng)的Processing安裝包:

通過網(wǎng)盤分享的文件:processing-4.3.3.7z
鏈接: https://pan.baidu.com/s/12B4F33M1caRncVjSJiFPTg?pwd=9h5i 提取碼: 9h5i

5.3 擴(kuò)展學(xué)習(xí)

Mahony濾波器數(shù)學(xué)推導(dǎo)

歡迎各位道友相互討論,一直在學(xué)習(xí)的路上!

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Processing
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    9137
  • IMU
    IMU
    +關(guān)注

    關(guān)注

    6

    文章

    363

    瀏覽量

    46715
  • ESP8266
    +關(guān)注

    關(guān)注

    51

    文章

    965

    瀏覽量

    47391
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    開源——ESP8266+MPU6050 實(shí)現(xiàn)運(yùn)動(dòng)姿態(tài)檢測(cè)

    ESP8266的I2C通信 ? ? ? ?在運(yùn)動(dòng)姿態(tài)檢測(cè)、機(jī)器人平衡控制、VR頭戴設(shè)備等應(yīng)用中,MPU6050(三軸加速度計(jì)+三軸陀螺儀)是一個(gè)常見的
    的頭像 發(fā)表于 02-20 17:54 ?1975次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>開源</b>——<b class='flag-5'>ESP8266</b>+MPU6050 <b class='flag-5'>實(shí)現(xiàn)</b>運(yùn)動(dòng)<b class='flag-5'>姿態(tài)</b>檢測(cè)

    開源——ESP8266+MPU6050 實(shí)現(xiàn)運(yùn)動(dòng)姿態(tài)檢測(cè)

    ,減少漂移,提高yaw角的計(jì)算精度。 一、硬件連接 MPU6050模塊采用I2C通信連接到ESP8266開發(fā)板 1.所需材料:
    發(fā)表于 02-20 17:44

    開源——ESP8266結(jié)合ICM20948實(shí)現(xiàn)高精度姿態(tài)

    實(shí)驗(yàn)室發(fā)布新版ICM20948模塊,可以非常方便的應(yīng)用在各個(gè)系列開發(fā)板或其他類似MCU,它可以作為已經(jīng)停產(chǎn)的MPU9250的替代品,
    發(fā)表于 03-07 15:46

    《電子發(fā)燒友電子設(shè)計(jì)周報(bào)》聚焦硬科技領(lǐng)域核心價(jià)值 第2期:2025.03.3--2025.03.7

    可以跨樓層的智能配送機(jī)器人 2、ESP8266結(jié)合ICM20948實(shí)現(xiàn)高精度姿態(tài)
    發(fā)表于 03-07 18:03

    經(jīng)驗(yàn)——STM32F4驅(qū)動(dòng)ICM20948 九軸運(yùn)動(dòng)傳感器 + VOFA上位機(jī)可視化驗(yàn)證與抗漂移優(yōu)化

    六、資源下載1.優(yōu)化后完整工程代碼 通過百度網(wǎng)盤分享工程文件,鏈接(提取碼: m9dw)。 增強(qiáng)板ICM20948姿態(tài)角校準(zhǔn)工程源文件: https://pan.baidu.c
    發(fā)表于 06-06 10:03

    開源——STM32F103RBT6驅(qū)動(dòng) ICM20948 九軸傳感器及 vofa + 上位機(jī)可視化教程

    STM32F1本教程使用標(biāo)準(zhǔn)板(STM32F103RBT6)通過I2C驅(qū)動(dòng)ICM20948九軸傳感器,實(shí)現(xiàn)姿態(tài)
    發(fā)表于 06-09 14:53

    使用esp8266實(shí)現(xiàn)STM32聯(lián)網(wǎng)(最簡(jiǎn)單USART方法)

    到電腦上的java程序 這一篇 esp8266與STM32連接,電腦通過STM32配置esp8266實(shí)現(xiàn)聯(lián)網(wǎng)發(fā)送數(shù)據(jù)具體流程如下圖 2= esp8266怎么和STM32連接(引腳連
    發(fā)表于 11-22 11:51 ?1.3w次閱讀

    Esp8266單機(jī)開源分享

    電子發(fā)燒友網(wǎng)站提供《Esp8266單機(jī)開源分享.zip》資料免費(fèi)下載
    發(fā)表于 07-04 14:55 ?3次下載
    <b class='flag-5'>Esp8266</b>單機(jī)<b class='flag-5'>開源</b>分享

    ESP8266迷你系統(tǒng)開源分享

    電子發(fā)燒友網(wǎng)站提供《ESP8266迷你系統(tǒng)開源分享.zip》資料免費(fèi)下載
    發(fā)表于 08-08 10:07 ?7次下載
    <b class='flag-5'>ESP8266</b>迷你系統(tǒng)<b class='flag-5'>開源</b>分享

    開發(fā)板ESP8266開源分享

    電子發(fā)燒友網(wǎng)站提供《開發(fā)板ESP8266開源分享.zip》資料免費(fèi)下載
    發(fā)表于 08-10 14:49 ?17次下載
    開發(fā)板<b class='flag-5'>ESP8266</b><b class='flag-5'>開源</b>分享

    BIM時(shí)鐘ESP8266開源項(xiàng)目

    電子發(fā)燒友網(wǎng)站提供《BIM時(shí)鐘ESP8266開源項(xiàng)目.zip》資料免費(fèi)下載
    發(fā)表于 08-16 11:18 ?2次下載
    BIM時(shí)鐘<b class='flag-5'>ESP8266</b><b class='flag-5'>開源</b>項(xiàng)目

    ESP8266物聯(lián)網(wǎng)開源分享

    電子發(fā)燒友網(wǎng)站提供《ESP8266物聯(lián)網(wǎng)開源分享.zip》資料免費(fèi)下載
    發(fā)表于 12-06 14:45 ?4次下載
    <b class='flag-5'>ESP8266</b>物聯(lián)網(wǎng)<b class='flag-5'>開源</b>分享

    ESP8266編程盾開源

    電子發(fā)燒友網(wǎng)站提供《ESP8266編程盾開源.zip》資料免費(fèi)下載
    發(fā)表于 02-02 14:25 ?1次下載
    <b class='flag-5'>ESP8266</b>編程盾<b class='flag-5'>開源</b>

    經(jīng)驗(yàn)——STM32F4驅(qū)動(dòng)ICM20948 九軸運(yùn)動(dòng)傳感器 + VOFA上位機(jī)可視化驗(yàn)證與抗漂移優(yōu)化

    溫度補(bǔ)償?shù)?b class='flag-5'>零偏補(bǔ)償系統(tǒng)、數(shù)據(jù)校驗(yàn)容錯(cuò)機(jī)制及動(dòng)態(tài)參數(shù)姿態(tài)算算法。經(jīng)VOFA+驗(yàn)證,靜態(tài)漂移降低94.7%,響應(yīng)延遲縮短62.5%,搖擺幅度減少79.3%,達(dá)到工業(yè)級(jí)應(yīng)用標(biāo)準(zhǔn)。該方案為無人機(jī)、機(jī)器人等需要
    的頭像 發(fā)表于 06-06 09:43 ?330次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b>經(jīng)驗(yàn)——STM32F4驅(qū)動(dòng)<b class='flag-5'>ICM20948</b> 九軸運(yùn)動(dòng)傳感器 + VOFA上位機(jī)可視化驗(yàn)證與抗漂移優(yōu)化

    開源——STM32F103RBT6驅(qū)動(dòng) ICM20948 九軸傳感器及 vofa + 上位機(jī)可視化教程

    本教程使用標(biāo)準(zhǔn)板(STM32F103RBT6)通過I2C驅(qū)動(dòng)ICM20948九軸傳感器,實(shí)現(xiàn)姿態(tài)
    的頭像 發(fā)表于 06-09 14:01 ?379次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>開源</b>——STM32F103RBT6驅(qū)動(dòng) <b class='flag-5'>ICM20948</b> 九軸傳感器及 vofa + 上位機(jī)可視化教程
    主站蜘蛛池模板: 狠狠色狠狠色综合 | 日本美女黄视频 | 日本xxwwwxxxx网站 | 自拍中文字幕 | 欧美男女交性过程视频 | 婷婷6月 | 国产一区二区精品 | www婷婷| 视频二区在线观看 | 亚洲国产成人精品不卡青青草原 | 综合婷婷 | 国产伦精品一区二区三区女 | 婷婷色九月 | 97久久精品国产精品青草 | 五月天激情综合网 | 亚洲成人黄色网址 | 欧洲亚洲一区 | 男人视频在线 | 性欧美欧美| 日本片免费观看一区二区 | 女性私密部位扒开的视频 | 日韩在线视频一区二区三区 | 日韩艹 | 一级毛片aaaaaa视频免费看 | xxxxx日本69| 免费高清一级欧美片在线观看 | 能看的黄网 | 毛片三级在线观看 | 手机在线观看一级午夜片 | 亚洲性后网 | 天天干天天狠 | 成人窝窝午夜看片 | 涩涩爱影院 | 宅男午夜视频在线观看 | 一级毛片真人免费播放视频 | 高清在线免费观看 | 在线播放一区二区精品产 | 国产日本在线播放 | 国产精品毛片天天看片 | 国产网站在线免费观看 | 99久精品 |