Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

本页介绍了在安卓下保存、加载地图所涉及的接口及用法。



概述


Slamware core不具有保存地图的功能,重新上电后,之前扫描构建的地图就会消失。所以为了复用建好的地图,需要通过上位机将已有的地图上传到Slamware Core里面。关于地图数据以及如何通过RoboStudio加载已知的地图,可以参考下面两篇文档:

相关文档:

KBSW183102 如何加载已知的地图

KBSW180143 关于SLAMWARE SDK中坐标系统以及地图数据的概述



涉及接口


为了让大家更好地了解,这里将重要的接口单独提出来介绍。更多地图相关接口内容,请参考Android SDK文档


CompositeMap getCompositeMap()

获取Slamware Core当前的compositemap。如果成功返回一个CompositeMap对象,否则返回null或者抛异常。

void setCompositeMap(CompositeMap map, Pose pose)

将compositemap map上传给Slamware Core,并将机器人在上传的这张地图中的正确的位姿同时上传,保证定位正确。没有返回值。(该方法是一个阻塞的方法,获取的同时不要进行别的操作。)


CompositeMapHelper 地图工具类

方法:

1.loadFile(String var1)

加载地图文件var1,var1为地图文件的路径。返回加载的CompositeMap对象,若加载失败返回null。

2.saveFile(String var1, CompositeMap var2)

将CompositeMap地图var2保存为var1。返回值String,若保存成功返回null,若失败返回表示错误信息的String。(注意:一定要给SD卡权限!)




代码描述


下面是部分代码片段,主要为了展示接口的使用方法和大致逻辑,供客户参考。


1.获取SD卡的读取权限

获取SD卡的读写权限
RxPermissions rxPermission = new RxPermissions(this);
rxPermission.request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE).subscribe(granted -> {
	if (granted) {}
	else
	{
		// permission denied
		Toast.makeText(this, "获取权限失败,Log无法输出到SD卡", Toast.LENGTH_SHORT).show();
		finish();
	}
});


2.加载已知地图,上传给Slamware Core

上传地图
String originMap = Environment.getExternalStorageDirectory() + "/test/map/" + "originMap.stcm";
CompositeMapHelper compositeMapHelper = new CompositeMapHelper();
CompositeMap compositeMap1 = compositeMapHelper.loadFile(originMap);
Pose pose=new pose();
robotPlatform.setCompositeMap(compositeMap1,pose);


3.在原有的composite map的基础上,为其添加POI图层

添加POI图层
// 借用PoseMap添加POI图层
PoseMap poseMap = new PoseMap();
poseMap.setUsage("point_of_interest"); 

// 添加10个CompositePose到PoseMap中
HashMap<String, CompositePose> poseHashMap = new HashMap<>();
for (int i = 0; i < 10; i++)
{  
	CompositePose compositePose = new CompositePose();
	compositePose.setName("point1" + i);
	compositePose.setPose(new Pose(new Location(i, i, 0), new Rotation()));
	poseHashMap.put("key1" + i, compositePose);          
}
poseMap.setPoses(poseHashMap);

// 将PIO图层添加到CompositeMap1中
ArrayList<MapLayer> newMaps = compisteMap.getMaps();
newMaps.add(poseMap);
compositeMap1.setMaps(newMaps);


4.获得composite map中的所有图层及其用法,并输入POI图层中的星标点。

打印地图中图层的用处以及POI图层中的星标点
//打印compositeMap1中所有的MapLayer的Usage
ArrayList<MapLayer> maps = compositeMap1.getMaps();
Iterator itor = maps.iterator();
while (itor.hasNext())
{
	MapLayer mapLayer = (MapLayer) itor.next();
	Log.d(TAG, "mapLayer.getUsage(): " + mapLayer.getUsage());

	// 打印出point_of_interest层所有点的pose和name;
	if (mapLayer.getUsage().equals("point_of_interest")) 
	{
		Log.d(TAG, "point_of_interest: ");
		PoseMap poiMap = (PoseMap) mapLayer;
		HashMap poses = poiMap.getPoses();

		Iterator<HashMap.Entry<String, CompositePose>> iterator = poses.entrySet().iterator();
		while (iterator.hasNext()) 
		{
			HashMap.Entry<String, CompositePose> entry = iterator.next();
			entry.getKey();
			Log.d(TAG, "entry.getValue(): " + entry.getValue().getPose().getLocation().getX() + " "+ entry.getValue().getPose().getLocation().getY() );
		}
	}
}


5.将地图保存到其他位置如SD卡。

下载地图
/*直接将模块当前的地图保存下来,可以使用:
CompositeMap compositeMap = robotPlatform.getCompositeMap();*/

String addPOImap = Environment.getExternalStorageDirectory() + "/test/map/" + "addPOImap.stcm";
compositeMapHelper.saveFile(addPOImap, compositeMap1);
Log.d(TAG, "map save to " + addPOImap); 
  • No labels