【ROS中的IMU惯性测量单元】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、IMU的部分关键数据解析
  • 二、常规IMU模块与九轴
  • 三、使用C++实现获取IMU数据的节点
    • 1.IMU中的话题
    • 2.获取IMU数据程序设计思路
    • 3.获取IMU数据程操作步骤与实验现象
      • (1)偏航角Yaw(沿着Z轴的旋转方向)的观测
      • (2)横滚角ROLL(沿着X轴的旋转方向)的观测
      • (3)俯仰角Pitch(沿着X轴的旋转方向)的观测
  • 总结


前言


IMU(Inertial Measurement Unit)

IMU用于测量机器人的空间姿态;

一、IMU的部分关键数据解析

index.ros.org搜索sensor_msgs
找到Neotic版本,进入website,找到sensor_msgs/Imu Message,这里可以查看ROS对IMU消息格式的定义;

消息头部是个header,记录了消息发送的时间戳和坐标系ID;
变量orientation,是IMU根据消息包中的原始矢量加速度和角速度解算出来的数据,描述了机器人的朝向相对于空间中XYZ三个坐标轴的偏移量;orientation是由x,y,z,w四个64位的浮点数组成,其中w是基于三个坐标轴旋转偏移量的描述,即欧拉角的描述;在某些姿态下会存在一种叫万向锁的问题,使用Quaternion数学方法,即使用xyzw四个值来描述机器人朝向的方法,也称四元数描述法,可以有效避免万向锁问题。在实际的应用中,四元数描述法通常只在进行旋转变换的过程中使用,旋转后得到结果还是会转换成欧拉角进行处理

geometry_msgs/Vector3 angular_velocity IMU测得的角速度,作为传感器数据输入量,对比geometry_msgs/Vector3 angular是机器人的角速度输出量;

geometry_msgs/Vector3 linear_acceleration 描述的是三个轴上的加速度;

geometry_msgs/Quaternion orientation
float64[9] orientation_covariance
geometry_msgs/Quaternion angular_velocity
float64[9] angular_velocity_covariance #角速度
geometry_msgs/Quaternion linear_acceleration
float64[9] linear_acceleration_covariance #矢量加速度
上述三个数据成员都各自带了一个协方差矩阵,主要用于后期的优化和滤波;

如果协方差数值已知就将其填充到协方差矩阵中;
如果协方差数值未知,则将协方差矩阵全部置为零;

如果协方差矩阵对应的数值不存在(比如IMU没有输出orientation姿态数据),那么协方差矩阵的第一个数值为-1;

如果要使用这个消息包里的某个数据,需要先对协方差矩阵的第一个数值进行判断;
如果数值为-1,表明要使用的数据是不存在的,不要去读取它;

二、常规IMU模块与九轴

部分IMU模块额外提供了XYZ三个轴向的磁强计输出,也就是九轴模块;
磁强计数据在ROS中有专门的消息格式(不再IMU的消息包中);

为了方便使用,IMU会根据消息包中的原始数值进行融合得到空间姿态描述,即orientation中的数据;

三、使用C++实现获取IMU数据的节点

1.IMU中的话题

imu/data_raw(sensor_msgs/Imu)
加速度计输出的矢量加速度和陀螺仪输出的旋转角速度;

imu/data(sensor_msgs/Imu)
即imu/data_raw(原始的数据)加上融合后的四元数姿态描述;

imu/mag(sensor_msgs/MagneticField)
磁强计输出磁强数据,只有九轴才会发布这个话题;

2.获取IMU数据程序设计思路

1.创建一个新的软件包,包名为imu_pkg;
2.在软件包中新建一个节点,节点名称为imu_node;
3.在节点中,向ROS中的NodeHandle申请订阅话题/imu/data并设置回调函数为IMUCallback();
4.构建回调函数IMUCallback(),用来接收和处理IMU数据;
5.使用TF工具将四元数转化为欧拉角;
6.调用ROS_INFO()显示转换后的欧拉角数值;

3.获取IMU数据程操作步骤与实验现象

打开终端
CTRL+ALT+T

打开catkin_ws/src/工作目录
cd catkin_ws/src/

创建一个新的软件包,包名为imu_pkg
catkin_create_pkg imu_pkg roscpp rospy sensor_msgs

在vscode中的imu_pkg的src文件中创建imu_node.cpp文件

在imu_node.cpp编写程序代码

#include <ros/ros.h>//引入ROS头文件
#include <sensor_msgs/Imu.h>//引入IMU消息的头文件
#include <tf/tf.h>//引入tf转换库
void IMUCallback(const sensor_msgs::Imu imu_msg)
{
    if(imu_msg.orientation_covariance[0] < 0)
    {
        return;
    }
    tf::Quaternion q(imu_msg.orientation.x, imu_msg.orientation.y, imu_msg.orientation.z, imu_msg.orientation.w);
    double roll, pitch, yaw;
    tf::Matrix3x3(q).getRPY(roll, pitch, yaw);
    roll = roll * 180.0 / M_PI;
    pitch = pitch * 180.0 / M_PI;
    yaw = yaw * 180.0 / M_PI;
    ROS_INFO("Roll: %f, Pitch: %f, Yaw: %f", roll, pitch, yaw);
}

