使用 imu_utils 、Kalibr 工具进行IMU和相机内外参外参标定

文章目录

  • 一、问题描述
  • 二、imu_utils 工具的使用
    • 1. 安装
      • 1.1 下载与编译
      • 1.2 编译bug解决
    • 2. 标定 IMU
      • 2.1 imu bag包录制
        • 2.1.1 imu 数据格式
        • 2.1.2 imu 数据录制
      • 2.2 imu 标定
  • 三、Kalibr 工具的使用
    • 1. 安装
      • 1.1 下载与编译
      • 1.2 问题解决

一、问题描述

vins系列安装完成后,将自己采集的图像和imu数据进行测试时,发现很难初始化化,即使初始化成功机器位姿总是跑飞(尤其是旋转时),内外参必须标定!!过来整理标定的填坑过程。。。

二、imu_utils 工具的使用

1. 安装

1.1 下载与编译

mkdir -p imu_calib_WS/src
cd imu_calib_WS/src# 下载 code_utils 、imu_utils
# 注意:全局安装ceres库,code_imu依赖ceres;
git clone https://github.com/gaowenliang/code_utils.git
git clone https://github.com/gaowenliang/imu_utils.gitcd ..
catkin_make

1.2 编译bug解决

  1. error: “code_utilsConfig.cmake”
    编译过程中,遇到如下图中的Could not find the required component 'code_utils'的错误。
    在这里插入图片描述原因是:imu_utils功能包依赖code_utils功能包,而在编译imu_utils功能包时code_utils功能包尚未编译完成解决方法:需指定依赖功能包,具体操作步骤如下:
// 1.在imu_utils 功能包的 CMakeLists.txt 添加
catkin_package(CATKIN_DEPENDS code_utils)// 2.在imu_utils 功能包的 package.xml 添加
<depend>code_utils</depend>
  1. error: “fatal error: backward.hpp”
    编译过程中,遇到如下图中的fatal error: backward.hpp的错误:
    在这里插入图片描述
    解决方法:修改code_utils/src/sumpixel_test.cpp文件:
#include "backward.hpp"
改成
#include "code_utils/backward.hpp"
  1. error: “libdw.h”
    编译过程中,遇到如下图中的fatal error: libv4l2.h的错误,直接 sudo apt-get install libdw-dev 解决。
    在这里插入图片描述

2. 标定 IMU

2.1 imu bag包录制

2.1.1 imu 数据格式

不同imu硬件驱动包驱动方式不同,此处只整理imu产生数据后的后期处理,下面为一帧imu数据(话题名为/imu0 ,话题消息格式采用ros官方的 sensor_msgs/Imu)。

rostopic echo -n 1 /imu0 header: seq: 5970stamp: secs: 1403637140nsecs: 448319000frame_id: "imu4"orientation: x: 0.0y: 0.0z: 0.0w: 1.0orientation_covariance: [99999.9, 0.0, 0.0, 0.0, 99999.9, 0.0, 0.0, 0.0, 99999.9]angular_velocity: x: 0.010471975511965976y: 0.10402162341886204z: 0.13683381335635544angular_velocity_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]linear_acceleration: x: 9.022118y: -0.8253930416666666z: -2.5415567916666664linear_acceleration_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
---
2.1.2 imu 数据录制

执行如下命令,进行imu的bag包录制。

# --duration=0.5h  		0.5h
# --duration=1m  		1min
# --duration=30  		30s
rosbag record -O imudata_30m.bag /imu0 --duration=0.5h  # 录制/imu0数据0.5h,并保存在imudata_30m.bag 中

2.2 imu 标定

上述步骤完成后,进入imu_utils功能包文件夹下 icm42652.launch 文件(自己添加)进行相关设置:

