ROS中IMU惯性测量单元

一、IMU惯性测量单元消息包

IMU 是安装在机器人内部的一种传感器模块,用于测量机器人的空间姿态。

IMU的消息包定义在sensor_msgs包中的Imu中。头部是header,记录了消息发送的时间戳和坐标系ID。第二个是角速度。第三个是矢量加速度。三个数据成员都各自有一个协方差矩阵,主要用于后期的优化和滤波。

角速度:在x、y、z三个轴上的旋转角速度。矢量加速度:在x、y、z三个轴上的加速度。总共有6个数值,所以叫六轴IMU。另外还有一些IMU模块,额外提供了XYZ三个轴向的磁强计输出,就变成了九轴IMU。磁强计数据在ROS中有专门的消息格式,并没有包含在这个IMU消息包中。

角速度、矢量加速度这六个数值,都是IMU传感器直接测量到的数值,我们称之为裸数据。为了方便用户使用,IMU模块通常还会输出一个根据上述数值融合得到的空间姿态描述,也就是第一个数值orientation,它描述的是机器人朝向相对于空间中XYZ三个坐标轴的偏移量。

如果对消息包中IMU解算的这个orientation结果不满意,或者有其他的特殊需求,可以自行根据裸数据进行姿态信息的融合。这个orientation是一个Quaternion类型的数值,可以看到这是一个包含了xyzw四个数值的数据结构。

明明是相对于XYZ三个轴的旋转偏移量,怎么会整出四个值来?这是因为基于XYZ三个轴的旋转偏移量的描述,也就是欧拉角描述,在某些姿态下会存在一种叫做万向锁的问题。所以一位聪明的数学家发明了这种叫做Quaternion 的方法,也就是我们现在看到的,使用xyzw四个值来描述机器人朝向的方法,也叫做四元数描述法,有效的避免了万向锁问题。在实际的应用中,四元数描述法通常只在进行旋转变换的过程中使用,旋转后得到的结果,还是会转换成欧拉角来进行处理。

二、获取IMU数据的C++节点

为了获取IMU的数据,我们必须知道IMU数据格式,以及话题名称。IMU数据格式在上一节中具体讲述过。话题名称依据ROS的官方标准,分为以下三种。第一种只输出裸数据;第二种输出裸数据+orientation;第三输出磁强计数据(只有九轴IMU才会有)。

实现步骤:

step1:创建工作空间,创建imu_pag功能包。记得加入sensor_msgs依赖包。

step2:在功能包的src子目录中创建节点。

step3:需要使用tf工具来完成将四元数转换成欧拉角,所以要包含tf的头文件。main函数中第一行代码:将locale设置为当前的中文环境,避免显示的中文变成乱码。

step4:编写回调函数。第7行:判断imu数据是否存在。第9行:使用TF工具将四元数转换成欧拉角,需要将消息包里的四元数转换成tf的四元数对象。第16行:定义三个变量准备用来装载转换后的欧拉角结果。第17行:将quaternion对象转换成一个tf的3x3矩阵对象,然后调用矩阵对象的getRPY函数,这个RPY就是roll滚转pitch俯仰和yaw航向角的缩写,将其转换成欧拉角。第18行:这时候三个欧拉角变量里的数值单位是弧度,将其转换成360°的角度值。

step4:给这个节点设置编译规制,打开CMakeList.txt文件,找到build块,添加以下三行代码。

step5:编译+运行。

三、获取IMU数据的python节点

实现步骤:

step1:创建工作空间,新建功能包,创建python脚本。

step2:编写代码

step3:chmod添加可执行权限,运行。 

四、IMU航向锁定的C++节点

让一个节点在订阅IMU数据的同时,还发布运动控制指令,使机器人能对姿态的变化做出反应,实现一个航向锁定的效果。我们可以直接在前面实验的程序上做修改,在此基础上,只需要把运动控制的部分内容也加进来就行了。

实现步骤:

step1:定义一个发布对象vel_pub,因为这个vel_pub一会我们要在main主函数和回调函数里都要用到,所以这里把它定义为一个全局对象,然后在主函数里对这个vel_pub进行初始化。