int main(int argc,char *argv[])
{
    setlocale(LC_ALL, "");
    ros::init(argc,argv,"imu_node");
    printf("This is imu_node\n");

    ros::NodeHandle nh;
    ros::Subscriber imu_sub = nh.subscribe("/imu/data",10,IMUCallback);
    ros::spin();

    return 0;
}

运行ros
roscore

运行仿真环境
roslaunch wpr_simulation wpb_simple.launch

运行imu_node节点
rosrun imu_pkg imu_node

查看节点间的通信方式
rqt_graph
在这里插入图片描述

(1)偏航角Yaw(沿着Z轴的旋转方向)的观测

调整仿真机器人的位置和角度,
传感器读取的角度值为:Roll: -0.000097, Pitch: 0.000098, Yaw: 0.000002,单位是度
在这里插入图片描述当机器人向右旋转一定的角度的时候:
读取到IMU的欧拉角数值为:Roll: 0.000022, Pitch: 0.000144, Yaw: 53.769232
(旋转正方向由右手定则确定)
此时偏航角Yaw是53.8度(保留一位小数)
在这里插入图片描述

(2)横滚角ROLL(沿着X轴的旋转方向)的观测

将机器人向左侧倾斜:
读取到IMU的欧拉角数值为:Roll: -150.856759, Pitch: -7.867335, Yaw: 7.86
此时横滚角度为-150.9度(保留一位小数)
在这里插入图片描述

(3)俯仰角Pitch(沿着X轴的旋转方向)的观测

将机器人向正后方倾倒:
读取到IMU的欧拉角数值为:Roll: -89.735427, Pitch: 89.999940, Yaw: -84.293126
此时横滚角度为 -84.3度(保留一位小数)

在这里插入图片描述


总结

简单分析了IMU部分关键数据的组成与使用方法,通过仿真观测了机器人的欧拉角;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901976.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

世界酒中国菜与另可数字平台达成战略合作

世界酒中国菜与另可数字平台达成战略合作&#xff0c;共推行业发展新高度 近日&#xff0c;在行业内引起广泛关注的“世界酒中国菜”项目&#xff0c;与“另可”数字平台成功举行了战略合作签约仪式。这一重要合作不仅是双方发展历程中的重要里程碑&#xff0c;更是继世界酒中…

Ubuntu 22.04系统启动时自动运行ROS2节点

在 Ubuntu 启动时自动运行 ROS2 节点的方法 环境&#xff1a;Ubuntu 系统&#xff0c;ROS2 Humble&#xff0c;使用系统自带的 启动应用程序 目标&#xff1a;在系统启动时自动运行指定的 ROS2 节点 效果展示 系统启动后&#xff0c;自动运行小乌龟节点和键盘控制节点。 实践…

川渝地区软件工程考研择校分析

C哥专业提供——计软考研院校选择分析专业课备考指南规划 通过最新数据分析,5所高校软件工程专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南大学 对于想考川渝地区985但核心目标为优先上岸的考生,建议重点考虑西…

SSM学习day01 JS基础语法

一、JS基础语法 跟java有点像&#xff0c;但是不用注明数据类型 使用var去声明变量 特点1&#xff1a;var关键字声明变量&#xff0c;是为全局变量&#xff0c;作用域很大。在一个代码块中定义的变量&#xff0c;在其他代码块里也能使用 特点2&#xff1a;可以重复定义&#…

【玩儿】Java 数字炸弹小游戏(控制台版)+ IO 数据存储

Java 数字炸弹小游戏&#xff08;控制台版&#xff09; IO 数据存储 数字炸弹小游戏概述功能实现实体类User.java 玩家信息实体类GameRecode.java 游戏记录实体类 自定义异常AccountLockedException.java 账号锁定异常PasswordErrorException.java 密码错误异常UnknowAccountEx…

解决JeecgBoot微服务通过Gateway访问Swagger资源出现“Knife4j文档请求异常”

1.问题描述 基于jeecgboot单体版本,参照官方推荐的纯微服务项目拆分指南,对jeecgboot项目进行微服务拆分,将gateway和system模块启动成功后,通过gateway访问访问Swagger接口文档,出现“Knife4j文档请求异常”,如下图: 2.问题定位: 1.浏览器F12打开控制台,查看异常请…

RPKI路由应急管控系统---软件著作

