T265相机双目鱼眼+imu联合标定(全记录)

最近工作用到t265,记录一遍标定过程

1.安装驱动

首先安装realsense驱动,因为笔者之前使用过d435i,装的librealsense版本为2.55.1,直接使用t265会出现找不到设备的问题,经查阅发现是因为realsense在2.53.1后就不再支持t265了。

包括使用launch文件打开相机也不可以。

需要对其降级,于是到librealsense/build中执行sudo make uninstall删除。

新下载2.53.1版本:realsense各个版本

下载后,准备安装,这过程不要连接相机!

先安装依赖:

sudo apt-get install libudev-dev pkg-config libgtk-3-dev
sudo apt-get install libusb-1.0-0-dev pkg-config
sudo apt-get install libglfw3-dev
sudo apt-get install libssl-dev

然后进入到下载好并解压的文件夹内执行以下命令:

sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && udevadm trigger 
mkdir build
cd build
cmake …
make
sudo make install

完事就可以输入:

realsense-viewer

此时应该显示t265双目鱼眼相机的画面了

好,这一步成功

2.安装Realsense ROS

创建ros工作空间:

mkdir -p ~/realsense_ws/src
cd ~/catkin_ws/src
catkin_init_workspace

然后下载文件:

git clone https://github.com/IntelRealSense/realsense-ros.git
git clone https://github.com/pal-robotics/ddynamic_reconfigure.git

编译并运行:

cd ..
catkin_make 
source devel/setup.bash
roslaunch realsense2_camera demo_t265.launch

就可以在rviz中添加话题查看左右目图像了。

3.安装imu标定工具:

code_utils:

mkdir -p ~/code_utils_ws/src
cd code_utils_ws/
catkin_make

下载包并编译:

sudo apt-get install libdw-dev
cd ~/code_utils_ws/src
git clone https://github.com/gaowenliang/code_utils.git
cd ..
catkin_make

会报错:显示没有backward.hpp

只需要在include_directories中加入路径就好,如图:

再编译就好了。

然后下载imu_utils功能包,并编译:

cd ~/code_utils_ws/src
git clone https://github.com/gaowenliang/imu_utils.git
cd ..
catkin_make

这次很顺利。

然后需要在静置条件下录制imu包,我录为2h,在录包的时候一定要执行roslaunch rs_t265.launch,使相机工作。

 执行开始录制包:

rosbag record -O imu2h /camera/imu --duration=2h

然后标定过程需要在/home/shikai/code_utils_ws/src/imu_utils/launch这个路径下新建一个launch文件

<launch><node pkg="imu_utils" type="imu_an" name="imu_an" output="screen"><param name="imu_topic" type="string" value= "/camera/imu"/><param name="imu_name" type="string" value= "imu"/><param name="data_save_path" type="string" value= "$(find imu_utils)/data/"/><param name="max_time_min" type="int" value= "120"/><param name="max_cluster" type="int" value= "100"/></node></launch>

主要修改 imu_topic为自己的imu话题和max_time_min时长,单位是分钟。

roslaunch imu_test.launch
rosbag play -r 200 imu2h.bag

这一步分开执行,有的博主没写清楚,执行第一步之后,程序会进入等待话题的状态,这时再执行第二步快进过一遍自己的rosbag,当bag包加速回放完毕后,执行launch的窗口仍然会显示wait for imu data.,等待一段时间计算,计算完毕后会显示计算结果。显示done之后,在/home/shikai/code_utils_ws/src/imu_utils/data这个文件夹下会出现一系列的data文件,打开yaml文件,会看到计算出来的噪声和随机游走的系数值。

到此时对imu标定完毕

4.安装kalibr:

这个网上有好多教程,不赘述,直接说录包命令

rosbag record -O test1 /camera/fisheye1/image_raw /camera/fisheye2/image_raw

对着标定板录包后,该实用kalibr进行标定了

rosrun kalibr kalibr_calibrate_cameras --target April.yaml --bag test1.bag --models omni-radtan omni-radtan --topics /camera/fisheye1/image_raw /camera/fisheye2/image_raw

