IMU参数辨识及标定

news2024/11/20 16:05:44

IMU参数辨识及标定

、标定参数分析

        标定的本质是参数辨识。首先明确哪些参数可辨识,其次弄清怎样辨识。

        参数包括陀螺仪和加速度计各自的零偏、标度因数、安装误差。

  • IMU需要标定的参数主要是确定性误差随机误差,确定性误差主要标定biasscalemisalignment,随机误差主要标定noiserandom walkkalibr_allan 是用于求取随机误差的开源工具。

可以中英对照 

1.参数项

1) 零偏

        这个比较好理解,就是输出比输入多了一个常值误差。

        需要注意的是,通过Allan方差分析,得到了器件的量化噪声、角度随机游走、角速率随机游走、零偏不稳定性噪声、速率斜坡,仔细看,这些都是对零偏质量的分析,也可以直观的理解为零偏的波动和漂移程度,这里面并没有分析零偏本身的大小,而这个才是我们标定里要去估计的那个常值误差。

                加速度计的零偏在这里表示为

        陀螺仪的零偏在这里表示为

2) 标度因数误差

        也叫刻度因数误差。假设器件输出的是标准单位角速度(rad/s),那么输出和输入的比就是1。如果不是,就得需要标定,修正这个比例。

        加速度计的标度因数这里表示如下:

        陀螺仪的标度因数这里表示为:

  1. 修改配置文件

        进入之前编译好的imu_utils文件夹下xxxx.launch文件(自己添加的)查看相关设置:

3) 安装误差

        这里面b坐标系是正交的imu坐标系,g坐标系的三个轴是分别对应三个陀螺仪。由于加工工艺原因,陀螺仪的三个轴并不正交,和我们导航中使用的正交轴不重合。我们需要仔细想一想,这个安装误差怎么在陀螺输出中体现出来的,因为我们标定时只能采集到陀螺的输出,而无法直接去测量安装误差。理论上,在陀螺坐标轴和b系重合的情况下,我们沿b系某一个坐标轴旋转,那么其他两个轴是不会有角速度输出的,而有了安装误差以后,便有了输出,据此,我们就可以建立输出和误差之间的关系了。以图中一项误差为例,Sgxy表示的就是y轴的单位输入,在x陀螺上由安装误差造成的输出。由此,我们可以把所有的安装误差都成矩阵形式,即:

        加速度计的安装误差原理和它一样,直接给出公式。

        这样一共有12项安装误差参数。有的时候,可以简化为9项,具体什么情况下简化,以及怎样简化,我们会在本文的后面讲。

2)启动launch文件

source devel/setup.bash

roslaunch imu_utils xxxx.launch

2. 误差模型

        通过上面的参数分析,我们已经可以很容易地写出误差模型了。

        陀螺仪:

        其中W是陀螺输出,ω是各坐标轴真实输入。该公式的展开形式为

        同理,可以得到加速度计的展开形式为:

二、利用imu_utils 标定IMU参数

        imu_utils是用于求取IMU随机误差的开源工具。

1. 下载imu_utils和code_utils

imu_utils下载地址为:GitHub - gaowenliang/imu_utils: A ROS package tool to analyze the IMU performance.
code_utils下载地址为:GitHub - gaowenliang/code_utils: my code utils

注意:

1、全局安装ceres库,code_imu依赖ceres

2、不要同时把imu_utilscode_utils一起放到src下进行编译。由于imu_utils依赖code_utils,所以先把code_utils放在工作空间的src下面,进行编译。然后再将imu_utils放到src下面,再编译。

2. 安装依赖并编译

sudo apt-get install libdw-dev

 2.1 编译code_utils
2.2 安装Ceres

Ubuntu20.04安装Ceres1.14.0 - 知乎

2.3 构建工作空间编译code_utils

问题:

sumpixel_test.cpp文件

问题1修改#include "backward.hpp"为 #include“code_utils/backward.hpp”

问题2

解决:添加头文件:#include"opencv2/imgcodecs/legacy/constants_c.h"

问题3

解决:V_MINMAX 改为 NORM_MINMAX

mat_io_test.cpp文件

问题:

解决:

opencv4.x以上,有些宏,API名字改了,需要改为新的:

CV_LOAD_IMAGE_UNCHANGED 改为 cv::IMREAD_UNCHANGED

CV_LOAD_IMAGE_GRAYSCALE 改为 cv::IMREAD_GRAYSCALE

CV_LOAD_IMAGE_COLOR 改为 cv::IMREAD_COLOR

CV_LOAD_IMAGE_ANYDEPTH 改为 cv::IMREAD_ANYDEPTH

3 imu_utils编译

文件结构:

        将 ROS 包imu_utils放入code_utils的工作区src下面进行编译使用catkin_make;进行构建

        CMakeLists.txt文件下

        代码修改如下:

修改set(CMAKE_CXX_FLAGS "-std=c++11")为set(CMAKE_CXX_FLAGS "-std=c++14")

4 播放bag文件,进行离线标定IMU(使用imu_utils计算allan方差)

4.1 播放rosbag

rosbag play -r 200 imu.bag               // 200 倍速播放rosbag

4.2 运行标定文件

source ./devel/setup.bash

roslaunch imu_utils gh5a5s1.launch

注意:等rosbag播放两秒左右在启动launch文件,因为在IMU前几分钟录制的数据误差比较大。

4.3 标定结果

        数据包播放结束之后,在/imu_utils/data/这个文件夹下会出现一系列的参数文件,如上图所示。

        打开xxxx_imu_param.yaml这个文件,会看到计算出来的噪声和随机游走的系数值,如下所示:

        虽然我们得到了标定结果,但这个标定结果并不是我们最终的结果。现在得到的结果的单位是rad/s和m/s^2,噪声是个能量概念或者说功率概念,我们还要把标定得到的参数归一化到每单位sqrt(hz)尺度下,即/aqrt(Hz)。

        加速度allan方差图

        加速度每个轴的allan方差

        陀螺的allan方差

        陀螺每个轴的allan方差

有时候播放完数据,程序没有任何反映。试试300rete 播放。

三、 利用kalibr_allan标定IMU随机误差

        该方法需要安装Matlab,才能编译kalibr_allan。

1. 下载kalibr_allan并编译

        问题:

        在/kalibr_allan-master/bagconvert/cmake目录下找到FindMatlab.cmake文件,更改matlab的地址。

find_program(MATLAB_EXE_PATH matlab

    PATHS /usr/local/MATLAB/R2018a/bin)

        把 /usr/local/MATLAB/R2018a/bin更换成自己matlab的地址

        修改之后,删除build和dev文件夹,再次catkin_make

2. 生成mat文件

        rosrun bagconvert bagconvert bag名字 topic名字

3. matlab计算IMU误差

        利用/kalibr_allan/matlab/SCRIPT_allan_matparallel.m生成误差文件。

生成误差的.m文件:

注意:修改路径,最好改为绝对路径

/kalibr_allan/matlab/SCRIPT_allan_matparallel.m

4. 绘制allan方差曲线

4.1 运行/kalibr_allan/matlab/SCRIPT_process_results.m文件

修改路径mat_path的路径修改为步骤3中得到的.mat文件

4.2 标定结果

accelerometer_noise_density = 0.00102011

accelerometer_random_walk   = 0.00003924

gyroscope_noise_density     = 0.00001248

gyroscope_random_walk       = NaN

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

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

相关文章

多线程学习-线程池

目录 1.线程池的作用 2.线程池的实现 3.自定义创建线程池 1.线程池的作用 当我们使用Thread的实现类来创建线程并调用start运行线程时,这个线程只会使用一次并且执行的任务是固定的,等run方法中的代码执行完之后这个线程就会变成垃圾等待被回收掉。如…

AcWing2069.网格分析

【题目链接】2069. 网络分析 - AcWing题库 输入样例1&#xff1a; 4 8 1 1 2 2 1 10 2 3 5 1 4 1 2 2 2 1 1 2 1 2 4 2 2 1输出样例1&#xff1a; 13 13 5 3 【代码及详细注释】 #include<bits/stdc.h> using namespace std; const int N1e510; int n,m,p[N],d[N]; /…

数据结构初阶:顺序表和链表

线性表 线性表 ( linear list ) 是 n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串 ... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性…

阿里巴巴蔡崇信:中国AI追赶神速,制造业霸主地位无可撼动!

快科技4月5日讯&#xff0c;阿里巴巴集团创始人兼董事长蔡崇信近日就AI技术领域及全球制造业形势发表看法。他认为&#xff0c;尽管中国在AI技术方面与美国有一定差距&#xff0c;但中国的追赶速度非常快。 AI-321 | 专注于AI工具分享的网站 AI工具集 | 人工智能工具箱 | 全球…

xss.pwnfunction-Jefff

在eval中可以直接执行命令所以直接把"直接闭合在结尾再加上一个"因为后面的"没闭和会报错 ?jeffa";alert(1);" 或 ?jeffa"-alert(1)-" -是分隔符

C++从入门到精通——类的定义及类的访问限定符和封装

类的定义及类的访问限定符和封装 前言一、类的定义类的两种定义方式成员变量命名规则的建议示例 二、类的访问限定符和封装访问限定符访问限定符说明C为什么要出现访问限定符例题 封装例题 前言 类的定义是面向对象编程中的基本概念&#xff0c;它描述了一类具有相同属性和方法…

【精品教程】护网HVV实战教程资料合集(持续更新,共20节)

以下是资料目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a; 01-HW介绍.zip 02-HTTP&Burp课程资料.zip 03-信息收集_3.zip 04-SQL注入漏洞_2.zip 05-命令执行漏洞.zip 06-XSS漏洞.zip 07-CSRF.zip 08-中间件漏洞.zip 09-SSRF.zip 10-XXE.zip 11-Java反序列…

