从0制作自己的ros导航小车
系列文章:
①【从0制作自己的ros导航小车:介绍及准备】
②【从0制作自己的ros导航小车:下位机篇】01、工程准备_标准库移植freertos
③【从0制作自己的ros导航小车:下位机篇】02、电机驱动、转速读取、PID控制
④【从0制作自己的ros导航小车:下位机篇】03、mpu6050偏航角获取
⑤【从0制作自己的ros导航小车:上、下位机通信篇】上、下位机串口DMA通信
⑥【从0制作自己的ros导航小车:上位机篇】01、里程计与坐标变换发布
⑦【从0制作自己的ros导航小车:上位机篇】02、ros1多机通讯与坐标变换可视化
⑧【从0制作自己的ros导航小车:上位机篇】03、添加urdf模型(发布各传感器与小车基坐标系之间的静态坐标变换)
⑨【从0制作自己的ros导航小车:上位机篇】04、使用gmapping建图
⑩【从0制作自己的ros导航小车:上位机篇】05、导航!
前言
建议新建一个工程来测试,通过软件iic的方式读取mpu6050数据很简单(想了解底层寄存器操作的,可以看前面标出的软件iic对应的博客),但是读出来的数据不是我们后续导航要用到的偏航角,所以需要使用DMP库来读取数据并解算得到欧拉角(偏航、翻滚、俯仰)。
什么是DMP库?我们可以通过IIC读取MPU6050加速度传感器数据和角速度传感器数据,但是后续的导航不是要这些数据,而是欧拉角中的偏航角,要得到欧拉角,要进行姿态解算,自己来姿态解算有点困难,可以使用DMP将原始数据直接转换为四元数输出,得到四元数之后,就可以很方便的计算出欧拉角,从而得到偏航角(YAW)。
一、GY-521 MPU6050三维角度传感器
本文使用mpu6050传感器型号如上,一共八个引脚,一般只用到四个,其余的我也没有试过。VCC、GND分别接5V电源和地;SCL、SDA分别是IIC通讯中的时钟引脚和数据引脚,在本项目中分别接PB10和PB11。
MPU6050 是 全球首款整合性 6 轴运动处理组件,免除了组合陀螺仪与加速器时之轴间差的问题。内部整合了 3 轴陀螺仪和 3 轴加速度传感器,可以使用 InvenSense 公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度。MPU6050之所以称之为6轴,是因为它能感应 X、Y、Z三个方向的加速度和X、Y、Z方向的角速度。
二、移植DMP
下载网盘中的文件:链接:https://pan.baidu.com/s/1VLw3W1twBUZrgHklSSF2nQ
提取码:1234
我将这些文件都放在工程的HardWare文件夹中,这里每个人习惯不一样,只要能保证调用得到就可以。要是不会添加的最好看看江协的视频。
注意事项:
如果和我用的引脚不一样的话需要更改代码:
①根据自己的gpio修改iic初始化的io口。(MPUIIC.c中)
②修改SCL和SDA的宏定义。(MPUIIC.h中)
io方向设置这部分需要看寄存器,参考这篇博客,io操作函数只需要根据自己用的iic口进行设置即可。
③由于后续导航只需要偏航角,为了减小计算带来的性能损失,注释掉翻滚和俯仰角。(inv_mpu.c)
三、读取偏航角测试
#include "stm32f10x.h" // Device header
#include "delay.h"
#include "MPUIIC.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main(void)
{
mpu_dmp_init();
while (1)
{
mpu_dmp_get_data(&Pitch,&Roll,&Yaw);
printf("\n\r yaw=%0.2f \n\r", Yaw);
}
}
如果没问题的话,可以在串口调试助手看打印信息是否正确。