rosrun kalibr kalibr_calibrate_cameras:这是ROS的命令格式,用于运行Kalibr包中的kalibr_calibrate_cameras程序。

--target April.yaml:这个参数指定了用于相机校准的标定板(标定靶)的配置文件。

--bag test1.bag:这个参数指定了包含相机图像数据的ROS bag文件。test1.bag是一个bag文件,其中包含了用于相机校准的图像数据。

--models omni-radtan omni-radtan:这个参数指定了相机模型的类型。omni-radtan是一种用于鱼眼相机的畸变模型,它考虑了径向畸变和切向畸变,适用于鱼眼镜头产生的强烈畸变。

--topics /camera/fisheye1/image_raw /camera/fisheye2/image_raw:这个参数指定了ROS话题

然后经过漫长的等待,最终得到双目相机标定结果

根据报告来看效果还可以 。

5.联合标定

首先新建文件touch imu.yaml

之前imu标定有一个yaml文件内容是这样的:

%YAML:1.0
---
type: IMU
name: imu
Gyr:unit: " rad/s"avg-axis:gyr_n: 2.0329310164723647e-03gyr_w: 2.2123382727191195e-05x-axis:gyr_n: 1.7189864293645056e-03gyr_w: 2.6415569244764821e-05y-axis:gyr_n: 2.7012961183810300e-03gyr_w: 2.2206632567010946e-05z-axis:gyr_n: 1.6785105016715576e-03gyr_w: 1.7747946369797813e-05
Acc:unit: " m/s^2"avg-axis:acc_n: 1.8852789385037937e-02acc_w: 4.0146583082726104e-04x-axis:acc_n: 1.6792437581239685e-02acc_w: 2.8762304968836755e-04y-axis:acc_n: 1.8515839456546758e-02acc_w: 5.7417816070608088e-04z-axis:acc_n: 2.1250091117327372e-02acc_w: 3.4259628208733464e-04

我们新建imu文件使用其中内容即可:

rostopic: /camera/imu
update_rate: 200.0 #Hzaccelerometer_noise_density: 1.8852789385037937e-02
accelerometer_random_walk: 4.0146583082726104e-04
gyroscope_noise_density: 2.0329310164723647e-03
gyroscope_random_walk: 2.2123382727191195e-05

这样就得到imu.yaml文件,加上之前得到t265相机标定yaml文件来联合标定,执行以下命令:

rosrun kalibr kalibr_calibrate_imu_camera --target April.yaml --bag test1.bag --cams test1-camchain.yaml --imu imu.yaml

等待好久,要一直优化,终端会显示这些,一直在迭代:

Optimizing...
Using the block_cholesky linear system solver
Using the levenberg_marquardt trust region policy
Using the block_cholesky linear system solver
Using the levenberg_marquardt trust region policy
Initializing
Optimization problem initialized with 17204 design variables and 656142 error terms
The Jacobian matrix is 1346674 x 77398
[0.0]: J: 1.18472e+06
[1]: J: 101749, dJ: 1.08297e+06, deltaX: 0.203747, LM - lambda:10 mu:2
[2]: J: 98905.9, dJ: 2843.45, deltaX: 0.0720314, LM - lambda:3.33333 mu:2
[3]: J: 98553.1, dJ: 352.821, deltaX: 0.0682763, LM - lambda:1.11111 mu:2
[4]: J: 98543.7, dJ: 9.38912, deltaX: 0.150521, LM - lambda:0.37037 mu:2

最终输出结果,外参、时间戳延迟之类:

T_ci:  (imu0 to cam0): 
[[-0.99999467  0.00187288 -0.00267487  0.01599095][-0.00187503 -0.99999792  0.00080112  0.02327695][-0.00267337  0.00080613  0.9999961  -0.01275659][ 0.          0.          0.          1.        ]]T_ic:  (cam0 to imu0): 
[[-0.99999467 -0.00187503 -0.00267337  0.0160004 ][ 0.00187288 -0.99999792  0.00080613  0.02325724][-0.00267487  0.00080112  0.9999961   0.01278067][ 0.          0.          0.          1.        ]]

