SLAMWARE模块最重要的功能为定位导航及建图,在此过程中,会涉及到大量对地图和坐标的操作,因此,有必要针对SDK中所用的坐标系统以及地图数据进行详细的介绍。 本文将首先介绍SLAMWARE模块中所建的地图,然后结合SDK中的一些地图相关接口进行说明。
Robostudio中的地图说明
以Robostudio客户端为例,红色箭头所指为地图坐标X轴正向, 绿色箭头所指为Y轴正向。蓝色点为坐标零点。红色四边形箭头为机器人所在位置,其中,箭头方向为机器人的朝向。
下图左上角的SLAMWARE SDP [-0.59,-0.44, -157.37] 分别是 [X轴坐标, Y轴坐标, 机器人偏转角度yaw]。 默认情况下,机器人开机的位置,即为地图零点位置。机器人朝向为X轴正向,为0度,角度逆时针增加。
注意
在robostudio中显示的机器人坐标中(左下角蓝色坐标值),yaw的值是角度制,而通过接口getpose()获得的yaw则是弧度制,二者的转化关系为弧度(rad) = 角度(°)*2Π/360
将地图数据转换成BMP
以下内容将以如何从Slamware模块中获取整张地图数据并将mapdata转换成bmp为例,详细介绍地图的相关概念,
Tip
示例代码来自windows SDK中的map2bmp参考代码
sdp = SlamwareCorePlatform::connect(opt_sdpIPAddress, opt_sdpPort); rpos::core::RectangleF knownArea = sdp.getKnownArea(MapTypeBitmap8Bit, rpos::features::location_provider::EXPLORERMAP); //获得地图已知区域 Map map = sdp.getMap(MapTypeBitmap8Bit, knownArea, rpos::features::location_provider::EXPLORERMAP);//根据地图已知区域,获得地图 bitmap_image mapBitmap(map.getMapDimension().x(), map.getMapDimension().y()); //根据已获得的地图尺寸,定义bmp for (size_t posY = 0; posY < map.getMapDimension().y(); ++posY) //获取mapdata数据,并转化成bmp { for (size_t posX = 0; posX < map.getMapDimension().x(); ++posX) { rpos::system::types::_u8 cellValue = 128 + map.getMapData()[posX + (map.getMapDimension().y()-posY-1) * map.getMapDimension().x()]; mapBitmap.set_pixel(posX, posY, cellValue, cellValue, cellValue); } }
上述代码中由getKnowArea() 获取到的KnownArea, 指的是当前所生成的地图的区域,这部分会随着机器人运行过程中地图的增大而增大。getMapDimention().x() getMapDimention().y()分别获取的是地图X, Y方向的像素个数。getMapData()中的数据,是一组数值在 -128 ~ 127 之间的包含地图信息的整数,在转换成灰度值的时候,需要加上128。
地图坐标及机器人位置(以下图示仅适用于RoboStudio客户端,安卓系统坐标显示需要做坐标转换,无论在哪种坐标系下mapdata的起始位置都为 (X min, Y min))
下图的坐标中包含了机器人的位置信息,在显示机器人位置的时候,可以通过获取机器人的Pose, 并结合地图position以及resolution. 换算出机器人显示时的具体像素位置,以及朝向。
坐标
地图坐标及机器人位置示意图, resolution是每个像素对应的实际距离,单位是米,可以由getMapResolution()得到。左下角的map postion, 可以由getMapPosition()得到。 SDP机器人的位置,可以由getPose()得到, 其中,yaw角度为图示逆时针的方向角,单位是弧度。laser point的方向角以机器人前进方向为0度,为逆时针角度。