$search
00001 00009 /* 00010 * Copyright (c) 2010, A. Hornung, University of Freiburg 00011 * All rights reserved. 00012 * 00013 * Redistribution and use in source and binary forms, with or without 00014 * modification, are permitted provided that the following conditions are met: 00015 * 00016 * * Redistributions of source code must retain the above copyright 00017 * notice, this list of conditions and the following disclaimer. 00018 * * Redistributions in binary form must reproduce the above copyright 00019 * notice, this list of conditions and the following disclaimer in the 00020 * documentation and/or other materials provided with the distribution. 00021 * * Neither the name of the University of Freiburg nor the names of its 00022 * contributors may be used to endorse or promote products derived from 00023 * this software without specific prior written permission. 00024 * 00025 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00026 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00027 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00028 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00029 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00030 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00031 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00032 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00033 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00034 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00035 * POSSIBILITY OF SUCH DAMAGE. 00036 */ 00037 00038 #include <ros/ros.h> 00039 #include <octomap_ros/GetOctomap.h> 00040 #include <octomap_ros/conversions.h> 00041 #include <octomap/octomap.h> 00042 #include <fstream> 00043 00044 #define USAGE "\nUSAGE: octomap_saver <map.bt>\n" \ 00045 " map.bt: filename of map to be saved\n" 00046 00047 using namespace std; 00048 00052 class MapSaver{ 00053 public: 00054 MapSaver(const std::string& mapname){ 00055 ros::NodeHandle n; 00056 const static std::string servname = "octomap_binary"; 00057 ROS_INFO("Requesting the map from %s...", n.resolveName(servname).c_str()); 00058 octomap_ros::GetOctomap::Request req; 00059 octomap_ros::GetOctomap::Response resp; 00060 while(n.ok() && !ros::service::call(servname, req, resp)) 00061 { 00062 ROS_WARN("Request to %s failed; trying again...", n.resolveName(servname).c_str()); 00063 usleep(1000000); 00064 } 00065 00066 if (n.ok()){ // skip when CTRL-C 00067 ROS_INFO("Map received, saving to %s", mapname.c_str()); 00068 ofstream mapfile(mapname.c_str(), ios_base::binary); 00069 00070 if (!mapfile.is_open()){ 00071 ROS_ERROR("Could not open file %s for writing", mapname.c_str()); 00072 } else { 00073 octomap::OcTree octomap(0.1); 00074 octomap::octomapMsgToMap(resp.map, octomap); 00075 octomap.writeBinary(mapname); 00076 00077 ROS_INFO("Finished writing %d nodes to file %s (res: %f)", octomap.size(), mapname.c_str(), octomap.getResolution()); 00078 00079 // write out stream directly (old format, no header) 00080 //mapfile.write((char*)&resp.map.data[0], resp.map.data.size()); 00081 //mapfile.close(); 00082 } 00083 } 00084 } 00085 }; 00086 00087 int main(int argc, char** argv){ 00088 ros::init(argc, argv, "octomap_saver"); 00089 std::string mapFilename(""); 00090 if (argc == 2) 00091 mapFilename = std::string(argv[1]); 00092 else{ 00093 ROS_ERROR("%s", USAGE); 00094 exit(-1); 00095 } 00096 00097 try{ 00098 MapSaver ms(mapFilename); 00099 }catch(std::runtime_error& e){ 00100 ROS_ERROR("map_saver exception: %s", e.what()); 00101 return -1; 00102 } 00103 00104 return 0; 00105 } 00106 00107