这是基于之前的vo类做的。vo类总结.note
参数文件的直接设置在config目录下,比如是default.yaml文件,里面会定义dataset_dir,cmera类的fx,fy,cx,cy,VisualOdometry的min_inliers,match_ratio,key_frame_min_rot,key_frame_min_trans,max_num_lost,number_of_features,scale_factor,level_pyramid.这些参数在visual_odometry.cpp里读取的时候必须参数名要一致,可以从参数文件中一个个复制。如果出错,编译不会出错,但是程序运行会报错误,一般是opencv的错误。例如
OpenCV Error: Assertion failed (npoints >= 0 && npoints == std::max(ipoints.checkVector(2, CV_32F), ipoints.checkVector(2, CV_64F))) in solvePnPRansac, file /home/uuuu/opencv-3.1.0/modules/calib3d/src/solvepnp.cpp, line 230
terminate called after throwing an instance of 'cv::Exception'
what(): /home/uuuu/opencv-3.1.0/modules/calib3d/src/solvepnp.cpp:230: error: (-215) npoints >= 0 && npoints == std::max(ipoints.checkVector(2, CV_32F), ipoints.checkVector(2, CV_64F)) in function solvePnPRansac
这个错误是由于num_of_features_ = Config::get<int> ( "number_of_features" );参数文件里是number_of_features,我写成num_of_features.
max_num_lost_ = Config::get<float> ( "max_num_lost" );参数文件里是max_num_lost,我给写成max_num了。
1.参数文件的读取
在主程序里用Config类的setParameterFile函数设置参数文件。变量是argv[1].
myslam::Config::setParameterFile(argv[1]);
实际运行的时候就是./bin/run_vo config/default.yaml
之所以编译好的程序会直接放在bin目录下,是因为在CMakeLIsts.txt文件里有设置
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin )
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib )
然后定义vo里程计
myslam::VisualOdometry::Ptr vo(new myslam::VisualOdometry);
这种指针定义的时候都会(new 什么)
得到dataset_dri就是数据集路径,可以直接从参数文件中读取
string dataset_dir=myslam::Config::get<string>("dataset_dir");
跟之前一样,定义fin为dataset+"\"+"associate.txt")
判断一下fin,如果打不开这个目录,输出错误,返回1.
定义rgb_files,depth_files,rgb_times,depth_times,这里是向量形式,因为用来存储每一个rgb_file文件名等。
一个while循环,while(!fin.eof())不知道这是个什么条件,eof判断文件是否到末尾,当是的时候返回true,while(!fin.eof())就是当文件还没有到末尾的时候,fin依次赋值给rgb_time,rgb_file,depth_time,depth_file.
然后依次再放进rgb_times等。只不过时间要经过atof(rgb_time.c_str()),文件名要是完整的路径,即dataset+"\"+rgb_file.
如果文件没有打开,跳出while循环,就是fin.good()==false.
定义camera类camera
myslam::Camera::Ptr camera(new myslam::Camera);
2.可视化部分
定义3d可视化为vis,命名为Visual Odometry

cv::viz::Viz3d vis("Visual Odometry");
定义世界坐标系和相机坐标系
cv::viz::WCoordinateSystem world_coor(1.0),camera_coor(0.5);
定义3个点cam_pos,cam_focal_point,cam_y_dir
cv::Point3d cam_pos(0,-1.0,-1.0),cam_focal_point(0,0,0),cam_y_dir(0,1,0);
后面的值不能出错,之前cam_pos值被我弄成了0,1.0,-1.0就导致只出来两条线。
前面3个点组成了cam_pose.
cv::Affine3d cam_pose=cv::viz::makeCameraPose(cam_pos,cam_focal_point,cam_y_dir);
设置可视化位姿为cam_pose
vis.setViewerPose(cam_pose)

设置两个坐标系的渲染属性rendering property,线长度为2和1.
world_coor.setRenderingProperty(cv::viz::LINE_WIDTH,2.0);
camera_coor.setRenderingProperty(cv::viz::LINE_WIDTH,1.0);
把两个坐标系添加到vis,一个命名为World,一个命名为Camera.必须首字母大写,不然识别不出来。
vis.showWidget("World",world_coor);
vis.showWidget("Camera",camera_coor);
3.读图
弄一个for循环,用来一张一张读图片。
定义color为cv::imread(rgb_files[i]),depth,度深度图的时候,后面要加-1.
如果color或depth的数据为空指针,就跳出循环。
定义myslam的帧类pFrame,初值为myslam::Frame::createFrame()
这里出了一点小错是因为我定义frame.cpp的时候忘了在createFrame()标明它所属的类。
依次定义pFrame的值camera_,color_,depth_,time_stamp_依次为camera,color,depth,rgb_times[i].
帧类以后要注意添加这4个值。camera可以myslam::Camera;:Ptr camera(new myslam::Camera)
因为在myslam::Camera类设置了一个函数camera(),里面就设置了fx,fy,cx,cy,depth_scale的读取方式。所以只要设置camera值为myslam::Camera;:Ptr camera(new myslam::Camera),就可以轻松获得camera的所有值。
设置完camera的所有值后再运行源程序,现在每个vo只需要20ms了。
color_,depth_,time_stamp_都可以读图得到。
之前已经设置过vo类了。
把这里的pFrame设置为vo的添加帧的输入。
vo->addFrame(pFrame);
如果vo的状态值为LOST,则跳出循环。这里判断的时候用的是myslam::VisualOdometry::LOST.
因为要显示的是T_c_w所以定义
SE3 Tcw=pFrame->T_c_w_.inverse().
定义M为Tcw的旋转矩阵的每一项的cv::Affine3d::Mat3形式和位移的每一项的cv::Affine3d::Vec3组成的。例如Tcw.rotation_matrix()(0,0)
类型同cam_pose,都是cv::Affine3d
这里也可视化了color图。cv::imshow("image",color)
cv::waitKey(1);这里为1的时候并没有停顿啊。但因为是和vis.spinOnce(1,false)一起用的,所以不确定。
设置部分位姿,这里设置了相机的为M,和前面的Camera照着。
vis.setWidgetPose("Camera",M)
设置for的循环周期vis.spinOnce(1,false);

