Newer
Older
orange2022 / src / openslam_gmapping / log / log_plot.cpp
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <sys/types.h>
#include <gmapping/log/carmenconfiguration.h>
#include <gmapping/log/sensorlog.h>


using namespace std;
using namespace GMapping;

int main(int argc, char ** argv){
  double maxrange=2.;
	if (argc<2){
		cout << "usage log_plot <filename> | gnuplot" << endl;
		exit (-1);
	}
	ifstream is(argv[1]);
	if (! is){
		cout << "no file " << argv[1] << " found" << endl;
		exit (-1);
	}
	CarmenConfiguration conf;
	conf.load(is);
	
	SensorMap m=conf.computeSensorMap();
	
	//for (SensorMap::const_iterator it=m.begin(); it!=m.end(); it++)
	//	cout << it->first << " " << it->second->getName() << endl;
	
	SensorLog log(m);
	is.close();
	
	ifstream ls(argv[1]);
	log.load(ls);
	ls.close();
	int count=0;
	int frame=0;
	cerr << "log size" << log.size() << endl;
	for (SensorLog::iterator it=log.begin(); it!=log.end(); it++){
		RangeReading* rr=dynamic_cast<RangeReading*>(*it);
		if (rr){
		  count++;
		  if (count%3)
		    continue;
		  std::vector<Point> points(rr->size());
		  uint j=0;
		  for (uint i=0; i<rr->size(); i++){
		    const RangeSensor * rs=dynamic_cast<const RangeSensor*>(rr->getSensor());
		    double c=rs->beams()[i].c, s=rs->beams()[i].s;
		    double r=(*rr)[i];
		    if (r>maxrange)
		      continue;
		    points[j++]=Point(r*c,r*s);
		  }
		  if (j){
		    char buf[1024];
		    sprintf(buf,"frame-%05d.gif",frame);
		    frame++;
		    cout << "set terminal gif" << endl;
		    cout << "set output \"" << buf << "\"" << endl;
		    cout << "set size ratio -1" << endl;
		    cout << "plot [-3:3][0:3] '-' w p ps 1" << endl;
		    for (uint i=0; i<j; i++){
		      cout << points[i].y << " " << points[i].x << endl;
		  }
		  cout << "e" << endl;
		  }
		}
	}
}