回调函数中,我们已经拿到IMU输出的机器人的当前朝向角yaw,我们再定义一个目标朝向角
target_yaw,然后定义一个差值变量diff _angle。再定义一个速度消息包,准备开始进行机器人的运动控制。


step2:编译+运行。

五、IMU航向锁定的python节点

step1:在头文件中加入速度控制消息包Twist。直接在main主函数中声明一个发布者对象。在回调函数中,将这个发布对象声明为全局变量(必须有这一步,否则会将vel_pub变成局部变量)。

step2:保存+运行。

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

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

相关文章

机器学习每周挑战——旅游景点数据分析

数据的截图,数据的说明: # 字段 数据类型 # 城市 string # 名称 string # 星级 string # 评分 float # 价格 float # 销量 int # 省/市/区 string # 坐标 string # 简介 string # 是否免费 bool # 具体地址 string拿到数据…

Godot 4 教程《勇者传说》依赖注入 学习笔记(0):环境配置

文章目录 前言相关地址环境配置初始化环境配置文件夹结构代码结构代码运行 资源文件导入像素风格窗口环境设置背景设置,Tileap使用自动TileMap 人物场景动画节点添加站立节点添加移动动画添加 通过依赖注入获取Godot的全局属性项目声明 当前项目逻辑讲解角色下降添加代码位置问…

MCGS学习——水位控制

要求 插入一个水罐,液位最大值为37插入一个滑动输入器,用来调节水罐水位,滑动输入器最大调节为液位最大值,并能清楚的显示出液位情况用仪表显示水位变化情况,仪表最大显示设置直观清楚方便读数,主划线为小…

CAJViewer8.1下载地址及安装教程

CAJViewer是中国学术期刊(CAJ)全文数据库的专用阅读软件。CAJViewer是中国知识资源总库(CNKI)开发的一款软件,旨在方便用户在线阅读和下载CAJ数据库中的学术论文、期刊和会议论文等文献资源。 CAJViewer具有直观的界面…

Linux系统——Mysql数据库锁的拓展

目录 一、锁的概述 二、锁的分类 1.按锁粒度分类 2.按性能分类 3.按对数据库操作类型 三、全局锁 1.定义 2.操作 3.特点 四、表级锁 1.表级锁分类 2.表锁分类 2.1表共享读锁(read lock) 2.2表独占写锁(write lock) …

随便注【强网杯2019】

大佬的完整wp:buuctf-web-[强网杯 2019]随便注-wp_取材于某次真实环境渗透,只说一句话:开发和安全缺一不可-CSDN博客 知识点: 单引号字符型绕过堆叠注入 可以执行多条语句multi_query():该函数可能引发堆叠注入handler用法 mysql专属&#…

计算机基础系列 —— 虚拟机代码翻译器(2)

I believe that at the end of the century the use of words and general educated opinion will have altered so much that one will be able to speak of machines thinking without expecting to be contradicted. —— Alan Turing 文中提到的所有实现都可以参考&#xf…

【MATLAB源码-第173期】基于matlab的RS编码的2FSK通信系统误码率仿真,通过AWGN信道输出误码率曲线。

操作环境: MATLAB 2022a 1、算法描述 通信系统的基本框架 在现代通信系统中,数据的传输通常涉及四个基本步骤:源编码、信道编码、调制和传输。源编码主要负责压缩数据,减少传输的数据量。信道编码则通过添加冗余信息来提高传输…

【Blockchain】区块链浏览器 | 以太坊Etherscan比特币Blockchain门罗币Monero

区块链浏览器概述 区块链浏览器是一种软件,它使用API(应用程序编程接口)和区块链节点从区块链中提取各种数据,然后使用数据库来排列搜索到的数据,并以可搜索的格式将数据呈现给用户。 用户的输入是资源管理器上的可搜索项,然后通过数据库上…

【力扣hot100】128-最长连续序列、283-移动零

