MRPT EKF SLAM (3D表示) 编程学习笔记

简介:

An implementation of EKF-based SLAM with range-bearing sensors, odometry, a full 6D robot pose, and 3D landmarks.

The main method is "processActionObservation" which processes pairs of action/observation.

The following Wiki page describes an front-end application based on this class: http://babel.isa.uma.es/mrpt/index.php/Application:kf-slam

See also:
An implementation for 2D only:  CRangeBearingKFSLAM2D

类之间调用关系:以CKalmanFilterCapable<>为基类,关键的方法在于processActionObservation,getCurrentState和getCurrentRobotPose

Inheritance graph

类的详细文档:http://babel.isa.uma.es/mrpt/reference/stable/classmrpt_1_1slam_1_1_c_range_bearing_k_f_s_l_a_m.html#_details

附上代码:

// EKF SLAM
void EKFSLAM()
{
	std::string configFile="../EKF-SLAM_test.ini";
	CRangeBearingKFSLAM  mapping;
	CConfigFile			 cfgFile( configFile );
	std::string			 rawlogFileName;

	//mapping.debugOut = &myDebugStream;
	CDisplayWindow3D        win("My window");

	// The rawlog file:
	rawlogFileName = cfgFile.read_string("MappingApplication","rawlog_file",std::string("log.rawlog"));
	unsigned int	rawlog_offset = cfgFile.read_int("MappingApplication","rawlog_offset",0);
	unsigned int SAVE_LOG_FREQUENCY= cfgFile.read_int("MappingApplication","SAVE_LOG_FREQUENCY",1);
	bool  SAVE_3D_SCENES = cfgFile.read_bool("MappingApplication","SAVE_3D_SCENES", true);
	bool  SAVE_MAP_REPRESENTATIONS = cfgFile.read_bool("MappingApplication","SAVE_MAP_REPRESENTATIONS", true);
	string OUT_DIR = cfgFile.read_string("MappingApplication","logOutput_dir","OUT_KF-SLAM");
	string ground_truth_file = cfgFile.read_string("MappingApplication","ground_truth_file","");
	//cout << "RAWLOG FILE:" << endl << rawlogFileName << endl;
	ASSERT_( fileExists( rawlogFileName ) );
	CFileGZInputStream	rawlogFile( rawlogFileName );

	// 创建输出目录
	//deleteFilesInDirectory(OUT_DIR);
	//createDirectory(OUT_DIR);

	// Load the config options for mapping:
	mapping.loadOptions( CConfigFile(configFile) );
	/* mapping.KF_options.dumpToConsole();
	mapping.options.dumpToConsole();
	*/
	//			INITIALIZATION
	// ----------------------------------------
	//mapping.initializeEmptyMap();

	// The main loop:
	CActionCollectionPtr	action;
	CSensoryFramePtr		observations;
	size_t			rawlogEntry = 0, step = 0;
	deque<CPose3D>   meanPath; // The estimated path
	CPose3DPDFGaussian		robotPose;
	std::vector<CPoint3D>	LMs;
	std::map<unsigned int,CLandmark::TLandmarkID> LM_IDs;
	CMatrixDouble	fullCov;
	CVectorDouble   fullState;

	for(;;)
	{
		if (os::kbhit())
		{	// Esc quit the program
			char	pushKey = os::getch();
			if (27 == pushKey)
				break;
		}

		// Load action/observation pair from the rawlog:
		if (! CRawlog::readActionObservationPair( rawlogFile, action, observations, rawlogEntry) )
			break; // file EOF

		if (rawlogEntry>=rawlog_offset)
		{
			// Process the action and observations:
			mapping.processActionObservation(action,observations);

			// Get current state:
			mapping.getCurrentState( robotPose,LMs,LM_IDs,fullState,fullCov );
			//cout << "Mean pose: " << endl << robotPose.mean << endl;
			//cout << "# of landmarks in the map: " << LMs.size() << endl;

			// Build the path:
			meanPath.push_back( robotPose.mean );

			
			// Free rawlog items memory:
			action.clear_unique();
			observations.clear_unique();
		}// (rawlogEntry>=rawlog_offset)

		//cout << format("\nStep %u  - Rawlog entries processed: %i\n", (unsigned int)step, (unsigned int)rawlogEntry);
		step++;

		// Show Mapping
		opengl::COpenGLScenePtr &scene3D = win.get3DSceneAndLock();

		// Modify the scene:
		opengl::CGridPlaneXYPtr grid = opengl::CGridPlaneXY::Create(-1000,1000,-1000,1000,0,5);
		grid->setColor(0.4,0.4,0.4);
		scene3D->insert( grid );

		// Robot path:
		opengl::CSetOfLinesPtr linesPath = opengl::CSetOfLines::Create();
		linesPath->setColor(1,0,0);

		double x0=0,y0=0,z0=0;

		if (!meanPath.empty())
		{
			x0 = meanPath[0].x();
			y0 = meanPath[0].y();
			z0 = meanPath[0].z();
		}

		for (deque<CPose3D>::iterator it=meanPath.begin();it!=meanPath.end();++it)
		{
			linesPath->appendLine(
				x0,y0,z0,
				it->x(), it->y(), it->z() );
			x0=it->x();
			y0=it->y();
			z0=it->z();
		}
		scene3D->insert( linesPath );
		opengl::CSetOfObjectsPtr  objs = opengl::CSetOfObjects::Create();
		mapping.getAs3DObject(objs);
		scene3D->insert( objs );

		// Unlock it, so the window can use it for redraw:
		win.unlockAccess3DScene();
		// Update window, if required
		win.forceRepaint();

	}	// end "while(1)"
}

