跳到内容 跳到主导航 跳到页脚

地图及位置

简介

地图和定位是机器人导航的先决条件,新建地图相当于告知机器人可行走的范围,定位相当于告知机器人目前所处的位置。机器人自带“地图工具“可以完成所有地图和点位的操作,当然你也可以自己使用api完成功能

设点:指告知机器人当前点位的名称,之后可使用接口导航到这个点位

建图及定位

建图及定位可使用系统集成的地图工具进行操作.

地图坐标中,xy是机器人在地图中的位置,theta是机器人的面朝方向(单位为弧度)

定位(设置机器人初始坐标点)

方法名称:setPoseEstimate

调用方式:

try {
    JSONObject params = new JSONObject();
    //x坐标
    params.put(Definition.JSON_NAVI_POSITION_X, x);
    //y坐标
    params.put(Definition.JSON_NAVI_POSITION_Y, y);
    //z坐标
    params.put(Definition.JSON_NAVI_POSITION_THETA, theta);
    RobotApi.getInstance().setPoseEstimate(reqId, params.toString(), new CommandListener() {
        @Override
        public void onResult(int result, String message) {
            if ("succeed".equals(message)) {
                //定位成功
            }
        }
    });
} catch (JSONException e) {
    e.printStackTrace();
}

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

判断当前是否已定位

方法名称:isRobotEstimate

调用方式:

RobotApi.getInstance().isRobotEstimate(reqId, new CommandListener() {
    @Override
    public void onResult(int result, String message) {
        if (!"true".equals(message)) {
            //当前未定位
        } else {
            //当前已定位
        }
    }
});

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

设置当前位置名称

方法名称:setLocation

调用方式:

RobotApi.getInstance().setLocation(reqId, placeName, new CommandListener() {
    @Override
    public void onResult(int result, String message) {
        if ("succeed".equals(message)) {
            //保存位置点成功
        } else {
            //保存位置点失败
        }
    }
});

参数

  • placeName:位置名称

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

注意:调用该接口前需要确保已定位

根据位置名称获取坐标点

方法名称:getLocation 调用方式:

RobotApi.getInstance().getLocation(reqId, placeName, new CommandListener() {
    @Override
    public void onResult(int result, String message) {
        try {
            JSONObject json = new JSONObject(message);
            //当前位置是否存在
            boolean isExist = json.getBoolean(Definition.JSON_NAVI_SITE_EXIST);
            if (isExist) {
                //x坐标
                double x = json.getDouble(Definition.JSON_NAVI_POSITION_X);
                //y坐标
                double y = json.getDouble(Definition.JSON_NAVI_POSITION_Y);
                //面朝方向
                double z = json.getDouble(Definition.JSON_NAVI_POSITION_THETA);
            }
        } catch (JSONException | NullPointerException e) {
            e.printStackTrace();
        }
    }
});

参数:

  • placeName:位置名称

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

注意:setLocation保存的位置会与地图关联,通过getLocation获取的时候也应该保持相同的地图,否则getLocation获取失败

删除位置点

方法名称:removeLocation 调用方式:

RobotApi.getInstance().removeLocation(reqId, placeName, new CommandListener() {
    @Override
    public void onResult(int result, String message) {
        if ("succeed".equals(message)) {
            //删除位置点成功
        } else {
            //删除位置点失败
        }
    }
});

参数

  • placeName:地点名称

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

获取当前地图所有位置点

方法名称:getPlaceList

调用方式:

RobotApi.getInstance().getPlaceList(reqId, new CommandListener() {
    @Override
    public void onResult(int result, String message) {
        try {
            JSONArray jsonArray = new JSONArray(message);
            int length = jsonArray.length();
            for (int i = 0; i < length; i++) {
                JSONObject json = jsonArray.getJSONObject(i);
                //常用
                json.getString("name"); //位置名称
                json.getDouble("x"); //x坐标
                json.getDouble("y"); //y坐标
                //不常用
                json.getDouble("theta"); //面朝方向
                json.getString("id"); //位置id
                json.getLong("time");//更新时间
                json.getInt("status"); //0:正常区域,可以到 1:禁行区,不可以到 2:地图外,不可以到
            }
        } catch (JSONException | NullPointerException e) {
            e.printStackTrace();
        }
    }
});

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

获取机器人当前坐标点

方法名称:getPosition

调用方式:

