18 #ifndef OPEN_KARTO_MAPPER_H 19 #define OPEN_KARTO_MAPPER_H 41 virtual void Info(
const std::string& ) {};
53 virtual void Debug(
const std::string& ) {};
121 Update(rPose1, rPose2, rCovariance);
151 m_Covariance = rotationMatrix * rCovariance * rotationMatrix.
Transpose();
178 return m_PoseDifference;
233 inline const std::vector<Edge<T>*>&
GetEdges()
const 253 std::vector<Vertex<T>*> vertices;
281 m_Edges.push_back(pEdge);
309 m_pSource->AddEdge(
this);
310 m_pTarget->AddEdge(
this);
321 if (m_pLabel != NULL)
449 typedef std::map<Name, std::vector<Vertex<T>*> >
VertexMap;
475 m_Vertices[rName].push_back(pVertex);
484 m_Edges.push_back(pEdge);
492 forEachAs(
typename VertexMap, &m_Vertices, indexIter)
513 inline const std::vector<Edge<T>*>&
GetEdges()
const 571 std::queue<Vertex<T>*> toVisit;
572 std::set<Vertex<T>*> seenVertices;
573 std::vector<Vertex<T>*> validVertices;
575 toVisit.push(pStartVertex);
576 seenVertices.insert(pStartVertex);
583 if (pVisitor->
Visit(pNext))
586 validVertices.push_back(pNext);
594 if (seenVertices.find(pAdjacent) == seenVertices.end())
596 toVisit.push(pAdjacent);
597 seenVertices.insert(pAdjacent);
601 }
while (toVisit.empty() ==
false);
603 std::vector<T*> objects;
606 objects.push_back((*iter)->GetObject());
621 : m_MaxDistanceSquared(math::
Square(maxDistance))
622 , m_UseScanBarycenter(useScanBarycenter)
634 return (squaredDistance <= m_MaxDistanceSquared -
KT_TOLERANCE);
714 return m_pLoopScanMatcher;
780 Pose2 ComputeWeightedMean(
const Pose2Vector& rMeans,
const std::vector<Matrix3>& rCovariances)
const;
791 const Name& rSensorName,
849 virtual void Compute() = 0;
855 virtual const IdPoseVector& GetCorrections()
const = 0;
923 assert(resolution != 0.0);
926 kt_int32u borderSize = GetHalfKernelSize(smearDeviation, resolution) + 1;
971 assert(m_pKernel != NULL);
973 int gridIndex = GridIndex(rGridPoint);
982 for (
kt_int32s j = -halfKernel; j <= halfKernel; j++)
986 kt_int32s kernelConstant = (halfKernel) + m_KernelSize * (j + halfKernel);
991 for (
kt_int32s i = -halfKernel; i <= halfKernel; i++)
993 kt_int32s kernelArrayIndex = i + kernelConstant;
995 kt_int8u kernelValue = m_pKernel[kernelArrayIndex];
996 if (kernelValue > pGridAdr[i])
999 pGridAdr[i] = kernelValue;
1016 :
Grid<
kt_int8u>(width + borderSize * 2, height + borderSize * 2)
1017 , m_SmearDeviation(smearDeviation)
1020 GetCoordinateConverter()->SetScale(1.0 / resolution);
1036 assert(resolution != 0.0);
1037 assert(m_SmearDeviation != 0.0);
1041 const kt_double MIN_SMEAR_DISTANCE_DEVIATION = 0.5 * resolution;
1042 const kt_double MAX_SMEAR_DISTANCE_DEVIATION = 10 * resolution;
1045 if (!
math::InRange(m_SmearDeviation, MIN_SMEAR_DISTANCE_DEVIATION, MAX_SMEAR_DISTANCE_DEVIATION))
1047 std::stringstream error;
1048 error <<
"Mapper Error: Smear deviation too small: Must be between " 1049 << MIN_SMEAR_DISTANCE_DEVIATION
1051 << MAX_SMEAR_DISTANCE_DEVIATION;
1052 throw std::runtime_error(error.str());
1058 m_KernelSize = 2 * GetHalfKernelSize(m_SmearDeviation, resolution) + 1;
1061 m_pKernel =
new kt_int8u[m_KernelSize * m_KernelSize];
1062 if (m_pKernel == NULL)
1064 throw std::runtime_error(
"Unable to allocate memory for kernel!");
1068 kt_int32s halfKernel = m_KernelSize / 2;
1069 for (
kt_int32s i = -halfKernel; i <= halfKernel; i++)
1071 for (
kt_int32s j = -halfKernel; j <= halfKernel; j++)
1074 kt_double distanceFromMean = _hypot(i * resolution, j * resolution);
1076 kt_double distanceFromMean = hypot(i * resolution, j * resolution);
1078 kt_double z = exp(-0.5 * pow(distanceFromMean / m_SmearDeviation, 2));
1081 assert(
math::IsUpTo(kernelValue, static_cast<kt_int32u>(255)));
1083 int kernelArrayIndex = (i + halfKernel) + m_KernelSize * (j + halfKernel);
1084 m_pKernel[kernelArrayIndex] =
static_cast<kt_int8u>(kernelValue);
1098 assert(resolution != 0.0);
1159 kt_bool doRefineMatch =
true);
1178 const Pose2& rSearchCenter,
1198 void ComputePositionalCovariance(
const Pose2& rBestPose,
1200 const Pose2& rSearchCenter,
1215 void ComputeAngularCovariance(
const Pose2& rBestPose,
1217 const Pose2& rSearchCenter,
1228 return m_pCorrelationGrid;
1268 : m_pMapper(pMapper)
1269 , m_pCorrelationGrid(NULL)
1270 , m_pSearchSpaceProbs(NULL)
1271 , m_pGridLookup(NULL)
1299 , m_RunningBufferMaximumSize(runningBufferMaximumSize)
1300 , m_RunningBufferMaximumDistance(runningBufferMaximumDistance)
1320 pScan->
SetStateId(static_cast<kt_int32u>(m_Scans.size()));
1326 m_Scans.push_back(pScan);
1345 m_pLastScan = pScan;
1363 return m_RunningScans;
1372 m_RunningScans.push_back(pScan);
1375 Pose2 frontScanPose = m_RunningScans.front()->GetSensorPose();
1376 Pose2 backScanPose = m_RunningScans.back()->GetSensorPose();
1380 while (m_RunningScans.size() > m_RunningBufferMaximumSize ||
1384 m_RunningScans.erase(m_RunningScans.begin());
1387 frontScanPose = m_RunningScans.front()->GetSensorPose();
1388 backScanPose = m_RunningScans.back()->GetSensorPose();
1399 m_RunningScans.clear();
1427 : m_RunningBufferMaximumSize(runningBufferMaximumSize)
1428 , m_RunningBufferMaximumDistance(runningBufferMaximumDistance)
1447 void RegisterSensor(
const Name& rSensorName);
1463 std::vector<Name> deviceNames;
1466 deviceNames.push_back(iter->first);
1479 RegisterSensor(rSensorName);
1481 return GetScanManager(rSensorName)->GetLastScan();
1490 GetScanManager(pScan)->SetLastScan(pScan);
1517 GetScanManager(pScan)->AddRunningScan(pScan);
1527 return GetScanManager(rSensorName)->GetScans();
1537 return GetScanManager(rSensorName)->GetRunningScans();
1568 if (m_ScanManagers.find(rSensorName) != m_ScanManagers.end())
1570 return m_ScanManagers[rSensorName];
1764 Mapper(
const std::string& rName);
1776 void Initialize(
kt_double rangeThreshold);
1838 virtual ScanMatcher* GetSequentialScanMatcher()
const;
1852 return m_pMapperSensorManager;
1862 return m_pGraph->TryCloseLoop(pScan, rSensorName);
1866 void InitializeParameters();
1885 void FireInfo(
const std::string& rInfo)
const;
1891 void FireDebug(
const std::string& rInfo)
const;
1897 void FireLoopClosureCheck(
const std::string& rInfo)
const;
1903 void FireBeginLoopClosure(
const std::string& rInfo)
const;
1909 void FireEndLoopClosure(
const std::string& rInfo)
const;
2134 bool getParamUseScanMatching();
2135 bool getParamUseScanBarycenter();
2136 double getParamMinimumTimeInterval();
2137 double getParamMinimumTravelDistance();
2138 double getParamMinimumTravelHeading();
2139 int getParamScanBufferSize();
2140 double getParamScanBufferMaximumScanDistance();
2141 double getParamLinkMatchMinimumResponseFine();
2142 double getParamLinkScanMaximumDistance();
2143 double getParamLoopSearchMaximumDistance();
2144 bool getParamDoLoopClosing();
2145 int getParamLoopMatchMinimumChainSize();
2146 double getParamLoopMatchMaximumVarianceCoarse();
2147 double getParamLoopMatchMinimumResponseCoarse();
2148 double getParamLoopMatchMinimumResponseFine();
2151 double getParamCorrelationSearchSpaceDimension();
2152 double getParamCorrelationSearchSpaceResolution();
2153 double getParamCorrelationSearchSpaceSmearDeviation();
2156 double getParamLoopSearchSpaceDimension();
2157 double getParamLoopSearchSpaceResolution();
2158 double getParamLoopSearchSpaceSmearDeviation();
2161 double getParamDistanceVariancePenalty();
2162 double getParamAngleVariancePenalty();
2163 double getParamFineSearchAngleOffset();
2164 double getParamCoarseSearchAngleOffset();
2165 double getParamCoarseAngleResolution();
2166 double getParamMinimumAnglePenalty();
2167 double getParamMinimumDistancePenalty();
2168 bool getParamUseResponseExpansion();
2172 void setParamUseScanMatching(
bool b);
2173 void setParamUseScanBarycenter(
bool b);
2174 void setParamMinimumTimeInterval(
double d);
2175 void setParamMinimumTravelDistance(
double d);
2176 void setParamMinimumTravelHeading(
double d);
2177 void setParamScanBufferSize(
int i);
2178 void setParamScanBufferMaximumScanDistance(
double d);
2179 void setParamLinkMatchMinimumResponseFine(
double d);
2180 void setParamLinkScanMaximumDistance(
double d);
2181 void setParamLoopSearchMaximumDistance(
double d);
2182 void setParamDoLoopClosing(
bool b);
2183 void setParamLoopMatchMinimumChainSize(
int i);
2184 void setParamLoopMatchMaximumVarianceCoarse(
double d);
2185 void setParamLoopMatchMinimumResponseCoarse(
double d);
2186 void setParamLoopMatchMinimumResponseFine(
double d);
2189 void setParamCorrelationSearchSpaceDimension(
double d);
2190 void setParamCorrelationSearchSpaceResolution(
double d);
2191 void setParamCorrelationSearchSpaceSmearDeviation(
double d);
2194 void setParamLoopSearchSpaceDimension(
double d);
2195 void setParamLoopSearchSpaceResolution(
double d);
2196 void setParamLoopSearchSpaceSmearDeviation(
double d);
2199 void setParamDistanceVariancePenalty(
double d);
2200 void setParamAngleVariancePenalty(
double d);
2201 void setParamFineSearchAngleOffset(
double d);
2202 void setParamCoarseSearchAngleOffset(
double d);
2203 void setParamCoarseAngleResolution(
double d);
2204 void setParamMinimumAnglePenalty(
double d);
2205 void setParamMinimumDistancePenalty(
double d);
2206 void setParamUseResponseExpansion(
bool b);
2210 #endif // OPEN_KARTO_MAPPER_H CorrelationGrid(kt_int32u width, kt_int32u height, kt_int32u borderSize, kt_double resolution, kt_double smearDeviation)
std::map< Name, ScanManager * > ScanManagerMap
ScanMatcher * m_pSequentialScanMatcher
GraphTraversal(Graph< T > *pGraph)
virtual ~CorrelationGrid()
Parameter< kt_double > * m_pLinkScanMaximumDistance
virtual void Info(const std::string &)
kt_double Round(kt_double value)
kt_bool TryCloseLoop(LocalizedRangeScan *pScan, const Name &rSensorName)
virtual void AddNode(Vertex< LocalizedRangeScan > *)
void SetUniqueId(kt_int32u uniqueId)
Parameter< kt_double > * m_pCoarseAngleResolution
kt_int32s GetStateId() const
NearScanVisitor(LocalizedRangeScan *pScan, kt_double maxDistance, kt_bool useScanBarycenter)
Parameter< kt_double > * m_pLoopMatchMaximumVarianceCoarse
std::vector< Vector2< kt_double > > PointVectorDouble
Parameter< kt_double > * m_pMinimumTravelHeading
virtual void EndLoopClosure(const std::string &)
#define forEachAs(listtype, list, iter)
void AddEdge(Edge< T > *pEdge)
Parameter< kt_double > * m_pMinimumAnglePenalty
Matrix3 Transpose() const
std::vector< MapperListener * > m_Listeners
LocalizedRangeScanVector & GetScans()
kt_bool m_UseScanBarycenter
virtual void RemoveNode(kt_int32s)
const Vector2< kt_double > & GetPosition() const
Rectangle2< kt_int32s > m_Roi
virtual void RemoveConstraint(kt_int32s, kt_int32s)
virtual ~GraphTraversal()
std::vector< Name > GetSensorNames()
virtual void LoopClosureCheck(const std::string &)
Parameter< kt_double > * m_pLoopSearchSpaceSmearDeviation
void Update(const Pose2 &rPose1, const Pose2 &rPose2, const Matrix3 &rCovariance)
const std::vector< Edge< T > * > & GetEdges() const
virtual kt_bool Visit(Vertex< LocalizedRangeScan > *pVertex)
const Matrix3 & GetCovariance()
Parameter< kt_int32u > * m_pLoopMatchMinimumChainSize
Parameter< kt_double > * m_pCorrelationSearchSpaceResolution
virtual kt_int32s GridIndex(const Vector2< kt_int32s > &rGrid, kt_bool boundaryCheck=true) const
Parameter< kt_double > * m_pMinimumDistancePenalty
void AddVertex(const Name &rName, Vertex< T > *pVertex)
virtual void AddConstraint(Edge< LocalizedRangeScan > *)
Parameter< kt_double > * m_pDistanceVariancePenalty
void SetStateId(kt_int32s stateId)
MapperSensorManager * GetMapperSensorManager() const
Parameter< kt_bool > * m_pUseScanMatching
Vertex< T > * GetTarget() const
#define forEach(listtype, list)
kt_double m_SmearDeviation
virtual ~BreadthFirstTraversal()
LocalizedRangeScan * GetLastScan()
void SetLastScan(LocalizedRangeScan *pScan)
void SetROI(const Rectangle2< kt_int32s > &roi)
LocalizedRangeScanVector m_RunningScans
LocalizedRangeScanVector & GetScans(const Name &rSensorName)
MapperSensorManager * m_pMapperSensorManager
kt_int32u m_RunningBufferMaximumSize
GraphTraversal< LocalizedRangeScan > * m_pTraversal
Parameter< kt_bool > * m_pDoLoopClosing
virtual kt_bool Visit(Vertex< T > *pVertex)=0
BreadthFirstTraversal(Graph< T > *pGraph)
Parameter< kt_double > * m_pFineSearchAngleOffset
kt_int32u m_RunningBufferMaximumSize
Parameter< kt_double > * m_pScanBufferMaximumScanDistance
ScanSolver * m_pScanOptimizer
virtual void Debug(const std::string &)
Parameter< kt_double > * m_pLoopSearchSpaceDimension
kt_double SquaredDistance(const Vector2 &rOther) const
void SetLastScan(LocalizedRangeScan *pScan)
virtual kt_int32s GridIndex(const Vector2< kt_int32s > &rGrid, kt_bool boundaryCheck=true) const
const Name & GetSensorName() const
void SmearPoint(const Vector2< kt_int32s > &rGridPoint)
LocalizedRangeScan * GetLastScan(const Name &rSensorName)
CorrelationGrid * GetCorrelationGrid() const
ScanManager(kt_int32u runningBufferMaximumSize, kt_double runningBufferMaximumDistance)
Parameter< kt_double > * m_pMinimumTravelDistance
std::vector< Edge< T > * > m_Edges
void AddRunningScan(LocalizedRangeScan *pScan)
void AddRunningScan(LocalizedRangeScan *pScan)
LocalizedRangeScanVector & GetRunningScans()
void AddEdge(Edge< T > *pEdge)
void SetUseScanMatching(kt_bool val)
std::vector< Pose2 > Pose2Vector
ScanMatcher * GetLoopScanMatcher() const
virtual ~MapperSensorManager()
Vertex< T > * GetSource() const
ScanMatcher(Mapper *pMapper)
kt_bool InRange(const T &value, const T &a, const T &b)
void AddScan(LocalizedRangeScan *pScan, kt_int32s uniqueId)
kt_double m_RunningBufferMaximumDistance
const kt_double KT_TOLERANCE
#define const_forEach(listtype, list)
virtual void BeginLoopClosure(const std::string &)
std::vector< Vertex< T > * > GetAdjacentVertices() const
GridIndexLookup< kt_int8u > * m_pGridLookup
Pose2 GetReferencePose(kt_bool useBarycenter) const
static CorrelationGrid * CreateGrid(kt_int32s width, kt_int32s height, kt_double resolution, kt_double smearDeviation)
CorrelationGrid * m_pCorrelationGrid
Parameter< kt_double > * m_pLoopSearchSpaceResolution
Parameter< kt_double > * m_pCorrelationSearchSpaceDimension
MapperSensorManager(kt_int32u runningBufferMaximumSize, kt_double runningBufferMaximumDistance)
const std::vector< Edge< T > * > & GetEdges() const
LocalizedRangeScan * GetScan(kt_int32s id)
std::vector< std::pair< kt_int32s, Pose2 > > IdPoseVector
Parameter< kt_double > * m_pLinkMatchMinimumResponseFine
LocalizedRangeScanVector & GetRunningScans(const Name &rSensorName)
Vertex< LocalizedRangeScan > * GetVertex(LocalizedRangeScan *pScan)
ScanMatcher * m_pLoopScanMatcher
void SetLabel(EdgeLabel *pLabel)
ScanManagerMap m_ScanManagers
Grid< kt_double > * m_pSearchSpaceProbs
std::map< Name, std::vector< Vertex< T > * > > VertexMap
static kt_int32s GetHalfKernelSize(kt_double smearDeviation, kt_double resolution)
Edge(Vertex< T > *pSource, Vertex< T > *pTarget)
Parameter< kt_double > * m_pCorrelationSearchSpaceSmearDeviation
virtual std::vector< T * > Traverse(Vertex< T > *pStartVertex, Visitor< T > *pVisitor)
Parameter< kt_double > * m_pLoopMatchMinimumResponseCoarse
LocalizedRangeScan * m_pLastScan
std::vector< LocalizedRangeScan * > m_Scans
const Rectangle2< kt_int32s > & GetROI() const
kt_double m_RunningBufferMaximumDistance
LinkInfo(const Pose2 &rPose1, const Pose2 &rPose2, const Matrix3 &rCovariance)
const VertexMap & GetVertices() const
Parameter< kt_double > * m_pCoarseSearchAngleOffset
Parameter< kt_double > * m_pLoopSearchMaximumDistance
Parameter< kt_double > * m_pAngleVariancePenalty
virtual void CalculateKernel()
Parameter< kt_double > * m_pMinimumTimeInterval
Parameter< kt_bool > * m_pUseResponseExpansion
Parameter< kt_int32u > * m_pScanBufferSize
kt_bool IsUpTo(const T &value, const T &maximum)
std::vector< Edge< T > * > m_Edges
ScanManager * GetScanManager(LocalizedRangeScan *pScan)
std::vector< LocalizedRangeScan * > LocalizedRangeScanVector
ScanManager * GetScanManager(const Name &rSensorName)
Parameter< kt_bool > * m_pUseScanBarycenter
LocalizedRangeScanVector m_Scans
const Pose2 & GetPoseDifference()
Parameter< kt_double > * m_pLoopMatchMinimumResponseFine
kt_double GetHeading() const
void FromAxisAngle(kt_double x, kt_double y, kt_double z, const kt_double radians)
kt_double m_MaxDistanceSquared