464 lines
12 KiB
C++
464 lines
12 KiB
C++
#include <cstdlib>
|
|
#include "carmenconfiguration.h"
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <assert.h>
|
|
#include <sys/types.h>
|
|
#include <sensor_odometry/odometrysensor.h>
|
|
#include <sensor_range/rangesensor.h>
|
|
|
|
|
|
#define LINEBUFFER_SIZE 10000
|
|
|
|
namespace GMapping {
|
|
|
|
using namespace std;
|
|
|
|
istream& CarmenConfiguration::load(istream& is){
|
|
clear();
|
|
char buf[LINEBUFFER_SIZE];
|
|
bool laseron=false;
|
|
bool rlaseron=false;
|
|
bool rlaser1=false;
|
|
bool rlaser2=false;
|
|
|
|
string beams;
|
|
string rbeams;
|
|
|
|
while (is){
|
|
is.getline(buf, LINEBUFFER_SIZE);
|
|
istringstream lis(buf);
|
|
|
|
string qualifier;
|
|
string name;
|
|
|
|
if (lis)
|
|
lis >> qualifier;
|
|
else
|
|
continue;
|
|
//this is a workaround for carmen log files
|
|
//the number lf laser beams should be specofoed in the config
|
|
//part of the log
|
|
if (qualifier=="FLASER"){
|
|
laseron=true;
|
|
lis >> beams;
|
|
}
|
|
if (qualifier=="RLASER"){
|
|
rlaseron=true;
|
|
lis >> rbeams;
|
|
}
|
|
if (qualifier=="ROBOTLASER1"){
|
|
string laser_type, start_angle, field_of_view, angular_resolution, maximum_range, accuracy, remission_mode;
|
|
lis >> laser_type>> start_angle>> field_of_view>> angular_resolution>> maximum_range>> accuracy>> remission_mode>> beams;
|
|
rlaser1=true;
|
|
}
|
|
if (qualifier=="ROBOTLASER2"){
|
|
string laser_type, start_angle, field_of_view, angular_resolution, maximum_range, accuracy, remission_mode;
|
|
lis >> laser_type>> start_angle>> field_of_view>> angular_resolution>> maximum_range>> accuracy>> remission_mode>> rbeams;
|
|
rlaser2=true;
|
|
}
|
|
if (qualifier!="PARAM")
|
|
continue;
|
|
if (lis)
|
|
lis >> name;
|
|
else continue;
|
|
|
|
|
|
vector<string> v;
|
|
while (lis){
|
|
string cparm;
|
|
lis >> cparm;
|
|
if (lis)
|
|
v.push_back(cparm);
|
|
}
|
|
insert(make_pair(name, v));
|
|
}
|
|
if (laseron || rlaser1){
|
|
vector<string> v;
|
|
v.push_back(beams);
|
|
insert(make_pair("laser_beams", v));
|
|
cerr << "FRONT LASER BEAMS FROM LOG: " << beams << endl;
|
|
v.clear();
|
|
v.push_back("on");
|
|
insert(make_pair("robot_use_laser", v));
|
|
}
|
|
if (rlaseron || rlaser2){
|
|
vector<string> v;
|
|
v.push_back(rbeams);
|
|
insert(make_pair("rear_laser_beams", v));
|
|
cerr << "REAR LASER BEAMS FROM LOG: " << beams << endl;
|
|
v.clear();
|
|
v.push_back("on");
|
|
insert(make_pair("robot_use_rear_laser", v));
|
|
}
|
|
return is;
|
|
}
|
|
|
|
SensorMap CarmenConfiguration::computeSensorMap() const{
|
|
//this boring stuff is for retrieving the parameters from the loaded tokens
|
|
|
|
SensorMap smap;
|
|
//odometry
|
|
OdometrySensor* odometry=new OdometrySensor("ODOM");
|
|
OdometrySensor* truepos=new OdometrySensor("TRUEPOS", true);
|
|
|
|
smap.insert(make_pair(odometry->getName(), odometry));
|
|
smap.insert(make_pair(truepos->getName(), truepos));
|
|
//sonars
|
|
const_iterator key=find("robot_use_sonar");
|
|
if (key!=end() && key->second.front()=="on"){
|
|
RangeSensor* sonar=new RangeSensor("SONAR");
|
|
|
|
//the center of the sonar is the center of the base
|
|
sonar->m_pose.x=sonar->m_pose.y=sonar->m_pose.theta=0;
|
|
|
|
double maxrange=10.;
|
|
key=find("robot_max_sonar");
|
|
if (key!=end()){
|
|
maxrange=atof(key->second.front().c_str());
|
|
cerr << "max sonar:" << maxrange << endl;
|
|
}
|
|
|
|
unsigned int sonar_num=0;
|
|
key=find("robot_num_sonars");
|
|
if (key!=end()){
|
|
sonar_num=atoi(key->second.front().c_str());
|
|
cerr << "robot_num_sonars" << sonar_num << endl;
|
|
}
|
|
|
|
key=find("robot_sonar_offsets");
|
|
if (key!=end()){
|
|
const vector<string> & soff=key->second;
|
|
|
|
if( (soff.size()/3<sonar_num)){
|
|
cerr << __PRETTY_FUNCTION__ << ": Error " << soff.size()
|
|
<< " parameters for defining the sonar offsets"
|
|
<< " while the specified number of sonars requires "
|
|
<< sonar_num*3 << " parameters at least" << endl;
|
|
} else {
|
|
cerr << __PRETTY_FUNCTION__ << ": Ok " << soff.size() << " parameters for defining the sonar offsets of " << sonar_num << " devices" << endl;
|
|
}
|
|
|
|
|
|
RangeSensor::Beam beam;
|
|
|
|
for (unsigned int i=0; i<sonar_num*3; i+=3){
|
|
beam.span=M_PI/180.*7.5;
|
|
beam.pose.x=atof(soff[i].c_str());
|
|
beam.pose.y=atof(soff[i+1].c_str());
|
|
beam.pose.theta=atof(soff[i+2].c_str());
|
|
beam.maxRange=maxrange;
|
|
sonar->m_beams.push_back(beam);
|
|
cerr << "beam_x" << beam.pose.x;
|
|
cerr << " beam_y" << beam.pose.y;
|
|
cerr << " beam_theta" << beam.pose.theta << endl;;
|
|
}
|
|
}
|
|
sonar->updateBeamsLookup();
|
|
smap.insert(make_pair(sonar->getName(), sonar));
|
|
}
|
|
|
|
//laser
|
|
key=find("robot_use_laser");
|
|
|
|
if (key!=end() && key->second.front()=="on"){
|
|
RangeSensor* laser=new RangeSensor("FLASER");
|
|
laser->newFormat=false;
|
|
//by default the center of the robot is the center of the laser
|
|
laser->m_pose.x=laser->m_pose.y=laser->m_pose.theta=0;
|
|
key=find("robot_frontlaser_offset");
|
|
if (key!=end()){
|
|
laser->m_pose.x=atof(key->second.front().c_str());
|
|
cerr << "FRONT OFFSET= " << laser->m_pose.x << endl;
|
|
}
|
|
|
|
|
|
|
|
RangeSensor::Beam beam;
|
|
|
|
//double angle=-.5*M_PI;
|
|
unsigned int beam_no=180;
|
|
|
|
key=find("laser_beams");
|
|
if (key!=end()){
|
|
beam_no=atoi(key->second.front().c_str());
|
|
cerr << "FRONT BEAMS="<< beam_no << endl;
|
|
}
|
|
|
|
double maxrange=50;
|
|
double resolution=1.;
|
|
|
|
|
|
if (beam_no==180 || beam_no==181)
|
|
resolution =1.;
|
|
else if (beam_no==360 || beam_no==361)
|
|
resolution =.5;
|
|
else if (beam_no==540 || beam_no==541)
|
|
resolution =.5;
|
|
else if (beam_no==769) {
|
|
resolution =360./1024.;
|
|
maxrange = 4.1;
|
|
}
|
|
else if (beam_no==682) {
|
|
resolution =360./1024.;
|
|
maxrange = 4.1;
|
|
}
|
|
else if (beam_no==683) {
|
|
resolution =360./1024.;
|
|
maxrange = 5.5;
|
|
}
|
|
else {
|
|
key=find("laser_front_laser_resolution");
|
|
if (key!=end()){
|
|
resolution=atof(key->second.front().c_str());
|
|
cerr << "FRONT RES " << resolution << endl;
|
|
}
|
|
}
|
|
|
|
laser->m_beams.resize(beam_no);
|
|
double center_beam=(double)beam_no/2.;
|
|
uint low_index=(uint)floor(center_beam);
|
|
uint up_index=(uint)ceil(center_beam);
|
|
double step=resolution*M_PI/180.;
|
|
double angle=beam_no%2?0:step;
|
|
unsigned int i=beam_no%2?0:1;
|
|
for (; i<low_index+1; i++, angle+=step){
|
|
beam.span=0;
|
|
beam.pose.x=0;
|
|
beam.pose.y=0;
|
|
beam.s = 1;
|
|
beam.c = 1;
|
|
beam.pose.theta=-angle;
|
|
beam.maxRange=maxrange;
|
|
laser->m_beams[low_index-i]=beam;
|
|
beam.pose.theta=angle;
|
|
laser->m_beams[up_index+i-1]=beam;
|
|
}
|
|
laser->updateBeamsLookup();
|
|
smap.insert(make_pair(laser->getName(), laser));
|
|
cerr << "front beams " << beam_no << endl;
|
|
cerr << "maxrange " << maxrange << endl;
|
|
}
|
|
|
|
|
|
key=find("robot_use_laser");
|
|
if (key!=end() && key->second.front()=="on"){
|
|
RangeSensor* laser=new RangeSensor("ROBOTLASER1");
|
|
laser->newFormat=true;
|
|
cerr << "ROBOTLASER1 inserted" << endl;
|
|
//by default the center of the robot is the center of the laser
|
|
laser->m_pose.x=laser->m_pose.y=laser->m_pose.theta=0;
|
|
key=find("robot_frontlaser_offset");
|
|
if (key!=end()){
|
|
laser->m_pose.x=atof(key->second.front().c_str());
|
|
cerr << "FRONT OFFSET=" << laser->m_pose.x << endl;
|
|
}
|
|
|
|
RangeSensor::Beam beam;
|
|
|
|
//double angle=-.5*M_PI;
|
|
unsigned int beam_no=180;
|
|
|
|
key=find("laser_beams");
|
|
if (key!=end()){
|
|
beam_no=atoi(key->second.front().c_str());
|
|
cerr << "FRONT BEAMS="<< beam_no << endl;
|
|
}
|
|
|
|
double maxrange=50;
|
|
double resolution=1.;
|
|
|
|
|
|
if (beam_no==180 || beam_no==181)
|
|
resolution =1.;
|
|
else if (beam_no==360 || beam_no==361)
|
|
resolution =.5;
|
|
else if (beam_no==540 || beam_no==541)
|
|
resolution =.5;
|
|
else if (beam_no==769)
|
|
resolution =360./1024.;
|
|
else if (beam_no==683) {
|
|
resolution =360./1024.;
|
|
maxrange=5.50;
|
|
}
|
|
else {
|
|
key=find("laser_front_laser_resolution");
|
|
if (key!=end()){
|
|
resolution=atof(key->second.front().c_str());
|
|
cerr << "FRONT RES" << resolution << endl;
|
|
}
|
|
}
|
|
|
|
laser->m_beams.resize(beam_no);
|
|
double center_beam=(double)beam_no/2.;
|
|
uint low_index=(uint)floor(center_beam);
|
|
uint up_index=(uint)ceil(center_beam);
|
|
double step=resolution*M_PI/180.;
|
|
double angle=beam_no%2?0:step;
|
|
unsigned int i=beam_no%2?0:1;
|
|
for (; i<low_index+1; i++, angle+=step){
|
|
beam.span=0;
|
|
beam.pose.x=0;
|
|
beam.pose.y=0;
|
|
beam.s=0;
|
|
beam.c=1;
|
|
beam.pose.theta=-angle;
|
|
beam.maxRange=maxrange;
|
|
laser->m_beams[low_index-i]=beam;
|
|
beam.pose.theta=angle;
|
|
laser->m_beams[up_index+i-1]=beam;
|
|
}
|
|
laser->updateBeamsLookup();
|
|
smap.insert(make_pair(laser->getName(), laser));
|
|
cerr << "front beams" << beam_no << endl;
|
|
}
|
|
|
|
|
|
//vertical laser
|
|
key=find("robot_use_rear_laser");
|
|
|
|
if (key!=end() && key->second.front()=="on"){
|
|
RangeSensor* laser=new RangeSensor("RLASER");
|
|
|
|
//by default the center of the robot is the center of the laser
|
|
laser->m_pose.x=laser->m_pose.y=laser->m_pose.theta=0;
|
|
laser->m_pose.theta=M_PI;
|
|
key=find("robot_rearlaser_offset");
|
|
if (key!=end()){
|
|
laser->m_pose.x=atof(key->second.front().c_str());
|
|
cerr << "REAR OFFSET = " << laser->m_pose.x << endl;
|
|
}
|
|
|
|
|
|
|
|
RangeSensor::Beam beam;
|
|
|
|
//double angle=-.5*M_PI;
|
|
unsigned int beam_no=180;
|
|
|
|
key=find("rear_laser_beams");
|
|
if (key!=end()){
|
|
beam_no=atoi(key->second.front().c_str());
|
|
cerr << "REAR BEAMS="<< beam_no << endl;
|
|
}
|
|
|
|
double maxrange=89;
|
|
double resolution=1.;
|
|
|
|
|
|
if (beam_no==180 || beam_no==181)
|
|
resolution =1.;
|
|
else if (beam_no==360 || beam_no==361)
|
|
resolution =.5;
|
|
else if (beam_no==540 || beam_no==541)
|
|
resolution =.5;
|
|
else if (beam_no==769)
|
|
resolution =360./1024.;
|
|
else {
|
|
key=find("laser_rear_laser_resolution");
|
|
if (key!=end()){
|
|
resolution=atof(key->second.front().c_str());
|
|
cerr << "REAR RES" << resolution << endl;
|
|
}
|
|
}
|
|
|
|
laser->m_beams.resize(beam_no);
|
|
double center_beam=(double)beam_no/2.;
|
|
uint low_index=(uint)floor(center_beam);
|
|
uint up_index=(uint)ceil(center_beam);
|
|
double step=resolution*M_PI/180.;
|
|
double angle=beam_no%2?0:step;
|
|
unsigned int i=beam_no%2?0:1;
|
|
for (; i<low_index+1; i++, angle+=step){
|
|
beam.span=0;
|
|
beam.pose.x=0;
|
|
beam.pose.y=0;
|
|
beam.s=0;
|
|
beam.c=1;
|
|
beam.pose.theta=-angle;
|
|
beam.maxRange=maxrange;
|
|
laser->m_beams[low_index-i]=beam;
|
|
beam.pose.theta=angle;
|
|
laser->m_beams[up_index+i-1]=beam;
|
|
}
|
|
laser->updateBeamsLookup();
|
|
smap.insert(make_pair(laser->getName(), laser));
|
|
cerr<< "rear beams" << beam_no << endl;
|
|
}
|
|
|
|
key=find("robot_use_rear_laser");
|
|
if (key!=end() && key->second.front()=="on"){
|
|
RangeSensor* laser=new RangeSensor("ROBOTLASER2");
|
|
laser->newFormat=true;
|
|
cerr << "ROBOTLASER2 inserted" << endl;
|
|
//by default the center of the robot is the center of the laser
|
|
laser->m_pose.x=laser->m_pose.y=0;
|
|
laser->m_pose.theta=M_PI;
|
|
key=find("robot_rearlaser_offset");
|
|
if (key!=end()){
|
|
// laser->m_pose.x==atof(key->second.front().c_str());
|
|
cerr << "REAR OFFSET not used" << laser->m_pose.x << endl;
|
|
}
|
|
|
|
RangeSensor::Beam beam;
|
|
|
|
//double angle=-.5*M_PI;
|
|
unsigned int beam_no=180;
|
|
|
|
key=find("rear_laser_beams");
|
|
if (key!=end()){
|
|
beam_no=atoi(key->second.front().c_str());
|
|
cerr << "REAR BEAMS="<< beam_no << endl;
|
|
}
|
|
|
|
double maxrange=50;
|
|
double resolution=1.;
|
|
|
|
|
|
if (beam_no==180 || beam_no==181)
|
|
resolution =1.;
|
|
else if (beam_no==360 || beam_no==361)
|
|
resolution =.5;
|
|
else if (beam_no==540 || beam_no==541)
|
|
resolution =.5;
|
|
else if (beam_no==769)
|
|
resolution =360./1024.;
|
|
else {
|
|
key=find("laser_rear_laser_resolution");
|
|
if (key!=end()){
|
|
resolution=atof(key->second.front().c_str());
|
|
cerr << "REAR RES" << resolution << endl;
|
|
}
|
|
}
|
|
|
|
laser->m_beams.resize(beam_no);
|
|
double center_beam=(double)beam_no/2.;
|
|
uint low_index=(uint)floor(center_beam);
|
|
uint up_index=(uint)ceil(center_beam);
|
|
double step=resolution*M_PI/180.;
|
|
double angle=beam_no%2?0:step;
|
|
unsigned int i=beam_no%2?0:1;
|
|
for (; i<low_index+1; i++, angle+=step){
|
|
beam.span=0;
|
|
beam.s=0;
|
|
beam.c=1;
|
|
beam.pose.x=0;
|
|
beam.pose.y=0;
|
|
beam.pose.theta=-angle;
|
|
beam.maxRange=maxrange;
|
|
laser->m_beams[low_index-i]=beam;
|
|
beam.pose.theta=angle;
|
|
laser->m_beams[up_index+i-1]=beam;
|
|
}
|
|
laser->updateBeamsLookup();
|
|
smap.insert(make_pair(laser->getName(), laser));
|
|
cerr << "rear beams" << beam_no << endl;
|
|
}
|
|
|
|
|
|
return smap;
|
|
}
|
|
|
|
};
|
|
|