ROS2进阶 -- 硬件篇第五章第三节 -- PlateFormIO使用开源库驱动IMU——MPU6050

本文主要是介绍ROS2进阶 -- 硬件篇第五章第三节 -- PlateFormIO使用开源库驱动IMU——MPU6050,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

序:
上一节我们安装好了MPU6050的三方库,这一节我们尝试使用该库通过esp32将IMU模块驱动起来。

参考资料:小鱼——使用开源库驱动IMU

一、使用开源库驱动IMU

1. MPU6050介绍

首先我们了解下MPU6050模块,从外观看,长这个样子
在这里插入图片描述
MPU6050 为全球首例集成六轴传感器的运动处理组件,内置了运动融合引擎,用于手持和桌面的应用程序、游戏控制器、体感遥控以及其他消费电子设备。它内置一个三轴 MEMS 陀螺仪、一个三轴 MEMS 加速度计、一个数字运动处理引擎(DMP)以及用于第三方的数字传感器接口的辅助 I2C 端口(常用于扩展磁力计)。当辅助 I2C 端口连接到一个三轴磁力计,MPU6050 能提供一个完整的九轴融合输出到其主 I2C 端口。

在板子上是这样的
在这里插入图片描述

2. 调用开源库驱动

新建工程example06_mpu6050

在这里插入图片描述

2.1 添加依赖

修改platformio.ini

[env:esp32doit-devkit-v1]
platform = espressif32
board = esp32doit-devkit-v1
framework = arduino
monitor_speed = 115200
lib_deps = https://mirror.ghproxy.com/https://github.com/rfetick/MPU6050_light.git

2.2 样例程序

复制到main.cpp中

/* Get all possible data from MPU6050* Accelerometer values are given as multiple of the gravity [1g = 9.81 m/s²]* Gyro values are given in deg/s* Angles are given in degrees* Note that X and Y are tilt angles and not pitch/roll.** License: MIT*/#include "Wire.h"
#include <MPU6050_light.h>MPU6050 mpu(Wire);unsigned long timer = 0;void setup() {Serial.begin(9600);Wire.begin();byte status = mpu.begin();Serial.print(F("MPU6050 status: "));Serial.println(status);while(status!=0){ } // stop everything if could not connect to MPU6050Serial.println(F("Calculating offsets, do not move MPU6050"));delay(1000);mpu.calcOffsets(true,true); // gyro and acceleroSerial.println("Done!\n");}void loop() {mpu.update();if(millis() - timer > 1000){ // print data every secondSerial.print(F("TEMPERATURE: "));Serial.println(mpu.getTemp());Serial.print(F("ACCELERO  X: "));Serial.print(mpu.getAccX());Serial.print("\tY: ");Serial.print(mpu.getAccY());Serial.print("\tZ: ");Serial.println(mpu.getAccZ());Serial.print(F("GYRO      X: "));Serial.print(mpu.getGyroX());Serial.print("\tY: ");Serial.print(mpu.getGyroY());Serial.print("\tZ: ");Serial.println(mpu.getGyroZ());Serial.print(F("ACC ANGLE X: "));Serial.print(mpu.getAccAngleX());Serial.print("\tY: ");Serial.println(mpu.getAccAngleY());Serial.print(F("ANGLE     X: "));Serial.print(mpu.getAngleX());Serial.print("\tY: ");Serial.print(mpu.getAngleY());Serial.print("\tZ: ");Serial.println(mpu.getAngleZ());Serial.println(F("=====================================================\n"));timer = millis();}}

2.3 接线方法

如图所示
在这里插入图片描述

2.4 修改代码

  1. 修改波特率 9600->115200
  2. 修改IO地址 Wire.begin();->Wire.begin(21, 22);
#include "Wire.h"          // 导入I2C相关头文件
#include <MPU6050_light.h> // 导入MPU6050库MPU6050 mpu(Wire); // 新建MPU6050对象mpuunsigned long timer = 0;void setup()
{Serial.begin(115200);Wire.begin(21, 22); // 初始化I2C,设置sda引脚为GPIO21,SCL引脚为GPIO22byte status = mpu.begin(); // 检测IMU模块状态Serial.print(F("MPU6050 status: "));Serial.println(status);while (status != 0){} // stop everything if could not connect to MPU6050Serial.println(F("Calculating offsets, do not move MPU6050"));delay(1000);mpu.calcOffsets(true, true); // gyro and accelero 校准Serial.println("Done!\n");
}void loop()
{mpu.update();if (millis() - timer > 1000){ // print data every secondSerial.print(F("TEMPERATURE: "));Serial.println(mpu.getTemp()); // 温度Serial.print(F("ACCELERO  X: "));Serial.print(mpu.getAccX()); // X轴加速度Serial.print("\tY: ");Serial.print(mpu.getAccY()); // Y轴加速度Serial.print("\tZ: ");Serial.println(mpu.getAccZ()); // Z轴加速度Serial.print(F("GYRO      X: "));Serial.print(mpu.getGyroX()); // X轴 角速度Serial.print("\tY: ");Serial.print(mpu.getGyroY()); // Y轴 角速度Serial.print("\tZ: ");Serial.println(mpu.getGyroZ()); // Z轴 角速度Serial.print(F("ACC ANGLE X: "));Serial.print(mpu.getAccAngleX()); // X轴角加速度Serial.print("\tY: ");Serial.println(mpu.getAccAngleY()); // Y轴角加速度Serial.print(F("ANGLE     X: "));Serial.print(mpu.getAngleX()); // X角度Serial.print("\tY: ");Serial.print(mpu.getAngleY()); // Y角度Serial.print("\tZ: ");Serial.println(mpu.getAngleZ()); // Z角度Serial.println(F("=====================================================\n"));timer = millis();}
}

3. 编译测试

保存代码,编译下载到开发板。打开串口监视器,查看结果。
在这里插入图片描述

二、学会面向对象编程-封装IMU驱动

说明:在本章练习编写c++代码,建议跟着视频【ROS2硬件控制】13A.3.学会面向对象编程-封装IMU驱动(上)一步一步敲一遍,是有用的,但还没有全部理解,故暂时空下。

文档链接:学会面向对象编程-封装IMU驱动

这篇关于ROS2进阶 -- 硬件篇第五章第三节 -- PlateFormIO使用开源库驱动IMU——MPU6050的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035584

相关文章

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Springboot 中使用Sentinel的详细步骤

《Springboot中使用Sentinel的详细步骤》文章介绍了如何在SpringBoot中使用Sentinel进行限流和熔断降级,首先添加依赖,配置Sentinel控制台地址,定义受保护的资源,... 目录步骤 1: 添加 Sentinel 依赖步骤 2: 配置 Sentinel步骤 3: 定义受保护的