毕业三年了,现在是第二份工作,第一份工作已经结束一年半了,这意味着,我有一年半的时间没有搞视觉SLAM相关的东西了,虽然在第二份工作也是做视觉相关的,但是只是用到一些目标识别和跟踪的知识,并锻炼了一下工程实现能力,编程能力,一直是我的一块心病,哈哈,由此可见我不用适合做程序员,至少不会是出色的程序员,但是这毕竟是我一个比较靠谱的职业,他可以让我生活的更好一些,所以,我还是在不断坚持,我去面试视觉SLAM岗位,面试官都会问,你有没有做过什么改进,可笑的是,我只是对一些开源的视觉SLAM代码熟悉一些而已。但是不积跬步无以至千里,我还是把基础的工作做好,随缘吧,哈哈,佛系程序员是这样的吗。
今年年初我用了一年的时间完成了两个工作,单房间和多房间扫地机的覆盖率测试软件,从场地搭建到软件开发,都是我一个人,虽然很多时候感觉到孤寂,但是看到其他同事跟项目经理扯皮时,被项目经理追着不放时,我感觉我是幸运的。完成了上面的项目后,领导让我开始调研视觉SLAM,想在我们现有的扫地机算法上加上视觉算法,重操旧业,感觉不错,但是压力还是不小的,我没有信息能做好,最初的一段时间我忙着去医院保胎,还得赶紧把驾照考出来,所以调研的进度比较慢,后来胎儿稳定了,驾照也考出来了,我的心也安定下来,专心做起工作来。
虽说是调研,但是还得实践,不能说光看看论文,博客就可以了,那就不得不搭建环境,把算法跑起来。说到大环境,不得不让我想起来,我在研究生时刚开始研究视觉SLAM时,那那基本上两三天重装一次Ubuntu系统,我还有个电子文档专门记录我的一些成功的操作,哪个库怎么安装,但是压力确实很大,Linux系统知识,编程能力,视觉SLAM基础知识,数学基础,真的让我吃不消,不知道当初为啥非要选这个方向。大概是没有自知之明,真是惨不忍睹。
话说回来,正是有了之前的无数次失败的经验,以及五六年里的知识沉淀,所以这次重新搭建环境就感觉轻松很多,因为我坚信,我遇到的问题,在网上一定会找到答案的,当时你如果能跳墙那是很好的,你的视野大了不是一点半点。之前一直用的是Ubuntu16.04,现在用的是Ubuntu8.04,差别不是很大。之前搭建过orb-slam3的环境,这次也比较顺畅,下一个是svo,尤其是svo2.0,费了老鼻子劲了。很多问题是因为网络问题导致的,一个是Ubuntu上我不能跳墙,在着就是,公司网速不好,一个东西要重复下载好几次,才有可能成功。所以第二次下载是我就使用手机热点,确实要好很多。
一、在原有win10系统的基础上安装Ubuntu18.04系统
Windows10安装ubuntu18.04双系统教程 - 不妨不妨,来日方长 - 博客园
Ubuntu上安装一个sogou输入法,好使
搜狗输入法linux-安装指导搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://shurufa.sogou.com/linux/guide
二、Ros melodic安装
我按照官网和一些博客文章安装最后在rosdep update出了问题一直解决不了,不过这篇文章有解决方法
ubuntu18.04 ROS melodic完整版教程及错误处理(附带 catkin_ws工作空间搭建)_黄宏智的博客-CSDN博客_ubuntu18.04安装catkin
我是用上面的方法解决的rosdep update失败的问题,后来公司来了一个实习生,在遇到同样的问题时,他找到了下面这个解决方案,感觉要简单很多。
本文之后,世上再无rosdep更新失败问题!如果有....小鱼就...造福国内用户的rosdepc出来啦,再也不用担心rosdep初始化失败问题。\x0a大家好,我是小鱼,经过小鱼的不懈努力,rosdep国产替代品rosdepc终于完成,一行代码搞定初始化失败问题。https://mp.weixin.qq.com/s/VGs8oWdhHH6XsHcx21lN4Q
三、 orb-slam3环境搭建
ubuntu18.04配置ORB-SLAM3(包含ROS)完整版教程_黄宏智的博客-CSDN博客
四、svo2.0
SVO2.0 安装编译_HR19的博客-程序员ITS203 - 程序员ITS203
在执行catkin build指令后,需要下载很多东西,好几个库会因为网速的问题,无法下载,可以尝试使用手机热点联网进行编译下载,再者出现“无法获取某个网址”错误时,那就重新编译,多执行几次编译命令,再次编译时不要删除掉上一次已经下载的build等文件夹中的东西。
除了网速问题,我还遇到了几个明显的问题,
(1)如果遇到“std::automic<int> a;不可以在定义式直接初始化”的错误时,
解决方案:那就在提示出错误的这个文件上添加头文件 #include<automic.h>
(2) 如果遇到“next is not a member of boost : in /usr/include/yaml-cpp/node/detail/iterator.h”
在/usr/include/boost/next_prior.hpp中实现了boost::next的功能
解决方案:在iterator.h文件中添加 #include<boost/next_prior.hpp>
(3)如果遇到“/usr/local/include/sigslot/signal.hpp:1160:65 error: 'slots_reference ' was not declared in this space”
解决方案:将所有CMakeLists.txt中的所有的c++11替换为c++14
五、安装realsense t265相机驱动
按照官网“librealsense/installation.md at development · IntelRealSense/librealsense · GitHub”上说的步骤来安装,太过漫长,所以我就使用下面的方法来安装,还有安装ros Wrapper的步骤
(69条消息) ubuntu18.04 Intel Realsense T265与Realsense D435i 使用教程_xtdx_xty的博客-CSDN博客
六、使用realsense t265运行svo2.0
首先t265相机是omni-direction相机,对于这种相机使用的相机镜头比较特殊,构建镜头畸变模型时常用的模型有"Kannala Brandt", "MEI", "Scaramuzza",开源的框架中orb-slam3使用的是Kannala Brandt模型,vins使用的是MEI模型,svo2.0 使用的是scaramuzza模型,前两种模型都可以用kalibr进行标定,但是kalibr 不能标定scaramuzza模型,只能用ocam_clib库标定,所以你需要安装matlab,然后运行ocam_calib进行标定。标定出来还需要根据svo_ros/scripts/omni_matlab_to_rpy.py进行转换,得到一个24维的矩阵。
参考calib/blufox_25000826_fisheye.yaml文件,还需要一个mask,下面是参考vins的mask的生成方式,得到一个mask。
cv::Mat image = cv::Mat::zeros(800, 848, CV_8UC1);
cv::circle(image, cv::Point2f(424, 400), 424, cv::Scalar(255), -1, 8, 0);
cv::imwrite("mask.png", image);
cv::imshow("mask", image);
cv::waitKey(0);
return 0;
然后在launch/fronted/run_from_bag.launch文件中,将"cam0_topic” value修改为t265相机发布的话题,“camera/fisheye1/image_raw”, 然后是将pinhole.yaml改为fisheye.yaml.
然后首先将t265相机的话题发布出来
roslaunch realsense2_camera rs_t265.launch
然后运行svo2
roslaunch svo_ros realsense.launch cam_name:=realsense_t265_fisheye(这里的realsense.launch是从run_from_bag.launch文件修改过来的,我创建的t265相机的配置文件命名为 realsense_t265_fisheye.yaml)
上面的工作都做完后,我终于在周五下班前的一分钟,运行成功了,这周工作总算有个交代。但是这周一我跑了一下比较长的走廊,视觉里程计的跟踪效果不好,角度没有漂移,但是尺度在开始测试后不久漂移了很多,尺度一直在缩小,不知道是不是我的相机标定结果不精确有关系。
总结:拿到最后的结果,上面五步是不可或缺的,也用了不少时间,最后是卡在了t265相机的畸变模型上面,其实在svo pro的GitHub上也是有介绍calibration这一块的,但是刚开始并没有放心上,不敏感,大概是刚开始对于上面提到的那三种相机模型不熟悉缘故,后来慢慢了解了这三种模型,自己的下一步工作才清晰。要不,刚开始,不知道自己到底该做些什么,怎么做。
上面测试结果,尺度漂移的厉害,肯定是有原因的,我先从我自己的工作上找问题,看看能不能解决这个问题。然后是把imu的数据也加上,再看一下效果。