陀螺儀LSM6DSV16X與AI集成(3)----讀取融合算法輸出的四元數

陀螺儀LSM6DSV16X與AI集成.2--姿態解算

  • 概述
  • 視頻教學
  • 樣品申請
  • 完整代碼下載
  • 使用demo板
  • 生成STM32CUBEMX
  • 串口配置
  • IIC配置
  • CS和SA0設置
  • 串口重定向
  • 參考程序
  • 初始化SFLP步驟
  • 初始化SFLP
  • 讀取四元數數據
  • 演示

概述

LSM6DSV16X 特性涉及到的是一種低功耗的傳感器融合算法(Sensor Fusion Low Power, SFLP).
低功耗傳感器融合(SFLP)算法:
該算法旨在以節能的方式結合加速度計和陀螺儀的數據。傳感器融合算法通過結合不同傳感器的優勢,提供更準確、可靠的數據。
6軸游戲旋轉向量:
SFLP算法能夠生成游戲旋轉向量。這種向量是一種表示設備在空間中方向的數據,特別適用于游戲和增強現實應用,這些應用中理解設備的方向和運動非常關鍵。
四元數表示法:
旋轉向量以四元數的形式表示。四元數是一種編碼3D旋轉的方法,它避免了歐拉角等其他表示法的一些限制(如萬向節鎖)。一個四元數有四個分量(X, Y, Z 和 W),其中 X, Y, Z 代表向量部分,W 代表標量部分。
FIFO存儲:
四元數的 X, Y, Z 分量存儲在 LSM6DSV16X 的 FIFO(先進先出)緩沖區中。FIFO 緩沖區是一種數據存儲方式,允許臨時存儲傳感器數據。這對于有效管理數據流非常有用,特別是在數據處理可能不如數據收集那么快的系統中。

最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。
在這里插入圖片描述

圖片包含了關于 LSM6DSV16X 傳感器的低功耗傳感器融合(Sensor Fusion Low Power, SFLP)功能的說明。這里是對圖片內容的解釋:
SFLP 功能:

  1. SFLP 單元用于生成基于加速度計和陀螺儀數據處理的以下數據:
  2. 游戲旋轉向量:以四元數形式表示設備的姿態。
  3. 重力向量:提供一個三維向量,表示重力方向。
  4. 陀螺儀偏差:提供一個三維向量,表示陀螺儀的偏差。
    激活與重置:
  5. 通過在 EMB_FUNC_EN_A(04h)嵌入式功能寄存器中設置 SFLP_GAME_EN 位為 1 來激活 SFLP 單元。
  6. 通過在 EMB_FUNC_INIT_A(66h)嵌入式功能寄存器中設置 SFLP_GAME_INIT 位為 1 來重置 SFLP 單元。
    性能參數表:
    表格展示了 SFLP 功能在不同情況下的性能,包括靜態精度、低動態精度和高動態精度,以及校準時間和方向穩定時間。這些參數反映了傳感器在不同運動狀態下的精確度和響應速度。
    在這里插入圖片描述

視頻教學

https://www.bilibili.com/video/BV1Jw41187c5/

陀螺儀LSM6DSV16X與AI集成(3)----讀取融合算法輸出的四元數

樣品申請

https://www.wjx.top/vm/OhcKxJk.aspx#

完整代碼下載

使用demo板

最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。
在這里插入圖片描述

生成STM32CUBEMX

用STM32CUBEMX生成例程,這里使用MCU為STM32WB55RG。
配置時鐘樹,配置時鐘為32M。

在這里插入圖片描述

串口配置

查看原理圖,PB6和PB7設置為開發板的串口。

在這里插入圖片描述
配置串口。

在這里插入圖片描述

IIC配置

在這里插入圖片描述
配置IIC為快速模式,速度為400k。
在這里插入圖片描述

CS和SA0設置

在這里插入圖片描述

串口重定向

打開魔術棒,勾選MicroLIB

在這里插入圖片描述

在main.c中,添加頭文件,若不添加會出現 identifier “FILE” is undefined報錯。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函數聲明和串口重定向:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END PFP */

參考程序

