【从0制作自己的ros导航小车:下位机篇】03、mpu6050偏航角获取

前言
建议新建一个工程来测试,通过软件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);
	}
}

如果没问题的话,可以在串口调试助手看打印信息是否正确。

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS中,可以使用ROS节点之间的话题(Topic)和服务(Service)实现从上位机到下位机的通讯。 1. 话题通讯:话题是ROS中最常用的通讯方式之一,它可以实现发布和订阅消息。在下位机上创建一个ROS节点,将需要发送给上位机的数据发布到一个话题上,上位机上的节点可以订阅该话题,获取下位机发送的数据。下位机发送数据的代码示例: ``` #include "ros/ros.h" #include "std_msgs/String.h" int main(int argc, char **argv) { ros::init(argc, argv, "talker"); ros::NodeHandle n; ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); ros::Rate loop_rate(10); int count = 0; while (ros::ok()) { std_msgs::String msg; std::stringstream ss; ss << "hello world " << count; msg.data = ss.str(); ROS_INFO("%s", msg.data.c_str()); chatter_pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); ++count; } return 0; } ``` 2. 服务通讯:服务是ROS中另一种常用的通讯方式,它可以实现请求和响应消息。在下位机上创建一个ROS节点,将需要发送给上位机的数据封装成一个ROS服务,上位机上的节点可以请求该服务,获取下位机发送的数据。下位机发送服务的代码示例: ``` #include "ros/ros.h" #include "beginner_tutorials/AddTwoInts.h" bool add(beginner_tutorials::AddTwoInts::Request &req, beginner_tutorials::AddTwoInts::Response &res) { res.sum = req.a + req.b; ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b); ROS_INFO("sending back response: [%ld]", (long int)res.sum); return true; } int main(int argc, char **argv) { ros::init(argc, argv, "add_two_ints_server"); ros::NodeHandle n; ros::ServiceServer service = n.advertiseService("add_two_ints", add); ROS_INFO("Ready to add two ints."); ros::spin(); return 0; } ``` 这些是ROS实现从上位机到下位机的通讯的两种常用方式。当然,在实际应用中,需要根据具体的需求选择不同的通讯方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值