本页介绍了在安卓下保存、加载地图所涉及的接口及用法。
Slamware core不具有保存地图的功能,重新上电后,之前扫描构建的地图就会消失。所以为了复用建好的地图,需要通过上位机将已有的地图上传到Slamware Core里面。关于地图数据解析以及如何通过RoboStudio加载已知的地图,可以参考下面两篇文档:
相关文档:
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卡的读取权限
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图层
// 借用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图层中的星标点。
//打印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); |