《视觉SLAM十四讲精品总结》Viz教程

https://blog.csdn.net/robinhjwy/article/details/78570166

一、简单示例程序

创建一个窗口并显示坐标系:

    //1.创建可视化窗口
    viz::Viz3d vis("VO");
    //2.构造一个坐标系,并显示到窗口中
    vis.showWidget("Coordinate", viz::WCoordinateSystem());
    //3.开启永久循环暂留
    vis.spin();

1、showWidget函数创建坐标系

void showWidget(const String &id, const Widget &widget, const Affine3d &pose = Affine3d::Identity());

第一个参数是特殊的名称,第二个参数用viz::WCoordinateSystem()直接当场创建了一个坐标系部件,最后一个Affine3d位姿参数。

2、spin()函数画面永久停留

spinOnce(1,false)函数给定时间内循环

void spinOnce(int time = 1, bool force_redraw = false);

 简单实例程序变种

viz::Viz3d vis("VO");
//创建世界和相机坐标系
viz::WCoordinateSystem world_coor(1.0),camera_coor(0.5);
vis.showWidget("World",world_coor);
vis.showWidget("Camera",camera_coor);

vis.spinOnce(1,false);

  第三句,永久循环暂留。
spin()函数开启一个event loop永远循环。直观的用处就是让画面停在那里,如果没有这一句的话,画面基本就是秒闪一下然后消失了。
关于spin()函数有两点要说:
第一就是spin()真的会让程序停在那里,不会运行下方的语句,除非按q或者e建,才会继续走。
第二就是这个函数的变种:void spinOnce(int time = 1, bool force_redraw = false); 表示event loop循环time时间,也就是在词句的停留时间,time的单位为毫秒,第二个force_redraw还不知道有啥用,测试来看,没有区别。后面有这个函数的示例程序。

《视觉SLAM十四讲精品总结》Viz教程_第1张图片

二、进阶

3、makeCameraPose()构造相机在世界坐标系下位姿


Affine3d cv::viz::makeCameraPose( Vec3d & position,Vec3d & focal_point,Vec3d& y_dir )	

参数:相机的世界坐标,相机中心点坐标,

4、setWidgetPose()窗口小部件位姿


void cv::viz::Viz3d::setWidgetPose(String & id, Affine3d & pose )	

参数:名称,变换矩阵位姿 T

具体使用实例:

Affine3d cam_pose=viz::makeCameraPose(cam_pos,cam_focal_point,cam_y_dir);

Affine3d T (
             Affine3d::Mat3(
              T.rotation()(0,0),T.rotation()(0,1),T.rotation()(0,2),
              T.rotation()(1,0),T.rotation()(1,1),T.rotation()(1,2),
              T.rotation()(2,0),T.rotation()(2,1),T.rotation()(2,2),),

              Affine3d::Vec3(
             T.translation()(0,0),T.translation()(0,1),T.translation()(0,2)) 
            ) 

vis.setWidgetPose("Camera",T);

"Camera"很重要:代表动的坐标系是哪个,要对应上。

三、实例

#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;
int main()
{
    //1.创建可视化窗口
    viz::Viz3d vis("VO");
    //2.构造一个坐标系,并显示到窗口中
    viz::WCoordinateSystem world_coor(1.0),camera_coor(0.5);
    //相机在世界坐标系下位姿视角
    Affine3d cam_pose=viz::makeCameraPose((0,-1,-1),(0,0,0),(0,1,0));
    vis.setViewerPose(cam_pose);
    vis.showWidget("World",world_coor);
    vis.showWidget("Camera",camera_coor);
    //先创建一旋转向量,罗德里格斯公式转为旋转矩阵,
    Mat rvec = Mat::zeros(1, 3, CV_32F);
  while(!vis.wasStopped())
  {
    rvec.at(0,0) = 0.f;
    rvec.at(0,1) += CV_PI*0.01f;
    rvec.at(0,2) = 0.f;
    Mat rmat;
    Rodrigues(rvec, rmat);
    Affine3f pose(rmat, Vec3f(0,0,0));
    vis.setWidgetPose("Camera", pose);
    vis.spinOnce(1, true);
  }
    
    //3.开启循环暂留
       vis.spinOnce(1, true);
}

总结一波:

1、先创建窗口viz::Viz3d vis("VO");

2、构造一个坐标系,并显示到窗口中 

viz模块中,窗口内显示的一切东西通通为部件,也就是Widget,这里调用showWidget()函数,将部件显示在窗口中。

viz::WCoordinateSystem world_coor(1.0)//创建坐标系

vis.showWidget("World",world_coor);//显示在窗口中

void showWidget(const String &id, const Widget &widget, const Affine3d &pose = Affine3d::Identity());

3、调整某部件的位姿

    Affine3f pose(rmat, Vec3f(0,0,0));//构建变换仿射矩阵4*4
    vis.setWidgetPose("Camera", pose);

说白了就是利用循环来不断调整上面Camera部件的位姿,达到动画的效果,另外这里就利用到了Camera的ID,来表征调整的是Camera的位姿。

你可能感兴趣的:(视觉,激光SLAM)