安卓手机 相机和IMU数据获取标定 在VINS-MONO运行自己的数据集(含打包方法) (非常详细一步一步来)

2023-05-16

Android手机上图像和IMU数据采集的方法

网上有相关的教程,但都讲的很模糊,而且不全,甚至还有人要收费。自己完整做了一遍发现还是有些麻烦,固记录下来供大家参考,希望能帮到大家、

采用开源库 VideoIMUCapture-Android
可同时采集图像和IMU数据并提供了标定脚本。点击上面链接,下载软件。

第一步:获取数据

我文末的参考博客里有从linux获取软件数据的方法,这里我介绍在windows上直接获取的方法(当然linux也可以这样)
从上面的github库里面获取apk文件进行安装,打开会得到这样一个界面,点击直接开始录制(如图)

在这里插入图片描述
录制完成的数据会储存在
/Android/data/se.lth.math.videoimucapture/files/YYYY_MM_DD_hh_mm_ss
当然,如果你点软件界面的感叹号,他告诉你的路径前面还有前缀 /storage/emulated/0/,这个只是值你的设备的主储存。
如果你通过手机文件管理器直接查看这个位置,很有可能看不到,这是Arduino11之后的权限问题。
最直接的方法,你直接将手机数据线连接到电脑上,在手机上选择usb传输模式为文件传输,这样你就可以在电脑端直接访问手机里的这个文件夹,如图
在这里插入图片描述
这里你就可以看到你在不同时间段录制的数据,直接就可以拿出来用
在这里插入图片描述

第二步:使用docker处理采集的数据

ubuntu18安装docker,参考链接:
ubuntu18.04上安装Docker
在linux下运行如下命令,获取 VideoIMUCapture-Android 的github库

git clone https://github.com/DavidGillsjo/VideoIMUCapture-Android.git

进入对应文件夹

cd VideoIMUCapture-Android/calibration

在calibration文件夹下运行命令,

SUDO=1 DATA=<my-data-path> ./run_dockerhub.sh

这里<my-data-path>就是你放的 YYYY_MM_DD_hh_mm_ss 这样日期文件的上一级文件,比如我这里
在这里插入图片描述

执行完这个就进入了docker容器里面,进入Docker容器后,默认在calibration目录。这里的calibration目录是docker中的,里面是用于处理采集的数据的Python脚本,其实这个docker容器是配置好了kalibr库,就不用我们自己去编译安装这个库了。

第三步:标定相机

先在这个位置:https://github.com/ethz-asl/kalibr/wiki/downloads下载一个 April,用A4纸打印,贴到平整的墙面上,然后用上面的软件对着它简单录制几十秒的视频。
按照上面的方法,把数据转移到linux上
首先要处理一下采集到的数据,将数据转换为kalibr可处理的数据
执行命令

python data2statistics.py /host_home/<path-to-recording>/video_meta.pb3

这里<path-to-recording>就是<my-data-path>/YYYY_MM_DD_hh_mm_ss,比如我这
在这里插入图片描述
运行后会弹出这样的图片,关掉就好了
在这里插入图片描述
kalibr标定
运行命令

python data2kalibr.py /host_home/<path-to-recording> --tag-size <measured-april-tag-size-in-meters> --subsample 30

这里–tag-size表示我们自己打印的Apritag后,用尺子测量的一个二维码大小单位是m,–subsample为从.mp4文件中采样图片间隔,30表示每隔30帧采样一张。
比如我这
在这里插入图片描述

这个脚本执行完后,如上图,会在数据存储的目录生成一个kalibr目录,用于存储处理好的数据。
进入到kalibr目录

cd /host_home/<path-to-recording>/kalibr

执行标定命令
这里发布的topic是/cam0/image_raw

kalibr_calibrate_cameras --bag kalibr.bag --target target.yaml --models pinhole-equi --topics /cam0/image_raw

第四步:标定IMU

由于IMU的加速度计和陀螺仪有噪声和游走噪声,需要单独的标定,目前都是采用imu_utils库来标定。
首先我们要在Ubuntu中安装ros,并编译imu_utils。
ros的安装可以参考我的另一篇博客:
https://blog.csdn.net/qin_liang/article/details/127352107

imu_utils编译按以下方法
安装imu_utils

先安装依赖

sudo apt-get install libdw-dev

先编译code_utils

mkdir -p imu-calibration/src
cd imu-calibration/src
git clone https://github.com/gaowenliang/code_utils.git
cd ..

在code_utils下面找到sumpixel_test.cpp,修改#include "backward.hpp"为