void CMrptImageBasicTestView::OnSlamEkfslam()
{
	// 调用EKF-SLAM
	HANDLE handle;
	DWORD id;
	handle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)EKFSLAM,NULL,0,&id);
	CloseHandle(handle);
}
执行结果 按3D格式显示,可以自主调整视角

image


本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2010/03/11/1683296.html,如需转载请自行联系原作者


相关文章
|
传感器 机器学习/深度学习 人工智能
苏黎世理工最新!maplab2.0:模块化的多模态建图定位框架
将多传感器模态和深度学习集成到同时定位和mapping(SLAM)系统中是当前研究的重要领域。多模态是在具有挑战性的环境中实现鲁棒性和具有不同传感器设置的异构多机器人系统的互操作性的一块垫脚石。借助maplab 2.0,这个多功能的开源平台,可帮助开发、测试新模块和功能,并将其集成到一个成熟的SLAM系统中。
苏黎世理工最新!maplab2.0:模块化的多模态建图定位框架
|
11月前
|
机器学习/深度学习 算法 测试技术
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
本文是关于如何搭建深度学习环境,特别是使用mmdetection进行CPU安装和训练的详细指南。包括安装Anaconda、创建虚拟环境、安装PyTorch、mmcv-full和mmdetection,以及测试环境和训练目标检测模型的步骤。还提供了数据集准备、检查和网络训练的详细说明。
716 5
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
|
JavaScript 前端开发 数据安全/隐私保护
|
人工智能 BI 开发者
|
Kubernetes Java 调度
掌握SpringBoot-2.3的容器探针:基础篇
SpringBoot-2.3.0.RELEASE发布了最新的容器探针技术,请随本文一起来了解一下吧
254 0
掌握SpringBoot-2.3的容器探针:基础篇
|
自然语言处理 网络协议 中间件
手把手做一个公众号GPT智能客服【二】实现微信公众号回复(订阅送源码!)
手把手做一个公众号GPT智能客服【二】实现微信公众号回复(订阅送源码!)
168 0
手把手做一个公众号GPT智能客服【二】实现微信公众号回复(订阅送源码!)
|
存储 负载均衡 安全
【Unity干货教程】如何实现Unity和Android原生互相调用?
Unity是一个跨平台开发工具,发布到移动平台也是大部分Unity开发者的必备技能。而由于Unity跨平台的特性,总会遇到在移动平台的技术细节支持不够,或者需要在调用其他原生插件的情况。这里我们说一下如何在Android Studio中创建一个可供Unity调用的aar插件,以实现Unity和Android原生互相调用的目的。
|
Ubuntu Linux Windows
ubuntu16.04安装MATLAB R2017b步骤详解(附完整文件包)
ubuntu16.04安装MATLAB R2017b步骤详解(附完整文件包)
880 0
ubuntu16.04安装MATLAB R2017b步骤详解(附完整文件包)
|
传感器 机器学习/深度学习 编解码
领域最全!多传感器融合方法综述!(Camera/Lidar/Radar等多源异构数据)(上)
自动驾驶正成为影响未来行业的关键技术,传感器是自动驾驶系统中感知外部世界的关键,其协作性能直接决定自动驾驶车辆的安全性。本文主要讨论了近年来自动驾驶中多传感器融合的不同策略。分析了常规传感器的性能和多传感器融合的必要性,包括radar、激光雷达、摄像机、超声波、GPS、IMU和V2X。
领域最全!多传感器融合方法综述!(Camera/Lidar/Radar等多源异构数据)(上)
|
消息中间件 安全 搜索推荐
【小家java】Java线程池之---ForkJoinPool线程池的使用以及原理(下)
【小家java】Java线程池之---ForkJoinPool线程池的使用以及原理(下)
【小家java】Java线程池之---ForkJoinPool线程池的使用以及原理(下)