https://github.com/stm32duino/LSM6DSV16X/blob/main/examples/LSM6DSV16X_Sensor_Fusion/LSM6DSV16X_Sensor_Fusion.ino

初始化SFLP步驟

啟用 LSM6DSV16X 傳感器中的旋轉向量低功耗傳感器融合(Rotation Vector SFLP)功能的步驟。旋轉向量是一個四元數,它提供了一個精確的設備姿態估計。這通常用于游戲控制、增強現實和虛擬現實等應用。下面是函數各部分的作用:

  1. 函數定義:LSM6DSV16XSensor_Enable_Rotation_Vector 旨在啟用旋轉向量功能,并返回操作的結果。如果成功,返回 0;如果出現錯誤,則返回錯誤代碼。
  2. 設置滿量程:函數首先設置加速度計和陀螺儀的滿量程,這是傳感器能夠測量的最大范圍。這里分別設置為 4g 和 2000 度每秒(dps)。
  3. 獲取 FIFO SFLP 設置:然后,它讀取當前的 FIFO SFLP(傳感器融合低功耗)配置。
  4. 啟用旋轉向量 SFLP 特性:通過將 fifo_sflp.game_rotation 設為 1 來啟用游戲旋轉向量功能。
  5. 設置 FIFO 模式:將 FIFO 設置為流模式(也稱為連續模式),在此模式下,數據持續地流入 FIFO,如果 FIFO 滿了,新數據會覆蓋舊數據。
  6. 設置數據輸出率:為加速度計和陀螺儀以及 SFLP 設置數據輸出率(ODR),在這里都設置為每秒 120 次采樣(120Hz)。
  7. 啟用 SFLP 低功耗模式:最后,啟用 SFLP 游戲旋轉向量特性,確保以低功耗模式運行。

初始化SFLP

開啟嵌入式函數訪問需要向 FUNC_CFG_ACCESS (01h)的EMB_FUNC_REG_ACCESS寫入1進行開啟。
在這里插入圖片描述
在這里插入圖片描述

/*** @brief  Change memory bank.[set]** @param  ctx      read / write interface definitions* @param  val      MAIN_MEM_BANK, EMBED_FUNC_MEM_BANK,* @retval          interface status (MANDATORY: return 0 -> no Error)**/
int32_t lsm6dsv16x_mem_bank_set(stmdev_ctx_t *ctx, lsm6dsv16x_mem_bank_t val)
{lsm6dsv16x_func_cfg_access_t func_cfg_access;int32_t ret;ret = lsm6dsv16x_read_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);if (ret != 0) { return ret; }func_cfg_access.shub_reg_access = ((uint8_t)val & 0x02U) >> 1;func_cfg_access.emb_func_reg_access = (uint8_t)val & 0x01U;ret = lsm6dsv16x_write_reg(ctx, LSM6DSV16X_FUNC_CFG_ACCESS, (uint8_t *)&func_cfg_access, 1);return ret;
}

SFLP_GAME_FIFO_EN 是 LSM6DSV16X 傳感器中 EMB_FUNC_FIFO_EN_A(44h)寄存器的一個設置位。這個特定的位用于控制是否啟用將 SFLP(Sensor Fusion Low Power)算法計算出的游戲旋轉向量(四元數)值存儲到 FIFO(先進先出)緩沖區中的功能。當這個位被設置為 1 時,啟用了這個功能,使得算法計算出的游戲旋轉向量可以批量存儲到 FIFO 緩沖區中。默認值為 0,表示該功能默認是禁用的。

在這里插入圖片描述

在這里插入圖片描述

LSM6DSV16X 傳感器的 FIFO_CTRL4 (0Ah) 寄存器配置信息。這個寄存器控制著 FIFO(先進先出)緩沖區的各種操作和數據批處理(batching)的設置。
連續模式,如果 FIFO 已滿,新采集的樣本會覆蓋舊樣本。

在這里插入圖片描述

在這里插入圖片描述

在AN5763手冊中,也說明了融合數據會輸出在FIFO中,同時有如下的輸出速率,我們可以配置默認的速率。
在這里插入圖片描述
在這里插入圖片描述

最后對EMB_FUNC_EN_A (04h) 寄存器的SFLP_GAME_EN設置為1。

