MRPT学习之可视化
星期一, 31. 七月 2017 09:31下午
可视化是在做SLAM时的一个重要环节,比如显示点云地图,机器人位置和姿态等等,虽然不是SLAM算法的核心,但交互体验直接影响了SLAM的效果,所以如何高效方便的可视化也是很重要的,MRPT上的可视化是基于OpenGL的,它在其基础上进行了许多二次开发,使得图形绘制更加便捷,这里介绍下简单的使用。
示例
- MRPT下源码在/sample/opengl_objects_demo
- MRPT下源码在/sample/display3D
关联类
3D场景主要是基于类mrpt::opengl::COpenGLSence。这个类允许使用OpenGL创建,加载,保存和渲染3D场景。
MRPT可以对哪些图元进行渲染
mrpt::opengl
可以轻松渲染多种对象,添加箭头
mrpt::opengl::CArrow
,平面
mrpt::opengl::CGridPlaneXY
,点云
mrpt::opengl::CPointCloud
,甚至是栅格地图
CSetOfObjects::posePDF2opengl()
,以及
其他多种模型 。
使用方法
官网函数说明
创建窗口和OpenGL对象
可以设置一些属性,窗口的大小,3D场景的视角,远近等等。
CDisplayWindow3D win("Demo of MRPT's OpenGL objects",640,480);
COpenGLScenePtr &theScene = win.get3DSceneAndLock();
win.setCameraZoom(20);
win.setCameraAzimuthDeg(-180);
win.setCameraElevationDeg(70);`
插入一个坐标平面
opengl::CGridPlaneXYPtr obj = opengl::CGridPlaneXY::Create(-10,10,-10,10,0,1);
obj->setColor(0.2,0.2,0.2);
obj->setLocation(0,0,0);
theScene->insert( obj );
插入一个机器人
opengl::CSetOfObjectsPtr obj1 = opengl::stock_objects::RobotPioneer();
obj1->setLocation(2,0,0);
theScene->insert( obj1 );`
绘制机器人运动轨迹
绘制的方法是基于
mrpt::opengl::CSetOfLines
,
linesPath->appendLineStrip
和
linesPath->appendLine
都可以实现,前者类似于
OpenGL
里的
GL_LINE_STRIP
即连接当前点和上一个点,当时一定要有起始点,否则出错,后者则是简单的连接两个点,更多详细参数参考
函数参数说明 ;同时也要更新机器人的位置,
obj1->setLocation
和
obj1->setPose(CPose3D)
都可以,但是后者可以更新机器人的姿态,这更加符合实际。
obj1->setPose(CPose3D(p));
theScene->insert( obj1 );
path.push_back(p);
{
opengl::CSetOfLinesPtr linesPath = opengl::CSetOfLines::Create();
linesPath->setColor(0,1,0);
linesPath->setLineWidth(2);
double gtx0=0,gty0=0;
linesPath->appendLine(gtx0,gty0,0,gtx0,gty0,0 );
for (int i=0;iappendLineStrip(path[i].x(),path[i].y(),0 );
//linesPath->appendLine(gtx0,gty0,0,path[i].x(),path[i].y(),0 );
//gtx0=path[i].x();
//gty0=path[i].y();
}
theScene->insert( linesPath );
}`
渲染步骤
- 得到窗口对象
win.get3DSceneAndLock();
并且锁住,防止渲染的时候被修改。
- 渲染生成的场景,就是修改属性,比如位置,姿态,记得插入
OpenGLSence
,语法theScene->insert( xxxxx )
。
- 解锁对象
win.unlockAccess3DScene();
,然后绘图win.repaint();
结果
Reference
[1] MRPT Tutorial
[2]
http://www.mrpt.org/