Android手機(jī)上圖像和IMU數(shù)據(jù)采集的方法
采用開源庫 https://github.com/DavidGillsjo/VideoIMUCapture-Android可同時(shí)采集圖像和IMU數(shù)據(jù)并提供了標(biāo)定腳本菇曲,具體的標(biāo)定方法可參考項(xiàng)目下的calibration文件夾中的README。
第一步:手機(jī)上采集數(shù)據(jù)并將數(shù)據(jù)導(dǎo)入到電腦
運(yùn)行APP采集的數(shù)據(jù)在手機(jī)上的存儲(chǔ)路徑為/sdcard/Android/data/se.lth.math.videoimucapture/files/YYYY_MM_DD_hh_mm_ss
可以通過adb命令將數(shù)據(jù)從手機(jī)拷貝到pc
adb pull /sdcard/Android/data/se.lth.math.videoimucapture/files/2022_03_27_09_34_31
錄制的數(shù)據(jù)共生成2個(gè)文件
其中video_meta.pb3是protobuff存儲(chǔ)格式抚吠,其中包含了IMU的數(shù)據(jù)
第二步:使用運(yùn)行Docker容器處理采集的數(shù)據(jù)
我用的是Ubuntu18.04裝的Docker常潮,在calibration文件夾下運(yùn)行命令
SUDO=1 DATA=<my-data-path> ./run_dockerhub.sh
<my-data-path>是電腦上存儲(chǔ)采集數(shù)據(jù)的目錄,進(jìn)入Docker容器后楷力,默認(rèn)在calibration目錄
這里的calibration目錄是docker中的喊式,里面是用于處理采集的數(shù)據(jù)的Python腳本孵户,其實(shí)這個(gè)docker容器是配置好了kalibr庫,就不用我們自己去編譯安裝這個(gè)庫了垃帅。
第三步:標(biāo)定相機(jī)
首先要處理一下采集到的數(shù)據(jù)延届,將數(shù)據(jù)轉(zhuǎn)換為kalibr可處理的數(shù)據(jù),kalibr是運(yùn)行在ros中的贸诚,其實(shí)就是將數(shù)據(jù)轉(zhuǎn)換為rosbag方庭。
python data2statistics.py /host_home/<path-to-recording>/video_meta.pb3
/host_home/<path-to-recording>代表的是宿主的數(shù)據(jù)存儲(chǔ)路徑,也就是我們Ubuntu系統(tǒng)中的路徑酱固。host_home代表Ubuntu的home路徑械念。
比如我把數(shù)據(jù)放到了Ubuntu中的~/VideoIMUCapture-Android/calibration/cc3下,那在docker中執(zhí)行的命令為
這里--tag-size表示我們自己打印的Apritag后运悲,用尺子測(cè)量的一個(gè)二維碼大小單位是m龄减,--subsample為從.mp4文件中采樣圖片間隔,30表示每隔30幀采樣一張班眯。
這個(gè)腳本執(zhí)行完后希停,如上圖,會(huì)在數(shù)據(jù)存儲(chǔ)的目錄生成一個(gè)kalibr目錄署隘,用于存儲(chǔ)處理好的數(shù)據(jù)宠能。
下一步我們進(jìn)入到kalibr目錄,執(zhí)行標(biāo)定命令
完成后磁餐,會(huì)生成camchain-kalibr.yaml文件表示標(biāo)定完成违崇,result-cam-kalibr.txt是標(biāo)定的結(jié)果,其中保存了誤差等數(shù)據(jù)诊霹,report-cam-kalibr.pdf是生成的統(tǒng)計(jì)圖
第四步:標(biāo)定IMU
由于IMU的加速度計(jì)和陀螺儀有噪聲和游走噪聲羞延,需要單獨(dú)的標(biāo)定,目前都是采用imu_utils庫來標(biāo)定脾还。
首先我們要在Ubuntu中安裝ros伴箩,并編譯imu_utils。
1鄙漏、這里我們用另一個(gè)App單獨(dú)采集IMU數(shù)據(jù)https://github.com/sunset768541/mobile-ar-sensor-logger赛蔫。
采集的數(shù)據(jù)存儲(chǔ)在手機(jī)的/sdcard/Android/data/edu.osu.pcv.marslogger/files/data/路徑
存儲(chǔ)的格式為
2、安裝ros 可參考https://zhuanlan.zhihu.com/p/397594162文章
安裝imu_utils可參考https://blog.csdn.net/learning_tortosie/article/details/102415313#commentBox 文章
3泥张、修改一下采集到的gro_accel.csv的第一行為,并改成imu0.csv
4鞠值、將imu0.csv轉(zhuǎn)換為ros.bag 可參考https://blog.csdn.net/hltt3838/article/details/116064390
利用kalibr_bagcreater 因?yàn)槲覀冊(cè)贒ocker中安裝了kalibr媚创,所以我們進(jìn)入docker中執(zhí)行
5、創(chuàng)建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= "meizu18"/>
<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可以自定義彤恶,比如我的是meizu18
max_time_min表示采集imu的數(shù)據(jù)的時(shí)間钞钙,建議2個(gè)小時(shí)鳄橘,單位是分鐘,我這里只采集的11分鐘
6芒炼、啟動(dòng)標(biāo)定 可參考https://blog.csdn.net/sinat_25923849/article/details/107867407
roslaunch imu_utils android.launch
rosbag play imu.bag
最好先 source imu_utils path /devel/setup.bash
roslaunch啟動(dòng)程序瘫怜,rosbag play是播放錄制的數(shù)據(jù),可以-r 200設(shè)置200倍播放本刽,當(dāng)處理完后鲸湃。
在imu_utils中生成了標(biāo)定文件
6、注意如果調(diào)用ros命令時(shí)報(bào)錯(cuò)子寓,沒有命令 可以運(yùn)行source /opt/ros/里面有個(gè)source.bash
第5步:相機(jī)和IMU融合標(biāo)定
同樣暗挑,根據(jù)VideoIMUCapture-Android/庫的calibration下的README.md Calibrate IMU and camera部分
首先通過python data2kalibr.py 處理記錄的數(shù)據(jù),這里 --kalibr-calibration指向我們?cè)谙鄼C(jī)標(biāo)定步驟生成的標(biāo)定文件
在生成的kalibr文件中執(zhí)行斜友,記得要把我們之前標(biāo)定的IMU數(shù)據(jù)拷貝到imu.yaml中
這一步完成后炸裆,就生成了標(biāo)定結(jié)果
備注
注意標(biāo)定相機(jī)和 相機(jī)IMU融合標(biāo)定的錄制數(shù)據(jù)方式不同,
單獨(dú)標(biāo)定相機(jī)鲜屏,是保持相機(jī)不動(dòng)烹看,移動(dòng)Apritag。
相機(jī)和IMU融合標(biāo)定是ApilTag不動(dòng)洛史,按照https://github.com/ethz-asl/kalibr/wiki/camera-imu-calibration 給的方式采集數(shù)據(jù)惯殊。
重要:如果采集標(biāo)定的數(shù)據(jù)誤差大于0.5,可能是采集的圖像質(zhì)量不夠好虹菲,注意采集圖像的時(shí)候要慢慢移動(dòng)靠胜,保證每個(gè)圖片都清晰,光線好毕源,Apritag要平整浪漠,盡量貼在硬紙板上。
ps:我開始的誤差是0.55霎褐,在重新采集圖片后址愿,誤差降低到了0.137。一般0.1-0.2表示標(biāo)定結(jié)果優(yōu)秀冻璃。