在這里插入圖片描述
在這里插入圖片描述

讀取四元數數據

FIFO_STATUS1(1Bh)和 FIFO_STATUS2(1Ch)寄存器中的 DIFF_FIFO [8:0] 字段包含在 FIFO 中收集的字(1 字節標簽 + 6 字節數據)的數量。
在這里插入圖片描述
在這里插入圖片描述

    /* Read watermark flag */status=lsm6dsv16x_fifo_status_get(&dev_ctx, &fifo_status);// Check the number of samples inside FIFOif (status != LSM6DSV16X_OK) {printf("LSM6DSV16X Sensor failed to get number of samples inside FIFO");while (1);}fifo_samples = fifo_status.fifo_level;

之后需要通過FIFO_DATA_OUT_TAG (78h)判斷是什么數據準備好,當為SFLP game rotation vector(0X13)時候,為四元數準備完畢。

在這里插入圖片描述
之后讀取FIFO_DATA_OUT_X_L (79h)到FIFO_DATA_OUT_Z_H (7Eh)共6個字節數據,進行四元數讀取。

在這里插入圖片描述

最后轉換為姿態角。

  /* Infinite loop *//* USER CODE BEGIN WHILE */while (1){uint16_t fifo_samples;lsm6dsv16x_fifo_out_raw_t f_data;/* Read watermark flag */status=lsm6dsv16x_fifo_status_get(&dev_ctx, &fifo_status);// Check the number of samples inside FIFOif (status != LSM6DSV16X_OK) {printf("LSM6DSV16X Sensor failed to get number of samples inside FIFO");while (1);}fifo_samples = fifo_status.fifo_level;// Read the FIFO if there is one stored sampleif (fifo_samples > 0) {for (int i = 0; i < fifo_samples; i++) {lsm6dsv16x_fifo_out_raw_get(&dev_ctx,&f_data);if(f_data.tag==LSM6DSV16X_SFLP_GAME_ROTATION_VECTOR_TAG){LSM6DSV16XSensor_FIFO_Get_Rotation_Vector(&dev_ctx,&quaternions[0]);// Print Quaternion data
//        printf("Quaternion: %.4lf,%.4lf,%.4lf,%.4lf\n",quaternions[3],quaternions[0],quaternions[1],quaternions[2]);	q0=quaternions[3];q1=quaternions[0];q2=quaternions[1];q3=quaternions[2];Pitch  = asin(2 * q2 * q3 + 2 * q0* q1)* 57.3; // pitch ,轉換為度數Roll = atan2(-2 * q1 * q3 + 2 * q0 * q2, q0*q0-q1*q1-q2*q2+q3*q3)* 57.3; // rollvYaw = atan2(2*(q1*q2 - q0*q3),q0*q0-q1*q1+q2*q2-q3*q3) * 57.3;   //偏移太大,			Roll=Roll*100;Pitch=Pitch*100;Yaw=Yaw*100;data_angular_rate_raw[8]=(int16_t)Roll>>8;//rolldata_angular_rate_raw[7]=(int16_t)Roll;data_angular_rate_raw[10]=(int16_t)Pitch>>8;//pitchdata_angular_rate_raw[9]=(int16_t)Pitch;data_angular_rate_raw[12]=(int16_t)Yaw>>8;//yawdata_angular_rate_raw[11]=(int16_t)Yaw;sumcheck = 0;addcheck = 0;for(uint16_t i=0; i < 14; i++){sumcheck += data_angular_rate_raw[i]; //從幀頭開始,對每一字節進行求和,直到 DATA 區結束addcheck += sumcheck; //每一字節的求和操作,進行一次 sumcheck 的累加}data_angular_rate_raw[14]=sumcheck;data_angular_rate_raw[15]=addcheck;HAL_UART_Transmit(&huart1 , (uint8_t *)&data_angular_rate_raw, 16, 0xFFFF);	
//				printf("Roll=%.2f,Pitch=%.2f,Yaw=%.2f\n",Roll,Pitch,Yaw);				}}}HAL_Delay(10);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */

演示

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210997.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL之創建時間類型的字段表

mysql之創建時間類型的字段表 CREATE TABLE tab(birthday DATE, -- 生日job_time DATETIME, -- 記錄年月日時分秒login_time TIMESTAMP -- 時間戳NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP )解釋&#xff1a; NOT NULL DEFAULT &#xff1a;默認不為空…

css未來:使用light-dark()切換主題色

css未來&#xff1a;使用light-dark()切換主題色 要根據使用的是淺色模式還是深色模式來更改顏色&#xff0c;我們通常會使用 prefers-color-scheme 媒體查詢。為了讓代碼實現變得更容易&#xff0c;CSS 現在附帶了一個名為 light-dark() 的實用函數。該函數接受兩個顏色值作為…

編譯原理lab3-cminus_compiler-LLVM簡要熟悉

lab3實驗報告&#xff0c;我的實驗報告圖例很少&#xff0c;這次只有兩張圖&#xff0c;其余的都以復制輸出的形式展現出來了&#xff0c;最終提交的代碼在最后 [[#你的提交|你的提交]][[#實驗設計|實驗設計]][[#提交一&#xff1a;手動編寫.ll|提交一&#xff1a;手動編寫.ll…

TREK610C高壓放大器

181/2461/8938技術規格 輸出電壓&#xff1a;0到10 kV直流電壓 輸出電流&#xff1a;0到2 mA 轉換率&#xff1a;大于500 V/μs 信號帶寬&#xff1a;直流到1.0 kHz &#xff08;-3dB&#xff09; 放大倍數&#xff1a;1000 V/V 閉環系統以保持低噪音、高精確度電壓輸出 短…

最簡單的基于 FFmpeg 的音頻解碼器

最簡單的基于 FFmpeg 的音頻解碼器 最簡單的基于 FFmpeg 的音頻解碼器正文參考工程文件下載 參考雷霄驊博士的文章&#xff0c;鏈接&#xff1a;最簡單的基于FFMPEGSDL的音頻播放器&#xff1a;拆分-解碼器和播放器 最簡單的基于 FFmpeg 的音頻解碼器 正文 FFmpeg 音頻解碼器…

【ArcGIS微課1000例】0080:ArcGIS將shp轉json(geojson)案例教程

本文以案例的形式,講述在ArcGIS軟件中,將矢量數據轉為GeoJSON的方法。 擴展閱讀:【GIS風暴】GeoJSON數據格式案例全解 文章目錄 一、GeoJson簡介二、ArcGIS將矢量數據轉為GeoJSON一、GeoJson簡介 GeoJSON是一種基于JSON的地理空間數據交換格式,它定義了幾種類型JSON對象以…

Spring Cloud Gateway 網關的基礎使用

1. 什么是網關&#xff1f;網關有什么用&#xff1f; 在微服務架構中&#xff0c;網關就是一個提供統一訪問地址的組件&#xff0c;它解決了內部微服務與外部的交互問題。網關主要負責流量的路由和轉發&#xff0c;將外部請求引到對應的微服務實例上。同時提供身份認證、授權、…

Spring-Boot---配置文件

文章目錄 配置文件的作用配置文件的格式PropertiesProperties基本語法讀取Properties配置文件 ymlyml基本語法讀取yml配置文件 Properties VS Yml 配置文件的作用 整個項目中所有重要的數據都是在配置文件中配置的&#xff0c;具有非常重要的作用。比如&#xff1a; 數據庫的…

230. 二叉搜索樹中第K小的元素 --力扣 --JAVA

題目 給定一個二叉搜索樹的根節點 root &#xff0c;和一個整數 k &#xff0c;請你設計一個算法查找其中第 k 個最小元素&#xff08;從 1 開始計數&#xff09;。 解題思路 利用List存儲數據&#xff1b;遍歷整個樹&#xff0c;讀取數各個節點的value&#xff1b;對value進行…

Python繪制多分類ROC曲線

目錄 1 數據集介紹 1.1 數據集簡介 1.2 數據預處理 2隨機森林分類 2.1 數據加載 2.2 參數尋優 2.3 模型訓練與評估 3 繪制十分類ROC曲線 第一步&#xff0c;計算每個分類的預測結果概率 第二步&#xff0c;畫圖數據準備 第三步&#xff0c;繪制十分類ROC曲線 1 數據集…

【數據結構】——排序篇(上)

前言&#xff1a;前面我們已經學過了許許多多的排序方法&#xff0c;如冒泡排序&#xff0c;選擇排序&#xff0c;堆排序等等&#xff0c;那么我們就來將排序的方法總結一下。 我們的排序方法包括以下幾種&#xff0c;而快速排序和歸并排序我們后面進行詳細的講解。 直接插入…

Qt實現二維碼生成和識別

一、簡介 QZxing開源庫: 生成和識別條碼和二維碼 下載地址&#xff1a;https://gitcode.com/mirrors/ftylitak/qzxing/tree/master 二、編譯與使用 1.下載并解壓&#xff0c;解壓之后如圖所示 2.編譯 打開src目錄下的QZXing.pro&#xff0c;選擇合適的編譯器進行編譯 最后生…

util.js

一、util.js是什么&#xff1f; 1、util.js是Node.js提供的一個工具庫&#xff0c;主要用于輔助實現JavaScript代碼的通用功能。 2、除了Node.js中內置的模塊外&#xff0c;util.js是Node.js中最核心的模塊之一。 3、通過util.js&#xff0c;開發者可以輕松實現JavaScript常…

Unity 資源管理之StreamingAssets

StreamingAssets也是Unity中特殊的文件夾&#xff0c;用于存放運行時可以直接訪問的資源。StreamingAssets一般存放數據或配置文件、圖片、視頻資源等。 StreamingAssets的文件路徑可以通過Application.streamingAssetsPath來獲取。 加載或訪問使用WWW類或UnityWebRequest類。…

MIT6S081-Lab2總結

大家好&#xff0c;我叫徐錦桐&#xff0c;個人博客地址為www.xujintong.com&#xff0c;github地址為https://github.com/xjintong。平時記錄一下學習計算機過程中獲取的知識&#xff0c;還有日常折騰的經驗&#xff0c;歡迎大家訪問。 Lab2就是了解一下xv6的系統調用流程&…

Java - Synchronized的鎖升級之路

Synchronized鎖 Synchronized在Java JVM里的實現是基于進入和退出Monitor對象來實現方法同步和代碼塊同步的 monitor enter指令是在編譯后插入到同步代碼塊的開始位置 而monitor exit是插入到方法結束處和異常處 JVM要保證每個monitor enter必須有對應的monitor exit與之配對。…

解決服務端渲染程序SSR運行時報錯: ReferenceError: document is not defined

現象&#xff1a; 原因&#xff1a; 該錯誤表明在服務端渲染 (SSR) 過程中&#xff0c;有一些代碼嘗試在沒有瀏覽器環境的情況下執行與瀏覽器相關的操作。這在服務端渲染期間是一個常見的問題&#xff0c;因為在服務端渲染期間是沒有瀏覽器 API。 解決辦法&#xff1a; 1. 修…

bat腳本之while

在批處理&#xff08;BAT&#xff09;腳本中&#xff0c;while循環是一種常用的控制流結構&#xff0c;用于在滿足特定條件的情況下重復執行一段代碼。 while循環的基本語法如下&#xff1a; while [ condition ] do command1 command2 ... commandN done這里的 cond…

【2023傳智杯-新增場次】第六屆傳智杯程序設計挑戰賽AB組-DEF題復盤解題分析詳解【JavaPythonC++解題筆記】

本文僅為【2023傳智杯-第二場】第六屆傳智杯程序設計挑戰賽-題目解題分析詳解的解題個人筆記,個人解題分析記錄。 本文包含:第六屆傳智杯程序設計挑戰賽題目、解題思路分析、解題代碼、解題代碼詳解 文章目錄 一.前言二.賽題題目D題題目-E題題目-F題題目-二.賽題題解D題題解-…

深入理解Sentinel系列-1.初識Sentinel

&#x1f44f;作者簡介&#xff1a;大家好&#xff0c;我是愛吃芝士的土豆倪&#xff0c;24屆校招生Java選手&#xff0c;很高興認識大家&#x1f4d5;系列專欄&#xff1a;Spring源碼、JUC源碼、Kafka原理、分布式技術原理&#x1f525;如果感覺博主的文章還不錯的話&#xff…