标签:file ini 单位 imu space argc line 范围 end


CMakeLists.txt
# cmake needs this line
cmake_minimum_required(VERSION 3.1)
# Define project name
project(Pangolin_project)
#添加Pangolin画图依赖库
find_package(Pangolin REQUIRED)
include_directories(${Pangolin_INCLUDE_DIRS})
#编译可执行文件
add_executable(plotTrajectory plotTrajectory.cpp)
#连接Pangolin库
target_link_libraries(plotTrajectory ${Pangolin_LIBRARIES})
plotTrajectory.cpp
#include <pangolin/pangolin.h>
#include <Eigen/Core>
#include <unistd.h>
// 本例演示了如何画出一个预先存储的轨迹
using namespace std;
using namespace Eigen;
// path to trajectory file
string trajectory_file = "./trajectory.txt";
void DrawTrajectory(vector<Isometry3d, Eigen::aligned_allocator<Isometry3d>>);
int main(int argc, char **argv) {
//1定义容器-保存轨迹数据
vector<Isometry3d, Eigen::aligned_allocator<Isometry3d>> poses;
//2打开文件,读取轨迹数据
ifstream fin(trajectory_file);
if (!fin) {
cout << "cannot find trajectory file at " << trajectory_file << endl;
return 1;
}
//3将文件数据赋值给容器
while (!fin.eof()) {
double time, tx, ty, tz, qx, qy, qz, qw;
fin >> time >> tx >> ty >> tz >> qx >> qy >> qz >> qw;
// 用Eigen::Isometry表示欧氏变换矩阵
Eigen::Isometry3d Twr = Eigen::Isometry3d::Identity( ); // 三维变换矩阵
Twr.rotate( Quaterniond(qw, qx, qy, qz) ); // 旋转部分赋值
//Isometry3d Twr(Quaterniond(qw, qx, qy, qz));
Twr.pretranslate(Vector3d(tx, ty, tz));// 设置平移向量
//cout << "Transform matrix = \n" << Twr.matrix( ) << endl;
poses.push_back(Twr);
}
cout << "read total " << poses.size() << " pose entries" << endl;
//4执行画图
// draw trajectory in pangolin
DrawTrajectory(poses);
return 0;
}
/*******************************************************************************************/
void DrawTrajectory(vector<Isometry3d, Eigen::aligned_allocator<Isometry3d>> poses) {
// create pangolin window and plot the trajectory
// 1创建名称为“Main”的GUI窗口,1024×768
pangolin::CreateWindowAndBind("Trajectory Viewer", 1024, 768);
// 2启动深度测试
glEnable(GL_DEPTH_TEST);
//该功能会使得pangolin只会绘制朝向镜头的那一面像素点,避免容易混淆的透视关系出现,因此在任何3D可视化中都应该开启该功能
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// 3创建一个观察相机视图
pangolin::OpenGlRenderState s_cam(
pangolin::ProjectionMatrix(1024, 768, 500, 500, 512, 389, 0.1, 1000), //摄像机的内参矩阵ProjectionMatrix Pangolin会自动根据内参矩阵完成对应的透视变换
pangolin::ModelViewLookAt(0, -0.1, -1.8, 0, 0, 0, 0.0, -1.0, 0.0) //摄像机初始时刻所处的位置 摄像机的视点位置(即摄像机的光轴朝向哪一个点)以及摄像机的本身哪一轴朝上
);
//4创建交互视图用于显示上一步摄像机所“拍摄”到的内容
pangolin::View &d_cam = pangolin::CreateDisplay()
.SetBounds(0.0, 1.0, 0.0, 1.0, -1024.0f / 768.0f)//前四个参数依次表示视图在视窗中的范围(下、上、左、右),可以采用相对坐标(0~1)以及绝对坐标(使用Attach对象)。 //
.SetHandler(new pangolin::Handler3D(s_cam));
//5 开始画图
while (pangolin::ShouldQuit() == false) {
// 5-1 清空颜色和深度缓存 否则视窗内会保留上一帧的图形
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
d_cam.Activate(s_cam);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
// 0 画出轨迹连线
for (size_t i = 0; i < poses.size(); i++) {
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_LINES);
auto p1 = poses[i], p2 = poses[i + 1];
glVertex3d(p1.translation()[0], p1.translation()[1], p1.translation()[2]);
glVertex3d(p2.translation()[0], p2.translation()[1], p2.translation()[2]);
glEnd();
}
//1-1设置每个位置相机视角三维轴 自己写计算过程
for (size_t i = 0; i < poses.size(); i++) {
// 计算变换后的点
Vector3d Ow = poses[i].translation();//获取平移矩阵
Vector3d Xw = poses[i] * (0.1 * Vector3d(1, 0, 0));//单位坐标1的线段变换到指定位置
Vector3d Yw = poses[i] * (0.1 * Vector3d(0, 1, 0));
Vector3d Zw = poses[i] * (0.1 * Vector3d(0, 0, 1));
//开始画图
glBegin(GL_LINES);
glLineWidth(2);
glColor3f(1.0, 0.0, 0.0);//定义颜色
glVertex3d(Ow[0], Ow[1], Ow[2]); glVertex3d(Xw[0], Xw[1], Xw[2]);
glColor3f(0.0, 1.0, 0.0);
glVertex3d(Ow[0], Ow[1], Ow[2]); glVertex3d(Yw[0], Yw[1], Yw[2]);
glColor3f(0.0, 0.0, 1.0);
glVertex3d(Ow[0], Ow[1], Ow[2]); glVertex3d(Zw[0], Zw[1], Zw[2]);
glEnd();
}
//1-2划出相机位置 使用库中的矩阵计算
for (size_t i = 0; i < poses.size(); i++) {
//1创建矩阵
glPushMatrix();
//2矩阵赋值,后续所有操作都乘上这个系数
Eigen::Isometry3d R =poses[i];
std::vector<GLdouble> Twc = {
R(0, 0), R(1,0), R(2, 0), 0.,
R(0, 1), R(1, 1), R(2, 1), 0.,
R(0, 2), R(1, 2), R(2, 2), 0.,
R(0, 3), R(1, 3), R(2, 3), 1.};
glMultMatrixd(Twc.data());//pangolin后续绘制中的所有坐标均需要乘以这个矩阵
//具体画框
glBegin(GL_LINES);//4-1
glLineWidth(2); //4-2
glColor3f(1.0, 0.0, 0.0);//4-3定义颜色
glVertex3f(0,0,0); glVertex3f(0.1,0,0);
glColor3f(0.0, 1.0, 0.0);//4-3定义颜色
glVertex3f(0,0,0); glVertex3f(0,0.1,0);
glColor3f(0.0, 0.0, 1.0);//4-3定义颜色
glVertex3f(0,0,0); glVertex3f(0,0,0.1);
glEnd();
//3更新矩阵
glPopMatrix();
}
//2划出相机位置
for (size_t i = 0; i < poses.size(); i++) {
//1创建矩阵
glPushMatrix();
//2矩阵赋值,后续所有操作都乘上这个系数
Eigen::Isometry3d R =poses[i];
std::vector<GLdouble> Twc = {
R(0, 0), R(1,0), R(2, 0), 0.,
R(0, 1), R(1, 1), R(2, 1), 0.,
R(0, 2), R(1, 2), R(2, 2), 0.,
R(0, 3), R(1, 3), R(2, 3), 1.};
glMultMatrixd(Twc.data());//pangolin后续绘制中的所有坐标均需要乘以这个矩阵
//3绘制相机轮廓线
const float w = 0.2;
const float h = w * 0.75;
const float z = w * 0.6;
glLineWidth(2); //4-1
glBegin(GL_LINES);//4-2
glColor3f(0.0f,1.0f,1.0f);//4-3
glVertex3f(0,0,0); glVertex3f(w,h,z);
glVertex3f(0,0,0); glVertex3f(w,-h,z);
glVertex3f(0,0,0); glVertex3f(-w,-h,z);
glVertex3f(0,0,0); glVertex3f(-w,h,z);
glVertex3f(w,h,z); glVertex3f(w,-h,z);
glVertex3f(-w,h,z); glVertex3f(-w,-h,z);
glVertex3f(-w,h,z); glVertex3f(w,h,z);
glVertex3f(-w,-h,z); glVertex3f(w,-h,z);
//5
glEnd();
//3更新矩阵
glPopMatrix();
}
// 运行帧循环以推进窗口事件
pangolin::FinishFrame();
usleep(5000); // sleep 5 ms
}
} // 清空颜色和深度缓存
trajectory.txt
1305031526.671473 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 1.000000000 1305031526.707547 0.002883195 -0.004662100 -0.002254304 0.011409802 0.010697415 0.002189494 0.999875307 1305031526.771481 0.013978966 -0.013082317 -0.010869596 0.043280017 0.032526672 0.003260542 0.998528004 1305031526.807455 -0.001601209 -0.011404546 -0.026841529 0.073491804 0.052071322 0.000915701 0.995935082 1305031526.871446 -0.004428456 -0.001333938 -0.042973492 0.115341254 0.070847765 -0.006601509 0.990774155 1305031526.907484 -0.006487503 -0.003464771 -0.058195263 0.135408968 0.081248961 -0.010381512 0.987398207 1305031526.939618 -0.014331216 -0.013660092 -0.078787915 0.147756621 0.091927201 -0.015138508 0.984625876 1305031526.971510 -0.018625503 -0.015494643 -0.089080200 0.165385425 0.100416750 -0.017430481 0.980948687 1305031527.007595 -0.020048823 -0.005540572 -0.097900160 0.181910872 0.106515355 -0.017926607 0.977364600 1305031527.039512 -0.023435375 -0.009148147 -0.106970325 0.195644155 0.113224901 -0.019022474 0.973931015
编译过程
# 创建编译文件夹(在Pangolin文件夹下) mkdir build && cd build # 配置编译选项 cmake .. make ./plotTrajectory

camke(6)配置pangolin 4slam划轨迹和相机位置姿态
标签:file ini 单位 imu space argc line 范围 end
原文地址:https://www.cnblogs.com/gooutlook/p/14855782.html