导航服务

导航服务用于提供机器人从当前位置移动到目的地的能力,NavigationManager 提供了地图管理、定位、移动等能力的相应 API 。

可通过RobotContext 对象获取到NavigationManager

NavigationManager navigationManager = robotContext.getSystemService(NavigationManager.SERVICE);

地图库

地图数据文件是由特定的地图扫描机器生成,其中指定了地图的初始方向、地图原点、距离单位、标记点、游览路线等数据(这些数据在生成地图时设定,无法修改),在获取到地图数据文件后需要将其导入到地图库中。

  • 创建地图

地图由标记点、图层、轨迹和地图数据组成,创建地图时根据需要添加。

  //创建标记点
  Marker marker/* [1] */=new Marker.Builder(point/* [2] */).build();

  //创建图层
  GroundOverlay groundOverlay /* [3] */= new GroundOverlay.Builder(width, height).build();

  //创建路线
  Polyline polyline /* [4] */= new Polyline.Builder(id).build();

  //创建地图
  NavMap navMap /* [5] */= new NavMap.Builder(scale).build();

[1] Marker地图标记,用于描述各个坐标点,通过 Marker.Builder 构建,使用说明如下:

方法 说明
Builder.constructor(point) 构造方法,设置标记点坐标
Builder.setId(id) 设置标记ID,唯一标志
Builder.setTitle(title) 设置标题
Builder.addTag(tag) 添加标签
Builder.addTag(index,tag) 在指定位置添加标签
Builder.addTagList(taglist) 添加标签列表
Builder.removeTag(index) 移除指定位置的标签
Builder.setDescription(description) 设置描述
Builder.setExtension(extension) 设置扩展数据,内容自定义
`[2]` `Ponit`坐标点,坐标为相对于地图原点的位置(单位与地图距离单位一致),原点为扫图起始点。
类型 属性 说明
float x x轴坐标
float y y轴坐标
`[3]` `GroundOverlay` 地图图层,显示时覆盖到地图上,通过 `GroundOverlay.Builder` 构建,使用说明如下:
方法 说明
Builder.constructor(width, height) 构造方法,宽度和高度
Builder.setName(name) 设置图层名称
Builder.setType(type) 设置图层类型
Builder.setOriginInImage(originInImage) 设置图层起点坐标
Builder.setImage(image) 设置本地图片URI
Builder.setImageUrl(imageUrl) 设置在线图片URL
`[4]` `Polyline` 地图上的路线,由多个 [Location](#Location) 组成,通过 `Polyline.Builder` 构建,使用说明如下:
方法 说明
Builder.constructor(id) 构造方法,添加路线id,唯一标志
Builder.setName(name) 设置名称
Builder.setDescription(description) 设置描述
Builder.addLocation(location) 添加路线包含的坐标点列表
Builder.addLocation(index,location) 在指定位置添加坐标
Builder.addLocationList(locationList) 添加坐标列表
Builder.removeLocation(index) 移除指定位置的坐标
Builder.setExtension(extension) 设置扩展数据,内容自定义
`[5]` `NavMap`地图,通过 `NavMap.Builder` 构建,使用说明如下:
方法 说明
Builder.constructor(scale) 构造时可指定地图缩放
Builder.setId(id) 设置地图ID
Builder.setName(name) 设置地图名称
Builder.setNavFile(navFileUri) 设置地图数据文件路径
Builder.addGroundOverlay(groundOverlay) 添加图层
Builder.addGroundOverlay(index, groundOverlay) 在列表的指定位置添加图层
Builder.addGroundOverlayList(groundOverlayList) 添加图层列表
Builder.removeGroundOverlay(index) 移除列表指定位置的图层
Builder.addMarker(marker) 添加标记
Builder.addMarker(index, marker) 在列表的指定位置标记
Builder.addMarkerList(markerList) 添加标记列表
Builder.removeMarker(index) 移除列表的指定位置的标记
Builder.addPolyline(polyline) 添加导航线路
Builder.addPolyline(index, polyline) 在列表的指定位置添加导航线路
Builder.addPolylineList(polylineList) 添加导航线路列表
Builder.removePolyline(index) 移除列表的指定位置的导航线路
  • 添加地图
  Promise<NavMap, NavMapException> addNavMapPromise /* [1] */= navigationManager.addNavMap(navMap); /* [2] */

[1] 返回结果为Promise的方法为异步方法,可通过注册回调获取执行结果,也可执行get()方法转换成同步方法,具体请参考 async

[2] 添加地图操作可能耗时较长,使用同步方法时需要注意。

  • 获取地图
  Promise<NavMap, NavMapException> getNavMapPromise = navigationManager.getNavMap(navMapId);

  Promise<List<NavMap>, NavMapException> getNavMapListPromise = navigationManager.getNavMapList();
  • 修改地图
  Promise<NavMap, NavMapException> modifyNavMapPromise = navigationManager.modifyNavMap(navMap);
  • 移除地图
  Promise<NavMap, NavMapException> removeNavMapPromise = navigationManager.removeNavMap(navMapId);

当前地图

在定位和导航之前需要先设置一张地图

  • 获取当前地图
  Promise<NavMap, NavMapException> currentNavMapPromise = navigationManager.getCurrentNavMap();
  • 设置当前地图
  Promise<NavMap, NavMapException> setCurrentNavMapPromise = navigationManager.setCurrentNavMap(navMapId);
  • 移除当前地图
  Promise<NavMap, NavMapException> unsetCurrentNavMapPromise = navigationManager.unsetCurrentNavMap();

定位

机器人在导航开始之前需要确定自己在地图中的位置。

  • 查询定位状态
  //是否正在定位
  boolean locatingSelf = navigationManager.isLocatingSelf();
  //是否已经定位成功
  boolean selfLocated = navigationManager.isSelfLocated();
  • 定位
  //默认定位
  ProgressivePromise<Location /* [1] */, LocatingException, LocatingProgress> locateSelfPromise = navigationManager.locateSelf();

  //使用参数定位
  LocatingOption locatingOption /* [2] */= new LocatingOption.Builder() 
      .setNearby(location)
      .setTimeout(timeout)
      .build();
  ProgressivePromise<Location, LocatingException, LocatingProgress> locateSelfPromise = navigationManager.locateSelf(locatingOption);

  //取消定位
  locateSelfPromise.cancel();

[1] Location 位置数据

属性 getter 说明
position x轴,y轴坐标,坐标为相对于地图原点
z z轴坐标
rotation 朝向角度,范围为(0~360), 角度为相对于地图初始角度
[2] LocationOption 定位选项,通过 LocationOption.Builder 构建,使用说明如下:
方法 说明 默认值
Buidler.setTimeout(timeout) 超时时间 单位:ms -1
Buidler.setNearby(useNearby) 在指定坐标附近定位 默认不使用
  • 获取当前位置
  Location currentLocation = navigationManager.getCurrentLocation();

导航

  • 查询导航状态
  boolean navigating = navigationManager.isNavigating();
  • 开始导航
  NavigationOption navigationOption /* [1] */= new NavigationOption.Builder(location).build(); 
  ProgressivePromise<Void, NavigationException, NavigationProgress/* [2] */> navigatePromise = navigationManager.navigate(navigationOption);

[1] NavigationOption导航选项,通过 NavigationOption.Builder 构建,使用说明如下:

属性 描述
Builder.constructor(location) 构造方法,设置导航目的地
Builder.setMaxSpeed(maxSpeed) 设置最大速度,m/s
Builder.setRetryCount(retryCount) 设置重试次数
Builder.setRetryInterval(retryInterval) 设置重试间隔,ms
Builder.setTrackMode(trackMode) 设置是否沿着轨迹导航(地图中附带轨道信息)

[2] NavigationProgress导航进度,通过getLocation()获取当前位置

  • 停止导航
  navigatePromise.cancel();

监听位置

  • 设置位置监听
    LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            //位置改变
        }
    };
    navigationManager.registerListener(locationListener);
  • 取消位置监听
    navigationManager.unregisterListener(locationListener);