news 2026/7/2 3:18:52

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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所以数据的时效性不强,所以大家也可以根据大疆的例程进行修改

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/28 18:33:07

【AI】AI学习笔记:翻译langGraph 记忆概述(Memory)

记忆概述 记忆是一个能够记录先前交互信息的系统。对于AI智能体而言&#xff0c;记忆至关重要&#xff0c;它使智能体能够记住过去的交互、从反馈中学习并适应用户偏好。随着智能体处理愈发复杂且交互频繁的任务&#xff0c;这种能力对于提升效率和用户满意度都变得不可或缺。本…

作者头像 李华
网站建设 2026/6/24 11:47:10

AI赋能运营:数字化系统如何自动分配收益与激励?

前面讨论的精巧设计&#xff0c;都需要一个高效、公平的“Chao级大脑”来执行。这就是AI数字化系统。本文揭示技术如何成为运营的基石&#xff0c;让复杂商业模型得以完美运转。1. 自动化&#xff1a;解决运营中繁琐的“分配”问题传统的分销或代理模式&#xff0c;佣金计算、业…

作者头像 李华
网站建设 2026/6/30 17:16:03

基于Springboot+Vue的JavaWeb的图书馆管理系统源码文档部署文档代码讲解等

课题介绍本课题旨在开发基于 SpringBootVue 的 JavaWeb 图书馆管理系统&#xff0c;采用前后端分离架构&#xff0c;解决传统图书馆管理中借阅流程繁琐、图书库存盘点低效、读者信息管理杂乱、数据统计不便等痛点&#xff0c;实现图书馆日常运营全流程数字化、管理规范化、服务…

作者头像 李华
网站建设 2026/6/25 17:11:46

flask python旅游景点印象服务系统

目录基于Flask的旅游景点印象服务系统摘要项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作基于Flask的旅游景点印象服务系统摘要 该系统采用Python的Flask框架开发&#xff0c;旨在为用户提供旅游景点的印…

作者头像 李华
网站建设 2026/6/30 0:30:31

基于大数据的农产品价格预测数据分析与可视化系统

目录摘要项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作摘要 该系统旨在利用大数据技术对农产品价格进行精准预测&#xff0c;并通过可视化手段直观展示分析结果&#xff0c;为农业生产者、经销商及政策制…

作者头像 李华