Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
334 views
in Technique[技术] by (71.8m points)

c++ - ROS making map.yaml and map.pgm from a "grid.txt"

I manage to load a map to memory and inflate it. Then I saved it to "grid.txt" which contains a matrix of 0's and 1's. Now I need to make a "map.yaml" and "map.pgm" from this "grid.txt" and I have no idea how to? Below is the code i use to generate the "grid_inflate.txt" this basically generates a .txt file containing a 2d array where obstacles are inflated(basically 0's that neighbor 1's are changed to 1), using the simulation world I launched.

#include <ros/ros.h>
#include <nav_msgs/GetMap.h>
#include <vector>
#include <fstream>
 
using namespace std;
 
// grid map
int rows;
int cols;
double mapResolution;
vector<vector<bool> > grid;
 
bool requestMap(ros::NodeHandle &nh);
void readMap(const nav_msgs::OccupancyGrid& msg);
void printGridToFile();

int main(int argc, char** argv)
{
    ros::init(argc, argv, "mapping");
    ros::NodeHandle nh;
 
    if (!requestMap(nh))
        exit(-1);
 
    printGridToFile();
 
    return 0;
}

bool requestMap(ros::NodeHandle &nh)
{
    nav_msgs::GetMap::Request req;
    nav_msgs::GetMap::Response res;
 
    while (!ros::service::waitForService("static_map", ros::Duration(3.0))) {
         ROS_INFO("Waiting for service static_map to become available");
    }
 
    ROS_INFO("Requesting the map...");
    ros::ServiceClient mapClient = nh.serviceClient<nav_msgs::GetMap>("static_map");
 
    if (mapClient.call(req, res)) {
        readMap(res.map);
        return true;
    }
    else {
        ROS_ERROR("Failed to call map service");
        return false;
    }
}

void readMap(const nav_msgs::OccupancyGrid& map)
{
    ROS_INFO("Received a %d X %d map @ %.3f m/px
",
            map.info.width,
            map.info.height,
            map.info.resolution); 
    rows = map.info.height;
    cols = map.info.width;
    mapResolution = map.info.resolution;
 
    // Dynamically resize the grid
    grid.resize(rows);
    for (int i = 0; i < rows; i++) {
        grid[i].resize(cols);
    } 
    int currCell = 0;
    for (int i = 0; i < rows; i++)  {
        for (int j = 0; j < cols; j++)      {
            if (map.data[currCell] == 0) // unoccupied cell
                grid[i][j] = false;
            else
                grid[i][j] = true; // occupied (100) or unknown cell (-1)
            currCell++;
        }
    }

    for (int i = 5 ; i < grid.size(); i++) {        
        for (int j = 5; j < grid[0].size(); j++) {
            if(grid[i][j] == true){
                if(grid[i][j-1] == false){
                    grid[i][j-1] = true;
                }
                if(grid[i-1][j] == false){
                    grid[i-1][j] = true;
                }
                if(grid[i-1][j-1] == false){
                    grid[i-1][j-1] = true;
                }
            }
        }
    }

    for (int i = grid.size() - 5; i >= 0; i--) {        
        for (int j = grid[0].size()-5; j >= 0; j--) {
            if(grid[i][j] == true){
                if(grid[i][j+1] == false){
                    grid[i][j+1] = true;
                }
                if(grid[i+1][j] == false){
                    grid[i+1][j] = true;
                }
                if(grid[i+1][j+1] == false){
                    grid[i+1][j+1] = true;
                }
            }
        }
    }

}

void printGridToFile() {
    ofstream gridFile;
    gridFile.open("grid_inflate.txt");
  
    for (int i = grid.size() - 1; i >= 0; i--) {        
        for (int j = 0; j < grid[0].size(); j++) {
        gridFile << (grid[i][j] ? "1" : "0");           
        }
        gridFile << endl;
    }
    gridFile.close();
}
question from:https://stackoverflow.com/questions/65951383/ros-making-map-yaml-and-map-pgm-from-a-grid-txt

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...