用一台笔记本跑ROVIO


经过两个月的努力,终于在一台笔记本上,让ROVIO跑起来了。这里分享一下经验教训。

背景

ROVIO

ROVIO是一款开源的SLAM算法。

ROVIO地址:

https://github.com/ethz-asl/rovio/

目标

我在笔记本上装ROVIO,主要还是为了实验这个算法,最终把ROVIO移植到VR眼镜上面。

硬件

笔记本型号:LenovoThinkPad T540

CPU:i7-4700MQ

摄像头使用了笔记本自带的,分辨率640*480。IMU传感器为MPU6000,1000HZ,我把它直接贴在摄像头的后面,这样两者直接的距离就接近于0,方便后面的calibration。

用一台笔记本跑ROVIO_第1张图片

这样的硬件配置,我感觉有个问题。我拿着笔记本走动的时候,可定是拿着下面,但是笔记本电脑的演示器只要微微的晃动,对于上面的摄像头和IMU传感器来说,就是比较大的震动了,这时候就很容易driftaway。

一开始,我还试图把一个VR头盔放在笔记本的键盘上,用手摁住VR头盔。结果怎么实验都失败。所以,硬件还是要尽量固定好的。

扩展ROVIO

 

安装

经过反复失败,我总结ROVIO必须装在Ubuntu14.04上面(我在Ubuntu16.04上面就无法安装成功)。详细的安装步骤见:

ROVIO detailedinstallation steps from scrach

处理视频和IMU数据

ROVIO是建立在ROS的基础上的。它运行的时候,会读取ROS的消息。针对这一特点,我开发了两个程序分别为

camera_message:

https://github.com/juwikuang/camera_message

usb_sensor_message:

https://github.com/juwikuang/usb_sensor_message

 

这两个程序都是ROSPackage,所以都在catkin下编译。其中,usb_sensor_message需要用到HIDAPI,网上没有找到关于如何在EclipseCDT下使用它的文章,我自己研究了一下。

具体见:

在EclipseCDT下调用HIDAPI- Ubuntu 14.04

Calibration 校准

根据ROVIO的官方说明,需要对摄像头校准。

https://github.com/ethz-asl/rovio/wiki/Configuration

官方推荐的校准工具为Kalibr:

https://github.com/ethz-asl/kalibr

我没有去下载编译源代码,而是直接去下载页面下载了各种需要的工具和材料:

https://github.com/ethz-asl/kalibr/wiki/downloads

首先,下载工具Kalibr-CDE64-bit。接着下载两个sampledatasets。我觉得下载sampledatasets很重要它里面有ROSbag,可以用ROS的image_view命令打开查看他是怎么校准的。CalibrationTarget,是可以自己去生成的,但是下载页面已经提供了,我就直接用了。我用的是最后一个,7*6的国际象棋格子。

用一台笔记本跑ROVIO_第2张图片

录像的时候,时间长会比较稳定。我录了三次,针对每次录像又用工具算了三次参数。时间最长的那次,三次的计算结果也是比较稳定的。官方提供的录像有70秒,所以录像最好也达到70秒。至于录像的时候怎么动,也都看官方的。

测试

很不幸,每次测试,都很卡。程序一开始就报错。事实上,直接跑ROVIO,用ROSbag生成消息,也经常卡住。

扩展ROVIONOROS

运行ROVIO,必须先运行ROS,这耗费了很多计算机资源。而且,后期移植到VR眼镜上面的时候,还要把ROS去掉,也是很费劲的。我就在网上搜索怎么办。我很幸运的找到了北邮的PangFuming去掉ROS后的ROVIO:

https://github.com/pangfumin/Rovio_NoRos

 

安装

这位PangFuming没有在README里面说清楚怎么安装,我查看了代码以后发现代码里面在找.txt文件,而我从ROVIO官网下载的数据库里面,只有CSV文件。针对此事我询问了作者,对话见下面的页面:

https://github.com/pangfumin/Rovio_NoRos/issues/4

同时,我也记录下了安装的过程:

http://blog.csdn.net/juwikuang/article/details/70307976

 

处理图像和IMU

图像和IMU的处理沿用了PangFumin的思路。只是把输入换成了笔记本摄像头和MPU6000传感器。摄像头数据的读取放在了主线程中,IMU数据的读取放在了单独的线程中。主线程和IMU线程通过一个Queue共享数据。

https://github.com/juwikuang/rovio_noros_laptop

 

测试

经过反复实验,终于成功了。不过,系统的稳定性还是比较差的。以下是成功时的视频:

https://www.youtube.com/watch?v=6duaeucjLhw&feature=youtu.be

反复实验的经验如下:一开始的时候很关键。最好开始画面里有很多的feature。这里有很多办法,我会在黑板上画很多的feature,或者直接把Calibration Targets放在镜头前。如果开机没有飘(driftaway),就开始缓慢的小幅移动,让ROVIO自己去调整CameraExtrinsics。接着,就可以在房间里走一圈,再回到原点。

我一开始以为如果有人走动,ROVIO会不准。但是实测结果发现影响有限。ROVIO有很多特征点,如果一两个特征点位置变动,ROVIO会抛弃他们。这里,ROVIO相当于在算法层面,解决了移动物体的侦测。

ROVIO与VR眼镜

一个是微软的Kinect游戏机,用了RGBD摄像头。而HTCvive和Oculus,则使用空间的两点和手中的摄像机定位。ROVIO没有深度信息,这也许就是为什么它容易driftaway。

如果要将ROVIO用于产品上,可能还需要一个特定的房间,在这个房间里,有很多的特征点。如果房间里是四面白墙,恐怕ROVIO就无法运算了。

有限空间的定位

但是如果环境是可以控制的,也就不需要ROVIO了。可以在房间里的放满国际象棋盘,在每个格子里标上数字,这样只需要根据摄像头视野中的四个角上的feature(数字),就能确定位置了。这里不需要什么算法,因为这样的排列组合是有限的。只需要一个数据库就可以了。在POC阶段,可能会用数字。当然到了产品阶段会换成别的东西。

测量的时候,需要用到精确的深度信息。测量完了,就不需要深度信息了。因为已经建立起了图像和深度信息的对应关系了。

你可能感兴趣的:(Computer,Vision)