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



概述


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