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

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;
}
};