ROS中IMU惯性测量单元

news2024/11/25 3:42:36

一、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:保存+运行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习网络缝合模块学习

主干网络缝合模块------>缝模块对其通道数 1缝合模块只看通道数 2把模块复制到模型中 3在forward中查看通道数是多少 4在init中进行实例化,注意通道数是上一步forward的通道数 5在forward中加载init中的实例化 6模型实例化测试模块是否加入 模块和模块之前…

【OS探秘】【虚拟化】【软件开发】VirtualBox 虚拟化软件卸载和重装

往期OS系列博文: 【OS探秘】【虚拟化】【软件开发】在Windows 11上安装mac OS虚拟机 【OS探秘】【虚拟化】【软件开发】在Windows 11上安装Kali Linux虚拟机 一、事出有因 近日,笔者的Oracle VM VirtualBox突然抽风了,虚拟机无法启动&…

【Spring Security】 快速入门

文章目录 一、 身份认证Demo1、创建工程2、代码编写2.1、Controller2.2、Html2.3、application.properties配置 3、启动项目并访问 二、Spring Security 默认做了什么二、底层原理1.概述2.FiltersDelegatingFilterProxyFilterChainProxySecurityFilterChainSecurity Filters 三…

CAJViewer7.3 下载地址及安装教程

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

蓝桥杯刷题第五天(昨天刷了忘记更了)

思路: 用dp来记录最短消耗时间 dp[坐标][zhuangtai] 状态0表示在底部,状态1表示在传送门处; 先初始化dp[1][0] 和dp[1][1]然后循环遍历到dp[n][0] 和dp[n][1],用动态规划方程去赋值; ps:易错点在于要开…

正弦实时数据库(SinRTDB)的使用(8)-过滤查询

前文已经将正弦实时数据库的使用进行了介绍,需要了解的可以先看下面的博客: 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

目标伪类选择器

E:target选择匹配E的所哟元素&#xff0c;且匹配元素被相关url指向 鼠标点击右边京东秒杀跳转到京东秒杀div&#xff0c;并变成黄色 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&…

基于 FFmpeg 和 SDL 的音视频同步播放器

基于 FFmpeg 和 SDL 的音视频同步播放器 基于 FFmpeg 和 SDL 的音视频同步播放器前置知识音视频同步简介复习DTS、PTS和时间基 程序框架主线程解复用线程音频解码播放线程视频解码播放线程 音视频同步逻辑源程序结果工程文件下载参考链接 基于 FFmpeg 和 SDL 的音视频同步播放器…

js垃圾回收新生代和老生代以及堆栈内存详细

js 堆栈内存、新生代和老生代、垃圾回收详聊 要想了解JS内存管理就必须明白存这些js数据的内存又分为&#xff1a;栈内存和堆内存 一、 栈|堆内存(Stack|Heap) 栈(Stack)内存 原始值&#xff1a;Number、String、Boolean、Null、Undefined、Symbol和BigInt 栈内存主要存储原始…

Mac使用“Workstation”安装双系统

## 选择虚拟机 Mac推荐使用“VMware” 优点 1.个人版是免费的 2.界面清晰&#xff0c;运行流程 3.使用人群广&#xff0c;遇到问题容易解决 版本比较 VMware Workstation Pro 和 VMware Workstation Player 个人使用推荐 VMware Workstation Player &#xff0c;因为个人的…

安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 从0开始 工具操作解析【三】

同类博文; 安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析 安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析【二】-CSDN博客 回顾以往 在以前的博文简单介绍了这款工具的rom制作全程。今天针对这款工具的…

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

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

Chatgpt掘金之旅—有爱AI商业实战篇(二)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、前言&#xff1a; 成为一名商业作者是一个蕴含着无限可能的职业选择。在当下数字化的时代&#xff0c;作家们有着众多的平台可以展示和推广自己的作品。无论您是对写书、文…

hcip综合实验2

目录 实验拓扑&#xff1a; 实验要求&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 1.配置设备接口IP 2.通过配置缺省路由让公网互通 3.配置ppp 1.R1和R5间的ppp的PAP认证&#xff1b; 2.R2与R5之间的ppp的CHAP认证; 3. R3与R5之间的HDLC封装; 4.构建R1、…

mysql安装遇到的问题

最近mysql安装遇到了许多问题 这个界面是下载器界面&#xff0c;reconfigure是重新配置这个版本&#xff0c;要新安装要点add 进入这个界面选择对应的版本下载

向量点积的推导

1、余弦定理 2、二维点积 三、三维点积 用到第一个余弦定理

9.处理消息边界

网络编程中消息的长度是不太确定的&#xff0c;read方法读取字节数据到ByteBuffer中&#xff0c;ByteBuffer会有一个固定容量&#xff0c;单次超出容量的部分字节数据将会在下一次的ByteBuffer中&#xff0c;这样消息就会按照字节截断&#xff0c;出现消息边界问题。 Http 2.0 …

UE4_碰撞_碰撞蓝图节点——Line Trace For Objects(对象的线条检测)

一、Line Trace For Objects&#xff08;对象的线条检测&#xff09;&#xff1a;沿给定线条执行碰撞检测并返回遭遇的首个命中&#xff0c;这只会找到由Object types指定类型的对象。注意他与Line Trace By Channel(由通道检测线条&#xff09;的区别&#xff0c;一个通过Obje…

解决AD使用交互式BOM插件时,插入make点导致显示异常的问题

记得上次写了一篇关于使用这个插件时出现这个问题的解决方法&#xff0c;具体可查看&#xff1a;AD使用交互式BOM插件时应该注意到的一个问题_ad的bom插件-CSDN博客 当时的解决办法就是删除后再运行脚本生成&#xff0c;这些天经过多次实验&#xff0c;发现是当时那个封装有问…

ES的RestClient相关操作

ES的RestClient相关操作 Elasticsearch使用Java操作。 本文仅介绍CURD索引库和文档&#xff01;&#xff01;&#xff01; Elasticsearch基础&#xff1a;https://blog.csdn.net/weixin_46533577/article/details/137207222 Elasticsearch Clients官网&#xff1a;https://ww…