#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

using namespace cv;

using namespace Sophus;

#define COMPARE 0

#define EXAMPLE 1

//pangolin画图

void DrawTrajectory(vector<:se3 eigen::aligned_allocator>> poses1,vector<:se3 eigen::aligned_allocator>> poses2) {

if (poses1.empty()||poses2.empty()) {

cerr << "Trajectory is empty!" << endl;

return;

}

// create pangolin window and plot the trajectory

pangolin::CreateWindowAndBind("Trajectory Viewer", 1024, 768);

glEnable(GL_DEPTH_TEST);

glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

pangolin::OpenGlRenderState s_cam(

pangolin::ProjectionMatrix(1024, 768, 500, 500, 512, 389, 0.1, 1000),

pangolin::ModelViewLookAt(0, -0.1, -1.8, 0, 0, 0, 0.0, -1.0, 0.0)

);

pangolin::View &d_cam = pangolin::CreateDisplay()

.SetBounds(0.0, 1.0, pangolin::Attach::Pix(175), 1.0, -1024.0f / 768.0f)

.SetHandler(new pangolin::Handler3D(s_cam));

while (pangolin::ShouldQuit() == false) {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

d_cam.Activate(s_cam);

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

glLineWidth(2);

for (size_t i = 0; i < poses1.size() - 1; i++) {

//glColor3f(1 - (float) i / poses1.size(), 0.0f, (float) i / poses1.size());

glColor3f(1.0f, 0.0f, 0.0f);

glBegin(GL_LINES);

auto p1 = poses1[i], p2 = poses1[i + 1];

glVertex2d(p1.translation()[0], p1.translation()[1]);//p1.translation()[2]

glVertex2d(p2.translation()[0], p2.translation()[1]);//p2.translation()[2]

glEnd();

}

for (size_t i = 0; i < poses2.size() - 1; i++) {

//glColor3f(1 - (float) i / poses2.size(), 0.0f, (float) i / poses2.size());

glColor3f(0.0f, 0.0f, 0.0f);

glBegin(GL_LINES);

auto p1 = poses2[i], p2 = poses2[i + 1];

glVertex2d(p1.translation()[0], p1.translation()[1]);//p1.translation()[2]

glVertex2d(p2.translation()[0], p2.translation()[1]);//p2.translation()[2]

glEnd();

}

pangolin::FinishFrame();

usleep(5000);   // sleep 5 ms

}

}

int main ( int argc, char** argv )

