【IMU】 椭球拟合标定加计Bias、Scale

椭球拟合简介

MESE IMU中,x,y,z轴的度量单位并不相同,假设各轴之间相互直。

加计静止状态(也就是只受重力的状态下),各个姿态只受重力的,x,y,z轴值(假设x,y,z轴相互垂直并且度量单位都一致,如三轴的度量单位都是2000(1g),量程固定的情况下),在三维空间中,重力点都在一个球面上,但各轴之间的度量单位都会有偏差,所以各姿态重力点都落在一个椭球面上,椭球的中心,就是加速度的偏移量,也就是校准值。

图1为标定原理公式

第一个椭球公式A、B、C,X0、Y0、Z0对应:Scale参数(比例因子)、Bias参数。

图1

令E对于a,b,c,d,e,f的各一阶偏导数等于0,通过求解偏导数方程组,得到a,b,c,d,e,f参数。进而得到A、B、C(Scale参数,比例因子),X0、Y0、Z0(Bias参数)。A、B、C,X0、Y0、Z0对应第一个椭球公式。

详细的展开数学原理以及偏导公式请参考:空间二次曲面数据拟合算法推导及仿真分析。

实测分析

采集19组加计静止数据。椭球拟合-标定加计(bias、scale)结果如图2所示:

可见加计静止数据恰好拟合成椭球面。

拟合数据分析:

1、采用加计输出模值应为重力加速度为评价标准。

rawData = 1.001998g

fitData = 1.00000g

2、补偿误差为 0.001998 * 9.8035 = 0.019587m/s2


19组加计静止数据如下:

ax	ay	az
-17.538	25.758	2006.695
-1997.923	-27.4	-25.143
-18.408	26.256	2006.927
-555.95	16.058	1925.793
-46.025	384.178	1969.542
37.619	-507.349	-1938.779
11.991	450.054	-1956.484
583.968	59.653	-1916.821
-313.098	-22.123	-1982.363
-16.711	26.097	2006.502
-13.122	-409.013	1963.334
581.886	-28.452	1921.501
-12.521	433.975	1959.581
30.725	-1985.632	211.399
-30.957	1991.537	198.426
-1998.108	-25.868	-3.205
-1970.602	-311.407	99.16
-1973.875	312.339	36.82
802.364	-92.147	1837.896

椭球拟合matlab代码如下:

clear all;
close all
clc;mat_path = './Fit.csv';fprintf('opening the mat file.\n')
data_imu = csvread(mat_path);imu_ax = data_imu(:,1);
imu_ay = data_imu(:,2);
imu_az = data_imu(:,3);
##deta_T = data_imu(:,9);x = imu_ax(1:1:end);
y = imu_ay(1:1:end);
z = imu_az(1:1:end);%转换成一维的数组便于后续的处理
##x = [87 301 274 312 -3805 4389 261 327 -1963 3024];
##y = [-52 -45 4088 -4109 -24 6 2106 -2047  -13 18];
##z = [-4454 3859 -303 -305 -390 -228 -3848 -3880 -3797 -3449];figure;
plot3(x,y,z,'r*');
hold on;
##string = ['加入噪声的椭球面数据,SNR=',num2str(SNR),'dB'];
title('Ellipsoid Specific Fitting');%*******************************************************************************************
%空间二次曲面拟合算法
num_points = length(x);
%一次项统计平均
x_avr = sum(x)/num_points;
y_avr = sum(y)/num_points;
z_avr = sum(z)/num_points;
%二次项统计平均
xx_avr = sum(x.*x)/num_points;
yy_avr = sum(y.*y)/num_points;
zz_avr = sum(z.*z)/num_points;
xy_avr = sum(x.*y)/num_points;
xz_avr = sum(x.*z)/num_points;
yz_avr = sum(y.*z)/num_points;
%三次项统计平均
xxx_avr = sum(x.*x.*x)/num_points;
xxy_avr = sum(x.*x.*y)/num_points;
xxz_avr = sum(x.*x.*z)/num_points;
xyy_avr = sum(x.*y.*y)/num_points;
xzz_avr = sum(x.*z.*z)/num_points;
yyy_avr = sum(y.*y.*y)/num_points;
yyz_avr = sum(y.*y.*z)/num_points;
yzz_avr = sum(y.*z.*z)/num_points;
zzz_avr = sum(z.*z.*z)/num_points;
%四次项统计平均
yyyy_avr = sum(y.*y.*y.*y)/num_points;
zzzz_avr = sum(z.*z.*z.*z)/num_points;
xxyy_avr = sum(x.*x.*y.*y)/num_points;
xxzz_avr = sum(x.*x.*z.*z)/num_points;
yyzz_avr = sum(y.*y.*z.*z)/num_points;%计算求解线性方程的系数矩阵
A0 = [yyyy_avr yyzz_avr xyy_avr yyy_avr yyz_avr yy_avr;yyzz_avr zzzz_avr xzz_avr yzz_avr zzz_avr zz_avr;xyy_avr  xzz_avr  xx_avr  xy_avr  xz_avr  x_avr;yyy_avr  yzz_avr  xy_avr  yy_avr  yz_avr  y_avr;yyz_avr  zzz_avr  xz_avr  yz_avr  zz_avr  z_avr;yy_avr   zz_avr   x_avr   y_avr   z_avr   1;];
%计算非齐次项
b = [-xxyy_avr;-xxzz_avr;-xxx_avr;-xxy_avr;-xxz_avr;-xx_avr];resoult = inv(A0)*b;
%resoult = solution_equations_n_yuan(A0,b);x00 = -resoult(3)/2;                  %拟合出的x坐标
y00 = -resoult(4)/(2*resoult(1));     %拟合出的y坐标
z00 = -resoult(5)/(2*resoult(2));     %拟合出的z坐标AA = sqrt(x00*x00 + resoult(1)*y00*y00 + resoult(2)*z00*z00 - resoult(6));   % 拟合出的x方向上的轴半径
BB = AA/sqrt(resoult(1));                                                    % 拟合出的y方向上的轴半径
CC = AA/sqrt(resoult(2));                                                    % 拟合出的z方向上的轴半径fprintf('拟合结果\n');
fprintf('a = %f, b = %f, c = %f, d = %f, e = %f, f = %f\n',resoult);
fprintf('x0 = %f\n',x00);
fprintf('y0 = %f\n',y00);
fprintf('z0 = %f\n',z00);
fprintf('A = %f\n',AA);
fprintf('B = %f\n',BB);
fprintf('C = %f\n',CC);[x1, y1, z1] = ellipsoid(x00,y00,z00,AA,BB,CC);
##figure
mesh(x1, y1, z1)
legend('rawData', 'fitElli')
axis equalrawNoise = sqrt(x.^2 + y.^2 + z.^2) / 2000;
rawNoise = sum(rawNoise) / length(rawNoise);
fprintf('rawNoise = %f\n',rawNoise);
fitNoise = sqrt(((x-x00)/AA).^2 + ((y-y00)/BB).^2 + ((z-z00)/CC).^2);
fitNoise = sum(fitNoise) / length(fitNoise);
fprintf('fitNoise = %f\n',fitNoise);

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

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

相关文章

TCP的p2p网络模式

TCP的p2p网络模式 1、tcp连接的状态有以下11种 CLOSED:关闭状态LISTEN:服务端状态,等待客户端发起连接请求SYN_SENT:客户端已发送同步连接请求,等待服务端相应SYN_RECEIVED:服务器收到客户端的SYN请请求&…

EPICS数据库示例

本文目标是使用EPICS数据库示例帮助新手理解如何使用不同的示例。 1、使用seq和mbbo的简单选择器 这个简单示例展示了如何使用一个mbbo和一个seq来旋转哪个值将被设置到一个PV。 # 这个mbbo记录将选择将运行seq的哪段 record(mbbo, "CHOOSE") {field(VAL, "…

ArcGIS中国工具(ArcGISCTools)等插件使用体验

ArcGIS中国工具(ArcGISCTools)的主要功能 1. 接合图表生成 这个功能允许用户生成标准分幅图的行政区边框注记,并在打印时自动加入。这对于需要制作标准地图的用户非常实用。 2. 图框工具 图框工具可以帮助用户创建和管理地图的图框&#…

Qt creator 控件转到槽 报错 The class containing “Ui:Dialog“ could not be found in

今天调试程序,发现主界面控件转到槽,报错如下图: 问题表现为:只有主窗口控件有这个错误,其他子窗口正常。 解决: 在网上搜这个报错信息,都没有一个很好的解决办法。 最后发现是我在子窗口中要…

Java根据经纬度获取两点之间的距离

Java根据经纬度获取两点之间的距离,最近在实现类似于钉钉打卡签到的需求,因为对精度要求不是很高,所以可以通过一个球面距离的公式来求两点距离,这里将地球当成一个球体,实际上地球是一个不规则的球体,所以…