#include "code_utils/backward.hpp"

再编译

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

获取imu数据
这里我们用另一个App单独采集IMU数据,点击链接下载
Mobile AR Sensor (MARS) Logger

开始录制后,将手机平放在桌面上静止11分钟。(官方推荐2小时,我这里用11分钟先试一下)
采集的数据存储在手机的、Android/data/edu.osu.pcv.marslogger/files/data/路径,找的方法同上

存储的格式为
在这里插入图片描述
修改一下采集到的gro_accel.csv的第一行为如下图所示,并改名成imu0.csv
在这里插入图片描述

将imu.csv转化为ros.bag
在doker环境下的kalibr文件夹下运行命令(根据自己的imu数据存放位置改,bag包名字可以改)

kalibr_bagcreater --folder /host_home/dataset/imu/ --output-bag imu.bag

比如我的
在这里插入图片描述
创建launch文件
打开之前miu_utils下的lauch文件夹,创建android.launch
在这里插入图片描述
里面内容如下:

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

imu_name可以自定义,比如我的是onePlus7

max_time_min表示采集imu的数据的时间,建议2个小时,单位是分钟,我这里只采集的11分钟

启动标定
如果下面的命令执行出错,可以先在imu_utils所在的空间下,执行catkin_make。如果是按照我之前的方法安装的imu_utils就是如下
在这里插入图片描述

在launch对应的文件夹下打开终端
输入命令(这里根据你imu_utils所在的位置更改)

source ~/imu-calibration/devel/setup.bash

再执行命令

roslaunch imu_utils android.launch

此时程序会进入等待话题的状态
在这里插入图片描述
这时打开之前转化的.bag包的位置,执行命令(bag名自己改)

rosbag play imu.bag

你也可以使用以下命令,以200倍速度播放

rosbag play -r 200 imu.bag

要是这里失败了就重新生成imu.bag
终端会开始读取数据
在这里插入图片描述
运行lauch的终端出现这个done的时候,就完成了标定(我当时只运行到log file的位置,等了一段时间还没结束,我看文件已经生成了就直接ctrl+C结束了终端,最后也显示了done)
在这里插入图片描述

完成后,你就可以在imu_utils的data文件夹下看到生成的标定文件
在这里插入图片描述

第五步:相机和IMU融合标定

相机和IMU融合标定是ApilTag不动
按照https://github.com/ethz-asl/kalibr/wiki/camera-imu-calibration 给的方式采集数据。
首先通过python data2kalibr.py 处理记录的数据,

python data2kalibr.py /host_home/<path-to-recording> --tag-size 0.025 --subsample 3 --kalibr-calibration <calibration-result-dir>/camchain-kalibr.yaml

这里 --kalibr-calibration指向我们在相机标定步骤生成的标定文件
比如我这
在这里插入图片描述
把我们之前标定的IMU数据中对应项(avg)填到到imu.yaml中(前面标定的IMU数据用的缩写)

然后改了一下rostopic,我的修改如下

在这里插入图片描述

切换到kalibra文件夹后再执行

cd <path-to-recording>/kalibr
kalibr_calibrate_imu_camera --target target.yaml --imu imu.yaml --cams camchain.yaml --bag kalibr.bag

在这里插入图片描述
在这里插入图片描述
这里可以看到就已经标定完成了

转化ros.bag包

进入对应文件夹

cd VideoIMUCapture-Android/calibration

在calibration文件夹下运行命令,

SUDO=1 DATA=<my-data-path> ./run_dockerhub.sh

