VIO第2讲:IMU标定实验

VIO第2讲:IMU标定实验

文章目录

  • VIO第2讲:IMU标定实验
  • 5 IMU标定实验
    • 5.1 仿真数据产生
      • 5.1.1 c++代码分析
      • 5.1.2 生成ros包数据
    • 5.2 Allan方差实验(港科大imu_utils)
      • 5.2.1 安装
      • 5.2.2 运行
    • 5.3 Allan方差实验(matlab代码kalibr_allan)
      • 5.3.1 安装
      • 5.3.2 bag转mat
      • 5.3.3 运行标定

5 IMU标定实验

5.1 仿真数据产生

参考代码

5.1.1 c++代码分析

在这里插入图片描述

下面代码确实是高斯噪声连续到离散除以sqr(δt),偏差随机游走则是乘以sqr(δt)

void IMU::addIMUnoise(MotionData& data)
{std::random_device rd;std::default_random_engine generator_(rd());std::normal_distribution<double> noise(0.0, 1.0);   // 均值为0,标准差为1的正态分布// 将噪声添加到原始的陀螺仪数据Eigen::Vector3d noise_gyro(noise(generator_),noise(generator_),noise(generator_));Eigen::Matrix3d gyro_sqrt_cov = param_.gyro_noise_sigma * Eigen::Matrix3d::Identity();// w = w + cov(3*3)*noise_gyro(3*1)/sqrt(t) + bgdata.imu_gyro = data.imu_gyro + gyro_sqrt_cov * noise_gyro / sqrt( param_.imu_timestep ) + gyro_bias_;Eigen::Vector3d noise_acc(noise(generator_),noise(generator_),noise(generator_));Eigen::Matrix3d acc_sqrt_cov = param_.acc_noise_sigma * Eigen::Matrix3d::Identity();data.imu_acc = data.imu_acc + acc_sqrt_cov * noise_acc / sqrt( param_.imu_timestep ) + acc_bias_;// gyro_bias updateEigen::Vector3d noise_gyro_bias(noise(generator_),noise(generator_),noise(generator_));gyro_bias_ += param_.gyro_bias_sigma * sqrt(param_.imu_timestep ) * noise_gyro_bias;data.imu_gyro_bias = gyro_bias_;// acc_bias updateEigen::Vector3d noise_acc_bias(noise(generator_),noise(generator_),noise(generator_));acc_bias_ += param_.acc_bias_sigma * sqrt(param_.imu_timestep ) * noise_acc_bias;data.imu_acc_bias = acc_bias_;}

运动模型:利用p求出v,a;通过欧拉角的导数求出角速度w,根据时间变量t来产生数据。

MotionData IMU::MotionModel(double t)
{MotionData data;// paramfloat ellipse_x = 15;float ellipse_y = 20;float z = 1;           // z轴做sin运动float K1 = 10;          // z轴的正弦频率是x,y的k1倍float K = M_PI/ 10;    // 20 * K = 2pi   由于我们采取的是时间是20s, 系数K控制yaw正好旋转一圈,运动一周// translation // twb:  body frame in world frame// p v aEigen::Vector3d position( ellipse_x * cos( K * t) + 5, ellipse_y * sin( K * t) + 5,  z * sin( K1 * K * t ) + 5);Eigen::Vector3d dp(- K * ellipse_x * sin(K*t),  K * ellipse_y * cos(K*t), z*K1*K * cos(K1 * K * t));              // position导数 in world framedouble K2 = K*K;Eigen::Vector3d ddp( -K2 * ellipse_x * cos(K*t),  -K2 * ellipse_y * sin(K*t), -z*K1*K1*K2 * sin(K1 * K * t));     // position二阶导数// Rotationdouble k_roll = 0.1;double k_pitch = 0.2;Eigen::Vector3d eulerAngles(k_roll * cos(t) , k_pitch * sin(t) , K*t );   // roll ~ [-0.2, 0.2], pitch ~ [-0.3, 0.3], yaw ~ [0,2pi]Eigen::Vector3d eulerAnglesRates(-k_roll * sin(t) , k_pitch * cos(t) , K);      // euler angles 的导数//    Eigen::Vector3d eulerAngles(0.0,0.0, K*t );   // roll ~ 0, pitch ~ 0, yaw ~ [0,2pi]
//    Eigen::Vector3d eulerAnglesRates(0.,0. , K);      // euler angles 的导数// 角速度是通过欧拉角求导来得到的?Eigen::Matrix3d Rwb = euler2Rotation(eulerAngles);         // body frame to world frameEigen::Vector3d imu_gyro = eulerRates2bodyRates(eulerAngles) * eulerAnglesRates;   //  euler rates trans to body gyroEigen::Vector3d gn (0,0,-9.81);                                   //  gravity in navigation frame(ENU)   ENU (0,0,-9.81)  NED(0,0,9,81)Eigen::Vector3d imu_acc = Rwb.transpose() * ( ddp -  gn );  //  Rbw * Rwn * gn = gsdata.imu_gyro = imu_gyro;data.imu_acc = imu_acc;data.Rwb = Rwb;data.twb = position;data.imu_velocity = dp;data.timestamp = t;return data;}

5.1.2 生成ros包数据

  GitHub同时提供了ros代码,我们直接用这套代码生成相应的imu.bag

// ros还是cpp代码种原始设置的标准差都是下面数据// noise----离散时间噪声标准差double gyro_bias_sigma = 1.0e-5;    // δbg rad/sdouble acc_bias_sigma = 0.0001;     // δba m/(s^2)double gyro_noise_sigma = 0.015;    // rad/s     δgdouble acc_noise_sigma = 0.019;      // m/(s^2)  δa

  这里先直接给出利用imu_utils进行的一个标定结果,对于高斯噪声,数量级一致,但对于偏置随机游走,数量级差了10~100!总而言之,这种标定方法对于高斯白噪声即角度/速度随机游走的标定结果是可信的,但是对于偏置还是没有那么可信!

%YAML:1.0
---
type: IMU
name: vio_test
Gyr:unit: " rad/s"avg-axis:gyr_n: 2.1017740504505478e-01	gyr_w: 1.1046695141140115e-03x-axis:gyr_n: 2.0373831670509726e-01gyr_w: 8.5917637284818333e-04y-axis:gyr_n: 2.0848823537157685e-01gyr_w: 1.1543541527689969e-03z-axis:gyr_n: 2.1830566305849022e-01gyr_w: 1.3004780167248545e-03
Acc:unit: " m/s^2"avg-axis:acc_n: 2.6608701268913315e-01acc_w: 5.0312842533421255e-03x-axis:acc_n: 2.6703857869563274e-01acc_w: 5.4894453768553463e-03y-axis:acc_n: 2.6561748859645246e-01acc_w: 5.1153714824778724e-03z-axis:acc_n: 2.6560497077531420e-01acc_w: 4.4890359006931569e-03

5.2 Allan方差实验(港科大imu_utils)

Github

5.2.1 安装

sudo apt-get install libdw-dev

报错1

  创建一个ROS空间,把两个ROS包放进去,然后catkin_make.如果这样做的话,大概率会报下面的错误。本质就是imu_utils依赖于code_utils这个包,但实际上我们之前没有按照那个包,就会报下面的错,其实可以在catkin_make之前显示的告诉它路径,或者就是先编译成功code_utils,再编译imu_utils

-- +++ processing catkin package: 'imu_utils'
-- ==> add_subdirectory(imu_utils)
-- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
-- Could NOT find code_utils (missing: code_utils_DIR)
-- Could not find the required component 'code_utils'. The following CMake error indicates that you either need to install the package with the same name or change your environment so that it can be found.
CMake Error at /opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):Could not find a package configuration file provided by "code_utils" withany of the following names:code_utilsConfig.cmakecode_utils-config.cmakeAdd the installation prefix of "code_utils" to CMAKE_PREFIX_PATH or set"code_utils_DIR" to a directory containing one of the above files.  If"code_utils" provides a separate development package or SDK, be sure it hasbeen installed.
Call Stack (most recent call first):imu_utils/CMakeLists.txt:13 (find_package)-- Configuring incomplete, errors occurred!
See also "/home/pj/pj/vio_with_only_eigen/imu_allan/build/CMakeFiles/CMakeOutput.log".
See also "/home/pj/pj/vio_with_only_eigen/imu_allan/build/CMakeFiles/CMakeError.log".
Invoking "cmake" failed

  编译出现的报错code_utils

报错2

  报错显示没有那个头文件,查看之后发现是有的,说名再CMakeLists.txt中没有显示的引入头文件,我们只需要添加即可。或者把#include "backward.hpp"改成#include "code_utils/backward.hpp"

[ 30%] Building CXX object code_utils/CMakeFiles/sumpixel_test.dir/src/sumpixel_test.cpp.o
/home/pj/pj/vio_with_only_eigen/imu_allan/src/code_utils/src/sumpixel_test.cpp:2:10: fatal error: backward.hpp: No such file or directory2 | #include "backward.hpp"|          ^~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [code_utils/CMakeFiles/sumpixel_test.dir/build.make:63: code_utils/CMakeFiles/sumpixel_test.dir/src/sumpixel_test.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:480: code_utils/CMakeFiles/sumpixel_test.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
include_directories(${catkin_INCLUDE_DIRS}${CMAKE_SOURCE_DIR}/code_utils/include/code_utils	# 添加这个,这样就能找到了${EIGEN3_INCLUDE_DIR})

报错3

  报错显示没找到glog.so动态库文件,但是这个环境前两天刚装的,所以必然不是这个问题

make[2]: *** No rule to make target '/usr/lib/x86_64-linux-gnu/libglog.so', needed by '/home/pj/pj/vio_with_only_eigen/imu_allan/devel/lib/libpnp.so'.  Stop.
make[2]: *** Waiting for unfinished jobs....
[ 92%] Building CXX object code_utils/CMakeFiles/pnp.dir/src/cv_utils/pnp/nonlinearpnp.cpp.o
make[1]: *** [CMakeFiles/Makefile2:804: code_utils/CMakeFiles/pnp.dir/all] Error 2
make: *** [Makefile:141: all] Error 2
Invoking "make -j2 -l2" failed

  locate下发现,库文件存在,但上面找的不是这个

pj@pj:~$ locate glog | grep so
...
/usr/lib/x86_64-linux-gnu/libglog.so.0
/usr/lib/x86_64-linux-gnu/libglog.so.0.0.0

  libglog.solibglog.so.0,所以我们把这两个软链接起来就能解决问题

sudo ln -s /usr/lib/x86_64-linux-gnu/libglog.so.0 /usr/lib/x86_64-linux-gnu/libglog.so

  然后编译imu_utils就没有报错了

5.2.2 运行

要么就是自己录个数据,至少2个小时以上

  • 播放rosbag数据
 rosbag play -r 200 imu_A3.bag
  • 启动对应得launch文件,注意修改!
roslaunch imu_utils A3.launch	# 换成自己的launch文件
<launch><node pkg="imu_utils" type="imu_an" name="imu_an" output="screen"><!--改成自己IMU的话题--><param name="imu_topic" type="string" value= "/djiros/imu"/><!--这个和最后保存的文件名有关,最后的文件名为A3_imu_param.yaml--><param name="imu_name" type="string" value= "A3"/><!--标定结果存放的文件目录--><param name="data_save_path" type="string" value= "$(find imu_utils)/data_my/"/><!--修改标定时间,单位是分钟,需要根据数据包的时长来调整--><param name="max_time_min" type="int" value= "120"/><param name="max_cluster" type="int" value= "100"/></node>
</launch>
  • 结果

  会生成很多文件,最终计算结果再yaml文件中,可以利用脚本文件下的matlab函数去画出角速度和加速度的Allan曲线。

在这里插入图片描述

type: IMU
name: A3
Gyr:unit: " rad/s"avg-axis:		gyr_n: 1.0351286977809465e-04		# δggyr_w: 2.9438676109223402e-05		# δbgx-axis:gyr_n: 1.0312669892959053e-04gyr_w: 3.3765827874234673e-05y-axis:gyr_n: 1.0787155789128671e-04gyr_w: 3.1970693666470835e-05z-axis:gyr_n: 9.9540352513406743e-05gyr_w: 2.2579506786964707e-05
Acc:unit: " m/s^2"avg-axis:acc_n: 1.3985049290745563e-03acc_w: 6.3249251509920116e-04x-axis:acc_n: 1.1687799474421937e-03acc_w: 5.3044554054317266e-04y-axis:acc_n: 1.2050535351630543e-03acc_w: 6.0281218607825414e-04z-axis:acc_n: 1.8216813046184213e-03acc_w: 7.6421981867617645e-04

github给出的—标定是离散参数
在这里插入图片描述

  • 绘图结果—script—这下面的图像不是A3,是生成的那个仿真数据图像!

角速度allan曲线

在这里插入图片描述

加速度allan曲线

在这里插入图片描述

​ 其实也能看出来,关于角速度偏置随机游走肯定是误差最大的!

5.3 Allan方差实验(matlab代码kalibr_allan)

5.3.1 安装

  GitHub,主要是装那个ros转换包,matlab直接打开就行

mkdir -p datacen/src
catkin_make

5.3.2 bag转mat

  使用命令 rosrun bagconvert bagconvert xx.bag/imu0,该命令的解释是rosrun bagconvert bagconvert [bag名字] [topic名字],这里如果topic输入不正确,可能会得到一个177kb的错误mat文件

在这里插入图片描述

在这里插入图片描述

5.3.3 运行标定

  • 修改SCRIPT_allan_matparallel.m
% Our bag information
%mat_path = '../data/imu_mtig700.mat';
%mat_path = '../data/imu_tango.mat';
% 改成上面bag转mat文件的路径,可以在matlab命令行pwd,像Ubuntu一样
mat_path = 'I:\kalibr_allan-master\data\imu.mat';

  然后运行这个文件,根据电脑的性能,运行时间长短不一,最终会在你的mat文件下生成一个resultmat文件

  • 修改SCRIPT_process_results.m
titlestr = 'ADIS16448 VI-Sensor';
% 修改路径
mat_path = 'I:\kalibr_allan-master\data\results_20240106T181017.mat';

结果展示

加速度allan曲线

在这里插入图片描述

角速度allan曲线:目前不知道哪里有问题,导致对应偏置随机游走无法计算!

在这里插入图片描述

上面生成的数据对应方差!// noise----离散时间噪声标准差double gyro_bias_sigma = 1.0e-5;    // δbg rad/sdouble acc_bias_sigma = 0.0001;     // δba m/(s^2)double gyro_noise_sigma = 0.015;    // rad/s     δgdouble acc_noise_sigma = 0.019;      // m/(s^2)  δa

其实可以看出,这种方差实验结果要比imu_utils要准确一点

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

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

相关文章

Vue局部注册组件实现组件化登录注册

Vue局部注册组件实现组件化登录注册 一、效果二、代码1、index.js2、App.vue3、首页4、登录&#xff08;注册同理&#xff09; 一、效果 注意我这里使用了element组件 二、代码 1、index.js import Vue from vue import VueRouter from vue-router import Login from ../vie…

基于SVM的功率分类,基于支持向量机SVM的功率分类识别,Libsvm工具箱详解

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接:基于SVM的功率分类,基于支持向量机SVM的功率分类识别资源-CSDN文库 https://download.csdn.net/download/abc991835105/88862836 SVM应用实例, 基于…

虚拟机的四种网络模式对比

nat网络地址转换 nat网络 桥接 内网模式 仅主机

【Java】java异常处理机制(实验五)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 1、理解java的异常处理机制 2、掌握try catch结构和thow和thows关键字的用法 二、实验内容 1、编写一个程序&#xff0c;输入某个班某门课程成绩&#xff0c;统计及格人数、不及格人数及课程平均分。设计一个异…

通天星CMSV6 车载视频监控平台信息泄露漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

【Python-语法】

Python-语法 ■ Python基础■ 数据类型■ 注释 单行注释&#xff0c;多行注释■ 编码方式 ■■■■■ ■ Python基础 ■ 数据类型 ■ 注释 单行注释&#xff0c;多行注释 ■ 编码方式 ■ ■ ■ ■ ■

【深度学习】微调通义千问模型:LoRA 方法,微调Qwen1.8B教程,实践

官网资料: https://github.com/QwenLM/Qwen/blob/main/README_CN.md 文章目录 准备数据运行微调设置网络代理启动容器执行 LoRA 微调修改 finetune/finetune_lora_single_gpu.sh运行微调 执行推理 在本篇博客中&#xff0c;我们将介绍如何使用 LoRA 方法微调通义千问模型&#…

Unity 2021.3发布WebGL设置以及nginx的配置

使用unity2021.3发布webgl 使用Unity制作好项目之后建议进行代码清理&#xff0c;这样会即将不用的命名空间去除&#xff0c;不然一会在发布的时候有些命名空间webgl会报错。 平台转换 将平台设置为webgl 设置色彩空间压缩方式 Compression Format 设置为DisabledDecompre…

Sora:开启视频生成新时代的强大人工智能模型

目录 一、Sora模型的诞生与意义 二、Sora模型的技术特点与创新 三、Sora模型的应用前景与影响 四、面临的挑战与未来发展 1、技术挑战 2、道德和伦理问题 3、计算资源需求 4、未来发展方向 随着信息技术的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已成为…

vue3中使用vuedraggable实现拖拽el-tree数据进分组

看效果&#xff1a; 可以实现单个拖拽、双击添加、按住ctrl键实现多个添加&#xff0c;或者按住shift键实现范围添加&#xff0c;添加到框中的数据&#xff0c;还能拖拽排序 先安装 vuedraggable 这是他的官网 vue.draggable中文文档 - itxst.com npm i vuedraggable -S 直接…

拓扑空间简介

目录 介绍集合论与映射映射相关定义映射&#xff08;map&#xff09;映射的一种分类&#xff1a;一一的和到上的 拓扑空间背景介绍开子集开子集的选择 拓扑拓扑空间常见拓扑拓扑子空间同胚其他重要定义 开覆盖紧致性有限开覆盖紧致性 R R R的紧致性 习题 介绍 这是对梁灿彬的《…

【软件架构】01-架构的概述

1、定义 软件架构就是软件的顶层结构 RUP&#xff08;统一过程开发&#xff09;4 1 视图 1&#xff09;逻辑视图&#xff1a; 描述系统的功能、组件和它们之间的关系。它主要关注系统的静态结构&#xff0c;包括类、接口、包、模块等&#xff0c;并用于表示系统的组织结构…

C++入门学习(三十六)函数的声明

程序是自上而下运行的&#xff0c;比如我下面的代码&#xff1a; #include <iostream> #include<string> using namespace std;int main() { int a1; int b2;int sumaddNumbers(a,b); cout<<sum;return 0; }int addNumbers(int a, int b) { int sum …

MFC 配置Halcon

1.新建一个MFC 工程&#xff0c;Halcon 为64位&#xff0c;所以先将工程改为x64 > VC 目录设置包含目录和库目录 包含目录 库目录 c/c ->常规 链接器 ->常规 > 链接器输入 在窗口中添加头文件 #include "HalconCpp.h" #include "Halcon.h"…

简单讲解并梳理微信小程序默认几个文件和文件夹结构及其作用

那么 我们来说一下 小程序整个项目结构 它各个文件 和 整体结构 这是我们新创建的一个小程序项目 我们从上到下 分别来看一下 这些文件和目录结构的作用 首先是 pages 它的作用在于存储整个项目所有的 page页面文件 我们小程序官方 是推荐我们将所有page 界面都放在pages目录…

稀疏计算、彩票假说、MoE、SparseGPT

稀疏计算可能是未来10年内最有潜力的深度学习方向之一&#xff0c;稀疏计算模拟了对人脑的观察&#xff0c;人脑在处理信息的时候只有少数神经元在活动&#xff0c;多数神经元是不工作的。而稀疏计算的基本思想是&#xff1a;在计算过程中&#xff0c;将一些不重要的参数设置为…

一招解决 vue数据格式校验时候 async-validator: [‘XXXX is not a number‘]

在vue中 amt数字需要进行纯数字校验&#xff1a; 格式都没问题&#xff0c;但是输入纯数字也会报错&#xff0c;报错如下&#xff1a; async-validator:[‘amt is not a number’] 网上找了一些&#xff0c;但是均为能奏效&#xff0c;尝试如下&#xff1a; 尝试1&#x…

基于Python网络爬虫的IT招聘就业岗位可视化分析推荐系统

文章目录 基于Python网络爬虫的IT招聘就业岗位可视化分析推荐系统项目概述招聘岗位数据爬虫分析系统展示用户注册登录系统首页IT招聘数据开发岗-javaIT招聘数据开发岗-PythonIT招聘数据开发岗-Android算法方面运维方面测试方面招聘岗位薪资多维度精准预测招聘岗位分析推荐 结语…

FlinkCDC详解

1、FlinkCDC是什么 1.1 CDC是什么 CDC是Chanage Data Capture&#xff08;数据变更捕获&#xff09;的简称。其核心原理就是监测并捕获数据库的变动&#xff08;例如增删改&#xff09;&#xff0c;将这些变更按照发生顺序捕获&#xff0c;将捕获到的数据&#xff0c;写入数据…

Jenkins中Publish Over SSH插件使用(1)

SSH插件 前言Publish Over SSH插件是jenkins里面必不可少的插件之一&#xff0c;主要的功能有两个把jenkins服务器上的文件&#xff0c;传输到远程nginx&#xff0c; 远程执行shell命令和脚本。 1. SSH插件下载与配置 1.1 下载Publish over SSH插件 系统管理—》管理插件 …