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

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

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

相关文章

从姿态估计到3D动画

在本文中,我们将尝试通过跟踪 2D 视频中的动作来渲染人物的 3D 动画。 在 3D 图形中制作人物动画需要大量的运动跟踪器来跟踪人物的动作,并且还需要时间手动制作每个肢体的动画。 我们的目标是提供一种节省时间的方法来完成同样的任务。 我们对这个问题…

C++数据类型(一):一文看懂引用的本质

一.引言 函数的参数传递方式主要有传值和传指针。 1.传值 在函数域中为参数分配内存&#xff0c;而把实参的数值传递到新分配的内存中。它的优点是有效避免函数的副作用。 例如&#xff1a; #include <iostream>void swap_val(int x,int y) {int tmp;tmp x;x y;y …

P6学习:Oracle Primavera P6 OBS/责任人解析

前言 Primavera P6 EPPM 责任人用于管理 P6 企业项目组合管理 (EPPM) 系统中的项目所有权和权限。 Primavera P6 EPPM 中的所有项目都至少围绕三个结构进行组织&#xff1a;称为企业项目结构 (EPS) 的用于组织项目的结构、称为工作分解结构 (WBS) 的用于组织项目内活动的结构…

08:HAL---通用定时器功能(输入捕获功能)

前言&#xff1a; 下面的以通用定时器为例&#xff0c;当然高级定时器具有通用定时器的全部功能 ICP1S&#xff1a;上面经过分频后的信号&#xff1b;这里的捕获指的是产生一个捕获事件。 一&#xff1a;输入捕获功能 1:简历 IC&#xff08;Input Capture&#xff09;输入…

Multi-task Lung Nodule Detection in Chest Radiographs with a Dual Head Network

全局头增强真的有用吗&#xff1f; 辅助信息 作者未提供代码

媒体偏见从何而来?--- 美国MRC(媒体评级委员会)为何而生?

每天当我们打开淘宝&#xff0c;京东&#xff0c;步入超市&#xff0c;逛街或者逛展会&#xff0c;各种广告铺天盖地而来。从原来的平面广告&#xff0c;到多媒体广告&#xff0c;到今天融合AR和VR技术的数字广告&#xff0c;还有元宇宙虚拟世界&#xff0c;还有大模型加持的智…

LangChain入门:2.OpenAPI调用ChatGPT模型

引言 在本文中&#xff0c;我们将带您深入探索如何通过OpenAPI与ChatGPT模型进行高效交互&#xff0c;实现智能文本问答功能。通过LangChain库的实践&#xff0c;您将学习构建一个能够与用户进行自然语言对话的系统的关键步骤。 准备步骤 在动手编码之前&#xff0c;请确保您…

八、大模型之Fine-Tuning(1)

1 什么时候需要Fine-Tuning 有私有部署的需求开源模型原生的能力不满足业务需求 2 训练模型利器Hugging Face 官网&#xff08;https://huggingface.co/&#xff09;相当于面向NLP模型的Github基于transformer的开源模型非常全封装了模型、数据集、训练器等&#xff0c;资源…

[Windows]修改默认远程端口3389

文章目录 注册表编辑器找到注册信息找到端口配置修改端口重启远程连接服务远程连接 因为不想使用windos默认远程3389端口&#xff0c;所以考虑换成其他的端口。保证安全&#xff08;虽然windows不是那么安全&#xff09;。 注册表编辑器 windos搜索注册表编辑器 找到注册信息…

网上国网App启动鸿蒙原生应用开发,鸿蒙开发前景怎么样?

从华为宣布全面启动鸿蒙生态原生应用一来&#xff0c;各种各样的新闻就没有停过&#xff0c;如&#xff1a;阿里、京东、小红书……等大厂的加入&#xff0c;而这次他们又与一个国企大厂进行合作&#xff1a; 作为特大型国有重点骨干企业&#xff0c;国家电网承担着保障安全、经…

HAL库 USART通讯

1、UASRT简介 串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式&#xff0c;因为它简单便捷&#xff0c;因此大部分电子设备都支持该通讯方式&#xff0c;电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 按位发送和接收的接口。如RS-232/422/…

C语言-文件操作

&#x1f308;很高兴可以来阅读我的博客&#xff01;&#x1f31f;我热衷于分享&#x1f58a;学习经验&#xff0c;&#x1f3eb;多彩生活&#xff0c;精彩足球赛事⚽&#x1f517;我的CSDN&#xff1a; Kevin ’ s blog&#x1f4c2;专栏收录&#xff1a;C预言 1. 文件的作用 …

【核弹级软安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件

Red Hat 发布了一份“紧急安全警报”&#xff0c;警告称两款流行的数据压缩库XZ Utils&#xff08;先前称为LZMA Utils&#xff09;的两个版本已被植入恶意代码后门&#xff0c;这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094&#xff0c;其CVS…

基于SSM远程同步课堂系统

基于SSM远程同步课堂系统的设计与实现 摘要 在这样一个网络数据大爆炸的时代&#xff0c;人们获取知识、获取信息的通道非常的多元化&#xff0c;通过网络来实现数据信息的获取成为了现在非常常见的一种方式&#xff0c;而通过网络进行教学&#xff0c;在网络上进行远程的课堂…

vue3 视频播放功能整体复盘梳理

回顾工作中对视频的处理&#xff0c;让工作中处理的问题的经验固化成成果&#xff0c;不仅仅是完成任务&#xff0c;还能解答任务的知识点。 遇到的问题 1、如何隐藏下载按钮&#xff1f; video 标签中的controlslist属性是可以用来控制播放器上空间的显示&#xff0c;在原来默…

视觉里程计之对极几何

视觉里程计之对极几何 前言 上一个章节介绍了视觉里程计关于特征点的一些内容&#xff0c;相信大家对视觉里程计关于特征的描述已经有了一定的认识。本章节给大家介绍视觉里程计另外一个概念&#xff0c;对极几何。 对极几何 对极几何是立体视觉中的几何关系&#xff0c;描…

LeetCode刷题【链表,图论,回溯】

目录 链表138. 随机链表的复制148. 排序链表146. LRU 缓存 图论200. 岛屿数量994. 腐烂的橘子207. 课程表 回溯 链表 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节…

搜索与图论——Floyd算法求最短路

floyd算法用来求多源汇最短路 用邻接矩阵来存所有的边 时间复杂度O(n^3) #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 20010,INF 1e9;int n,m,k; int g[N][N];void floyd(){for(int k 1;k < n;k ){f…

C++从入门到精通——引用()

C的引用 前言一、C引用概念二、引用特性交换指针引用 三、常引用保证值不变权限的方法权限的放大权限的缩小权限的平移类型转换临时变量 四、引用的使用场景1. 做参数2. 做返回值 五、传值、传引用效率比较值和引用的作为返回值类型的性能比较 六、引用和指针的区别引用和指针的…

AI算法中的关键先生 - 反向转播与戴维莱姆哈特

0. 引言 机器学习的自动推导过程中有一个关键步骤&#xff0c;就是自动求解过程的参数反向传播过程&#xff0c;这个工作据说是这个人做的&#xff1a; Remembering David E. Rumelhart (1942-2011) – Association for Psychological Science – APSAPS Fellow and Charter …