到这里就结束了

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

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

相关文章

【C语言指南】C语言内存管理 深度解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 引言 C语言是一种强大而灵活的编程语言&#xff0c;为程序员提供了对内存的直接控制能力。这种对内存…

Python学习从0到1 day26 第三阶段 Spark ④ 数据输出

半山腰太挤了&#xff0c;你该去山顶看看 —— 24.11.10 一、输出为python对象 1.collect算子 功能: 将RDD各个分区内的数据&#xff0c;统一收集到Driver中&#xff0c;形成一个List对象 语法&#xff1a; rdd.collect() 返回值是一个list列表 示例&#xff1a; from …

【机器学习】机器学习中用到的高等数学知识-1.线性代数 (Linear Algebra)

向量(Vector)和矩阵(Matrix)&#xff1a;用于表示数据集&#xff08;Dataset&#xff09;和特征&#xff08;Feature&#xff09;。矩阵运算&#xff1a;加法、乘法和逆矩阵(Inverse Matrix)等&#xff0c;用于计算模型参数。特征值(Eigenvalues)和特征向量(Eigenvectors)&…

java项目-jenkins任务的创建和执行

参考内容: jenkins的安装部署以及全局配置 1.编译任务的general 2.源码管理 3.构建里编译打包然后copy复制jar包到运行服务器的路径 clean install -DskipTests -Pdev 中的-Pdev这个参数用于激活 Maven 项目中的特定构建配置&#xff08;Profile&#xff09; 在 pom.xml 文件…

【数据库取证】快速从服务器镜像文件中获取后台隐藏数据

文章关键词&#xff1a;电子数据取证、数据库取证、电子物证、云取证、手机取证、计算机取证、服务器取证 小编最近做了很多鉴定案件和参加相关电子数据取证比武赛&#xff0c;经常涉及到服务器数据库分析。现在分享一下技术方案&#xff0c;供各位在工作中和取证赛事中取得好成…

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined

VUE_PROD_HYDRATION_MISMATCH_DETAILS 未明确定义。您正在运行 Vue 的 esm-bundler 构建&#xff0c;它期望这些编译时功能标志通过捆绑器配置全局注入&#xff0c;以便在生产捆绑包中获得更好的tree-shaking优化。 Vue.js应用程序正在使用ESM&#xff08;ECMAScript模块&#…

git撤销、回退某个commit的修改

文章目录 撤销某个特定的commit方法 1&#xff1a;使用 git revert方法 2&#xff1a;使用 git rebase -i方法 3&#xff1a;使用 git reset 撤销某个特定的commit 如果你要撤销某个很早之前的 commit&#xff0c;比如 7461f745cfd58496554bd672d52efa8b1ccf0b42&#xff0c;可…

Flume和kafka的整合

1、Kafka作为Source 【数据进入到kafka中&#xff0c;抽取出来】 在flume的conf文件夹下&#xff0c;有一个flumeconf 文件夹&#xff1a;这个文件夹是自己创建的 创建一个flume脚本文件&#xff1a; kafka-memory-logger.conf Flume 1.9用户手册中文版 — 可能是目前翻译最完…

JavaSE常用API-日期(计算两个日期时间差-高考倒计时)

计算两个日期时间差&#xff08;高考倒计时&#xff09; JDK8之前日期、时间 Date SimpleDateFormat Calender JDK8开始日期、时间 LocalDate/LocalTime/LocalDateTime ZoneId/ZoneDateTIme Instant-时间毫秒值 DateTimeFormatter Duration/Period

支持向量机SVM——基于分类问题的监督学习算法

支持向量机&#xff08;SVM&#xff0c;Support Vector Machine&#xff09;是一种常用于分类问题的监督学习算法&#xff0c;其核心思想是通过寻找一个最佳的超平面来将不同类别的数据点分开&#xff0c;从而实现分类。支持向量机广泛应用于模式识别、文本分类、图像识别等任务…

