/**
* @fileOverview
* @author Russell Toris - rctoris@wpi.edu
*/
/**
* An OccupancyGrid can convert a ROS occupancy grid message into a createjs Bitmap object.
*
* @constructor
* @param options - object with following keys:
* * message - the occupancy grid message
*/
ROS2D.OccupancyGrid = function(options) {
options = options || {};
var message = options.message;
// internal drawing canvas
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
// save the metadata we need
this.pose = new ROSLIB.Pose({
position : message.info.origin.position,
orientation : message.info.origin.orientation
});
// set the size
this.width = message.info.width;
this.height = message.info.height;
canvas.width = this.width;
canvas.height = this.height;
var imageData = context.createImageData(this.width, this.height);
for ( var row = 0; row < this.height; row++) {
for ( var col = 0; col < this.width; col++) {
// determine the index into the map data
var mapI = col + ((this.height - row - 1) * this.width);
// determine the value
var data = message.data[mapI];
var val;
if (data === 100) {
val = 0;
} else if (data === 0) {
val = 255;
} else {
val = 127;
}
// determine the index into the image data array
var i = (col + (row * this.width)) * 4;
// r
imageData.data[i] = val;
// g
imageData.data[++i] = val;
// b
imageData.data[++i] = val;
// a
imageData.data[++i] = 255;
}
}
context.putImageData(imageData, 0, 0);
// create the bitmap
createjs.Bitmap.call(this, canvas);
// change Y direction
this.y = -this.height * message.info.resolution;
// scale the image
this.scaleX = message.info.resolution;
this.scaleY = message.info.resolution;
this.width *= this.scaleX;
this.height *= this.scaleY;
// set the pose
this.x += this.pose.position.x;
this.y -= this.pose.position.y;
};
ROS2D.OccupancyGrid.prototype.__proto__ = createjs.Bitmap.prototype;