本页介绍了在安卓下保存、加载地图所涉及的接口及用法。
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); |