<launch><node pkg="imu_utils" type="imu_an" name="imu_an" output="screen"><param name="imu_topic" type="string" value= "/imu0"/>					 <!-- imutopic名称 --><param name="imu_name" type="string" value= "icm42652"/>        <!-- imu名称 --><param name="data_save_path" type="string" value= "$(find imu_utils)/data/icm42652/"/>  <!-- 标定结果文件保存位置 --><param name="max_time_min" type="int" value= "60"/>            <!--使用bag数据的最大时长 60为60min,默认是120分钟,程序会在最大时间截断读取数据--><param name="max_cluster" type="int" value= "100"/></node><arg name="bag_name" default = "imudata_30m" /> 	<!--imu的bag名--><node pkg="rosbag" type="play" name="player" output="log" args="$(env HOME)/data/datasets/0428_localization/$(arg bag_name).bag  -r 5"/>		<!-- 5倍速播放bag包-->
</launch>

imu_utils/data 路径下添加上面launch文件配置 imu_name 的内容,方便后续程序结束保存标定的结果文件(理论上应该程序自动生成路径,但实操后未生成)。

执行如下命令进行标定:

roslaunch imu_utils icm42652.launch

幸运的话,等待一会对应的目录文件夹会有yaml标定文件生成:

%YAML:1.0
---
type: IMU
name: icm42652
Gyr:unit: " rad/s"avg-axis:gyr_n: 1.4349307905863827e-03			# 陀螺仪误差模型高斯白噪声gyr_w: 1.9369393077422063e-05			# 陀螺仪biasx-axis:gyr_n: 1.4784338214134302e-03gyr_w: 2.1455538970808570e-05y-axis:gyr_n: 1.5718208003725456e-03gyr_w: 2.2505267719503148e-05z-axis:gyr_n: 1.2545377499731717e-03gyr_w: 1.4147372541954469e-05
Acc:unit: " m/s^2"avg-axis:acc_n: 1.4501213884079829e-02		# 加速度计误差模型高斯白噪声acc_w: 1.4807089586902465e-04		# 加速度计biasx-axis:acc_n: 1.4483543834083238e-02acc_w: 7.5054689915566628e-05y-axis:acc_n: 1.4540207652520546e-02acc_w: 1.9777915646436287e-04z-axis:acc_n: 1.4479890165635700e-02acc_w: 1.7137884122714445e-04

根据launch文件配置,标定文件生成路径:
在这里插入图片描述

建议imu_utils/src/imu_an.cpp 的 imu_callback 回调函数中添个获得imu数据的标记,否则,终端一直停留在 wait for imu data. 很容易让人自我怀疑(尤其是首次标定),,,
在这里插入图片描述

三、Kalibr 工具的使用

1. 安装

1.1 下载与编译

mkdir -p kalibr_cam_WS/src
cd kalibr_cam_WS/srcgit clone https://github.com/ethz-asl/kalibr.gitcd ..
catkin_make

1.2 问题解决

编译过程中,遇到如下图中的fatal error: libv4l2.h的错误,直接 sudo apt-get install libv4l-dev 解决。
在这里插入图片描述

# 生成4.5cm*4.5cm的aprilgrid(适应A3打印)
rosrun kalibr kalibr_create_target_pdf --type apriltag --nx 6 --ny 4 --tsize 0.045 --tspace 0.3 --eps# 生成 棋盘格标定板
rosrun kalibr kalibr_create_target_pdf --type checkerboard --nx 8 --ny 11 --csx 0.05 --csy 0.05

aprilgrid 生成图片如下所示:

在这里插入图片描述
其对应的 checkboard.yaml 文件如下设置:

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 4               #number of apriltags
tagSize: 0.045           #size of apriltag, edge to edge [m]
tagSpacing: 0.3          #ratio of space between tags to tagSize

标定板参数说明
--type apriltag 标定板类型
--nx [NUM_COLS] 列个数
--ny [NUM_ROWS] 行个数
--tsize [TAG_WIDTH_M] 二维码方格长度(size),单位m
--tspace [TAG_SPACING_PERCENT] 小方格与二维码方格长度比例
--eps参数,可以生成eps文件

