SLAM 显示机器人的3D运动轨迹

发布时间:2026/10/25 11:48:50
SLAM 显示机器人的3D运动轨迹 这个程序可以读取文件中记录的机器人运动轨迹绘制到窗口里。看一下输入数据,大概有600多个数据数据格式是时间,平移t(x,y,z),旋转四元数q(x,y,z,w)以第2个数据为例时间是1305031526.707547,x轴的平移是0.002883195,y轴的平移是-0.004662100,z轴的平移是-0.002254304,旋转四元数是0.011409802,0.010697415,0.002189494,0.999875307.运行程序后会显示机器人的运动轨迹这是正在绘制时截的图这是绘制完成后的截图对比上面两张图片可以看出来起点在第一张图片的右边。这还看不出来是3D的运动轨迹再截一张不同角度的输入trajectory.txt,记录机器人运动轨迹的文档输出没有保存输出结果运行编译后直接运行视频演示https://www.bilibili.com/video/BV1mD7B6eEVP/代码#include pangolin/pangolin.h #include Eigen/Core #include unistd.h using namespace Eigen; using namespace std; // path to trajectory file string trajectory_file ./examples/trajectory.txt; void DrawTrajectory(vectorIsometry3d, Eigen::aligned_allocatorIsometry3d); int main(int argc, char **argv) { vectorIsometry3d, Eigen::aligned_allocatorIsometry3d poses; ifstream fin(trajectory_file); if (!fin) { cout cannot find trajectory file at trajectory_file endl; return 1; } while (!fin.eof()) { double time, tx, ty, tz, qx, qy, qz, qw; fin time tx ty tz qx qy qz qw; Isometry3d Twr(Quaterniond(qw, qx, qy, qz)); Twr.pretranslate(Vector3d(tx, ty, tz)); poses.push_back(Twr); } cout read total poses.size() pose entries endl; // draw trajectory in pangolin DrawTrajectory(poses); return 0; } void DrawTrajectory(vectorIsometry3d, Eigen::aligned_allocatorIsometry3d poses) { // 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, 0.0, 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 poses.size(); i) { // 画每个位姿的三个坐标轴 Vector3d Ow poses[i].translation(); Vector3d Xw poses[i] * (0.1 * Vector3d(1, 0, 0)); Vector3d Yw poses[i] * (0.1 * Vector3d(0, 1, 0)); Vector3d Zw poses[i] * (0.1 * Vector3d(0, 0, 1)); glBegin(GL_LINES); 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(); } // 画出连线 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[i1]; glVertex3d(p1.translation()[0], p1.translation()[1], p1.translation()[2]); glVertex3d(p2.translation()[0], p2.translation()[1], p2.translation()[2]); glEnd(); } pangolin::FinishFrame(); usleep(5000); // sleep 5 ms } }参考高翔《视觉SLAM十四讲》P66附近

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询