Seata(分布式事务集成测试和总结)

文章目录 1.集成测试1.集成测试正常下单1.步骤2.浏览器访问 http://localhost:10008/order/save?userId666&productId1&nums1&money1003.注意事项和细节 2.集成测试模拟异常1.步骤1.com/sun/springcloud/controller/StorageController.java 休眠12s&#xff0c;模…

【项目新功能开发篇】需求分析和开发设计

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

揭秘rmallox病毒:防范、清除、恢复一步到位!

引言&#xff1a; 随着信息技术的快速发展&#xff0c;计算机病毒已成为网络安全领域的一大难题。其中&#xff0c;rmallox病毒是近年来备受关注的一种恶意软件。本文将深入探讨rmallox病毒的特性、传播途径、防范措施、清除方法以及数据恢复技巧&#xff0c;帮助读者全面了解这…

Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏,无法打开。您应该将它移到废纸篓

应该是保姆级教程了&#xff1a; Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏&#xff0c;无法打开。您应该将它移到废纸篓。 我下载的是 Sublime Text 3 for Mac中文直装版&#xff0c;https://www.32r.com/soft/38404.html 安装后打开就gg了&#xff1a; 表现…

【图论】【分类讨论】LeetCode3017按距离统计房屋对数目

本文涉及的知识点 图论 分类讨论 本题同解 【差分数组】【图论】【分类讨论】【整除以2】3017按距离统计房屋对数目 LeetCode3017按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中&#xff0c;存在编号从 1 到 n 的房屋&#xff0c;由 n 条街道相连。对所有 …

2024最新Notepad++下载安装教程图文步骤演示

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 文章目录 &#x1f42f;2024最新Notepad下载安装教程图文步骤演示&#x1f4dd;摘要引言正文&#x1f4d8;Notepad简介&#x1f4e5;下载Notepad&#x1f4e6;安装教程1. 获取安装…

2024HW-->Wireshark攻击流量分析

在HW中&#xff0c;最离不开的&#xff0c;肯定是看监控了&#xff0c;那么就要去了解一些wireshark的基础用法以及攻击的流量&#xff01;&#xff01;&#xff01;&#xff01; 1.Wireshark的基本用法 比如人家面试官给你一段流量包&#xff0c;你要会用 1.分组详情 对于我…

深入理解Java异常处理机制(day20)

异常处理 异常处理是程序运行过程产生的异常情况进行恰当的处理技术 在计算机编程里面&#xff0c;异常的情况比所我们所想的异常情况还要多。 Java里面有两种异常处理方式&#xff1b; 1.利用trycatchfinaly语句处理异常&#xff0c;优点是分开了处理异常代码和程序正常代码…

Android自定义view;实现掌阅打开书籍动画效果

这里利用自定义view的方式来处理&#xff0c;初始化数据&#xff0c;camera通过setLocation调整相机的位置&#xff0c;但是Camera 的位置单位是英寸&#xff0c;英寸和像素的换算单位在 Skia 中被写成了72 像素&#xff0c;8 x 72 576&#xff0c;所以它的默认位置是 (0, 0, …

STL--deque

deque 容器deque是一个双向队列&#xff08;double-ended queue&#xff09;&#xff0c;可以在队列的两端进行元素的插入和删除操作。deque 和 vector 非常相似。也采用dynamic array(动态数组) 来管理元素&#xff0c;提供随机访向&#xff0c;并有着和 vector 几乎一模一样…

jenkins+docker实现可持续自动化部署springboot项目

目录 一、前言 二、微服务带来的挑战 2.1 微服务有哪些问题 2.2 微服务给运维带来的挑战 三、可持续集成与交付概述 3.1 可持续集成与交付概念 3.1.1 持续集成 3.1.2 持续交付 3.1.3 可持续集成与交付核心理念 3.2 可持续集成优点 3.3 微服务为什么需要可持续集成 四…

anaconda虚拟环境安装apex0.1教程win10

我安装apex0.1的环境是&#xff1a;torch&#xff08;gpu&#xff09;1.8.0&#xff0c;cuda10.2&#xff0c;cuda7.6.5。 第一步&#xff1a;下载对应的pytorch、cuda、cudnn版本 这里就不详细介绍了&#xff0c;具体可以参考我的这篇博文win10中anaconda创建虚拟环境配置py…

Redis(性能管理、主从复制、哨兵模式)概述及部署

目录 一、性能管理 1、查看Redis内存使用 2、内存碎片率 3、跟踪内存碎片率 4、内存使用率 5、内回收key 二、Redis集群有三种模式 三、Redis主从复制 1、主从复制的概念 2、主从复制的作用 3、主从复制的流程 4、搭建Redis主从复制 1.环境准备 2.安装Redis&#…