在这里插入图片描述

转换工具:EPS转PNG/JPG/TIFF工具 、PDF转PNG工具

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

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

相关文章

EasyRecovery电脑数据恢复软件2024数据守护神#误删文件神器#硬盘恢复利器#数据丢失救星

&#x1f310; 你是否曾经因为误删文件、硬盘损坏等原因&#xff0c;失去了重要的数据&#xff1f;别担心&#xff0c;EasyRecovery电脑数据恢复软件是你的救星&#xff01;它能够帮你找回丢失的文件&#xff0c;让你的数据重新焕发生机。 &#x1f50d; EasyRecovery软件的核…

有关健身的俄语表达,柯桥零基础俄语培训

фитнес 健身 тренер 教练 абонемент 会员卡 аэробика 有氧运动 анаэробика 无氧运动 плавание 游泳 пробежка / бег трусцой 慢跑 беговая дорожка 跑步机 йога 瑜伽 коври…

持续学习的综述: 理论、方法与应用

摘要 为了应对现实世界的动态&#xff0c;智能系统需要在其整个生命周期中增量地获取、更新、积累和利用知识。这种能力被称为持续学习&#xff0c;为人工智能系统自适应发展提供了基础。从一般意义上讲&#xff0c;持续学习明显受到灾难性遗忘的限制&#xff0c;在这种情况下…

【Linux硬盘数据读取】WIN10访问linux分区解决方案:ext2fsd

<div id"content_views" class"htmledit_views" style"user-select: auto;"><p>尝试ext2explore、Paragon ExtFS都不好用&#xff0c;强烈安利ext2fsd&#xff0c;可读写&#xff0c;很强大</p> 转自&#xff1a;https://blog…

C++之模板(一)

1、为什么需要模板 将具有相同逻辑的一段代码提供一份模板&#xff0c;当我们需要处理不同类型的时候&#xff0c;可以通过数据类型当作参数来传递&#xff0c;从而实例化出对应类型的处理版本。 2、模板的定义 也是一种静态多态。 3、模板的分类 4、函数模板 5、函数模板的使…

-------------------------面试散文-----------------------------------

问题1&#xff1a;vue中动态引入图片&#xff0c;为什么使用require&#xff1f; 回答&#xff1a;因为动态添加的src 编译过后的文件地址和被编译过后的资源文件地址不一致&#xff0c;从而导致无法访问题 而使用require 返回的就是资源文件被编译后的文件地址&#xff0c;从…

Aeron:Aeron Agent

Aeron Agent 是一个 Java 代理&#xff0c;用于提供 Aeron、Aeron Archive 和 Aeron Cluster 中发生的运行时低级日志信息。这些日志语句包括从高级管理员事件到大容量数据帧事件。 在调试 Archive 和 Cluster 问题时&#xff0c;Aeron Agent 的日志数据尤其有用。 一、Availab…

本地无法连接linux上的MariaDB数据库

问题&#xff1a;本地用DBeaver无法连接服务器上的MariaDB数据库 &#xff1f; 测试1&#xff1a;在cmd中ping 服务器IP&#xff0c;看是否能ping通&#xff0c;能ping通&#xff0c;没有问题 测试2&#xff1a;在cmd中telnet 服务器IP 端口&#xff0c;看是否能访问&#xf…

常见的Redis使用问题及解决方案

目录 1. 缓存穿透 1.1 解决方案 2. 缓存击穿 2.1 解决方案 3. 缓存雪崩 3.1 概念图及问题描述 ​编辑3.2 解决方案 4. 分布式锁 4.1 概念 4.2 基于redis来实现分布式锁 4.3 用idea来操作一遍redis分布式锁 4.4 分布式上锁的情况下&#xff0c;锁释放了服务器b中的锁…

多态深度剖析