再运行(这里的camchain-imucam-kalibr.yaml,要具体写之前我们生成这个文件的位置,

python data2rosbag.py <path-to-recording> --calibration camchain-imucam-kalibr.yaml --raw-image

比如我的

python data2rosbag.py /host_home/dataset/test5 --calibration /host_home/dataset/cam_imu/kalibr/camchain-imucam-kalibr.yaml --raw-image

这样在这个文件夹下就生成了data.bag的包
在这里插入图片描述

在VINS上运行

打开VINS的config文件夹,新建一个android的文件夹
将euroc文件夹下的euroc_config.yaml复制到android的文件夹下,改名为android_config.yaml
在这里插入图片描述
修改里面的image_width,image_height,这里注意那个手机APP比如显示的分辨率是1280x960,你这里width要写960,height写1280,因为你手机是竖屏的。(千万不要把model_type改为小写,可能之前那个标定文件里是小写,但这里要保持大写,要不然后面跑的时候你看到的都是蓝色的点)
打开之前的标定文件,把imu和cam的参数填到andoid_config.yaml中
在这里插入图片描述
在VINS的文件夹中复制euroc.launch一份,改名为android.launch,修改config_path为我们刚才创建的android_config.yaml的文件夹

在这里插入图片描述
开始运行
在catkin_ws文件夹下分别打开三个终端,分别输入

source devel/setup.bash
roslaunch vins_estimator android.launch
source devel/setup.bash
roslaunch vins_estimator vins_rviz.launch

这里就是你自己数据集生成的bag包的位置

source devel/setup.bash
rosbag play data5.bag

到这一步,我们就终于用手机完成了数据集制作标定和运行,当然现在效果还不行,具体细节就要我们自己去优化了
在这里插入图片描述

参考博客:
Android的SLAM相机和IMU标定方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓手机 相机和IMU数据获取标定 在VINS-MONO运行自己的数据集(含打包方法) (非常详细一步一步来) 的相关文章

  • 自制三维激光扫描建模

    看图片就是我做的东西 xff0c 很炫酷是不是 好吧 xff0c 开玩笑 xff0c 这是电影普罗米修斯的截图 当初看这个电影的时候就感觉这东西好眩酷 xff0c 我能不能做出来 最近借着帮做毕业设计的机会我也做了一个 就是这个丑丑的东西啦
  • ICE C++ Hello World

    ICE C 43 43 Hello World实例教程 1 概述 本文演示了如何编写一个最简单的C 43 43 ICE Internet Communications Engine 应用程序 xff0c 包括必要环境的安装 该应用程序包含客
  • 华为工作的感悟

    参考 xff1a http www openlab net cn forums thread 1002986 1 p10035795 北邮北 xff0c 清华硕 xff0c 一年两个月的华为生活总结 xff0c 算了 xff0c 贴出来了
  • MRCP 媒体资源控制协议

    媒体资源控制协议 xff08 Media Resource Control Protocol MRCP xff09 是一种通讯协议 xff0c 用于语音服务器向客户端提供各种语音服务 如语音识别和语音合成 MRCP并不定义会话连接 xff0
  • matlab(1):使用matlab处理excel数据进行画图

    目录 0 说明 1 直接使用xlsread读取出错 2 解决办法 3 绘图 0 说明 Excel数据示例 xff08 number filter radius 0 8 3 csv xff09 xff0c 一共99行数据 xff08 4列 x
  • Hadoop中VIntWritable编码方式解析

    最近因为实验室的云计算项目 xff0c 开始学习Hadoop xff0c 有时间就记录一下自己在学习过程中的一些小收获吧 Hadoop权威指南 在序列化这一节有个例子程序 xff0c 叫做TextPair xff0c 代码略长 xff0c
  • MapReduce中的二次排序

    在MapReduce操作时 xff0c 我们知道传递的 lt key value gt 会按照key的大小进行排序 xff0c 最后输出的结果是按照key排过序的 有的时候我们在key排序的基础上 xff0c 对value也进行排序 这种需
  • 基于哈夫曼编码的文件压缩解压

    这个程序是研一上学期的课程大作业 当时 xff0c 跨专业的我只有一点 C 语言和数据结构基础 xff0c 为此 xff0c 我查阅了不少资料 xff0c 再加上自己的思考和分析 xff0c 实现后不断调试 测试和完善 xff0c 耗时一周
  • 2020-12-29 Matlab自动化控制-Adrc自抗扰控制参数调节

    Matlab自动化控制 Adrc自抗扰控制参数调节 上篇参看 xff1a https blog csdn net qingfengxd1 article details 111830762 以最简单的线性组合方法 xff08 1 xff09
  • 单级倒立摆的神经网络控制

    倒立摆系统是一种典型的多变量 非线性 强耦合模型 xff0c 它作为一种被控对象 xff0c 用来检验控制理论的可行性和控制的稳定性 人工神经网络由于具有信息的分布存储 并行处理以及自学习能力等优点 xff0c 在信息处理 模式识别 智能控
  • 基于串级 PID 控制算法的四旋翼无人机控制系统设计与实现

    1 内容简介 略 489 可以交流 咨询 答疑 2 内容说明 无人机 xff0c 英文名称UAV C Unmanned Aerial Vehicle xff0c 是一种特殊的飞行器 xff0c 可以按照预先设定的轨迹进行各种运动 xff0c
  • matlab simulink四旋翼无人机模糊PID控制姿态

    1 内容简介 略 532 可以交流 咨询 答疑 2 内容说明 四旋翼无人机控制灵活 安全性能较高 xff0c 能够实现空中悬停 翻滚 任意角度横 向飞行 xff0c 常常替代人们从事高空危险作业 xff0c 给我们的生活与工作带来了很多便利
  • 深度学习基础

    深度学习介绍 深度学习与机器学习的区别 xff1a 机器学习的特征工程步骤是要靠手动完成的 xff0c 而且需要大量的领域专业知识 深度学习不需要更多的特征处理 只需要进行图片的输入 xff0c 进入神经网络后 xff0c 输出结果 深度学
  • Ubuntu18.04安装ROS Melodic

    1 设置安装源 为了安装ROS Melodic xff0c 首先需要在Ubuntu 18 04 LTS上添加安装源到source list xff0c 方法如下 strong sudo sh c 39 echo 34 deb http pa
  • 嵌入式软件开发笔试面试(五)

    uboot启动流程 uboot是一种启动系统 xff0c 但不属于操作系统 xff0c 内核运行 xff0c uboot结束 启动流程 xff1a 一 汇编阶段 切换到svc模式 为了保证启动稳定 xff0c 关闭看门狗 中断 MMU ca
  • ros(22):catkin_make可以加多线程/多核、catkin_make -j4、catkin_make -j8、catkin_make -j12、catkin_make -j16

    之前以为catkin make 后面不能加多核 多线程 xff0c 现在发现是可以的 xff0c catkin make jn xff08 n为数字 xff09 命令在编译时被拆分为以下两个 xff1a make cmake check b
  • UWB TDOA一维定位解算

    在某些定位场景 xff0c 比如在隧道 走廊等区域 xff0c 需要用到一维解算 xff0c 下面介绍TDOA的长直线解算定位标签位置 xff08 当然也可以用TWR实现一维解算 xff09 定位模型与已知量如下 xff1a 解算不考虑z坐
  • baseflight无头模式原理

    最近探索了baseflight cleanflight源码相关 xff0c 看了源码想分享一下 xff0c baseflight无头模式的原理 baseflight源码可以在github中搜到 xff0c 网址直达 xff1a https
  • cleanflight修改--固件默认飞行模式

    对于我们飞控开发者来说 xff0c 如果每次下完代码后飞行模式modes都要在上位机重新改一次 xff0c 我们肯定会疯掉的 这时候就需要修改固件中默认的飞行模式了 如何下手呢 xff0c 我先从cleanflight飞控的上位机和下位机通
  • 编译mission planner地面站

    编译mp地面站步骤 xff1a 下载最新mp源码 xff1a https github com ArduPilot MissionPlanner 下载最新地面站msi xff08 编译需要引用 xff09 xff1a http firmwa

随机推荐

  • DJI Lightbridge2接收端数据解析

    因为XXXX xff0c 需要对DJI的指令系统做研究 xff0c 首先解析的是 LB2 xff0c 也拆解了七七八八了 xff0c 现在对LB2天空端DBUS口的数据协议进行解析 xff0c 供电子 嵌入式同学进行学习研究 DBUS采用4
  • 室内定位TDOA-UWB实现无线同步的一种方法

    定位中 xff0c 如采用TDOA方式进行坐标解算 xff0c UWB基站间就需要进行时间同步 xff0c 时间同步可以采用有线同步或无线同步 xff1b 找到一篇论文中 xff0c 对无线同步有着巧妙处理 xff0c 特写博客记录一下 U
  • 安装Visual Assit 可在VS2010/VC6.0中使用

    1 1 vs2010中安装 下载Visual Assist X10 6 1823 0 rar破解版 第一步 xff1a 关闭VS2010 第二步 安装 双击安装包中的VA X Setup1823 vsix xff0c 安装 xff1b 第三
  • C++空指针调用类成员函数

    C 43 43 空指针可以调用类成员函数 xff0c 但是 不能调用 类中的 虚函数 我们知道 xff0c 一个对象的指针可以调用它的成员函数和虚函数 xff0c 那么如果一个指向空nullptr的指针 xff0c 能不能调用它的成员函数和
  • MissionPlanner日志保存方法

    闪存日志 目录 闪存日志 日志类型 闪存 VS 数传日志 设置你想要记录的数据 用Mission Planner下载日志 查看内容 详细信息 针对APM Copter 查看KMZ文件 视频教程 日志类型 闪存 VS 数传日志 有两种方法可以
  • Layui的laydate日期组件限制只能选择工作日

    如题 xff0c 在使用Layui的laydate日期组件时 xff0c layui只给我们提供了日期组件的min max配置 xff0c 分别对应最小可选时间和最大可选时间 xff0c 但是如果我们需求是只能选择工作日 xff08 周一至
  • python(5):TypeError: xxx() got an unexpected keyword argument ‘xxx‘

    定义了一个python函数 xff0c 调用时出现报错如下 xff1a Traceback most recent call last File 34 gaussian kernel py 34 line 18 in lt module g
  • 对《Java编程思想》读者的一点建议

    Java 编程思想 这本书在豆瓣的评分高达 9 1 分 xff0c 但我总觉得有点虚高 记得刚上大学那会 xff0c 就在某宝上买了一本影印版的 Java 编程思想 xff0c 但由于初学 Java xff0c 对编程极度缺乏信心 xff0
  • 强烈推荐10本程序员必读的书

    经常有读者私下问我 xff0c 能否推荐几本书 xff0c 以便空闲的时间读一读 于是我跑去自己的书架上筛选了 10 本我最喜欢的书 xff0c 你可以挑选感兴趣的来读一读 01 代码整洁之道 我可以这么肯定地说 xff1a 代码整洁之道
  • 教妹学Java(二十 七):this 关键字的用法

    你好呀 xff0c 我是沉默王二 xff0c xff08 目前是 xff09 CSDN 周排名前十的博客专家 这是 教妹学 Java 专栏的第二十七篇 xff0c 今天我们来谈谈 Java 的 this 关键字 this 关键字有哪些用法
  • PID控制原理

    PID控制原理 PID即 xff1a Proportional xff08 比例 xff09 Integral xff08 积分 xff09 Differential xff08 微分 xff09 的缩写 xff0c PID控制算法是结合比
  • ROS入门:IMU&GPS融合定位实例

    1 声明 xff1a a 本文主要针对IMU amp GPS融合定位仿真环境的搭建过程进行讲解 xff0c 而没有对具体原理的介绍 b 本人作为技术小白 xff0c 完全参考了https zhuanlan zhihu com p 15266
  • vSLAM研究综述:2010-2016

    作为vSLAM领域小白 xff0c 学习完 视觉SLAM十四讲 后 xff0c 抱着学习的心态研究了论文Visual SLAM algorithms a survey from 2010 to 2016 作为入门的第一步 xff0c 会有很
  • ROS学习:cv_bridge与opencv版本冲突三种解决方案

    cv bridge与opencv版本冲突三种解决方案 1 问题描述 xff1a 2 解决方案 xff1a 2 1 不使用cv bridge包2 2 令cv bridge使用opencv版本切换为自己工程所使用的版本2 3 下载cv brid
  • Kubernetes实战指南(三十四): 高可用安装K8s集群1.20.x

    文章目录 1 安装说明2 节点规划3 基本配置4 内核配置5 基本组件安装6 高可用组件安装7 集群初始化8 高可用Master9 添加Node节点10 Calico安装11 Metrics Server部署12 Dashboard部署 1
  • 烤四轴

    烤四轴方法 xff0c 先盗图一张 先调试内环后外环 xff08 不明白自行搜索串级PID xff09 1 在飞机的起飞油门基础上进行 PID 参数的调整 xff1b 2 将角度外环去掉 xff0c 将打舵量作为内环的期望 xff1b 3
  • 最全面的linux信号量解析

    2012 06 28 15 08 285人阅读 评论 0 收藏 编辑 删除 信号量 一 xff0e 什么是信号量 信号量的使用主要是用来保护共享资源 xff0c 使得资源在一个时刻只有一个进程 xff08 线程 xff09 所拥有 信号量的
  • ubuntu(20):xargs:clang-format: 没有那个文件或目录与ubuntu18.04安装clang-format

    1 报错排查 xff1a xargs clang format 没有那个文件或目录 运行脚本中的命令如下 xff1b 需要注意这里的clang format后面没有跟数字 修改前脚本 find dogm demo dogm include
  • ORA-28000 the account is locked处理办法

    启动项目的时候提示ORA 28000 the account is locked 这是因为用户被锁定了 oracle11g中默认在default概要文件中设置了 FAILED LOGIN ATTEMPTS 61 10次 xff0c 当输入密
  • 安卓手机 相机和IMU数据获取标定 在VINS-MONO运行自己的数据集(含打包方法) (非常详细一步一步来)

    Android手机上图像和IMU数据采集的方法 网上有相关的教程 xff0c 但都讲的很模糊 xff0c 而且不全 xff0c 甚至还有人要收费 自己完整做了一遍发现还是有些麻烦 xff0c 固记录下来供大家参考 xff0c 希望能帮到大家