在map_sever的map_io.cpp中存在
// Checking map mode
if (
save_parameters.mode == MapMode::Scale &&
(save_parameters.image_format == "pgm" ||
save_parameters.image_format == "jpg" ||
save_parameters.image_format == "jpeg"))
{
std::cout <<
"[WARN] [map_io]: Map mode 'scale' requires transparency, but format '" <<
save_parameters.image_format <<
"' does not support it. Consider switching image format to 'png'." << std::endl;
}
当save_parameters.mode为Scale,且image.format是pgm、jpg、jpeg其中一种的时候,输出报错[WARN] [map_io]: Map mode 'scale' requires transparency, but format “ ”does not support it. Consider switching image format to 'png'.
首先看一下这个保存参数的消息类型:
struct SaveParameters
{
std::string map_file_name{""};
std::string image_format{""};
double free_thresh{0.0};
double occupied_thresh{0.0};
MapMode mode{MapMode::Trinary};
};
当像素的Alpha
值不为0,栅格值被设定为状态不明。
像素的明暗程度值小于free\_thresh
就表示栅格没有被占用,给栅格赋0。
若大于occupied\_thresh
就认为被占用了,给栅格赋100。
在free\_thresh
和occupied\_thresh
之间就线性转换到0~100之间。
在写入地图信息之前还会判断上述参数设置的是否正确,在map_io.cpp中
//checking thresholds会对参数设置的是否正确进行判断。如果没设置的话,默认为0.65和0.25
MapMode定义中有三种格式
在nap_mode.h中
MapMode
描述图像像素值和地图占用状态(0-100;-1)之间的关系。
亮度是指给定像素的RGB通道在0到255的范围内的平均值。
Trinary
*亮度>=占用阈值————占用(100)
(介于两者之间)—————未知(-1)
*亮度<=空闲阈值——————自由(0)
Scale
*alpha<1.0————未知(-1)
*亮度>=占用阈值————占用(100)
*。。。(线性插值到)————(0-99)
*亮度<=空闲阈值————自由(0)
Raw
*亮度=0——————自由(0)
(线性插值到)————0-99
*亮度=100——————占用(100)
*亮度>=101——————未知
在tryWriteMapToFlie函数中,把data的数值转化为灰度图来进行显示,从data的索引入手进行转换,设置每一个栅格(x,y)中对应的颜色灰度值pixel(data转化为pixel)。
每个栅格的填充颜色都是灰度数值,
Trinary模式
map_cell小于0或者大于100,灰色205表示
map_cell小于等于定义的free_thresh_int,使用浅灰色254表示
map_cell大于等于定义的occupied_thresh_int,使用黑色0表示
其他情况灰色205表示。
scale模式
根据地图数据的值进行灰度映射,将较高值的地图数据映射为较浅的灰度,较低值的地图数据映射为较深的灰度。
如果map_cell小于0或者大于100,使用半透明的灰色表示,其他情况根据map_cell的值进行灰度映射。0就是白色,100就是黑色
Raw模式
将地图数据直接 转化为灰度图,将较高值的地图数据映射为浅灰色,较低值的地图数据映射为深灰色。
如果map_cell小于0或者大于100,使用白色表示,其他情况根据map_cell的值进行灰度映射。
然后得到一个image对象,定义为image.pixelColor(x,y,pixel),// Get/set pixel color at location x & y.
后通过image.write(mapdatefile) 写进mapdatafile这张图片中