前言 继承是多态的基础&#xff0c; 如果对于继承的知识还不够了解&#xff0c; 可以去阅读上一篇文章 继承深度剖析 基本概念与定义 概念&#xff1a; 通俗来说&#xff0c;就是多种形态。具体点就是去完成某个行为&#xff0c; 当不同的对象去完成时会产生出不同的状…

如何完美解决 Xshell 使用 SSH 连接 Linux 服务器报错:找不到匹配的 host key 算法

&#x1f6e0;️ 如何完美解决 Xshell 使用 SSH 连接 Linux 服务器报错&#xff1a;找不到匹配的 host key 算法 摘要&#xff1a; 本文将带领大家深入学习如何解决 Xshell 使用 SSH 连接 Linux 服务器时报错“找不到匹配的 host key 算法”的问题。通过详细的操作步骤和代码案…

Shopee虾皮API:获取商家店铺商品列表

一、平台介绍 Shopee&#xff0c;作为东南亚及中国台湾地区领先的电商平台&#xff0c;为卖家提供了一个便捷、高效的销售渠道。作为卖家&#xff0c;能够将自己的商品展示在Shopee平台上&#xff0c;并通过平台的流量和工具&#xff0c;将商品销售给更多的潜在买家。 为了帮…

系统架构设计师 - 操作系统(2)

操作系统 操作系统&#xff08;5-6分&#xff09;文件管理绝对路径与相对路径 ★索引文件 ★★★位示图 ★ 存储管理段页式存储 ★★★页式存储段式存储段页式存储&#xff08;了解&#xff09; 页面置换算法 ★ 微内核操作系统嵌入式操作系统 ★★★ 大家好呀&#xff01;我是…

数据库课设-中小企业工资管理系统

一、效果展示 二、后端代码 import string import random from flask import Flask, render_template, request, jsonify, redirect, session import pymysql from flask_cors import CORS import time import schedule from datetime import datetime import threading from …

HK1-BOX X3刷UBUNTU 24.04,并开启WIFI

端午刚好有点时间&#xff0c;顺便把改完散热的HK1-BOX刷了个最新OC版的UBUNTU 24&#xff0c;这里记录下操作的步骤&#xff1a; 准备材料 HK1-BOX S905X3&#xff1a;注意X4的不行固件没匹配的。建议先改完散热&#xff0c;不然作为7X24小时的机器长时间高温还是很伤硬件的…

Web前端项目-拼图游戏【附源码】

拼图游戏 拼图游戏是一种经典的益智游戏&#xff0c;通过HTML、CSS和JavaScript等前端技术的综合运用来实现&#xff1b;拼图游戏可以锻炼玩家的观察能力、空间认知能力和逻辑思维能力。游戏开始时&#xff0c;一张图片会被切割成多个小块&#xff0c;并以随机顺序排列在游戏区…

CMOS图像传感器——列噪声(CFPN)去除

目前CMOS 图像传感器系统中列共用结构应用最为广泛,在该结构中,虽然像素曝光均匀,但是由于列输出系统处理属性的变动,对于不同列,像素的输出是不均匀的。因此,基于列的CMOS 图像传感器表现出垂直条纹固定模式噪声(CFPN),从而降低了图像的质量。由于人眼 的关系,CFPN …

「布道师系列文章」宝兰德徐清康解析 Kafka 和 AutoMQ 的监控

作者&#xff5c;北京宝兰德公司解决方案总监徐清康 01 前言 当我们使用一个软件的时候&#xff0c;经常都会问这个软件怎么监控、监控他的哪些指标&#xff1f;Kafka 的监控挺长时间都是一个老大难的问题&#xff0c;社区在监控方面一直没有投入太大的精力。如果要实现一…

kotlin 中的字符串

一、字符类访问 1、字符串的访问跟js一样&#xff0c;可以使用索引来访问或者直接循环。 fun main() {val a: String "2024"// 方式一&#xff1a;for (item in a) {println(item) // 输出每一个字符}// 方式二&#xff1a;println("${a[0]}, ${a[1]}, ${a[2…