zoukankan      html  css  js  c++  java
  • 高博课程第三次作业:轨迹的误差

    7 * 轨迹的误差

    在根目录下新建了build文件 把数据文件放入其中  ,编写了估计误差的ground_error.cpp文件和CMakeLists.txt 文件,代码如下

      1 //ground_error.cpp writed by zhang ning 2018/3/15
      2 #include <sophus/se3.h>
      3 #include <string>
      4 #include <iostream>
      5 #include <fstream>
      6 
      7 // need pangolin for plotting trajectory
      8 #include <pangolin/pangolin.h>
      9 
     10 using namespace std;
     11 
     12 
     13 
     14 // function for plotting trajectory, don't edit this code
     15 // start point is red and end point is blue
     16 void DrawTrajectory(vector<Sophus::SE3, Eigen::aligned_allocator<Sophus::SE3>>);
     17 
     18 int main(int argc, char **argv) {
     19 
     20     vector<Sophus::SE3, Eigen::aligned_allocator<Sophus::SE3>> poses;
     21 
     22     /// implement pose reading code
     23     // start your code here (5~10 lines)
     24 
     25     ifstream infile;
     26     infile.open("../data/trajectory.txt");
     27     if(!infile) cout<<"error"<<endl;
     28     
     29     cout<<"存入数组"<<endl;   //先将文件中的数据存入到一个二维数组中
     30     double data;
     31     double a[620][8];
     32     double *p=&a[0][0];
     33     while(infile>>data)             //遇到空白符结束
     34     {
     35         *p=data;
     36          p++;
     37     }
     38     infile.close();
     39     for(int i=0;i<620;i++)
     40     {   for(int j=0;j<8;j++)
     41            cout<<a[i][j]<<"	";
     42          cout<<endl;
     43     }
     44     for(int i=0;i<620;i++)   //分别对每一行数据生成一个变换矩阵,然后存入动态数组poses中
     45     {    
     46     Eigen::Quaterniond q = Eigen::Quaterniond(a[i][7],a[i][4],a[i][5],a[i][6]);
     47         Eigen::Vector3d t;
     48     t<<a[i][1],a[i][2],a[i][3];
     49         Sophus::SE3 SE3_qt(q,t);
     50         //cout<<SE3_qt<<endl;
     51         poses.push_back(SE3_qt);
     52     }
     53     // end your code here
     54 
     55     // draw trajectory in pangolin
     56     DrawTrajectory(poses);
     57     return 0;
     58 }
     59 
     60 
     61 void DrawTrajectory(vector<Sophus::SE3, Eigen::aligned_allocator<Sophus::SE3>> poses) {
     62     if (poses.empty()) {
     63         cerr << "Trajectory is empty!" << endl;
     64         return;
     65     }
     66 
     67     // create pangolin window and plot the trajectory
     68     pangolin::CreateWindowAndBind("Trajectory Viewer", 1024, 768);
     69     glEnable(GL_DEPTH_TEST);
     70     glEnable(GL_BLEND);
     71     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     72 
     73     pangolin::OpenGlRenderState s_cam(
     74             pangolin::ProjectionMatrix(1024, 768, 500, 500, 512, 389, 0.1, 1000),
     75             pangolin::ModelViewLookAt(0, -0.1, -1.8, 0, 0, 0, 0.0, -1.0, 0.0)
     76     );
     77 
     78     pangolin::View &d_cam = pangolin::CreateDisplay()
     79             .SetBounds(0.0, 1.0, pangolin::Attach::Pix(175), 1.0, -1024.0f / 768.0f)
     80             .SetHandler(new pangolin::Handler3D(s_cam));
     81 
     82 
     83     while (pangolin::ShouldQuit() == false) {
     84         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     85 
     86         d_cam.Activate(s_cam);
     87         glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
     88 
     89         glLineWidth(2);
     90         for (size_t i = 0; i < poses.size() - 1; i++) {
     91             glColor3f(1 - (float) i / poses.size(), 0.0f, (float) i / poses.size());
     92             glBegin(GL_LINES);
     93             auto p1 = poses[i], p2 = poses[i + 1];
     94             glVertex3d(p1.translation()[0], p1.translation()[1], p1.translation()[2]);
     95             glVertex3d(p2.translation()[0], p2.translation()[1], p2.translation()[2]);
     96             glEnd();
     97         }
     98         pangolin::FinishFrame();
     99         usleep(5000);   // sleep 5 ms
    100     }
    101 
    102 }
     1 # writed by zhang ning 2018/3/15
     2 cmake_minimum_required( VERSION 2.8 )
     3 
     4 project(trajectory.txt)
     5 
     6 set( CMAKE_BUILD_TYPE "Debug" )
     7 
     8 set( CMAKE_CXX_FLAGS "-std=c++11 -O3" ) 
     9 
    10 
    11 
    12 find_package( Sophus REQUIRED)
    13 find_package( Pangolin REQUIRED)
    14 
    15 
    16 include_directories( "/usr/include/eigen3" )
    17 include_directories( ${Sophus_INCLUDE_DIRS} )
    18 include_directories( ${Pangolin_INCLUDE_DIRS} )
    19 
    20 add_executable( draw_trajectory draw_trajectory.cpp)
    21 
    22 target_link_libraries( draw_trajectory ${Sophus_LIBRARIES} ${Pangolin_LIBRARIES} )
    23 
    24 add_executable( ground_error ground_error.cpp)
    25 target_link_libraries( ground_error ${Sophus_LIBRARIES} ${Pangolin_LIBRARIES})

    运行截图如下,与参考答案一致

  • 相关阅读:
    记一次 contentInsetAdjustmentBehavior 引发的bug
    Android埋点技术概览
    Android开发快速入门iOS开发概览
    工作项目遇到的一些问题
    ruby操作项目.xcodeproj
    关于performSelector afterDelay:0 的使用
    谷歌Python代码风格指南 中文翻译
    最大子矩阵问题--悬线法dp
    tarjan
    SDU CSPT3模拟
  • 原文地址:https://www.cnblogs.com/feifanrensheng/p/8576032.html
Copyright © 2011-2022 走看看