Files
2025-06-06 16:15:07 +08:00

156 lines
3.8 KiB
C++

#include <assert.h>
#include <sstream>
#include "sensorstream.h"
//#define LINEBUFFER_SIZE 1000000 //for not Cyrill to unbless me, it is better to exagerate :-))
// Can't declare a buffer that big on the stack. So we'll risk Cyrill's
// unblessing, and make it smaller.
#define LINEBUFFER_SIZE 8192
namespace GMapping {
using namespace std;
//SensorStream
SensorStream::SensorStream(const SensorMap& sensorMap) :m_sensorMap(sensorMap){}
SensorStream::~SensorStream(){}
SensorReading* SensorStream::parseReading(std::istream& is, const SensorMap& smap){
SensorReading* reading=0;
if (is){
char buf[LINEBUFFER_SIZE];
is.getline(buf, LINEBUFFER_SIZE);
istringstream lis(buf);
string sensorname;
if (lis){
lis >>sensorname;
} else
return 0;
SensorMap::const_iterator it=smap.find(sensorname);
if (it==smap.end()){
return 0;
}
Sensor* sensor=it->second;
OdometrySensor* odometry=dynamic_cast<OdometrySensor*>(sensor);
if (odometry)
reading=parseOdometry(lis, odometry);
RangeSensor* range=dynamic_cast<RangeSensor*>(sensor);
if (range)
reading=parseRange(lis, range);
}
return reading;
}
OdometryReading* SensorStream::parseOdometry(std::istream& is, const OdometrySensor* osen ){
OdometryReading* reading=new OdometryReading(osen);
OrientedPoint pose;
OrientedPoint speed;
OrientedPoint accel;
is >> pose.x >> pose.y >> pose.theta;
is >> speed.x >>speed.theta;
speed.y=0;
is >> accel.x;
accel.y=accel.theta=0;
reading->setPose(pose); reading->setSpeed(speed); reading->setAcceleration(accel);
double timestamp, reltimestamp;
string s;
is >> timestamp >>s >> reltimestamp;
reading->setTime(timestamp);
return reading;
}
RangeReading* SensorStream::parseRange(std::istream& is, const RangeSensor* rs){
//cerr << __PRETTY_FUNCTION__ << endl;
if(rs->newFormat){
string laser_type, start_angle, field_of_view, angular_resolution, maximum_range, accuracy, remission_mode;
is >> laser_type>> start_angle>> field_of_view>> angular_resolution>> maximum_range>> accuracy>> remission_mode;
//cerr << " New format laser msg" << endl;
}
unsigned int size;
is >> size;
assert(size==rs->beams().size());
RangeReading* reading=new RangeReading(rs);
reading->resize(size);
for (unsigned int i=0; i<size; i++){
is >> (*reading)[i];
}
if (rs->newFormat){
int reflectionBeams;
is >> reflectionBeams;
double reflection;
for (int i=0; i<reflectionBeams; i++)
is >> reflection;
}
OrientedPoint laserPose;
is >> laserPose.x >> laserPose.y >> laserPose.theta;
OrientedPoint pose;
is >> pose.x >> pose.y >> pose.theta;
reading->setPose(pose);
if (rs->newFormat){
string laser_tv, laser_rv, forward_safety_dist, side_safty_dist, turn_axis;
is >> laser_tv >> laser_rv >> forward_safety_dist >> side_safty_dist >> turn_axis;
}
// else {
// double a,b,c;
// is >> a >> b >> c;
// }
double timestamp, reltimestamp;
string s;
is >> timestamp >>s >> reltimestamp;
reading->setTime(timestamp);
return reading;
}
//LogSensorStream
LogSensorStream::LogSensorStream(const SensorMap& sensorMap, const SensorLog* log):
SensorStream(sensorMap){
m_log=log;
assert(m_log);
m_cursor=log->begin();
}
LogSensorStream::operator bool() const{
return m_cursor==m_log->end();
}
bool LogSensorStream::rewind(){
m_cursor=m_log->begin();
return true;
}
SensorStream& LogSensorStream::operator >>(const SensorReading*& rd){
rd=*m_cursor;
m_cursor++;
return *this;
}
//InputSensorStream
InputSensorStream::InputSensorStream(const SensorMap& sensorMap, std::istream& is):
SensorStream(sensorMap), m_inputStream(is){
}
InputSensorStream::operator bool() const{
return (bool) m_inputStream;
}
bool InputSensorStream::rewind(){
//m_inputStream.rewind();
return false;
}
SensorStream& InputSensorStream::operator >>(const SensorReading*& reading){
reading=parseReading(m_inputStream, m_sensorMap);
return *this;
}
};