128. 最长连续序列 import java.util.*;public class Test {public static void main(String[] args) {int[] nums {0, 3, 7, 2, 5, 8, 4, 6, 0, 1};int res new Solution().longestConsecutive(nums);System.out.println(res);} }class Solution {public int longestConsecu…

3.31学习总结

算法 解题思路 使用dfs,对蛋糕每层可能的高度和半径进行穷举.通过观察我们可以知道第一层的圆面积是它上面所有蛋糕层的圆面积之和,所以我们只要去求每层的侧面积就行了. 因为题目要求Ri > Ri1且Hi > Hi1,所以我们可以求出每层的最小体积和侧面积,用两个数组分别储存起来…

教你一键轻松领取阿里云优惠券

随着云计算的普及,越来越多的企业和个人开始选择使用云服务。阿里云作为国内领先的云计算服务提供商,以其稳定、高效、安全的服务赢得了广大用户的信赖。为了吸引用户上云,阿里云推出了优惠券活动,本文将教大家如何一键领取阿里云…

【Linux】深入理解进程状态、优先级和调度:Linux 内核中的实现原理探析

文章目录 前言1. 进程状态1.1. 轻量进程排队这件事情——队列1.2. 进程状态的表述及其影响:1.3. 挂起状态及处理:1.4.理解 Linux 内核源代码中的状态表述: 2. 进程优先级Linux 为什么要调整优先级是要受限的? 3. Linux的调度与切换…

Typora下载激活方案

一、下载 1.在typora官网下载最新版本,并安装: 官网地址 2.获取激活工具 感谢Typora激活方法(2023年最新版) - AI小智的文章 - 知乎 https://zhuanlan.zhihu.com/p/669618741 二、激活 1.把两个.exe文件复制到typora安装目录下 2.在typor…

ubuntu下给不同串口设置别名

目录 一、绑定设备ID 1.查看设备ID 2.编写usev规则 3.重新加载usev规则 4.查看 二、绑定USB端口号 1.先插入一个串口,查看USB设备信息 2.查看USB转串口信息 3.编写usev规则 4.重新加载usev规则 5.查看 在Ubuntu环境下,有时候工控机或者arm开…

推挽输出与开漏输出

推挽输出与开漏输出 文章目录 推挽输出与开漏输出前言一、推挽输出二、开漏输出总结 前言 在使用GPIO口时,会遇到两种配置,一种叫推挽输出,一种叫开漏输出,今天就简聊一聊这两种模式的差异和选择。 一、推挽输出 如图所示&#…

Lazarus远控组件NukeSped分析

静态信息: 样本md5:9b656f5d7e679b94e7b91fc3c4f313e4 由此可见为假的Adobe Flash Player 的攻击样本 样本分析 通过五个函数,内部调用sub_40159D函数动态获取API函数 利用IDA python解密字符串。。 完整python代码 Python> idc.get_…

扫雷(蓝桥杯)

题目描述 小明最近迷上了一款名为《扫雷》的游戏。其中有一个关卡的任务如下, 在一个二维平面上放置着 n 个炸雷,第 i 个炸雷 (xi , yi ,ri) 表示在坐标 (xi , yi) 处存在一个炸雷,它的爆炸范围是以半径为 ri 的一个圆。 为了顺利通过这片土…

Mac air 个人免费版VMWare Fusion安装及配置教程

Mac air 安装免费版VMWare Fusion教程及问题解决 1、下载VMWare Fusion2、下载wins镜像文件3、开始配置4、出现的问题及解决方法4.1 如何跳过启动时的网络连接4.2 启动后,无法连接网络怎么办4.3 怎么实现将文件拖拽到虚拟机中 当你手上是一台Mac电脑,却需…

【博弈论3——二人博弈的纳什均衡】

1.俾斯麦海之战 2. 零和博弈的定义 零和博弈(Zero-Sum Game)是一种博弈论的基本概念,指的是在博弈过程中,博弈参与者之间的收益和损失之和总是一个常数,特别是总和为零。即博弈一方的收益必然等于另一方的损失&#x…