RPKI路由应急管控系统V2.0 说明书 1.引言 1.1产品描述 软件名称&#xff1a;RPKI路由应急管控系统V2.0 简称&#xff1a;RPKI - QCL-V2.0 开发语言&#xff1a;Rust、Python、HTML、CSS、TypeScript 功能版本&#xff1a;V2.0 1.2开发背景及内容提要 随着互联网的快速发展…

gin入门教程(7): 使用 Logrus + Lumberjack 创建日志中间件

结合 Logrus 和 Lumberjack&#xff0c;可以创建一个高效的日志中间件&#xff0c;用于记录请求和响应。以下是实现步骤&#xff1a; 1. 安装依赖 首先&#xff0c;确保安装了 Logrus 和 Lumberjack&#xff1a; go get github.com/sirupsen/logrus go get gopkg.in/natefin…

基于Python大数据的王者荣耀战队数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

SpringBoot中yaml配置文件中文字符异常以及将多个独立的IDEA项目整合到一个项目里当做模块的处理

一、SpringBoot中yaml配置文件中文字符异常 在使用 SpringBoot 中 yaml 配置注入实体类中时&#xff0c;怎么注入都不成功&#xff0c;注入类的数据 yaml 如下。 schools:name: kermitgrades: 7students: 2050address: "中国北京" 报错如下&#xff1a; java.lang.I…

Linux 命令行学习:数据流控制、文本处理、文件管理与自动化脚本 (第二天)

目标&#xff1a;掌握更多命令行技巧和文本处理工具。 1. 管道和重定向 &#xff08;1&#xff09;输入输出重定向 输出重定向 (>)&#xff1a;将命令的输出写入到文件中&#xff0c;如果文件存在&#xff0c;则覆盖。 演示 &#xff1a; 输入重定向&#xff08;<&a…

解决电脑突然没有声音

问题描述&#xff1a;电脑突然没有声音了&#xff0c;最近没有怎么动过系统&#xff0c;没有安装或者卸载过什么软件&#xff0c;也没有安装或者卸载过驱动程序&#xff0c;怎么就没有声音了呢&#xff1f; 问题分析&#xff1a;仔细观察&#xff0c;虽然音量按钮那边看不到什…

基于Arduino的LED亮灭按键控制

一、项目简介 通过一个按键控制LED的亮灭&#xff0c;实现按键按一下LED点亮&#xff0c;再按一下LED熄灭&#xff0c;交替循环。 二、控制原理 1. 按键检测原理&#xff1a; 将Arduino的监测端口设置为输入上拉模式&#xff08;INPUT_PULLUP&#xff09;&#xff0c;用于连…

初始JavaEE篇——多线程(4):生产者-消费者模型、阻塞队列

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势&#xff1a;生产者—消费者模型的劣势&#xff1a; Java标准库中的阻…

【vue3|第29期】Vue3中的插槽:实现灵活的组件内容分发

日期&#xff1a;2024年10月24日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉在这里插入代码片得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不…

多款云存储平台存在安全漏洞,影响超2200万用户

据苏黎世联邦理工学院研究人员Jonas Hofmann和Kien Tuong Turong的发现&#xff0c;端到端加密&#xff08;E2EE&#xff09;云存储平台存在一系列安全问题&#xff0c;可能会使用户数据暴露给恶意行为者。在通过密码学分析后&#xff0c;研究人员揭示了Sync、pCloud、Icedrive…

docker中部署mysql时一直报Get“http://“

原因是使用阿里镜像是网速过慢的问题 解决方式&#xff1a;重新配置镜像 j解决docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“: net/http: request canc-CSDN博客

深度学习--CNN实现猫狗识别二分类(附带下载链接, 长期有效)

1. 代码实现(包含流程解释) 样本量: 8005 # # 1.导入数据集(加载图片)数据预处理# 进行图像增强, 通过对图像的旋转 ,缩放,剪切变换, 翻转, 平移等一系列操作来生成新样本, 进而增加样本容量, # 同时对图片数值进行归一化[0:1] from tensorflow.keras.preprocessing.image …

2024/10/27周报

文章目录 摘要Abstract深度学习预测进出水水质使用UCI机器学习库中的水处理数据集代码描述具体代码示例实验结果 智能比对示例数据示例比对步骤Python 代码示例结果解读应用场景 总结改进建议 摘要 本周对南宁伶俐工业园区污水处理厂进行调研&#xff0c;了解了该污水处理厂的…

H5实现PDF文件预览,使用pdf.js-dist进行加载

H5实现PDF文件预览&#xff0c;使用pdf.js-dist进行加载 一、应用场景 在H5平台上预览PDF文件是在原本已经开发完成的系统中新提出的需求&#xff0c;原来的系统业务部门是在PC端进行PDF的预览与展示&#xff0c;但是现在设备进行了切换&#xff0c;改成了安卓一体机进行文件…