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

RM赛事C型板九轴IMU解算(3)(姿态融合算法)

姿态解算是将陀螺仪的角速度数据,加速度计的加速 度计数据,磁力计的磁场数据进行融合,以解算出当前载体的姿态角。姿态解算算法的好坏
将影响到姿态角度的精度。我们以mahony算法为例,移植相关算法,创建姿态解算任务

这篇还是教大家如何移植,至于如何进行优化,大家自行决定,比如加上DMA,用FreeRTOS多线程,等等

首先是配置就把前面两篇文章的所有配置在CubeMX中配置,和并把前面用到的文件一直到新的KEIL中并进行添加

然后再加入这两个文件

然后再在这个文件目录下,找到这两文件,添加到你的keil工程中

然后打开工程

在main.c中添加这些头文件

#include "imu_temp_control_task.h" #include "BMI088driver.h" #include "pid.h" #include "bsp_imu_pwm.h" #include "ist8310driver.h" #include "ist8310driver_middleware.h" #include "MahonyAHRS.h" #include <math.h>

和这些宏定义和变量

#define IMU_temp_PWM(pwm) imu_pwm_set(pwm) //pwm???? #define TEMPERATURE_PID_KP 1600.0f //kp of temperature control PID #define TEMPERATURE_PID_KI 0.2f //ki of temperature control PID #define TEMPERATURE_PID_KD 0.0f //kd of temperature control PID #define TEMPERATURE_PID_MAX_OUT 4500.0f //max out of temperature control PID #define TEMPERATURE_PID_MAX_IOUT 4400.0f //max iout of temperature control PID extern SPI_HandleTypeDef hspi1; volatile uint8_t imu_start_flag = 0; uint16_t tempPWM; fp32 gyro[3], accel[3], temp;float mag[3]; //kp, ki,kd three params const fp32 imu_temp_PID[3] = {TEMPERATURE_PID_KP, TEMPERATURE_PID_KI, TEMPERATURE_PID_KD}; //pid struct pid_type_def imu_temp_pid; fp32 quat[4] = {0.0f, 0.0f, 0.0f, 0.0f}; fp64 INS_angle[3] = {0.0f, 0.0f, 0.0f};

然后成立这个函数进行四元数对角度的转化

void get_angle(fp32 q[4], fp64 *yaw, fp64 *pitch, fp64 *roll) { *yaw = atan2f(2.0f*(q[0]*q[3]+q[1]*q[2]), 2.0f*(q[0]*q[0]+q[1]*q[1])-1.0f)*57.29578; *pitch = asinf(-2.0f*(q[1]*q[3]-q[0]*q[2]))*57.29578; *roll = atan2f(2.0f*(q[0]*q[1]+q[2]*q[3]),2.0f*(q[0]*q[0]+q[3]*q[3])-1.0f)*57.29578; }

然后进行这些初始化

HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1); /* USER CODE BEGIN 2 */ PID_init(&imu_temp_pid, PID_POSITION, imu_temp_PID, TEMPERATURE_PID_MAX_OUT, TEMPERATURE_PID_MAX_IOUT); ist8310_init(); while(BMI088_init()) { ; } //set spi frequency hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } quat[0] = 1.0f; quat[1] = 0.0f; quat[2] = 0.0f; quat[3] = 0.0f;

最后替换掉原来的while(1)循环

while (1) { BMI088_read(gyro, accel, &temp); ist8310_read_mag(mag); // uint16_t tempPWM; PID_calc(&imu_temp_pid, temp, 40.0f); if (imu_temp_pid.out < 0.0f) { imu_temp_pid.out = 0.0f; } tempPWM = (uint16_t)imu_temp_pid.out; IMU_temp_PWM(tempPWM); MahonyAHRSupdate(quat, gyro[0], gyro[1], gyro[2], accel[0], accel[1], accel[2], mag[0], mag[1], mag[2]); get_angle(quat, INS_angle + 0, INS_angle + 1, INS_angle + 2); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }

最后只需要读取INS_angle[3]的三个数据就分别是,Yao,Pitch,Roll的角度

但是我们这个姿态的解算没有进行滤波,也没用DMA所以数据的时效性不强,所以大家也可以根据大疆的例程进行修改

http://www.jsqmd.com/news/290105/

相关文章:

  • Lua基础语法(上篇)
  • 驱动千店销售转化提升10%:3C零售门店的人效优化实战方案
  • 破解出海管理“消耗战”:中企如何用数字化工具赢得海外团队信任?
  • 【通信】基于matlab DPCM编码及2DPSK调制数字频带通信系统仿真【含Matlab源码 15019期】
  • 【光学】基于matlab水波在多个垂直薄板下的透射系数【含Matlab源码 15013期】
  • 【图像加密】基于matlab双随机相位编码和压缩传感实现安全图像加密【含Matlab源码 15009期】
  • 2026年 不锈钢模块/不锈钢加工厂/不锈钢剪板折弯厂家推荐排行榜:匠心工艺与精密制造实力解析
  • 基于 Vue + VueUse 的 WebSocket 优雅封装:打造高可用的全局连接管理方案
  • AI赋能运营:数字化系统如何自动分配收益与激励?
  • ArcGIS大师之路500技---066DEM不进位保留一位小数
  • 从出题到成绩:在线笔试系统如何提升 HR 招聘效率?
  • 考试云:在线答题系统,构建一体化赛事解决方案
  • 如何通过接近开关降低误停机成本
  • 【AI】AI学习笔记:翻译langGraph 记忆概述(Memory)
  • 什么是动态ip/ 什么情况下使用动态ip
  • P8329 ZJOI2022 树 题解 / 容斥
  • ‌AI伦理测试框架:构建负责任软件的基石
  • 2026年 楼承板设备厂家推荐排行榜,钢承板/免浇筑/闭口/开口楼承板设备,十大楼承板成型机及压型设备实力品牌深度解析
  • AI测试工具快速上手指南:从零到精通的实战教程
  • 深度实践:从“手动排障”到“对话诊断”,构建基于 GenAI 的 K8s 智能运维平台
  • 测试了一下,AI扒MIDI谱子的效率很离谱
  • 测试框架整合AI:实现智能化的3步法
  • No132:AI中国故事-对话老子——道法自然与AI设计:无为而治、柔弱胜刚强与复杂系统智慧
  • AI赋能持续交付:从构建到部署的全链路优化
  • AI驱动的测试革命:电商巨头的效率跃迁之路
  • 2026年 聚酰亚胺厂家推荐排行榜:聚酰亚胺棒/管/板/垫片/异型件/定制加工,耐高温绝缘工程塑料件专业供应商精选
  • 快速弄懂POM设计模式
  • 软件测试环境搭建及测试过程(超详细整理)
  • 接口测试用例设计详解
  • 51单片机学习笔记3-独立按键