add slam_gmapping
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
add_subdirectory(sensor_base)
|
||||
ament_export_libraries(sensor_base)
|
||||
|
||||
add_subdirectory(sensor_odometry)
|
||||
ament_export_libraries(sensor_odometry)
|
||||
|
||||
add_subdirectory(sensor_range)
|
||||
ament_export_libraries(sensor_range)
|
||||
@@ -0,0 +1,5 @@
|
||||
-include ../global.mk
|
||||
|
||||
SUBDIRS=sensor_base sensor_odometry sensor_range
|
||||
|
||||
-include ../build_tools/Makefile.subdirs
|
||||
@@ -0,0 +1,4 @@
|
||||
add_library(sensor_base sensor.cpp sensorreading.cpp)
|
||||
install(TARGETS sensor_base DESTINATION lib)
|
||||
|
||||
ament_export_libraries(sensor_base)
|
||||
@@ -0,0 +1,12 @@
|
||||
#include <gmapping/sensor/sensor_base/sensor.h>
|
||||
|
||||
namespace GMapping{
|
||||
|
||||
Sensor::Sensor(const std::string& name){
|
||||
m_name=name;
|
||||
}
|
||||
|
||||
Sensor::~Sensor(){
|
||||
}
|
||||
|
||||
};// end namespace
|
||||
@@ -0,0 +1,18 @@
|
||||
#ifndef SENSORREADING_H
|
||||
#define SENSORREADING_H
|
||||
|
||||
#include "sensor.h"
|
||||
namespace GMapping{
|
||||
|
||||
class SensorReading{
|
||||
public:
|
||||
SensorReading(const Sensor* s=0, double time=0);
|
||||
inline double getTime() const {return m_time;}
|
||||
inline const Sensor* getSensor() const {return m_sensor;}
|
||||
protected:
|
||||
double m_time;
|
||||
const Sensor* m_sensor;
|
||||
};
|
||||
|
||||
}; //end namespace
|
||||
#endif
|
||||
@@ -0,0 +1,15 @@
|
||||
#include <gmapping/sensor/sensor_base/sensorreading.h>
|
||||
|
||||
namespace GMapping{
|
||||
|
||||
//SensorReading::SensorReading(const Sensor* s, double t){
|
||||
// m_sensor=s;
|
||||
// m_time=t;
|
||||
//}
|
||||
//
|
||||
//
|
||||
//SensorReading::~SensorReading(){
|
||||
//}
|
||||
|
||||
};
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
add_library(sensor_odometry odometryreading.cpp odometrysensor.cpp)
|
||||
target_link_libraries(sensor_odometry sensor_base)
|
||||
|
||||
install(TARGETS sensor_odometry DESTINATION lib)
|
||||
|
||||
ament_export_libraries(sensor_odometry)
|
||||
@@ -0,0 +1,9 @@
|
||||
#include <gmapping/sensor/sensor_odometry/odometryreading.h>
|
||||
|
||||
namespace GMapping{
|
||||
|
||||
OdometryReading::OdometryReading(const OdometrySensor* odo, double time):
|
||||
SensorReading(odo,time){}
|
||||
|
||||
};
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#include <gmapping/sensor/sensor_odometry/odometrysensor.h>
|
||||
|
||||
namespace GMapping{
|
||||
|
||||
OdometrySensor::OdometrySensor(const std::string& name, bool ideal): Sensor(name){ m_ideal=ideal;}
|
||||
|
||||
|
||||
};
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
add_library(sensor_range rangereading.cpp rangesensor.cpp)
|
||||
target_link_libraries(sensor_range sensor_base)
|
||||
#ament_target_dependencies(sensor_range sensor_base)
|
||||
|
||||
install(TARGETS sensor_range DESTINATION lib)
|
||||
|
||||
ament_export_libraries(sensor_range)
|
||||
@@ -0,0 +1,114 @@
|
||||
#include <limits>
|
||||
#include <iostream>
|
||||
#include <assert.h>
|
||||
#include <sys/types.h>
|
||||
#include <gmapping/utils/gvalues.h>
|
||||
#include <gmapping/sensor/sensor_range/rangereading.h>
|
||||
|
||||
namespace GMapping{
|
||||
|
||||
using namespace std;
|
||||
|
||||
RangeReading::RangeReading(const RangeSensor* rs, double time):
|
||||
SensorReading(rs,time){}
|
||||
|
||||
RangeReading::RangeReading(unsigned int n_beams, const double* d, const RangeSensor* rs, double time):
|
||||
SensorReading(rs,time){
|
||||
assert(n_beams==rs->beams().size());
|
||||
resize(n_beams);
|
||||
for (unsigned int i=0; i<size(); i++)
|
||||
(*this)[i]=d[i];
|
||||
}
|
||||
|
||||
RangeReading::~RangeReading(){
|
||||
// cerr << __PRETTY_FUNCTION__ << ": CAZZZZZZZZZZZZZZZZZZZZOOOOOOOOOOO" << endl;
|
||||
}
|
||||
|
||||
unsigned int RangeReading::rawView(double* v, double density) const{
|
||||
if (density==0){
|
||||
for (unsigned int i=0; i<size(); i++)
|
||||
v[i]=(*this)[i];
|
||||
} else {
|
||||
Point lastPoint(0,0);
|
||||
uint suppressed=0;
|
||||
for (unsigned int i=0; i<size(); i++){
|
||||
const RangeSensor* rs=dynamic_cast<const RangeSensor*>(getSensor());
|
||||
assert(rs);
|
||||
Point lp(
|
||||
cos(rs->beams()[i].pose.theta)*(*this)[i],
|
||||
sin(rs->beams()[i].pose.theta)*(*this)[i]);
|
||||
Point dp=lastPoint-lp;
|
||||
double distance=sqrt(dp*dp);
|
||||
if (distance<density){
|
||||
// v[i]=MAXDOUBLE;
|
||||
v[i]=std::numeric_limits<double>::max();
|
||||
suppressed++;
|
||||
}
|
||||
else{
|
||||
lastPoint=lp;
|
||||
v[i]=(*this)[i];
|
||||
}
|
||||
//std::cerr<< __PRETTY_FUNCTION__ << std::endl;
|
||||
//std::cerr<< "suppressed " << suppressed <<"/"<<size() << std::endl;
|
||||
}
|
||||
}
|
||||
// return size();
|
||||
return static_cast<unsigned int>(size());
|
||||
|
||||
};
|
||||
|
||||
unsigned int RangeReading::activeBeams(double density) const{
|
||||
if (density==0.)
|
||||
return size();
|
||||
int ab=0;
|
||||
Point lastPoint(0,0);
|
||||
uint suppressed=0;
|
||||
for (unsigned int i=0; i<size(); i++){
|
||||
const RangeSensor* rs=dynamic_cast<const RangeSensor*>(getSensor());
|
||||
assert(rs);
|
||||
Point lp(
|
||||
cos(rs->beams()[i].pose.theta)*(*this)[i],
|
||||
sin(rs->beams()[i].pose.theta)*(*this)[i]);
|
||||
Point dp=lastPoint-lp;
|
||||
double distance=sqrt(dp*dp);
|
||||
if (distance<density){
|
||||
suppressed++;
|
||||
}
|
||||
else{
|
||||
lastPoint=lp;
|
||||
ab++;
|
||||
}
|
||||
//std::cerr<< __PRETTY_FUNCTION__ << std::endl;
|
||||
//std::cerr<< "suppressed " << suppressed <<"/"<<size() << std::endl;
|
||||
}
|
||||
return ab;
|
||||
}
|
||||
|
||||
std::vector<Point> RangeReading::cartesianForm(double maxRange) const{
|
||||
const RangeSensor* rangeSensor=dynamic_cast<const RangeSensor*>(getSensor());
|
||||
assert(rangeSensor && rangeSensor->beams().size());
|
||||
// uint m_beams=rangeSensor->beams().size();
|
||||
uint m_beams=static_cast<unsigned int>(rangeSensor->beams().size());
|
||||
std::vector<Point> cartesianPoints(m_beams);
|
||||
double px,py,ps,pc;
|
||||
px=rangeSensor->getPose().x;
|
||||
py=rangeSensor->getPose().y;
|
||||
ps=sin(rangeSensor->getPose().theta);
|
||||
pc=cos(rangeSensor->getPose().theta);
|
||||
for (unsigned int i=0; i<m_beams; i++){
|
||||
const double& rho=(*this)[i];
|
||||
const double& s=rangeSensor->beams()[i].s;
|
||||
const double& c=rangeSensor->beams()[i].c;
|
||||
if (rho>=maxRange){
|
||||
cartesianPoints[i]=Point(0,0);
|
||||
} else {
|
||||
Point p=Point(rangeSensor->beams()[i].pose.x+c*rho, rangeSensor->beams()[i].pose.y+s*rho);
|
||||
cartesianPoints[i].x=px+pc*p.x-ps*p.y;
|
||||
cartesianPoints[i].y=py+ps*p.x+pc*p.y;
|
||||
}
|
||||
}
|
||||
return cartesianPoints;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
#include <gmapping/sensor/sensor_range/rangesensor.h>
|
||||
|
||||
namespace GMapping{
|
||||
|
||||
RangeSensor::RangeSensor(std::string name): Sensor(name){}
|
||||
|
||||
RangeSensor::RangeSensor(std::string name, unsigned int beams_num, double res, const OrientedPoint& position, double span, double maxrange):Sensor(name),
|
||||
m_pose(position), m_beams(beams_num){
|
||||
double angle=-.5*res*beams_num;
|
||||
for (unsigned int i=0; i<beams_num; i++, angle+=res){
|
||||
RangeSensor::Beam& beam(m_beams[i]);
|
||||
beam.span=span;
|
||||
beam.pose.x=0;
|
||||
beam.pose.y=0;
|
||||
beam.pose.theta=angle;
|
||||
beam.maxRange=maxrange;
|
||||
}
|
||||
newFormat=0;
|
||||
updateBeamsLookup();
|
||||
}
|
||||
|
||||
void RangeSensor::updateBeamsLookup(){
|
||||
for (unsigned int i=0; i<m_beams.size(); i++){
|
||||
RangeSensor::Beam& beam(m_beams[i]);
|
||||
beam.s=sin(m_beams[i].pose.theta);
|
||||
beam.c=cos(m_beams[i].pose.theta);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
Reference in New Issue
Block a user