node对接ChatGpt的流式输出的配置

node对接ChatGpt的流式输出的配置 首先看一下效果 将数据用流的方式返回给客户端,这种技术需求在传统的管理项目中不多见,但是在媒体或者有实时消息等功能上就会用到,这个知识点对于前端还是很重要的。 即时你不写服务端,但是服务端如果给你这样的接口,你也得知道怎么去使用联…

SobarQube实现PDF报告导出

文章目录 前言一、插件配置二、使用步骤1.新生成一个Token2.将拷贝的Token加到上文中执行的命令中3.查看报告 三、友情提示总结 前言 这篇博文是承接此文 .Net项目在Windows中使用sonarqube进行代码质量扫描的详细操作配置 描述如何导出PDF报告 众所周知&#xff0c;导出PDF功…

[Codesys]常用功能块应用分享-BMOV功能块功能介绍及其使用实例说明

官方说明 功能说明 参数 类型 功能 pbyDataSrcPOINTER TO BYTE指向源数组指针uiSizeUINT要移动数据的BYTE数pbyDataDesPOINTER TO BYTE指向目标数组指针 实例应用-ST IF SYSTEM_CLOCK.AlwaysTrue THENCASE iAutoState OF0: //读写完成信号在下次读写信号的上升沿或复位信号…

sql注入之二次注入(sqlilabs-less24)

二阶注入&#xff08;Second-Order Injection&#xff09;是一种特殊的 SQL 注入攻击&#xff0c;通常发生在用户输入的数据首先被存储在数据库中&#xff0c;然后在后续的操作中被使用时&#xff0c;触发了注入漏洞。与传统的 SQL 注入&#xff08;直接注入&#xff09;不同&a…

springboot实现简单的数据查询接口(无实体类)

目录 前言&#xff1a;springboot整体架构 1、ZjGxbMapper.xml 2、ZjGxbMapper.java 3、ZjGxbService.java 4、ZjGxbController.java 5、调用接口测试数据是否正确 6、打包放到服务器即可 前言&#xff1a;springboot整体架构 文件架构&#xff0c;主要编写框选的这几类…

我的第一个PyQt5程序

PyQt5的开发环境配置完成之后&#xff0c;开始编写第一个PyQt5的程序。 方法一&#xff1a;使用将.ui转换成.py文件的方法 import sys from FirstPyQt import Ui_MainWindow from PyQt5.QtWidgets import *#QtCore,QtGui,QtWidgets # from QtTest import Ui_MainWindow#导入Q…

C++ | Leetcode C++题解之第560题和为K的子数组

题目&#xff1a; 题解&#xff1a; class Solution { public:int subarraySum(vector<int>& nums, int k) {unordered_map<int, int> mp;mp[0] 1;int count 0, pre 0;for (auto& x:nums) {pre x;if (mp.find(pre - k) ! mp.end()) {count mp[pre - …

DVWA靶场通关——SQL Injection篇

一&#xff0c;Low难度下unionget字符串select注入 1&#xff0c;首先手工注入判断是否存在SQL注入漏洞&#xff0c;输入1 这是正常回显的结果&#xff0c;再键入1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for…

MYSQL 精通索引【快速理解】

目录 1、什么是索引&#xff1f; 2、索引结构 1.为什么不使用二叉树呢&#xff1f; 2.B树数据结果 3.B树 4.Hash结构 3、索引语法 1.创建索引 2.查看索引 3.删除索引 4、SQL性能分析 1.SQL执行频次 2.慢查询日志 3.profile详情 4.EXPLAIN 5、索引规则 1.最左前缀法则 2.索…

【Framework系列】UnityEditor调用外部程序详解

需求介绍 之前Framework系列有介绍过导表配置工具&#xff0c;感兴趣的小伙伴可以看一看之前的文章《【Framework系列】Excel转Json&#xff0c;配置表、导表工具介绍》。由于导表工具和Unity是两个工程&#xff0c;导表工具不在Unity工程之内&#xff0c;所以在配置生成完成之…