经过两个月的努力,终于在一台笔记本上,让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。

这样的硬件配置,我感觉有个问题。我拿着笔记本走动的时候,可定是拿着下面,但是笔记本电脑的演示器只要微微的晃动,对于上面的摄像头和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的国际象棋格子。

录像的时候,时间长会比较稳定。我录了三次,针对每次录像又用工具算了三次参数。时间最长的那次,三次的计算结果也是比较稳定的。官方提供的录像有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阶段,可能会用数字。当然到了产品阶段会换成别的东西。

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

用一台笔记本跑ROVIO相关推荐

  1. 两台笔记本通过无线连接共享上网

    『电脑网络』 [网络天地]两台笔记本通过无线连接共享上网 点击:5551 回复:2 作者:一剑追风 发表日期:2008-11-25 21:25:00 两台笔记本通过无线连接共享上网 以前跟同事一起出差 ...

  2. 来,我们谈谈怎么选购一台笔记本

    一.写在前面: 笔记本的更新换代之快是无法想象的,可能我今天刚推荐一款性价比第一的笔记本,明天就有更好更便宜的笔记本出现了.只推荐一款型号给各位只能是授之以鱼.但让人欣慰的是,总有一些不变的思路可以让 ...

  3. android 解锁mac,论一台笔记本三个不同系统的玩法,解锁正确姿势

    原标题:论一台笔记本三个不同系统的玩法,解锁正确姿势 关于<折腾永无止境>的文章... 所以不打算长篇幅介绍怎么安装.步骤.怎么折腾的教科书,不懂?隔壁度娘给你答案! 目标非常明确:要榨干 ...

  4. 两台笔记本如何不走路由而是通过无线网卡互联

    (2008-06-03 20:32 博客搬家拾遗) 前几天在宿舍,四个人想打DOAT,这四台本本里有两台有无线网卡,宿舍虽然有个4口路由器(不带无线),但还有一个人要上网.于是打算这么办: 于是在两台 ...

  5. android德州扑克计算器,学界 | 一台笔记本打败超算:CMU冷扑大师团队提出全新德扑AI Modicum...

    原标题:学界 | 一台笔记本打败超算:CMU冷扑大师团队提出全新德扑AI Modicum 选自arXiv 参与:路.晓坤 CMU 冷扑大师团队在读博士 Noam Brown.Tuomas Sandho ...

  6. 两台笔记本的操作系统都为xp的共享上网教程

    两台笔记本的操作系统都为xp的共享上网教程(可上网的机器为p1,需要共享上网的机器为p2): 1, 保证p1可以通过有线网上网. 2, 将p1的无线网络配置设置成仅计算机到计算机,路径:无线连接-&g ...

  7. 用4K屏幕的笔记本跑虚拟机vmware如何放大字体?

    用4K屏幕的笔记本跑虚拟机vmware如何放大字体? 用4K屏幕的笔记本跑虚拟机vmware12下的cadence,字非常小 尝试了以下两个方法: 1. vmware里面虚拟机自身的设置里,把分辨率从 ...

  8. matlab吃cpu还是显卡_如何配置一台适合跑MATLAB的电脑

    因为毕业搬家,再也不能用学校实验室的电脑了,所以最近刚配置了一台电脑,用来在家写写MATLAB,同时刷刷知乎.经常刷到关于MATLAB电脑配置的问题,所以想跟大家说一说如何配置一台适合跑MATLAB的 ...

  9. 一套鼠标键盘控制windows和mac两台笔记本——shareMouse

    对于经常要进行多任务处理的小伙伴们,电脑上同时放着两台以上的电脑,时不时用这只鼠标,时不时用那只鼠标,非常恼人,而且经常搞混.更让人头疼的是,如果这种事情是常事.桌面上的线路和键盘鼠标,也占据了你的大 ...

  10. 两台笔记本,使用其中一台当作另一台的扩展屏

    在做显示屏的笔记本(笔记本2)上打开设系统,投影到此电脑.会看到这个界面. 把这个设置好.之后在另一台笔记本(笔记本1)上按下win徽标键+P快捷键选择连接到无线显示器,便会自动搜索,选择笔记本2,就 ...

最新文章

  1. 基于NB-IoT的智慧路灯监控系统(NB-IoT专栏—实战篇4:PC应用开发)
  2. R语言match函数对象之间的匹配实战
  3. 开源界的 5 大开源许可协议
  4. php访问日记在哪,nginx访问日志在哪里
  5. mysql创建表设置数值范围,MySQL创建数据表时设定引擎MyISAM/InnoDB操作
  6. Airbnb搜索:深度学习排序算法如何进化?
  7. iOS 将本地项目/demo上传到github的简单方法
  8. Spring AOP无法拦截Controller中的方法
  9. 路由模块router实现step1
  10. 自然语言处理(NLP)
  11. 移植鸿蒙系统到STM32L476RG_NUCLEO开发板的一点小经验
  12. 关于华为鸿蒙创新的作文,关于创新的高中作文4篇
  13. postgresql 高可用 repmgr 的使用之四 1 Primary + 1 Standby 的 switchover
  14. 海外直播运营账号的网络线路,该如何选择?
  15. 黑马程序员新版Linux零基础快速入门到精通——学习笔记
  16. mac开机启动mysql_mac 设置mysql开机自启动
  17. 川土微电子CA-IS1300用于电流检测的隔离运放新品上市
  18. 安卓来电归属地_比尔·盖茨懊悔让微软损失4000亿美金!当年为何会与安卓失之交臂?...
  19. 安装vag服务器虚拟机,FusionAccess桌面云组件介绍/安装
  20. Java集合框架(List)

热门文章

  1. 小米无线路由器服务器用户名和密码忘了,小米路由器管理密码忘记了怎么办?...
  2. 使用Python爬虫爬取淘宝商品并分析
  3. 隐藏计算机文件夹中,电脑高手教你如何隐藏文件夹的方法
  4. Atom | 用最酷的编辑器 写最美的代码
  5. 【飞控开发基础教程3】疯壳·开源编队无人机-串口(基础收发)
  6. 堪萨斯大学计算机硕士,堪萨斯大学计算机专业设置及申请条件汇总 你get到了吗?...
  7. Essay写作必须要保证质量吗?随便写能通过吗?
  8. ctf——逆向新手题目8 (logmein) WP
  9. matlab三维图渲染颜色,三维图颜色渐变
  10. 开心豆少儿英语好吗,收费怎么样,一年多少钱的学费