{

vector<:se3 eigen::aligned_allocator>> ps1,ps2;

#if COMPARE

ifstream file("../compare.txt");

string line;

vector pEstimated,pGroundTruth;

while(getline(file,line))

{

stringstream record(line);

vector vTmp(16,0);

for(auto &v:vTmp)

record>>v;

Point3d p1{vTmp[1],vTmp[2],vTmp[3]};//位置

Eigen::Quaterniond q1{vTmp[4],vTmp[5],vTmp[6],vTmp[7]};//旋转四元数

Sophus::SE3 SE3_qt1(q1,Eigen::Vector3d(p1.x,p1.y,p1.z));//组成李群(欧式变换群)--estimated

Point3d p2{vTmp[9],vTmp[10],vTmp[11]};

Eigen::Quaterniond q2{vTmp[12],vTmp[13],vTmp[14],vTmp[15]};

Sophus::SE3 SE3_qt2(q2,Eigen::Vector3d(p2.x,p2.y,p2.z));//组成李群(欧式变换群)--groundtruth

pEstimated.push_back(p1);//求估计到真实的变换矩阵只需要用到位置

pGroundTruth.push_back(p2);

ps1.push_back(SE3_qt1);

ps2.push_back(SE3_qt2);

}

#endif

#if EXAMPLE

ifstream ifileEstimated("../EstimatedAligned.txt");

ifstream ifileGround("../GroundAligned.txt");

string line;

vector pEstimated,pGroundTruth;//用于求取变换矩阵的相机位置

while(getline(ifileEstimated,line))

{

stringstream record(line);

double vtmp[8];

for (auto i = 0; i < 8; i++)

record >> vtmp[i];

Point3d p1{vtmp[1],vtmp[2],vtmp[3]};//位置

pEstimated.push_back(p1);

Eigen::Quaterniond q(vtmp[4], vtmp[5], vtmp[6], vtmp[7]);

Sophus::SE3 SE3_qt1(q,Eigen::Vector3d(p1.x,p1.y,p1.z));//组成李群(欧式变换群)--estimated

ps1.push_back(SE3_qt1);

}

while(getline(ifileGround,line))

{

stringstream record(line);

double vtmp[8];

for (auto i = 0; i < 8; i++)

record >> vtmp[i];

Point3d p2{vtmp[1],vtmp[2],vtmp[3]};//位置

pGroundTruth.push_back(p2);

Eigen::Quaterniond q(vtmp[4], vtmp[5], vtmp[6], vtmp[7]);

Sophus::SE3 SE3_qt2(q,Eigen::Vector3d(p2.x,p2.y,p2.z));//组成李群(欧式变换群)--groundtruth

ps2.push_back(SE3_qt2);

}

#endif

//下面是ICP过程,p1=Rp2+t,即为真实到估计之间的变换,之后取逆即为估计到真实之间的变换

Point3d pMid1, pMid2;     // center of mass

int N = pEstimated.size();

for ( int i=0; i

{

pMid1 += pEstimated[i];

pMid2 += pGroundTruth[i];

}

pMid1 = Point3d( pMid1/ N);

pMid2 = Point3d( pMid2/ N);

vector     q1 ( N ), q2 ( N ); // remove the center

for ( int i=0; i

{

q1[i] = pEstimated[i] - pMid1;

q2[i] = pGroundTruth[i] - pMid2;

}

// compute q1*q2^T

Eigen::Matrix3d W = Eigen::Matrix3d::Zero();

for ( int i=0; i

{

W=W+Eigen::Vector3d ( q1[i].x, q1[i].y, q1[i].z ) * Eigen::Vector3d ( q2[i].x, q2[i].y, q2[i].z ).transpose();

}

cout<

// SVD on W

Eigen::JacobiSVD<:matrix3d> svd ( W, Eigen::ComputeFullU|Eigen::ComputeFullV );

Eigen::Matrix3d U = svd.matrixU();

Eigen::Matrix3d V = svd.matrixV();

cout<

cout<

Eigen::Matrix3d R_ = U* ( V.transpose() );

Eigen::Vector3d t_ = Eigen::Vector3d ( pMid1.x, pMid1.y, pMid1.z ) - R_ * Eigen::Vector3d ( pMid2.x, pMid2.y, pMid2.z );

cout<

cout<

//取逆

Eigen::Matrix3d R=R_.inverse();

Eigen::Vector3d t=-R*t_;

//    Eigen::Quaterniond q(R_);

//    cout<

//DrawTrajectory(ps1,ps2);

SE3 SE3_T(R,t);

#if EXAMPLE

ofstream ofileEst("../AfterAligned.txt");//保存经过转换后的相机位姿的文件

#endif

for(auto &p:ps1)

{

p=SE3_T*p;

#if EXAMPLE

Eigen::Quaterniond q(p.rotation_matrix());//把李群变换成位置向量和四元数形式保存

Eigen::Vector3d vp(p.translation());

//a按格式写入文件,直接以转置的形式写入,格式有些混乱

ofileEst<

ofileEst<

q.y()<

}

ofileEst.close();

#endif

DrawTrajectory(ps1,ps2);

return 0;

}

布尔教育 高端php培训,最新布尔教育php最后一期学员(完整)相关推荐

  1. 老男孩高端linux培训2014业务服务范围

    寻求有想法.有抱负的志同道合的各路英雄豪杰! 简历直投老男孩信箱49000448@qq.com 老男孩高端linux培训2014业务服务范围 个人培训: 北京老男孩培训,全国最负责.最高端.最专业的l ...

  2. 白帽子-高端信息安全培训视频教程

    白帽子-高端信息安全培训(攻防技术.渗透测试.安全产品.安全标准.风险评估.等级保护.项目实战) 课程分类:网络安全 适合人群:初级 课时数量:100课时 用到技术:经典.流行的攻防技术:渗透测试PT ...

  3. 【剑拔峨眉 团队裂变】蜜教育高端特训隆重拉开序幕

    2018年4月16日,蜜拓蜜教育·剑拔峨眉团队裂变高端特训会在四川峨眉山红珠山宾馆隆重拉开序幕,现场气氛高昂,场面震感. 早在4月15日这天,蜜教育的讲师们就早早的到达会场,将会议现场的大小事宜,落到 ...

  4. Hadoop大数据零基础高端实战培训系列配文本挖掘项目

    <Hadoop大数据零基础高端实战培训系列配文本挖掘项目(七大亮点.十大目标)> 课程讲师:迪伦 课程分类:大数据 适合人群:初级 课时数量:230课时 用到技术:部署Hadoop集群 涉 ...

  5. 欢迎大家关注我创办的北京圣思园科技有限公司IT高端就业培训

    本人已经于今年7月底离开了工作3年半的理光软件研究所,并且创立了北京圣思园科技有限公司(http://www.shengsiyuan.com). 公司专注于IT高端就业培训,制定出了符合企业实际需求的 ...

  6. 白帽子-高端信息安全培训(攻防技术、渗透测试、安全产品、安全标准、风险评估、等级保护、项目实战)...

    课程名字:白帽子-高端信息安全培训(攻防技术.渗透测试.安全产品.安全标准.风险评估.等级保护.项目实战) 课程讲师:heib0y 课程分类:网络安全 适合人群:初级 课时数量:100课时 用到技术: ...

  7. Hadoop大数据零基础高端实战培训

    Hadoop大数据零基础高端实战培训系列配文本挖掘项目(七大亮点.十大目标) 课程讲师:迪伦 课程分类:大数据 适合人群:初级 课时数量:330课时 用到技术:部署Hadoop集群 涉及项目:京东商城 ...

  8. Hadoop大数据零基础高端实战培训视频

    <Hadoop大数据零基础高端实战培训系列配文本挖掘项目(七大亮点.十大目标)>  课程讲师:迪伦  课程分类:大数据  适合人群:初级  课时数量: 300课时  用到技术:部署Hado ...

  9. 华清远见嵌入式高端课程再获好评 名企爱上星创客学员

    9月,莘莘学子陆续返校开始新学期的学业,而在华清远见星创客嵌入式精英训练营,16041期班的学员们也即将结束5个月紧张的学习生活,准备迎接人生又一段新的旅程. 这段时间里,他们一边忙着最后一部分技术课 ...

最新文章

  1. 实现一个全链路监控平台很难吗?一点都不难。。。
  2. 11g RAC不能启动ohasd进程
  3. Ajax和JSON-学习笔记01【原生JS方式实现Ajax】
  4. 使用RestTemplate消费Hybris User API获取指定用户的信息
  5. iOS 开发和部署过程概述
  6. JAVA圣诞代码,圣诞节(示例代码)
  7. JAVA入门级教学之(IDEA工具的快捷键和简单设置)
  8. 信息学奥赛一本通C++语言——1108: 向量点积计算
  9. “央视boys” 四人带货超5亿:权来康康,撒开了买
  10. 【缓存】缓存,这么用才真正达到缓存的效果
  11. 开源软件 Nagios 曝11个漏洞,可使IT 基础设施遭接管引发供应链攻击
  12. Hexagon DSP系列记录(二)——写Hexagon DSP程序流程
  13. 自适应滤波器的设计(终极版)
  14. 文档自动同步云服务器,​文件自动同步网盘能实现吗?
  15. firefox插件下载失败
  16. 我用Python分析淘宝低价人群和匿名人群的连衣裙数据后,发现了这些秘密!
  17. Kotlin GreenDao
  18. Android 模拟器横屏竖屏切换设置
  19. vue 实现 tooltips的效果
  20. 09组团队项目-Beta冲刺-1/5

热门文章

  1. C++ 函数- cout
  2. 大众点评:开放质疑与阿里竞争
  3. 本章讲述一些foolish技巧
  4. 仿新浪微博 android,android 仿新浪微博
  5. SQL Server入门(四) 官网关于 SQL Server初级入门教程
  6. 【control】微分平坦(Differential Flatness)
  7. 深入实践 Spring Boot PDF 百度云盘下载
  8. 用户分群模型,这么建才有用
  9. Tick 数据在技术上究竟是什么东西?
  10. 国产LIN收发器芯片SIT1028,PIN to PIN替代TJA1028