RobotApi.getInstance().getPosition(reqId, new CommandListener() {
    @Override
    public void onResult(int result, String message) {
        try {
            JSONObject json = new JSONObject(message);
            //x坐标
            double x = json.getDouble(Definition.JSON_NAVI_POSITION_X);
            //y坐标
            double y = json.getDouble(Definition.JSON_NAVI_POSITION_Y);
            //面朝方向
            double z = json.getDouble(Definition.JSON_NAVI_POSITION_THETA);
        } catch (JSONException | NullPointerException e) {
            e.printStackTrace();
        }
    }
});

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

注意:调用该接口前需要确保已定位

判断机器人是否在位置点

方法名称:isRobotInLocations 调用方式:

try {
    JSONObject params = new JSONObject();
    params.put(Definition.JSON_NAVI_TARGET_PLACE_NAME, placeName); //位置名称
    params.put(Definition.JSON_NAVI_COORDINATE_DEVIATION, range); //位置范围
    RobotApi.getInstance().isRobotInlocations(reqId,
            params.toString(), new CommandListener() {
                @Override
                public void onResult(int result, String message) {
                    try {
                        JSONObject json = new JSONObject(message);
                        //是否在目标点
                        json.getBoolean(Definition.JSON_NAVI_IS_IN_LOCATION);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
} catch (JSONException e) {
    e.printStackTrace();
}

参数

  • placeName:位置名称
  • range:位置范围,单位m

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

获取当前地图名称

方法名称:getMapName 调用方式:

RobotApi.getInstance().getMapName(reqId, new CommandListener() {
    @Override
    public void onResult(int result, String message) {
        if (!TextUtils.isEmpty(message)) {
            //message为地图名称
            String mapName = message;
        }
    }
});

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

位置状态改变监听

启动一个监听回调,在位置和位置状态发生改变时触发回调。

public class Pose {
    public float px, py, theta;
    public final long time;
    public String name;
    /**
     * FREE = 0;      // 正常区域,可以到
     * OBSTACLE = 1;  // 禁行区,不可以到
     * OUTSIDE = 2;   // 地图外,不可以到
     */
    public int status;
    public float distance;
}
RobotApi.getInstance().registerStatusListener(Definition.STATUS_POSE,
    new StatusListener(){
        @Override
        public void onStatusUpdate(String type, String value) {
            Pose pose = GsonUtil.fromJson(value, Pose.class);
        }
    });

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

切换地图

方法名称:switchMap 调用方式:

RobotApi.getInstance().switchMap(reqId, mapName, new CommandListener(){
    @Override
    public void onResult(int result, String message) {
        if ("succeed".equals(message)) {
            //切换地图成功
        }
    }
});

参数

  • mapName:地图名称

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

注意:切换地图后需要重新定位

读取地图PGM文件并进展示(包含点位坐标转换)

读取地图和坐标转换是一整套地图工具在支撑,示例代码如下:

    /*
     * getMap
     * 获得当前地图
     * 地图具有当前机器人位置信息,方向坐标与可点击导航的位置点位
     * Get the current map
     * The map has current robot position information, direction coordinates and clickable navigation positions
     * 共享内存获取 map.pgm 文件
     * */
    private void getMap(final String name) {
        Log.d(TAG, "getMapPgmPFD: mapName=" + name);
        //获取 map.pgm 文件描述符
        ParcelFileDescriptor mapPgmPFD = ShareMemoryApi.getInstance().getMapPgmPFD(name);
        FileDescriptor fd = mapPgmPFD.getFileDescriptor();
        FileInputStream fileInputStream = new FileInputStream(fd);
        //从文件描述符读取数据流,解析为 RoverMap(此逻辑和之前一致)
        mRoverMap = MapppUtils.loadPFD2RoverMap(fileInputStream);
        
        //TODO 自定义操作
        
        //释放 service 层资源
        ShareMemoryApi.getInstance().releaseGetMapPgmPFD();
    }

    /**
     * 共享内存修改 map.pgm 文件,测试代码
     */
    private void setMapPgmPFD(String mapName,RoverMap roverMap) {
        byte[] bytes = MapUtils.saveRoverMapToPFDData(roverMap);
        boolean result = ShareMemoryApi.getInstance().setMapPgmPFD(mapName, bytesT);
        Log.d(TAG, "setMapPgmPFD: result=" + result);
    }

如果有相关需求,请拷贝或参考示例代码中NavFragment部分代码,最终可把机器人中的地图、点位信息读出并展示成如下形式。下载代码

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

这篇文章是否有帮助?

-1