C++继承(一文说懂)

目录 一: 🔥继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承关系和访问限定符1.2.3 继承基类成员访问方式的变化 二:🔥基类和派生类对象赋值转换三:🔥继承中的作用域四:&a…

DHCP与TCP的简单解析

目录 一、DHCP 1.1 DHCP概述 1.2 DHCP的优势 1.3 DHCP的模式与分配方式***** 1.3.1 DHCP的模式:C/S模式(客户机与服务器模式) 1.3.2 DHCP的分配方式 1.4 DHCP的租约过程及原理 1.4.1 DHCP的工作原理***** 1.4.2 更新租约原理***** …

高考志愿怎么选专业,哪些是热门专业?

选专业看上去非常简单,但是真正做起来的时候确实不容易,因为对于很多结束高考的学生来说,选专业就意味着他们选择自己的未来,这可是直接关系到未来的学习和职业发展,关系到将来的就业方向,再加上现在的社会…

近红外光谱脑功能成像(fNIRS):2.实验设计、指标计算与多重比较

一、实验设计的策略与方法 近红外光谱成像(INIRS)作为一种非侵入性脑功能成像技术,为研究大脑活动提供了一种高效、生态效度高的方法。然而,为了充分利用INIRS技术并确保实验结果的准确性和可靠性,研究者必须精心设计实…

基于stm32开发的红外循迹小车

本项目算是接触32来开发的第一个小项目了,虽然前期用51写过一个循迹小车,以为直接转到32会比较简单,结果还是花了大几天才把小车的参数完全调完,以此来记录下自己的学习历程(注:循迹算法并未加入PID算法&am…

spring boot集成easypoi导出word换行处理

项目场景&#xff1a; spring boot集成easypoi导出word <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version> </dependency> 问题描述 spring boo…

最新的 DL/T645 调试工具,工程师必备

分享一个好用的 DL/T645 调试工具&#xff0c;下载地址&#xff1a;https://www.redisant.cn/dl645master 文章目录 最新的 DL/T645 调试工具&#xff0c;工程师必备主要功能软件截图 最新的 DL/T645 调试工具&#xff0c;工程师必备 DL/T645 是中国电力行业的一个通信协议标准…

Day47:LeedCode1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列

1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字…

解决uni-app中全局设置页面背景颜色只有部分显示颜色的问题

在页面的style标签设置了背景色但是只显示一部分 <style lang"scss"> .content{background-color: #f7f7f7;height: 100vh; } </style>我们在app.vue里设置就行了 注意一定要是**page{}** <style>/*每个页面公共css */page{background-color: #…

淘宝商品评论电商API接口:提升销量与用户评论的策略

一、API接口简介 淘宝商品评论电商API接口是淘宝开放平台提供的一项服务&#xff0c;联讯数据通过这个接口&#xff0c;商家可以获取关于自己商品的评论数据&#xff0c;包括评论内容、评分、买家等级等信息。这些数据可以帮助商家更好地了解消费者需求&#xff0c;优化商品和服…

724.力扣每日一题7/8 Java

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 主要基于数组的…

linux主机离线安装python3环境

一、下载好python版本 Index of /ftp/python/https://www.python.org/ftp/python/ 二、创建文件夹 mkdir /home/python/ 三、上传到主机 四、解压 # 解压xz得到tar包 xz -d Python-3.9.8.tar.xz # 解压tar包 tar -xvf Python-3.9.8.tar 五、指定安装路径 # 进入解压后的…

【Python_GUI】tkinter常用组件——文本类组件

文本时窗口中必不可少的一部分&#xff0c;tkinter模块中&#xff0c;有3种常用的文本类组件&#xff0c;通过这3种组件&#xff0c;可以在窗口中显示以及输入单行文本、多行文本、图片等。 Label标签组件 Label组件的基本使用 Label组件是窗口中比较常用的组件&#xff0c;…

【LeetCode】有效的数独

目录 一、题目二、解法 一、题目 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&…

智能充电(新能源电动车,电单车)云管理系统的定制解决方案

一 系统简介 智能充电&#xff08;新能源电动车&#xff0c;电单车&#xff09;云管理系统 是一套能够实现对充电站/桩的实时通讯、状态监控、故障检测、运营分析、数据统计、策略设置的智能化多任务管理系统。 二 平台概览 智能充电云管理系统 https://chongdianzhuang.itg…