简单的来说就是定义vo,camera,pFrame,color,depth.
vo,camera里的参数在定义的时候就已经读取了.camera,color,depth都是pFrame帧里的变量。
然后把pFrame当成变量一个个输入到vo中就可以了。vo->addFrame.

运行vo总结的更多相关文章

  1. 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能

    以往的Android开发有一个头疼的且拖慢速度的问题,就是你每改一行代码要想看到结果必须要编译运行到手机或者模拟器上,而且需要从头(可能是登录界面)一直点击到你修改的界面为止.开发一个完整的Andro ...

  2. [转]领域驱动设计系列文章(2)——浅析VO、DTO、DO、PO的概念、区别和用处

    原文地址:http://www.blogjava.net/johnnylzb/archive/2010/05/27/321968.html 上一篇文章作为一个引子,说明了领域驱动设计的优势,从本篇文章 ...

  3. 浅析VO、DTO、DO、PO的概念、区别和用处

    上一篇文章作为一个引子,说明了领域驱动设计的优势,从本篇文章开始,笔者将会结合自己的实际经验,谈及领域驱动设计的应用.本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同 ...

  4. [转载]PO BO VO DTO POJO DAO概念及其作用

    原文链接:http://jeoff.blog.51cto.com/186264/88517/ POJO = pure old java object or plain ordinary java ob ...

  5. [Android Pro] 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能

    reference to : http://www.cnblogs.com/soaringEveryday/p/4991563.html 以往的Android开发有一个头疼的且拖慢速度的问题,就是你每 ...

  6. server 2008 IIS 搭建PHP运行环境

    本文以windows server 2008 r2 Enterprise作为操作系统,以IIS为web部署服务组件,配置PHP的服务器端执行环境,其中IIS版本为7.5,PHP版本为5.3. 注意:本 ...

  7. 领域驱动设计系列文章——浅析VO、DTO、DO、PO的概念、区别和用处

    本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: ...

  8. [转]PO和VO、关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) )

    摘自http://www.cnblogs.com/kelin1314/archive/2009/11/13/1602778.html PO和VO PO 即Persistence Object VO 即 ...

  9. Spark Core源代码分析: Spark任务运行模型

    DAGScheduler 面向stage的调度层,为job生成以stage组成的DAG,提交TaskSet给TaskScheduler运行. 每个Stage内,都是独立的tasks,他们共同运行同一个 ...

随机推荐

  1. Socket 异步通信示例

    这个项目是一个控制台应用程序: 服务器端: using System; using System.Net; using System.Net.Sockets; using System.Text; u ...

  2. iOS 最新公布app到AppStore全流程具体解释

    一.生成公布证书(证书的作用:类似于驾照,证明你的身份能够进行开发人员一些操作) 打开https://developer.apple.com 点击右上角开发人员中心 这里输入你付款过的Apple 帐号 ...

  3. Netbeans打开包括中文文件时提示错误

    Netbeans打开包括中文文件时提示错误.在Netbeans里找了半天没找到怎么设置,最后发现要改动Netbeans的配置文件才干解决. 编辑C:\Program Files\NetBeans 8. ...

  4. cocos2d-x 3.0 Android环境搭建(亲測通过)

    网上一大堆讲述coco2d-x 3.0 版本号的android环境搭建.真是不忍直視.讲的不清不楚,真是不知道他们自己有没有測试过.今天正好忙完项目有点时间去部署了下android环境. cocos2 ...

  5. csv文件中出现乱码的解决方法

    1.首先用UE打开CSV文件,发现没有乱码了. 2.然后新建一个txt文本,把CSV中的数据复制到txt文本中,保存格式为ANSI/ASCII. 3.复制txt文件,再把副本后缀改为CSV格式,再用E ...

  6. JAVA card 应用开发(六) 个人化数据的线路安全和数据安全

    卡片个人化数据的线路安全和数据安全 说明:下面理论,基于GP2.2规范. 一.线路安全 1. 概念:线路安全.就是对于数据不保密.但要保证数据的完整性和防止被篡改. 2. 方法:在原有的数据基础上.加 ...

  7. 简单的积雪shader

    // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject' Shader "Custom/CoverSnow&q ...

  8. Linux 随手记(文件操作)

    新建文件夹 mkdir 文件夹名 新建文件 touch 文件名 重命名 mv 文件名 新文件名 将/a目录移动到/b下,并重命名为c mv /a /b/c 复制文件 cp [选项] 源文件或目录 目标 ...

  9. 百度地图SnapshotReadyCallback截屏

    今天碰到了地图截图的功能,不太会,查查资料知道怎么弄了,跟大家分享一下 直接上代码,弄了一个方法,将截取的图片上传至服务器,返回给我们图片路径 //获取地图截图 private void getscr ...

  10. element-ui table 点击分页table滚动到顶部

    在做项目中,碰到一个问题,table加了固定头,内容可滚动,当滚到table底边时,点击分页后还在底边 解决方法:设置table的 ref='multipleTable' //切换分页的方法加上下面这 ...