diff --git a/homer_map_manager/include/homer_map_manager/Managers/MaskingManager.h b/homer_map_manager/include/homer_map_manager/Managers/MaskingManager.h index 5809635a993909e01eb9ecb35a28dd2ba48adcc2..1947da82f3a60d2e3b31b6d03e0c62c646f28656 100644 --- a/homer_map_manager/include/homer_map_manager/Managers/MaskingManager.h +++ b/homer_map_manager/include/homer_map_manager/Managers/MaskingManager.h @@ -3,31 +3,32 @@ #include <ros/ros.h> -#include <nav_msgs/OccupancyGrid.h> -#include <nav_msgs/MapMetaData.h> #include <homer_mapnav_msgs/ModifyMap.h> +#include <nav_msgs/MapMetaData.h> +#include <nav_msgs/OccupancyGrid.h> #include <sstream> /** * @class MaskingManager - * @brief Manages a map that can overwrite values in the SLAM map or store it in a separate layer + * @brief Manages a map that can overwrite values in the SLAM map or store it + * in a separate layer * @author Malte Knauf, David Gossow */ -class MaskingManager -{ - public: - +class MaskingManager { + public: /** @brief The constructor. */ MaskingManager(nav_msgs::MapMetaData mapInfo); /** @brief The destructor. */ virtual ~MaskingManager(); - void updateMapInfo(const nav_msgs::MapMetaData::ConstPtr mapInfo); + void updateMapInfo(const nav_msgs::MapMetaData &mapInfo); - /** modifies either the masking layer or the slam layer (accordingly to the given map layer in the msg */ - nav_msgs::OccupancyGrid::ConstPtr modifyMap(homer_mapnav_msgs::ModifyMap::ConstPtr msg); + /** modifies either the masking layer or the slam layer (accordingly to the + * given map layer in the msg */ + nav_msgs::OccupancyGrid::ConstPtr modifyMap( + homer_mapnav_msgs::ModifyMap::ConstPtr msg); /** resets the masking map layer */ nav_msgs::OccupancyGrid::ConstPtr resetMap(); @@ -35,19 +36,18 @@ class MaskingManager /** replaces the masking map layer */ void replaceMap(nav_msgs::OccupancyGrid map); - private: - + private: /** stores the masking values in the dedicated masking map */ nav_msgs::OccupancyGrid m_MaskingMap; /** stores the masking values that are afterwards sent to the slam map */ nav_msgs::OccupancyGrid m_SlamMap; - /** tools to draw masking polygons */ - void drawPolygon ( std::vector< geometry_msgs::Point > vertices, int value, int mapLayer ); - void drawLine ( std::vector<int> &data, int startX, int startY, int endX, int endY, int value ); - void fillPolygon ( std::vector<int> &data, int x, int y, int value ); + void drawPolygon(std::vector<geometry_msgs::Point> vertices, int value, + int mapLayer); + void drawLine(std::vector<int> &data, int startX, int startY, int endX, + int endY, int value); + void fillPolygon(std::vector<int> &data, int x, int y, int value); }; #endif - diff --git a/homer_map_manager/src/Managers/MaskingManager.cpp b/homer_map_manager/src/Managers/MaskingManager.cpp index 7f72ac493df2ba4a32a379d97253582516eb59ee..4ee2ff60823e43a3abb3bb3bdf7e040225238b68 100644 --- a/homer_map_manager/src/Managers/MaskingManager.cpp +++ b/homer_map_manager/src/Managers/MaskingManager.cpp @@ -2,190 +2,181 @@ using namespace std; -MaskingManager::MaskingManager(nav_msgs::MapMetaData mapInfo) -{ +MaskingManager::MaskingManager(nav_msgs::MapMetaData mapInfo) { m_MaskingMap.info = mapInfo; - m_MaskingMap.data.resize(m_MaskingMap.info.width * m_MaskingMap.info.height); - std::fill( m_MaskingMap.data.begin(), m_MaskingMap.data.end(), homer_mapnav_msgs::ModifyMap::NOT_MASKED ); + m_MaskingMap.data.resize(m_MaskingMap.info.width * + m_MaskingMap.info.height); + std::fill(m_MaskingMap.data.begin(), m_MaskingMap.data.end(), + homer_mapnav_msgs::ModifyMap::NOT_MASKED); m_SlamMap.info = mapInfo; m_SlamMap.data.resize(m_SlamMap.info.width * m_SlamMap.info.height); - std::fill( m_SlamMap.data.begin(), m_SlamMap.data.end(), homer_mapnav_msgs::ModifyMap::NOT_MASKED ); + std::fill(m_SlamMap.data.begin(), m_SlamMap.data.end(), + homer_mapnav_msgs::ModifyMap::NOT_MASKED); } -MaskingManager::~MaskingManager() -{} +MaskingManager::~MaskingManager() {} -void MaskingManager::updateMapInfo(const nav_msgs::MapMetaData::ConstPtr mapInfo) -{ - if(m_SlamMap.info.width != mapInfo.width) - { +void MaskingManager::updateMapInfo(const nav_msgs::MapMetaData &mapInfo) { + if (m_SlamMap.info.width != mapInfo.width) { m_SlamMap.info = mapInfo; - std::vector<int> tmpData = m_MaskingMap.data; - + int x_add_left = + (m_MaskingMap.info.origin.position.x - mapInfo.origin.position.x) / + mapInfo.resolution; + int y_add_up = + (m_MaskingMap.info.origin.position.y - mapInfo.origin.position.y) / + mapInfo.resolution; + + std::vector<signed char> tmpData = m_MaskingMap.data; + m_MaskingMap.data.resize(mapInfo.width * mapInfo.height); - std::fill(m_MaskingMap.data.begin(), m_MaskingMap.data.end(), 0); - - for(int x = 0; x < ) - { - for(int y = 0;) - { + std::fill(m_MaskingMap.data.begin(), m_MaskingMap.data.end(), + homer_mapnav_msgs::ModifyMap::NOT_MASKED); + + for (int x = 0; x < m_MaskingMap.info.width; x++) { + for (int y = 0; y < m_MaskingMap.info.height; y++) { + int i = y * m_MaskingMap.info.width + x; + int j = (y + y_add_up) * mapInfo.width + x + x_add_left; + m_MaskingMap.data[j] = tmpData[i]; } } - m_MaskingMap.info = mapInfo; + m_MaskingMap.info = mapInfo; } } -nav_msgs::OccupancyGrid::ConstPtr MaskingManager::modifyMap(homer_mapnav_msgs::ModifyMap::ConstPtr msg) -{ - //reset SLAM mask map before each masking - std::fill( m_SlamMap.data.begin(), m_SlamMap.data.end(), homer_mapnav_msgs::ModifyMap::NOT_MASKED ); +nav_msgs::OccupancyGrid::ConstPtr MaskingManager::modifyMap( + homer_mapnav_msgs::ModifyMap::ConstPtr msg) { + // reset SLAM mask map before each masking + std::fill(m_SlamMap.data.begin(), m_SlamMap.data.end(), + homer_mapnav_msgs::ModifyMap::NOT_MASKED); drawPolygon(msg->region, msg->maskAction, msg->mapLayer); nav_msgs::OccupancyGrid::ConstPtr ret; - if(msg->mapLayer == 0) - { - ret = boost::make_shared<const::nav_msgs::OccupancyGrid>(m_SlamMap); - } - else - { - ret = boost::make_shared<const::nav_msgs::OccupancyGrid>(m_MaskingMap); + if (msg->mapLayer == 0) { + ret = boost::make_shared<const ::nav_msgs::OccupancyGrid>(m_SlamMap); + } else { + ret = boost::make_shared<const ::nav_msgs::OccupancyGrid>(m_MaskingMap); } return ret; } -nav_msgs::OccupancyGrid::ConstPtr MaskingManager::resetMap() -{ - std::fill( m_MaskingMap.data.begin(), m_MaskingMap.data.end(), homer_mapnav_msgs::ModifyMap::NOT_MASKED ); - nav_msgs::OccupancyGrid::ConstPtr ret = boost::make_shared<const::nav_msgs::OccupancyGrid>(m_MaskingMap); +nav_msgs::OccupancyGrid::ConstPtr MaskingManager::resetMap() { + std::fill(m_MaskingMap.data.begin(), m_MaskingMap.data.end(), + homer_mapnav_msgs::ModifyMap::NOT_MASKED); + nav_msgs::OccupancyGrid::ConstPtr ret = + boost::make_shared<const ::nav_msgs::OccupancyGrid>(m_MaskingMap); return ret; } -void MaskingManager::replaceMap(nav_msgs::OccupancyGrid map) -{ - if(map.data.size() != 0) +void MaskingManager::replaceMap(nav_msgs::OccupancyGrid map) { + if (map.data.size() != 0) m_MaskingMap = map; else - std::fill( m_MaskingMap.data.begin(), m_MaskingMap.data.end(), homer_mapnav_msgs::ModifyMap::NOT_MASKED ); + std::fill(m_MaskingMap.data.begin(), m_MaskingMap.data.end(), + homer_mapnav_msgs::ModifyMap::NOT_MASKED); } -void MaskingManager::drawPolygon ( vector< geometry_msgs::Point > vertices , int value , int mapLayer) -{ - if ( vertices.size() == 0 ) - { - ROS_INFO_STREAM( "No vertices given!" ); - return; - } - //make temp. map +void MaskingManager::drawPolygon(vector<geometry_msgs::Point> vertices, + int value, int mapLayer) { + if (vertices.size() == 0) { + ROS_INFO_STREAM("No vertices given!"); + return; + } + // make temp. map std::vector<int> data(m_MaskingMap.info.width * m_MaskingMap.info.height); - std::fill (data.begin(), data.end(), 0); - - //draw the lines surrounding the polygon - for ( unsigned int i = 0; i < vertices.size(); i++ ) - { - int i2 = ( i+1 ) % vertices.size(); - drawLine ( data, vertices[i].x, vertices[i].y, vertices[i2].x, vertices[i2].y, 1); - } - //calculate a point in the middle of the polygon - float midX = 0; - float midY = 0; - for ( unsigned int i = 0; i < vertices.size(); i++ ) - { - midX += vertices[i].x; - midY += vertices[i].y; - } - midX /= vertices.size(); - midY /= vertices.size(); - //fill polygon - fillPolygon ( data, (int)midX, (int)midY, 1 ); - - //copy polygon to masking map or slam map (according to parameter mapLayer) - for ( int i = 0; i < data.size(); i++ ) - { - if ( data[i] != 0 ) - { - switch(mapLayer) - { - case 0: //SLAM map - m_SlamMap.data[i] = value; - break; - case 1: //Kinect Map. apply masking to masking map - case 2: //masking map - m_MaskingMap.data[i] = value; - break; + std::fill(data.begin(), data.end(), 0); + + // draw the lines surrounding the polygon + for (unsigned int i = 0; i < vertices.size(); i++) { + int i2 = (i + 1) % vertices.size(); + drawLine(data, vertices[i].x, vertices[i].y, vertices[i2].x, + vertices[i2].y, 1); + } + // calculate a point in the middle of the polygon + float midX = 0; + float midY = 0; + for (unsigned int i = 0; i < vertices.size(); i++) { + midX += vertices[i].x; + midY += vertices[i].y; + } + midX /= vertices.size(); + midY /= vertices.size(); + // fill polygon + fillPolygon(data, (int)midX, (int)midY, 1); + + // copy polygon to masking map or slam map (according to parameter mapLayer) + for (int i = 0; i < data.size(); i++) { + if (data[i] != 0) { + switch (mapLayer) { + case 0: // SLAM map + m_SlamMap.data[i] = value; + break; + case 1: // Kinect Map. apply masking to masking map + case 2: // masking map + m_MaskingMap.data[i] = value; + break; } } } } -void MaskingManager::drawLine ( std::vector<int> &data, int startX, int startY, int endX, int endY, int value ) -{ - //bresenham algorithm - int x, y, t, dist, xerr, yerr, dx, dy, incx, incy; - // compute distances - dx = endX - startX; - dy = endY - startY; - - // compute increment - if ( dx < 0 ) - { - incx = -1; - dx = -dx; - } - else - { - incx = dx ? 1 : 0; - } - - if ( dy < 0 ) - { - incy = -1; - dy = -dy; - } - else - { - incy = dy ? 1 : 0; - } - - // which distance is greater? - dist = ( dx > dy ) ? dx : dy; - // initializing - x = startX; - y = startY; - xerr = dx; - yerr = dy; - - // compute cells - for ( t = 0; t < dist; t++ ) - { - data[x + m_MaskingMap.info.width * y] = value; - - xerr += dx; - yerr += dy; - if ( xerr > dist ) - { - xerr -= dist; - x += incx; +void MaskingManager::drawLine(std::vector<int> &data, int startX, int startY, + int endX, int endY, int value) { + // bresenham algorithm + int x, y, t, dist, xerr, yerr, dx, dy, incx, incy; + // compute distances + dx = endX - startX; + dy = endY - startY; + + // compute increment + if (dx < 0) { + incx = -1; + dx = -dx; + } else { + incx = dx ? 1 : 0; } - if ( yerr > dist ) - { - yerr -= dist; - y += incy; + + if (dy < 0) { + incy = -1; + dy = -dy; + } else { + incy = dy ? 1 : 0; } - } -} + // which distance is greater? + dist = (dx > dy) ? dx : dy; + // initializing + x = startX; + y = startY; + xerr = dx; + yerr = dy; + + // compute cells + for (t = 0; t < dist; t++) { + data[x + m_MaskingMap.info.width * y] = value; + + xerr += dx; + yerr += dy; + if (xerr > dist) { + xerr -= dist; + x += incx; + } + if (yerr > dist) { + yerr -= dist; + y += incy; + } + } +} -void MaskingManager::fillPolygon ( std::vector<int> &data, int x, int y, int value ) -{ - int index = x + m_MaskingMap.info.width * y; - if ( value != data[index] ) - { - data[index] = value; - fillPolygon ( data, x + 1, y, value ); - fillPolygon ( data, x - 1, y, value ); - fillPolygon ( data, x, y + 1, value ); - fillPolygon ( data, x, y - 1, value ); - } +void MaskingManager::fillPolygon(std::vector<int> &data, int x, int y, + int value) { + int index = x + m_MaskingMap.info.width * y; + if (value != data[index]) { + data[index] = value; + fillPolygon(data, x + 1, y, value); + fillPolygon(data, x - 1, y, value); + fillPolygon(data, x, y + 1, value); + fillPolygon(data, x, y - 1, value); + } } diff --git a/homer_map_manager/src/map_manager_node.cpp b/homer_map_manager/src/map_manager_node.cpp index 4e279befe589b7a96212bd279b5030ec378bef97..1060e1a32be2b3c084c417fde7bb0504bd5f30ea 100644 --- a/homer_map_manager/src/map_manager_node.cpp +++ b/homer_map_manager/src/map_manager_node.cpp @@ -1,16 +1,16 @@ #include <homer_map_manager/map_manager_node.h> //#include <gperftools/profiler.h> -MapManagerNode::MapManagerNode(ros::NodeHandle *nh) -{ +MapManagerNode::MapManagerNode(ros::NodeHandle* nh) { m_LastLaserTime = ros::Time::now(); int mapSize; float resolution; - ros::param::param("/homer_mapping/size", mapSize, (int) 35); - ros::param::param("/homer_mapping/resolution", resolution, (float) 0.05); - ros::param::param("/map_manager/roi_updates", m_roi_polling, (bool) false); - ros::param::param("/map_manager/roi_polling_time", m_roi_polling_time, (float) 0.5); + ros::param::param("/homer_mapping/size", mapSize, (int)35); + ros::param::param("/homer_mapping/resolution", resolution, (float)0.05); + ros::param::param("/map_manager/roi_updates", m_roi_polling, (bool)false); + ros::param::param("/map_manager/roi_polling_time", m_roi_polling_time, + (float)0.5); m_lastROIPoll = ros::Time::now(); m_MapManager = new MapManager(nh); m_POIManager = new PoiManager(nh); @@ -21,413 +21,436 @@ MapManagerNode::MapManagerNode(ros::NodeHandle *nh) mapInfo.height = mapSize / resolution; mapInfo.resolution = resolution; mapInfo.origin.position.x = 0; - mapInfo.origin.position.y = 0; - mapInfo.origin.position.z = 0; - mapInfo.origin.orientation.x = 0; - mapInfo.origin.orientation.y = 0; - mapInfo.origin.orientation.z = 0; - mapInfo.origin.orientation.w = 1; + mapInfo.origin.position.y = 0; + mapInfo.origin.position.z = 0; + mapInfo.origin.orientation.x = 0; + mapInfo.origin.orientation.y = 0; + mapInfo.origin.orientation.z = 0; + mapInfo.origin.orientation.w = 1; m_MaskingManager = new MaskingManager(mapInfo); - //subscriptions of MapManagerModule - m_RapidMapSubscriber = nh->subscribe("/rapid_mapping/map", 1, &MapManagerNode::callbackRapidMap, this); - m_OctomapSubscriber = nh->subscribe("/projected_map", 1, &MapManagerNode::callbackOctomapMap, this); - m_SLAMMapSubscriber = nh->subscribe("/homer_mapping/slam_map", 1, &MapManagerNode::callbackSLAMMap, this); - m_SaveMapSubscriber = nh->subscribe("/map_manager/save_map", 1, &MapManagerNode::callbackSaveMap, this); - m_LoadMapSubscriber = nh->subscribe("/map_manager/load_map", 1, &MapManagerNode::callbackLoadMap, this); - m_MapVisibilitySubscriber = nh->subscribe("/map_manager/toggle_map_visibility", 1, &MapManagerNode::callbackMapVisibility, this); - m_LaserScanSubscriber = nh->subscribe("/scan", 1, &MapManagerNode::callbackLaserScan, this); - m_BackLaserScanSubscriber = nh->subscribe("/back_scan", 1, &MapManagerNode::callbackBackLaser, this); - m_FrontLaserScanSubscriber = nh->subscribe("/front_scan", 1, &MapManagerNode::callbackFrontLaser, this); - m_PoseSubscriber = nh->subscribe("/pose", 1, &MapManagerNode::poseCallback, this); - - //subscriptions of PoiManager - m_AddPOISubscriber = nh->subscribe("/map_manager/add_POI", 20, &MapManagerNode::callbackAddPOI, this); - m_ModifyPOISubscriber = nh->subscribe("/map_manager/modify_POI", 100, &MapManagerNode::callbackModifyPOI, this); - m_DeletePOISubscriber = nh->subscribe("/map_manager/delete_POI", 100, &MapManagerNode::callbackDeletePOI, this); - m_GetPOIsService = nh->advertiseService("/map_manager/get_pois", &MapManagerNode::getPOIsService, this); - - // Services for Map Handling - m_SaveMapService = nh->advertiseService("/map_manager/save_map", &MapManagerNode::saveMapService, this); - m_ResetMapService = nh->advertiseService("/map_manager/reset_map", &MapManagerNode::resetMapService, this); - m_LoadMapService = nh->advertiseService("/map_manager/load_map", &MapManagerNode::loadMapService, this); - - //subscriptions of RoiManager - m_AddROISubscriber = nh->subscribe("/map_manager/add_ROI", 20, &MapManagerNode::callbackAddROI, this); - m_ModifyROISubscriber = nh->subscribe("/map_manager/modify_ROI", 100, &MapManagerNode::callbackModifyROI, this); - m_DeleteROIByNameSubscriber = nh->subscribe("/map_manager/delete_ROI_by_name", 100, &MapManagerNode::callbackDeleteROIbyName, this); - m_DeleteROIByIDSubscriber = nh->subscribe("/map_manager/delete_ROI_by_id", 100, &MapManagerNode::callbackDeleteROIbyID, this); - m_GetROIsService = nh->advertiseService("/map_manager/get_rois", &MapManagerNode::getROIsService, this); - m_GetROINameService = nh->advertiseService("/map_manager/get_roi_name", &MapManagerNode::getROINameService, this); - m_PoiInsideROISService = nh->advertiseService("/map_manager/point_inside_rois", &MapManagerNode::pointInsideRoisService, this); - if(m_roi_polling) - { - m_RoiPollPublisher = nh->advertise<homer_mapnav_msgs::RoiChange>("/map_manager/roi_change", 1); - } - - //subscribtions of MaskingMapModule - m_ModifyMapSubscriber = nh->subscribe("/map_manager/modify_map", 1, &MapManagerNode::callbackModifyMap, this); - m_ResetMapsSubscriber = nh->subscribe("/map_manager/reset_maps", 1, &MapManagerNode::callbackResetMaps, this); - - //loaded map publisher - m_LoadedMapPublisher = nh->advertise<nav_msgs::OccupancyGrid>("/map_manager/loaded_map", 1); - - //mask slam publisher - m_MaskSlamMapPublisher = nh->advertise<nav_msgs::OccupancyGrid>("/map_manager/mask_slam", 1); - - - //load map file from config if present + // subscriptions of MapManagerModule + m_RapidMapSubscriber = nh->subscribe( + "/rapid_mapping/map", 1, &MapManagerNode::callbackRapidMap, this); + m_OctomapSubscriber = nh->subscribe( + "/projected_map", 1, &MapManagerNode::callbackOctomapMap, this); + m_SLAMMapSubscriber = nh->subscribe("/homer_mapping/slam_map", 1, + &MapManagerNode::callbackSLAMMap, this); + m_SaveMapSubscriber = nh->subscribe("/map_manager/save_map", 1, + &MapManagerNode::callbackSaveMap, this); + m_LoadMapSubscriber = nh->subscribe("/map_manager/load_map", 1, + &MapManagerNode::callbackLoadMap, this); + m_MapVisibilitySubscriber = + nh->subscribe("/map_manager/toggle_map_visibility", 1, + &MapManagerNode::callbackMapVisibility, this); + m_LaserScanSubscriber = + nh->subscribe("/scan", 1, &MapManagerNode::callbackLaserScan, this); + m_BackLaserScanSubscriber = nh->subscribe( + "/back_scan", 1, &MapManagerNode::callbackBackLaser, this); + m_FrontLaserScanSubscriber = nh->subscribe( + "/front_scan", 1, &MapManagerNode::callbackFrontLaser, this); + m_PoseSubscriber = + nh->subscribe("/pose", 1, &MapManagerNode::poseCallback, this); + + // subscriptions of PoiManager + m_AddPOISubscriber = nh->subscribe("/map_manager/add_POI", 20, + &MapManagerNode::callbackAddPOI, this); + m_ModifyPOISubscriber = + nh->subscribe("/map_manager/modify_POI", 100, + &MapManagerNode::callbackModifyPOI, this); + m_DeletePOISubscriber = + nh->subscribe("/map_manager/delete_POI", 100, + &MapManagerNode::callbackDeletePOI, this); + m_GetPOIsService = nh->advertiseService( + "/map_manager/get_pois", &MapManagerNode::getPOIsService, this); + + // Services for Map Handling + m_SaveMapService = nh->advertiseService( + "/map_manager/save_map", &MapManagerNode::saveMapService, this); + m_ResetMapService = nh->advertiseService( + "/map_manager/reset_map", &MapManagerNode::resetMapService, this); + m_LoadMapService = nh->advertiseService( + "/map_manager/load_map", &MapManagerNode::loadMapService, this); + + // subscriptions of RoiManager + m_AddROISubscriber = nh->subscribe("/map_manager/add_ROI", 20, + &MapManagerNode::callbackAddROI, this); + m_ModifyROISubscriber = + nh->subscribe("/map_manager/modify_ROI", 100, + &MapManagerNode::callbackModifyROI, this); + m_DeleteROIByNameSubscriber = + nh->subscribe("/map_manager/delete_ROI_by_name", 100, + &MapManagerNode::callbackDeleteROIbyName, this); + m_DeleteROIByIDSubscriber = + nh->subscribe("/map_manager/delete_ROI_by_id", 100, + &MapManagerNode::callbackDeleteROIbyID, this); + m_GetROIsService = nh->advertiseService( + "/map_manager/get_rois", &MapManagerNode::getROIsService, this); + m_GetROINameService = nh->advertiseService( + "/map_manager/get_roi_name", &MapManagerNode::getROINameService, this); + m_PoiInsideROISService = + nh->advertiseService("/map_manager/point_inside_rois", + &MapManagerNode::pointInsideRoisService, this); + if (m_roi_polling) { + m_RoiPollPublisher = nh->advertise<homer_mapnav_msgs::RoiChange>( + "/map_manager/roi_change", 1); + } + + // subscribtions of MaskingMapModule + m_ModifyMapSubscriber = nh->subscribe( + "/map_manager/modify_map", 1, &MapManagerNode::callbackModifyMap, this); + m_ResetMapsSubscriber = nh->subscribe( + "/map_manager/reset_maps", 1, &MapManagerNode::callbackResetMaps, this); + + // loaded map publisher + m_LoadedMapPublisher = + nh->advertise<nav_msgs::OccupancyGrid>("/map_manager/loaded_map", 1); + + // mask slam publisher + m_MaskSlamMapPublisher = + nh->advertise<nav_msgs::OccupancyGrid>("/map_manager/mask_slam", 1); + + // load map file from config if present std::string mapfile; - ros::param::get("/map_manager/default_mapfile", mapfile); - if(mapfile != "") - { - std_msgs::String::Ptr mapfileMsg(new std_msgs::String); - mapfileMsg->data= mapfile; - callbackLoadMap ( mapfileMsg ); + ros::param::get("/map_manager/default_mapfile", mapfile); + if (mapfile != "") { + std_msgs::String::Ptr mapfileMsg(new std_msgs::String); + mapfileMsg->data = mapfile; + callbackLoadMap(mapfileMsg); } - m_POIManager->broadcastPoiList(); - m_ROIManager->broadcastRoiList(); + m_POIManager->broadcastPoiList(); + m_ROIManager->broadcastRoiList(); } -MapManagerNode::~MapManagerNode() -{ - if(m_MapManager) delete m_MapManager; - if(m_POIManager) delete m_POIManager; - if(m_ROIManager) delete m_ROIManager; - if(m_MaskingManager) delete m_MaskingManager; +MapManagerNode::~MapManagerNode() { + if (m_MapManager) delete m_MapManager; + if (m_POIManager) delete m_POIManager; + if (m_ROIManager) delete m_ROIManager; + if (m_MaskingManager) delete m_MaskingManager; } -void MapManagerNode::callbackSLAMMap(const nav_msgs::OccupancyGrid::ConstPtr &msg) -{ +void MapManagerNode::callbackSLAMMap( + const nav_msgs::OccupancyGrid::ConstPtr& msg) { m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::SLAM_LAYER, msg); - m_MaskingManager->updateMapInfo(const nav_msgs::MapMetaData::ConstPtr msg->info); + m_MaskingManager->updateMapInfo(msg->info); +} + +void MapManagerNode::callbackRapidMap( + const nav_msgs::OccupancyGrid::ConstPtr& msg) { + m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::RAPID_MAP, msg); } -void MapManagerNode::callbackRapidMap( const nav_msgs::OccupancyGrid::ConstPtr& msg) -{ - m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::RAPID_MAP, msg); +void MapManagerNode::callbackOctomapMap( + const nav_msgs::OccupancyGrid::ConstPtr& msg) { + m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::KINECT_LAYER, + msg); + + // nav_msgs::OccupancyGrid mergedMap; + // + // int width = 701; + // int height = 701; + // float resolution = 0.05; + // + // int ByteSize = width * height; + // + // mergedMap.header.stamp = ros::Time::now(); + // mergedMap.header.frame_id = "map"; + // mergedMap.info.width = width; + // mergedMap.info.height = height; + // mergedMap.info.resolution = resolution; + // mergedMap.info.origin.position.x = -height*resolution/2; + // mergedMap.info.origin.position.y = -width*resolution/2; + // mergedMap.info.origin.orientation.w = 1.0; + // mergedMap.info.origin.orientation.x = 0.0; + // mergedMap.info.origin.orientation.y = 0.0; + // mergedMap.info.origin.orientation.z = 0.0; + // mergedMap.data.resize(ByteSize,-1); + + // for ( int y = 0; y < msg->info.height; y++ ) + // { + // for ( int x = 0; x < msg->info.width; x++ ) + // { + // int i = x + y * msg->info.width; + + // + // //if cell is occupied by kinect obstacle merge cell with merged + //map + // if(msg->data[i] == + //homer_mapnav_msgs::ModifyMap::BLOCKED) + // { + + // Eigen::Vector2i point(x,y); + // geometry_msgs::Point tmp = map_tools::fromMapCoords( point + //,msg->info.origin, msg->info.resolution); + // point = map_tools::toMapCoords(tmp , mergedMap.info.origin, + //mergedMap.info.resolution); + // int k = point.y() * mergedMap.info.width + + //point.x(); + // mergedMap.data[k] = + //homer_mapnav_msgs::ModifyMap::DEPTH; + // } + // } + // } + // + // + // m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::KINECT_LAYER, + //boost::make_shared<nav_msgs::OccupancyGrid>(mergedMap)); } -void MapManagerNode::callbackOctomapMap( const nav_msgs::OccupancyGrid::ConstPtr& msg) -{ - m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::KINECT_LAYER, msg); - -// nav_msgs::OccupancyGrid mergedMap; -// -// int width = 701; -// int height = 701; -// float resolution = 0.05; -// -// int ByteSize = width * height; -// -// mergedMap.header.stamp = ros::Time::now(); -// mergedMap.header.frame_id = "map"; -// mergedMap.info.width = width; -// mergedMap.info.height = height; -// mergedMap.info.resolution = resolution; -// mergedMap.info.origin.position.x = -height*resolution/2; -// mergedMap.info.origin.position.y = -width*resolution/2; -// mergedMap.info.origin.orientation.w = 1.0; -// mergedMap.info.origin.orientation.x = 0.0; -// mergedMap.info.origin.orientation.y = 0.0; -// mergedMap.info.origin.orientation.z = 0.0; -// mergedMap.data.resize(ByteSize,-1); - -// for ( int y = 0; y < msg->info.height; y++ ) -// { -// for ( int x = 0; x < msg->info.width; x++ ) -// { -// int i = x + y * msg->info.width; - -// -// //if cell is occupied by kinect obstacle merge cell with merged map -// if(msg->data[i] == homer_mapnav_msgs::ModifyMap::BLOCKED) -// { - -// Eigen::Vector2i point(x,y); -// geometry_msgs::Point tmp = map_tools::fromMapCoords( point ,msg->info.origin, msg->info.resolution); -// point = map_tools::toMapCoords(tmp , mergedMap.info.origin, mergedMap.info.resolution); -// int k = point.y() * mergedMap.info.width + point.x(); -// mergedMap.data[k] = homer_mapnav_msgs::ModifyMap::DEPTH; -// } -// } -// } -// -// -// m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::KINECT_LAYER, boost::make_shared<nav_msgs::OccupancyGrid>(mergedMap)); -} - -void MapManagerNode::callbackSaveMap(const std_msgs::String::ConstPtr &msg) -{ +void MapManagerNode::callbackSaveMap(const std_msgs::String::ConstPtr& msg) { MapGenerator map_saver(msg->data); - nav_msgs::OccupancyGrid::ConstPtr SLAMMap = m_MapManager->getMapLayer(homer_mapnav_msgs::MapLayers::SLAM_LAYER); - nav_msgs::OccupancyGrid::ConstPtr maskingMap = m_MapManager->getMapLayer(homer_mapnav_msgs::MapLayers::MASKING_LAYER); - map_saver.save(SLAMMap, maskingMap, m_POIManager->getList(), m_ROIManager->getList() ); + nav_msgs::OccupancyGrid::ConstPtr SLAMMap = + m_MapManager->getMapLayer(homer_mapnav_msgs::MapLayers::SLAM_LAYER); + nav_msgs::OccupancyGrid::ConstPtr maskingMap = + m_MapManager->getMapLayer(homer_mapnav_msgs::MapLayers::MASKING_LAYER); + map_saver.save(SLAMMap, maskingMap, m_POIManager->getList(), + m_ROIManager->getList()); } -void MapManagerNode::callbackLoadMap(const std_msgs::String::ConstPtr &msg) -{ +void MapManagerNode::callbackLoadMap(const std_msgs::String::ConstPtr& msg) { m_MapManager->clearMapLayers(); - ROS_INFO_STREAM( "Loading map from file " << msg->data); + ROS_INFO_STREAM("Loading map from file " << msg->data); bool success; MapServer map_loader(msg->data, success); - if(success) - { - ros::Rate poll_rate(10); - while(m_LoadedMapPublisher.getNumSubscribers() == 0) - { - poll_rate.sleep(); - } - m_LoadedMapPublisher.publish(map_loader.getSLAMMap()); - m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::SLAM_LAYER, boost::make_shared<nav_msgs::OccupancyGrid>(map_loader.getSLAMMap())); - nav_msgs::OccupancyGrid::ConstPtr maskingMap = boost::make_shared<nav_msgs::OccupancyGrid>(map_loader.getMaskingMap()); - m_MaskingManager->replaceMap(map_loader.getMaskingMap()); - if(maskingMap->data.size() != 0) - { - m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::MASKING_LAYER, maskingMap); - } - m_POIManager->replacePOIList(map_loader.getPois()); - m_POIManager->broadcastPoiList(); - m_ROIManager->replaceROIList(map_loader.getRois()); - m_ROIManager->broadcastRoiList(); - } - else - { - ROS_ERROR_STREAM("[MapManager] Could not open mapfile!!"); + if (success) { + ros::Rate poll_rate(10); + while (m_LoadedMapPublisher.getNumSubscribers() == 0) { + poll_rate.sleep(); + } + m_LoadedMapPublisher.publish(map_loader.getSLAMMap()); + m_MapManager->updateMapLayer( + homer_mapnav_msgs::MapLayers::SLAM_LAYER, + boost::make_shared<nav_msgs::OccupancyGrid>( + map_loader.getSLAMMap())); + nav_msgs::OccupancyGrid::ConstPtr maskingMap = + boost::make_shared<nav_msgs::OccupancyGrid>( + map_loader.getMaskingMap()); + m_MaskingManager->replaceMap(map_loader.getMaskingMap()); + if (maskingMap->data.size() != 0) { + m_MapManager->updateMapLayer( + homer_mapnav_msgs::MapLayers::MASKING_LAYER, maskingMap); + } + m_POIManager->replacePOIList(map_loader.getPois()); + m_POIManager->broadcastPoiList(); + m_ROIManager->replaceROIList(map_loader.getRois()); + m_ROIManager->broadcastRoiList(); + } else { + ROS_ERROR_STREAM("[MapManager] Could not open mapfile!!"); } } -void MapManagerNode::callbackAddPOI(const homer_mapnav_msgs::PointOfInterest::ConstPtr &msg) -{ - ROS_INFO_STREAM("callbackAddPOI"); +void MapManagerNode::callbackAddPOI( + const homer_mapnav_msgs::PointOfInterest::ConstPtr& msg) { + ROS_INFO_STREAM("callbackAddPOI"); m_POIManager->addPointOfInterest(msg); } -void MapManagerNode::callbackModifyPOI(const homer_mapnav_msgs::ModifyPOI::ConstPtr &msg) -{ +void MapManagerNode::callbackModifyPOI( + const homer_mapnav_msgs::ModifyPOI::ConstPtr& msg) { m_POIManager->modifyPointOfInterest(msg); } -void MapManagerNode::callbackDeletePOI(const std_msgs::String::ConstPtr &msg) -{ +void MapManagerNode::callbackDeletePOI(const std_msgs::String::ConstPtr& msg) { m_POIManager->deletePointOfInterest(msg->data); } -void MapManagerNode::callbackAddROI(const homer_mapnav_msgs::RegionOfInterest::ConstPtr &msg) -{ +void MapManagerNode::callbackAddROI( + const homer_mapnav_msgs::RegionOfInterest::ConstPtr& msg) { m_ROIManager->addRegionOfInterest(msg); } -void MapManagerNode::callbackModifyROI(const homer_mapnav_msgs::RegionOfInterest::ConstPtr &msg) -{ +void MapManagerNode::callbackModifyROI( + const homer_mapnav_msgs::RegionOfInterest::ConstPtr& msg) { m_ROIManager->modifyRegionOfInterest(msg); } -void MapManagerNode::callbackDeleteROIbyName(const std_msgs::String::ConstPtr &msg) -{ - ROS_INFO_STREAM("Recieved /map_manager/delete_ROI_by_name"); - if(m_ROIManager->deleteRegionOfInterest(msg->data)) - { - ROS_INFO_STREAM("ROI deleted."); - } - else - { - ROS_WARN_STREAM("Could not delete ROI."); +void MapManagerNode::callbackDeleteROIbyName( + const std_msgs::String::ConstPtr& msg) { + ROS_INFO_STREAM("Recieved /map_manager/delete_ROI_by_name"); + if (m_ROIManager->deleteRegionOfInterest(msg->data)) { + ROS_INFO_STREAM("ROI deleted."); + } else { + ROS_WARN_STREAM("Could not delete ROI."); } } -void MapManagerNode::callbackDeleteROIbyID(const std_msgs::Int32::ConstPtr &msg) -{ +void MapManagerNode::callbackDeleteROIbyID( + const std_msgs::Int32::ConstPtr& msg) { m_ROIManager->deleteRegionOfInterest(msg->data); } -void MapManagerNode::callbackMapVisibility(const homer_mapnav_msgs::MapLayers::ConstPtr &msg) -{ +void MapManagerNode::callbackMapVisibility( + const homer_mapnav_msgs::MapLayers::ConstPtr& msg) { m_MapManager->toggleMapVisibility(msg->layer, msg->state); } -void MapManagerNode::callbackModifyMap(const homer_mapnav_msgs::ModifyMap::ConstPtr &msg) -{ - nav_msgs::OccupancyGrid::ConstPtr maskingMap = m_MaskingManager->modifyMap(msg); - if(msg->mapLayer == homer_mapnav_msgs::MapLayers::SLAM_LAYER || msg->maskAction == homer_mapnav_msgs::ModifyMap::HIGH_SENSITIV) - { +void MapManagerNode::callbackModifyMap( + const homer_mapnav_msgs::ModifyMap::ConstPtr& msg) { + nav_msgs::OccupancyGrid::ConstPtr maskingMap = + m_MaskingManager->modifyMap(msg); + if (msg->mapLayer == homer_mapnav_msgs::MapLayers::SLAM_LAYER || + msg->maskAction == homer_mapnav_msgs::ModifyMap::HIGH_SENSITIV) { m_MaskSlamMapPublisher.publish(maskingMap); m_highSensitiveMap = maskingMap; - } - else - { - m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::MASKING_LAYER, maskingMap); + } else { + m_MapManager->updateMapLayer( + homer_mapnav_msgs::MapLayers::MASKING_LAYER, maskingMap); } } -void MapManagerNode::callbackResetMaps(const std_msgs::Empty::ConstPtr &msg) -{ +void MapManagerNode::callbackResetMaps(const std_msgs::Empty::ConstPtr& msg) { nav_msgs::OccupancyGrid::ConstPtr maskingMap = m_MaskingManager->resetMap(); - m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::MASKING_LAYER, maskingMap); + m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::MASKING_LAYER, + maskingMap); } -void MapManagerNode::callbackLaserScan(const sensor_msgs::LaserScan::ConstPtr &msg) -{ +void MapManagerNode::callbackLaserScan( + const sensor_msgs::LaserScan::ConstPtr& msg) { m_MapManager->updateLaser(homer_mapnav_msgs::MapLayers::SICK_LAYER, msg); } -void MapManagerNode::callbackBackLaser(const sensor_msgs::LaserScan::ConstPtr &msg) -{ +void MapManagerNode::callbackBackLaser( + const sensor_msgs::LaserScan::ConstPtr& msg) { m_MapManager->updateLaser(homer_mapnav_msgs::MapLayers::HOKUYO_BACK, msg); } -void MapManagerNode::callbackFrontLaser(const sensor_msgs::LaserScan::ConstPtr &msg) -{ - m_MapManager->updateLaser(homer_mapnav_msgs::MapLayers::HOKUYO_FRONT, msg); +void MapManagerNode::callbackFrontLaser( + const sensor_msgs::LaserScan::ConstPtr& msg) { + m_MapManager->updateLaser(homer_mapnav_msgs::MapLayers::HOKUYO_FRONT, msg); } -bool MapManagerNode::getPOIsService(homer_mapnav_msgs::GetPointsOfInterest::Request& req, - homer_mapnav_msgs::GetPointsOfInterest::Response& res) -{ +bool MapManagerNode::getPOIsService( + homer_mapnav_msgs::GetPointsOfInterest::Request& req, + homer_mapnav_msgs::GetPointsOfInterest::Response& res) { res.poi_list.pois = m_POIManager->getList(); return true; } -bool MapManagerNode::getROIsService(homer_mapnav_msgs::GetRegionsOfInterest::Request& req, - homer_mapnav_msgs::GetRegionsOfInterest::Response& res) -{ +bool MapManagerNode::getROIsService( + homer_mapnav_msgs::GetRegionsOfInterest::Request& req, + homer_mapnav_msgs::GetRegionsOfInterest::Response& res) { res.roi_list.rois = m_ROIManager->getList(); return true; } -bool MapManagerNode::pointInsideRoisService(homer_mapnav_msgs::PointInsideRois::Request& req, - homer_mapnav_msgs::PointInsideRois::Response& res) -{ - res.rois = m_ROIManager->pointInsideRegionOfInterest(req.point); - return true; +bool MapManagerNode::pointInsideRoisService( + homer_mapnav_msgs::PointInsideRois::Request& req, + homer_mapnav_msgs::PointInsideRois::Response& res) { + res.rois = m_ROIManager->pointInsideRegionOfInterest(req.point); + return true; } -bool MapManagerNode::getROINameService(homer_mapnav_msgs::GetRegionOfInterestName::Request& req, - homer_mapnav_msgs::GetRegionOfInterestName::Response& res) -{ - res.name = m_ROIManager->getROIName(req.roi_id); - return true; +bool MapManagerNode::getROINameService( + homer_mapnav_msgs::GetRegionOfInterestName::Request& req, + homer_mapnav_msgs::GetRegionOfInterestName::Response& res) { + res.name = m_ROIManager->getROIName(req.roi_id); + return true; } -void MapManagerNode::poseCallback(const geometry_msgs::PoseStamped::ConstPtr& msg) -{ - m_MapManager->updatePose(msg); - if(msg->header.stamp - m_lastROIPoll > ros::Duration(m_roi_polling_time) && m_roi_polling) - { - m_lastROIPoll = msg->header.stamp; - geometry_msgs::PointStamped posePoint; - posePoint.header.frame_id="/map"; - posePoint.header.stamp = msg->header.stamp; - posePoint.point = msg->pose.position; - std::vector<homer_mapnav_msgs::RegionOfInterest> rois; - rois = m_ROIManager->pointInsideRegionOfInterest(posePoint); - bool found = false; - for(int i = 0; i < m_ids.size(); i++) - { - found = false; - for(int j = 0; j < rois.size(); j++) - { - if(m_ids[i] == rois[j].id) - { - rois.erase (rois.begin()+j); - found = true; - break; - } - } - if(!found) - { - homer_mapnav_msgs::RoiChange change; - change.id = m_ids[i]; - change.name = m_ROIManager->getROIName(m_ids[i]); - change.action = false; - m_RoiPollPublisher.publish(change); - m_ids.erase(m_ids.begin()+i); - i--; - } - } - for(int i = 0; i < rois.size(); i++) - { - homer_mapnav_msgs::RoiChange change; - change.id = rois[i].id; - change.name = m_ROIManager->getROIName(change.id); - change.action = true; - m_RoiPollPublisher.publish(change); - m_ids.push_back(rois[i].id); - } - } +void MapManagerNode::poseCallback( + const geometry_msgs::PoseStamped::ConstPtr& msg) { + m_MapManager->updatePose(msg); + if (msg->header.stamp - m_lastROIPoll > ros::Duration(m_roi_polling_time) && + m_roi_polling) { + m_lastROIPoll = msg->header.stamp; + geometry_msgs::PointStamped posePoint; + posePoint.header.frame_id = "/map"; + posePoint.header.stamp = msg->header.stamp; + posePoint.point = msg->pose.position; + std::vector<homer_mapnav_msgs::RegionOfInterest> rois; + rois = m_ROIManager->pointInsideRegionOfInterest(posePoint); + bool found = false; + for (int i = 0; i < m_ids.size(); i++) { + found = false; + for (int j = 0; j < rois.size(); j++) { + if (m_ids[i] == rois[j].id) { + rois.erase(rois.begin() + j); + found = true; + break; + } + } + if (!found) { + homer_mapnav_msgs::RoiChange change; + change.id = m_ids[i]; + change.name = m_ROIManager->getROIName(m_ids[i]); + change.action = false; + m_RoiPollPublisher.publish(change); + m_ids.erase(m_ids.begin() + i); + i--; + } + } + for (int i = 0; i < rois.size(); i++) { + homer_mapnav_msgs::RoiChange change; + change.id = rois[i].id; + change.name = m_ROIManager->getROIName(change.id); + change.action = true; + m_RoiPollPublisher.publish(change); + m_ids.push_back(rois[i].id); + } + } } - bool MapManagerNode::saveMapService(homer_mapnav_msgs::SaveMap::Request& req, - homer_mapnav_msgs::SaveMap::Response& res) -{ - //ROS_INFO_STREAM("Saving map "<<req->folder); + homer_mapnav_msgs::SaveMap::Response& res) { + // ROS_INFO_STREAM("Saving map "<<req->folder); MapGenerator map_saver(std::string(req.folder.data)); - nav_msgs::OccupancyGrid::ConstPtr SLAMMap = m_MapManager->getMapLayer(homer_mapnav_msgs::MapLayers::SLAM_LAYER); - nav_msgs::OccupancyGrid::ConstPtr maskingMap = m_MapManager->getMapLayer(homer_mapnav_msgs::MapLayers::MASKING_LAYER); - map_saver.save(SLAMMap, maskingMap, m_POIManager->getList(), m_ROIManager->getList() ); + nav_msgs::OccupancyGrid::ConstPtr SLAMMap = + m_MapManager->getMapLayer(homer_mapnav_msgs::MapLayers::SLAM_LAYER); + nav_msgs::OccupancyGrid::ConstPtr maskingMap = + m_MapManager->getMapLayer(homer_mapnav_msgs::MapLayers::MASKING_LAYER); + map_saver.save(SLAMMap, maskingMap, m_POIManager->getList(), + m_ROIManager->getList()); } bool MapManagerNode::loadMapService(homer_mapnav_msgs::LoadMap::Request& req, - homer_mapnav_msgs::LoadMap::Response& res) -{ - - //load map file from config if present + homer_mapnav_msgs::LoadMap::Response& res) { + // load map file from config if present std::string mapfile = std::string(req.filename.data); - if(mapfile != "") - { - ROS_INFO_STREAM("Loading map with filename: "<<mapfile); - std_msgs::String::Ptr mapfileMsg(new std_msgs::String); - mapfileMsg->data= mapfile; - callbackLoadMap ( mapfileMsg ); + if (mapfile != "") { + ROS_INFO_STREAM("Loading map with filename: " << mapfile); + std_msgs::String::Ptr mapfileMsg(new std_msgs::String); + mapfileMsg->data = mapfile; + callbackLoadMap(mapfileMsg); + } else { + ROS_ERROR_STREAM("Map filename is empty. Could not load map"); } - else - { - ROS_ERROR_STREAM("Map filename is empty. Could not load map"); - } } bool MapManagerNode::resetMapService(std_srvs::Empty::Request& req, - std_srvs::Empty::Response& res) -{ - ROS_INFO_STREAM("Resetting current map"); + std_srvs::Empty::Response& res) { + ROS_INFO_STREAM("Resetting current map"); nav_msgs::OccupancyGrid::ConstPtr maskingMap = m_MaskingManager->resetMap(); - m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::MASKING_LAYER, maskingMap); + m_MapManager->updateMapLayer(homer_mapnav_msgs::MapLayers::MASKING_LAYER, + maskingMap); } -int main(int argc, char** argv) -{ +int main(int argc, char** argv) { ros::init(argc, argv, "map_manager"); ros::NodeHandle nh; -/* char* pprofile = std::getenv("MAPMANAGER_PROFILE"); - if (pprofile) - { - ProfilerStart(pprofile); - } -*/ + /* char* pprofile = std::getenv("MAPMANAGER_PROFILE"); + if (pprofile) + { + ProfilerStart(pprofile); + } + */ MapManagerNode node(&nh); ros::Rate loop_rate(10); - while (ros::ok()) - { - try - { + while (ros::ok()) { + try { ros::spinOnce(); loop_rate.sleep(); + } catch (exception& e) { + std::cout << "Exception in main loop" << e.what() << std::endl; } - catch (exception &e) + } + /* if (pprofile) { - std::cout<<"Exception in main loop"<<e.what()<<std::endl; + ProfilerStop(); } - } -/* if (pprofile) - { - ProfilerStop(); - } -*/ + */ return 0; } -