123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211 |
- #ifndef OPEN_KARTO_MAPPER_H
- #define OPEN_KARTO_MAPPER_H
- #include <map>
- #include <set>
- #include <vector>
- #include <queue>
- #include <open_karto/Karto.h>
- namespace karto
- {
-
-
-
- class MapperListener
- {
- public:
-
- virtual void Info(const std::string& ) {};
- };
-
- class MapperDebugListener
- {
- public:
-
- virtual void Debug(const std::string& ) {};
- };
-
- class MapperLoopClosureListener : public MapperListener
- {
- public:
-
- virtual void LoopClosureCheck(const std::string& ) {};
-
- virtual void BeginLoopClosure(const std::string& ) {};
-
- virtual void EndLoopClosure(const std::string& ) {};
- };
-
-
-
-
- class EdgeLabel
- {
- public:
-
- EdgeLabel()
- {
- }
-
- virtual ~EdgeLabel()
- {
- }
- };
-
-
-
-
-
-
- class LinkInfo : public EdgeLabel
- {
- public:
-
- LinkInfo(const Pose2& rPose1, const Pose2& rPose2, const Matrix3& rCovariance)
- {
- Update(rPose1, rPose2, rCovariance);
- }
-
- virtual ~LinkInfo()
- {
- }
- public:
-
- void Update(const Pose2& rPose1, const Pose2& rPose2, const Matrix3& rCovariance)
- {
- m_Pose1 = rPose1;
- m_Pose2 = rPose2;
-
- Transform transform(rPose1, Pose2());
- m_PoseDifference = transform.TransformPose(rPose2);
-
- Matrix3 rotationMatrix;
- rotationMatrix.FromAxisAngle(0, 0, 1, -rPose1.GetHeading());
- m_Covariance = rotationMatrix * rCovariance * rotationMatrix.Transpose();
- }
-
- inline const Pose2& GetPose1()
- {
- return m_Pose1;
- }
-
- inline const Pose2& GetPose2()
- {
- return m_Pose2;
- }
-
- inline const Pose2& GetPoseDifference()
- {
- return m_PoseDifference;
- }
-
- inline const Matrix3& GetCovariance()
- {
- return m_Covariance;
- }
- private:
- Pose2 m_Pose1;
- Pose2 m_Pose2;
- Pose2 m_PoseDifference;
- Matrix3 m_Covariance;
- };
-
-
-
- template<typename T>
- class Edge;
-
- template<typename T>
- class Vertex
- {
- friend class Edge<T>;
- public:
-
- Vertex(T* pObject)
- : m_pObject(pObject)
- {
- }
-
- virtual ~Vertex()
- {
- }
-
- inline const std::vector<Edge<T>*>& GetEdges() const
- {
- return m_Edges;
- }
-
- inline T* GetObject() const
- {
- return m_pObject;
- }
-
- std::vector<Vertex<T>*> GetAdjacentVertices() const
- {
- std::vector<Vertex<T>*> vertices;
- const_forEach(typename std::vector<Edge<T>*>, &m_Edges)
- {
- Edge<T>* pEdge = *iter;
-
- if (pEdge->GetSource() != this)
- {
- vertices.push_back(pEdge->GetSource());
- }
- if (pEdge->GetTarget() != this)
- {
- vertices.push_back(pEdge->GetTarget());
- }
- }
- return vertices;
- }
- private:
-
- inline void AddEdge(Edge<T>* pEdge)
- {
- m_Edges.push_back(pEdge);
- }
- T* m_pObject;
- std::vector<Edge<T>*> m_Edges;
- };
-
-
-
-
- template<typename T>
- class Edge
- {
- public:
-
- Edge(Vertex<T>* pSource, Vertex<T>* pTarget)
- : m_pSource(pSource)
- , m_pTarget(pTarget)
- , m_pLabel(NULL)
- {
- m_pSource->AddEdge(this);
- m_pTarget->AddEdge(this);
- }
-
- virtual ~Edge()
- {
- m_pSource = NULL;
- m_pTarget = NULL;
- if (m_pLabel != NULL)
- {
- delete m_pLabel;
- m_pLabel = NULL;
- }
- }
- public:
-
- inline Vertex<T>* GetSource() const
- {
- return m_pSource;
- }
-
- inline Vertex<T>* GetTarget() const
- {
- return m_pTarget;
- }
-
- inline EdgeLabel* GetLabel()
- {
- return m_pLabel;
- }
-
- inline void SetLabel(EdgeLabel* pLabel)
- {
- m_pLabel = pLabel;
- }
- private:
- Vertex<T>* m_pSource;
- Vertex<T>* m_pTarget;
- EdgeLabel* m_pLabel;
- };
-
-
-
-
- template<typename T>
- class Visitor
- {
- public:
-
- virtual kt_bool Visit(Vertex<T>* pVertex) = 0;
- };
-
-
-
- template<typename T>
- class Graph;
-
- template<typename T>
- class GraphTraversal
- {
- public:
-
- GraphTraversal(Graph<T>* pGraph)
- : m_pGraph(pGraph)
- {
- }
-
- virtual ~GraphTraversal()
- {
- }
- public:
-
- virtual std::vector<T*> Traverse(Vertex<T>* pStartVertex, Visitor<T>* pVisitor) = 0;
- protected:
-
- Graph<T>* m_pGraph;
- };
-
-
-
-
- template<typename T>
- class Graph
- {
- public:
-
- typedef std::map<Name, std::vector<Vertex<T>*> > VertexMap;
- public:
-
- Graph()
- {
- }
-
- virtual ~Graph()
- {
- Clear();
- }
- public:
-
- inline void AddVertex(const Name& rName, Vertex<T>* pVertex)
- {
- m_Vertices[rName].push_back(pVertex);
- }
-
- inline void AddEdge(Edge<T>* pEdge)
- {
- m_Edges.push_back(pEdge);
- }
-
- void Clear()
- {
- forEachAs(typename VertexMap, &m_Vertices, indexIter)
- {
-
- forEach(typename std::vector<Vertex<T>*>, &(indexIter->second))
- {
- delete *iter;
- }
- }
- m_Vertices.clear();
- const_forEach(typename std::vector<Edge<T>*>, &m_Edges)
- {
- delete *iter;
- }
- m_Edges.clear();
- }
-
- inline const std::vector<Edge<T>*>& GetEdges() const
- {
- return m_Edges;
- }
-
- inline const VertexMap& GetVertices() const
- {
- return m_Vertices;
- }
- protected:
-
- VertexMap m_Vertices;
-
- std::vector<Edge<T>*> m_Edges;
- };
-
-
-
- template<typename T>
- class BreadthFirstTraversal : public GraphTraversal<T>
- {
- public:
-
- BreadthFirstTraversal(Graph<T>* pGraph)
- : GraphTraversal<T>(pGraph)
- {
- }
-
- virtual ~BreadthFirstTraversal()
- {
- }
- public:
-
- virtual std::vector<T*> Traverse(Vertex<T>* pStartVertex, Visitor<T>* pVisitor)
- {
- std::queue<Vertex<T>*> toVisit;
- std::set<Vertex<T>*> seenVertices;
- std::vector<Vertex<T>*> validVertices;
- toVisit.push(pStartVertex);
- seenVertices.insert(pStartVertex);
- do
- {
- Vertex<T>* pNext = toVisit.front();
- toVisit.pop();
- if (pVisitor->Visit(pNext))
- {
-
- validVertices.push_back(pNext);
- std::vector<Vertex<T>*> adjacentVertices = pNext->GetAdjacentVertices();
- forEach(typename std::vector<Vertex<T>*>, &adjacentVertices)
- {
- Vertex<T>* pAdjacent = *iter;
-
- if (seenVertices.find(pAdjacent) == seenVertices.end())
- {
- toVisit.push(pAdjacent);
- seenVertices.insert(pAdjacent);
- }
- }
- }
- } while (toVisit.empty() == false);
- std::vector<T*> objects;
- forEach(typename std::vector<Vertex<T>*>, &validVertices)
- {
- objects.push_back((*iter)->GetObject());
- }
- return objects;
- }
- };
-
-
-
- class NearScanVisitor : public Visitor<LocalizedRangeScan>
- {
- public:
- NearScanVisitor(LocalizedRangeScan* pScan, kt_double maxDistance, kt_bool useScanBarycenter)
- : m_MaxDistanceSquared(math::Square(maxDistance))
- , m_UseScanBarycenter(useScanBarycenter)
- {
- m_CenterPose = pScan->GetReferencePose(m_UseScanBarycenter);
- }
- virtual kt_bool Visit(Vertex<LocalizedRangeScan>* pVertex)
- {
- LocalizedRangeScan* pScan = pVertex->GetObject();
- Pose2 pose = pScan->GetReferencePose(m_UseScanBarycenter);
- kt_double squaredDistance = pose.GetPosition().SquaredDistance(m_CenterPose.GetPosition());
- return (squaredDistance <= m_MaxDistanceSquared - KT_TOLERANCE);
- }
- protected:
- Pose2 m_CenterPose;
- kt_double m_MaxDistanceSquared;
- kt_bool m_UseScanBarycenter;
- };
-
-
-
- class Mapper;
- class ScanMatcher;
-
- class KARTO_EXPORT MapperGraph : public Graph<LocalizedRangeScan>
- {
- public:
-
- MapperGraph(Mapper* pMapper, kt_double rangeThreshold);
-
- virtual ~MapperGraph();
- public:
-
- void AddVertex(LocalizedRangeScan* pScan);
-
- Edge<LocalizedRangeScan>* AddEdge(LocalizedRangeScan* pSourceScan,
- LocalizedRangeScan* pTargetScan,
- kt_bool& rIsNewEdge);
-
- void AddEdges(LocalizedRangeScan* pScan, const Matrix3& rCovariance);
-
- kt_bool TryCloseLoop(LocalizedRangeScan* pScan, const Name& rSensorName);
-
- LocalizedRangeScanVector FindNearLinkedScans(LocalizedRangeScan* pScan, kt_double maxDistance);
-
- inline ScanMatcher* GetLoopScanMatcher() const
- {
- return m_pLoopScanMatcher;
- }
- private:
-
- inline Vertex<LocalizedRangeScan>* GetVertex(LocalizedRangeScan* pScan)
- {
- return m_Vertices[pScan->GetSensorName()][pScan->GetStateId()];
- }
-
- LocalizedRangeScan* GetClosestScanToPose(const LocalizedRangeScanVector& rScans, const Pose2& rPose) const;
-
- void LinkScans(LocalizedRangeScan* pFromScan,
- LocalizedRangeScan* pToScan,
- const Pose2& rMean,
- const Matrix3& rCovariance);
-
- void LinkNearChains(LocalizedRangeScan* pScan, Pose2Vector& rMeans, std::vector<Matrix3>& rCovariances);
-
- void LinkChainToScan(const LocalizedRangeScanVector& rChain,
- LocalizedRangeScan* pScan,
- const Pose2& rMean,
- const Matrix3& rCovariance);
-
- std::vector<LocalizedRangeScanVector> FindNearChains(LocalizedRangeScan* pScan);
-
- Pose2 ComputeWeightedMean(const Pose2Vector& rMeans, const std::vector<Matrix3>& rCovariances) const;
-
- LocalizedRangeScanVector FindPossibleLoopClosure(LocalizedRangeScan* pScan,
- const Name& rSensorName,
- kt_int32u& rStartNum);
-
- void CorrectPoses();
- private:
-
- Mapper* m_pMapper;
-
- ScanMatcher* m_pLoopScanMatcher;
-
- GraphTraversal<LocalizedRangeScan>* m_pTraversal;
- };
-
-
-
-
- class ScanSolver
- {
- public:
-
- typedef std::vector<std::pair<kt_int32s, Pose2> > IdPoseVector;
-
- ScanSolver()
- {
- }
-
- virtual ~ScanSolver()
- {
- }
- public:
-
- virtual void Compute() = 0;
-
- virtual const IdPoseVector& GetCorrections() const = 0;
-
- virtual void AddNode(Vertex<LocalizedRangeScan>* )
- {
- }
-
- virtual void RemoveNode(kt_int32s )
- {
- }
-
- virtual void AddConstraint(Edge<LocalizedRangeScan>* )
- {
- }
-
- virtual void RemoveConstraint(kt_int32s , kt_int32s )
- {
- }
-
- virtual void Clear() {};
- };
-
-
-
-
- class CorrelationGrid : public Grid<kt_int8u>
- {
- public:
-
- virtual ~CorrelationGrid()
- {
- delete [] m_pKernel;
- }
- public:
-
- static CorrelationGrid* CreateGrid(kt_int32s width,
- kt_int32s height,
- kt_double resolution,
- kt_double smearDeviation)
- {
- assert(resolution != 0.0);
-
- kt_int32u borderSize = GetHalfKernelSize(smearDeviation, resolution) + 1;
- CorrelationGrid* pGrid = new CorrelationGrid(width, height, borderSize, resolution, smearDeviation);
- return pGrid;
- }
-
- virtual kt_int32s GridIndex(const Vector2<kt_int32s>& rGrid, kt_bool boundaryCheck = true) const
- {
- kt_int32s x = rGrid.GetX() + m_Roi.GetX();
- kt_int32s y = rGrid.GetY() + m_Roi.GetY();
- return Grid<kt_int8u>::GridIndex(Vector2<kt_int32s>(x, y), boundaryCheck);
- }
-
- inline const Rectangle2<kt_int32s>& GetROI() const
- {
- return m_Roi;
- }
-
- inline void SetROI(const Rectangle2<kt_int32s>& roi)
- {
- m_Roi = roi;
- }
-
- inline void SmearPoint(const Vector2<kt_int32s>& rGridPoint)
- {
- assert(m_pKernel != NULL);
- int gridIndex = GridIndex(rGridPoint);
- if (GetDataPointer()[gridIndex] != GridStates_Occupied)
- {
- return;
- }
- kt_int32s halfKernel = m_KernelSize / 2;
-
- for (kt_int32s j = -halfKernel; j <= halfKernel; j++)
- {
- kt_int8u* pGridAdr = GetDataPointer(Vector2<kt_int32s>(rGridPoint.GetX(), rGridPoint.GetY() + j));
- kt_int32s kernelConstant = (halfKernel) + m_KernelSize * (j + halfKernel);
-
-
-
- for (kt_int32s i = -halfKernel; i <= halfKernel; i++)
- {
- kt_int32s kernelArrayIndex = i + kernelConstant;
- kt_int8u kernelValue = m_pKernel[kernelArrayIndex];
- if (kernelValue > pGridAdr[i])
- {
-
- pGridAdr[i] = kernelValue;
- }
- }
- }
- }
- protected:
-
- CorrelationGrid(kt_int32u width, kt_int32u height, kt_int32u borderSize,
- kt_double resolution, kt_double smearDeviation)
- : Grid<kt_int8u>(width + borderSize * 2, height + borderSize * 2)
- , m_SmearDeviation(smearDeviation)
- , m_pKernel(NULL)
- {
- GetCoordinateConverter()->SetScale(1.0 / resolution);
-
- m_Roi = Rectangle2<kt_int32s>(borderSize, borderSize, width, height);
-
- CalculateKernel();
- }
-
- virtual void CalculateKernel()
- {
- kt_double resolution = GetResolution();
- assert(resolution != 0.0);
- assert(m_SmearDeviation != 0.0);
-
-
- const kt_double MIN_SMEAR_DISTANCE_DEVIATION = 0.5 * resolution;
- const kt_double MAX_SMEAR_DISTANCE_DEVIATION = 10 * resolution;
-
- if (!math::InRange(m_SmearDeviation, MIN_SMEAR_DISTANCE_DEVIATION, MAX_SMEAR_DISTANCE_DEVIATION))
- {
- std::stringstream error;
- error << "Mapper Error: Smear deviation too small: Must be between "
- << MIN_SMEAR_DISTANCE_DEVIATION
- << " and "
- << MAX_SMEAR_DISTANCE_DEVIATION;
- throw std::runtime_error(error.str());
- }
-
-
- m_KernelSize = 2 * GetHalfKernelSize(m_SmearDeviation, resolution) + 1;
-
- m_pKernel = new kt_int8u[m_KernelSize * m_KernelSize];
- if (m_pKernel == NULL)
- {
- throw std::runtime_error("Unable to allocate memory for kernel!");
- }
-
- kt_int32s halfKernel = m_KernelSize / 2;
- for (kt_int32s i = -halfKernel; i <= halfKernel; i++)
- {
- for (kt_int32s j = -halfKernel; j <= halfKernel; j++)
- {
- #ifdef WIN32
- kt_double distanceFromMean = _hypot(i * resolution, j * resolution);
- #else
- kt_double distanceFromMean = hypot(i * resolution, j * resolution);
- #endif
- kt_double z = exp(-0.5 * pow(distanceFromMean / m_SmearDeviation, 2));
- kt_int32u kernelValue = static_cast<kt_int32u>(math::Round(z * GridStates_Occupied));
- assert(math::IsUpTo(kernelValue, static_cast<kt_int32u>(255)));
- int kernelArrayIndex = (i + halfKernel) + m_KernelSize * (j + halfKernel);
- m_pKernel[kernelArrayIndex] = static_cast<kt_int8u>(kernelValue);
- }
- }
- }
-
- static kt_int32s GetHalfKernelSize(kt_double smearDeviation, kt_double resolution)
- {
- assert(resolution != 0.0);
- return static_cast<kt_int32s>(math::Round(2.0 * smearDeviation / resolution));
- }
- private:
-
- kt_double m_SmearDeviation;
-
- kt_int32s m_KernelSize;
-
- kt_int8u* m_pKernel;
-
- Rectangle2<kt_int32s> m_Roi;
- };
-
-
-
-
- class KARTO_EXPORT ScanMatcher
- {
- public:
-
- virtual ~ScanMatcher();
- public:
-
- static ScanMatcher* Create(Mapper* pMapper,
- kt_double searchSize,
- kt_double resolution,
- kt_double smearDeviation,
- kt_double rangeThreshold);
-
- kt_double MatchScan(LocalizedRangeScan* pScan,
- const LocalizedRangeScanVector& rBaseScans,
- Pose2& rMean, Matrix3& rCovariance,
- kt_bool doPenalize = true,
- kt_bool doRefineMatch = true);
-
- kt_double CorrelateScan(LocalizedRangeScan* pScan,
- const Pose2& rSearchCenter,
- const Vector2<kt_double>& rSearchSpaceOffset,
- const Vector2<kt_double>& rSearchSpaceResolution,
- kt_double searchAngleOffset,
- kt_double searchAngleResolution,
- kt_bool doPenalize,
- Pose2& rMean,
- Matrix3& rCovariance,
- kt_bool doingFineMatch);
-
- void ComputePositionalCovariance(const Pose2& rBestPose,
- kt_double bestResponse,
- const Pose2& rSearchCenter,
- const Vector2<kt_double>& rSearchSpaceOffset,
- const Vector2<kt_double>& rSearchSpaceResolution,
- kt_double searchAngleResolution,
- Matrix3& rCovariance);
-
- void ComputeAngularCovariance(const Pose2& rBestPose,
- kt_double bestResponse,
- const Pose2& rSearchCenter,
- kt_double searchAngleOffset,
- kt_double searchAngleResolution,
- Matrix3& rCovariance);
-
- inline CorrelationGrid* GetCorrelationGrid() const
- {
- return m_pCorrelationGrid;
- }
- private:
-
- void AddScans(const LocalizedRangeScanVector& rScans, Vector2<kt_double> viewPoint);
-
- void AddScan(LocalizedRangeScan* pScan, const Vector2<kt_double>& rViewPoint, kt_bool doSmear = true);
-
- PointVectorDouble FindValidPoints(LocalizedRangeScan* pScan, const Vector2<kt_double>& rViewPoint) const;
-
- kt_double GetResponse(kt_int32u angleIndex, kt_int32s gridPositionIndex) const;
- protected:
-
- ScanMatcher(Mapper* pMapper)
- : m_pMapper(pMapper)
- , m_pCorrelationGrid(NULL)
- , m_pSearchSpaceProbs(NULL)
- , m_pGridLookup(NULL)
- {
- }
- private:
- Mapper* m_pMapper;
- CorrelationGrid* m_pCorrelationGrid;
- Grid<kt_double>* m_pSearchSpaceProbs;
- GridIndexLookup<kt_int8u>* m_pGridLookup;
- };
-
-
-
-
- class ScanManager
- {
- public:
-
- ScanManager(kt_int32u runningBufferMaximumSize, kt_double runningBufferMaximumDistance)
- : m_pLastScan(NULL)
- , m_RunningBufferMaximumSize(runningBufferMaximumSize)
- , m_RunningBufferMaximumDistance(runningBufferMaximumDistance)
- {
- }
-
- virtual ~ScanManager()
- {
- Clear();
- }
- public:
-
- inline void AddScan(LocalizedRangeScan* pScan, kt_int32s uniqueId)
- {
-
- pScan->SetStateId(static_cast<kt_int32u>(m_Scans.size()));
-
- pScan->SetUniqueId(uniqueId);
-
- m_Scans.push_back(pScan);
- }
-
- inline LocalizedRangeScan* GetLastScan()
- {
- return m_pLastScan;
- }
-
- inline void SetLastScan(LocalizedRangeScan* pScan)
- {
- m_pLastScan = pScan;
- }
-
- inline LocalizedRangeScanVector& GetScans()
- {
- return m_Scans;
- }
-
- inline LocalizedRangeScanVector& GetRunningScans()
- {
- return m_RunningScans;
- }
-
- void AddRunningScan(LocalizedRangeScan* pScan)
- {
- m_RunningScans.push_back(pScan);
-
- Pose2 frontScanPose = m_RunningScans.front()->GetSensorPose();
- Pose2 backScanPose = m_RunningScans.back()->GetSensorPose();
-
- kt_double squaredDistance = frontScanPose.GetPosition().SquaredDistance(backScanPose.GetPosition());
- while (m_RunningScans.size() > m_RunningBufferMaximumSize ||
- squaredDistance > math::Square(m_RunningBufferMaximumDistance) - KT_TOLERANCE)
- {
-
- m_RunningScans.erase(m_RunningScans.begin());
-
- frontScanPose = m_RunningScans.front()->GetSensorPose();
- backScanPose = m_RunningScans.back()->GetSensorPose();
- squaredDistance = frontScanPose.GetPosition().SquaredDistance(backScanPose.GetPosition());
- }
- }
-
- void Clear()
- {
- m_Scans.clear();
- m_RunningScans.clear();
- }
- private:
- LocalizedRangeScanVector m_Scans;
- LocalizedRangeScanVector m_RunningScans;
- LocalizedRangeScan* m_pLastScan;
- kt_int32u m_RunningBufferMaximumSize;
- kt_double m_RunningBufferMaximumDistance;
- };
-
-
-
-
- class KARTO_EXPORT MapperSensorManager
- {
- typedef std::map<Name, ScanManager*> ScanManagerMap;
- public:
-
- MapperSensorManager(kt_int32u runningBufferMaximumSize, kt_double runningBufferMaximumDistance)
- : m_RunningBufferMaximumSize(runningBufferMaximumSize)
- , m_RunningBufferMaximumDistance(runningBufferMaximumDistance)
- , m_NextScanId(0)
- {
- }
-
- virtual ~MapperSensorManager()
- {
- Clear();
- }
- public:
-
- void RegisterSensor(const Name& rSensorName);
-
- LocalizedRangeScan* GetScan(const Name& rSensorName, kt_int32s scanIndex);
-
- inline std::vector<Name> GetSensorNames()
- {
- std::vector<Name> deviceNames;
- const_forEach(ScanManagerMap, &m_ScanManagers)
- {
- deviceNames.push_back(iter->first);
- }
- return deviceNames;
- }
-
- inline LocalizedRangeScan* GetLastScan(const Name& rSensorName)
- {
- RegisterSensor(rSensorName);
- return GetScanManager(rSensorName)->GetLastScan();
- }
-
- inline void SetLastScan(LocalizedRangeScan* pScan)
- {
- GetScanManager(pScan)->SetLastScan(pScan);
- }
-
- inline LocalizedRangeScan* GetScan(kt_int32s id)
- {
- assert(math::IsUpTo(id, (kt_int32s)m_Scans.size()));
- return m_Scans[id];
- }
-
- void AddScan(LocalizedRangeScan* pScan);
-
- inline void AddRunningScan(LocalizedRangeScan* pScan)
- {
- GetScanManager(pScan)->AddRunningScan(pScan);
- }
-
- inline LocalizedRangeScanVector& GetScans(const Name& rSensorName)
- {
- return GetScanManager(rSensorName)->GetScans();
- }
-
- inline LocalizedRangeScanVector& GetRunningScans(const Name& rSensorName)
- {
- return GetScanManager(rSensorName)->GetRunningScans();
- }
-
- LocalizedRangeScanVector GetAllScans();
-
- void Clear();
- private:
-
- inline ScanManager* GetScanManager(LocalizedRangeScan* pScan)
- {
- return GetScanManager(pScan->GetSensorName());
- }
-
- inline ScanManager* GetScanManager(const Name& rSensorName)
- {
- if (m_ScanManagers.find(rSensorName) != m_ScanManagers.end())
- {
- return m_ScanManagers[rSensorName];
- }
- return NULL;
- }
- private:
-
- ScanManagerMap m_ScanManagers;
- kt_int32u m_RunningBufferMaximumSize;
- kt_double m_RunningBufferMaximumDistance;
- kt_int32s m_NextScanId;
- std::vector<LocalizedRangeScan*> m_Scans;
- };
-
-
-
-
- class KARTO_EXPORT Mapper : public Module
- {
- friend class MapperGraph;
- friend class ScanMatcher;
- public:
-
- Mapper();
-
- Mapper(const std::string& rName);
-
- virtual ~Mapper();
- public:
-
- void Initialize(kt_double rangeThreshold);
-
- void Reset();
-
- virtual kt_bool Process(LocalizedRangeScan* pScan);
-
- virtual kt_bool Process(Object* pObject);
-
- virtual const LocalizedRangeScanVector GetAllProcessedScans() const;
-
- void AddListener(MapperListener* pListener);
-
- void RemoveListener(MapperListener* pListener);
-
- void SetScanSolver(ScanSolver* pSolver);
-
- virtual MapperGraph* GetGraph() const;
-
- virtual ScanMatcher* GetSequentialScanMatcher() const;
-
- virtual ScanMatcher* GetLoopScanMatcher() const;
-
- inline MapperSensorManager* GetMapperSensorManager() const
- {
- return m_pMapperSensorManager;
- }
-
- inline kt_bool TryCloseLoop(LocalizedRangeScan* pScan, const Name& rSensorName)
- {
- return m_pGraph->TryCloseLoop(pScan, rSensorName);
- }
- private:
- void InitializeParameters();
-
- kt_bool HasMovedEnough(LocalizedRangeScan* pScan, LocalizedRangeScan* pLastScan) const;
- public:
-
-
-
- void FireInfo(const std::string& rInfo) const;
-
- void FireDebug(const std::string& rInfo) const;
-
- void FireLoopClosureCheck(const std::string& rInfo) const;
-
- void FireBeginLoopClosure(const std::string& rInfo) const;
-
- void FireEndLoopClosure(const std::string& rInfo) const;
-
-
-
- private:
-
- Mapper(const Mapper&);
-
- const Mapper& operator=(const Mapper&);
- public:
- void SetUseScanMatching(kt_bool val) { m_pUseScanMatching->SetValue(val); }
- private:
- kt_bool m_Initialized;
- ScanMatcher* m_pSequentialScanMatcher;
- MapperSensorManager* m_pMapperSensorManager;
- MapperGraph* m_pGraph;
- ScanSolver* m_pScanOptimizer;
- std::vector<MapperListener*> m_Listeners;
-
- Parameter<kt_bool>* m_pUseScanMatching;
-
- Parameter<kt_bool>* m_pUseScanBarycenter;
-
- Parameter<kt_double>* m_pMinimumTimeInterval;
-
- Parameter<kt_double>* m_pMinimumTravelDistance;
-
- Parameter<kt_double>* m_pMinimumTravelHeading;
-
- Parameter<kt_int32u>* m_pScanBufferSize;
-
- Parameter<kt_double>* m_pScanBufferMaximumScanDistance;
-
- Parameter<kt_double>* m_pLinkMatchMinimumResponseFine;
-
- Parameter<kt_double>* m_pLinkScanMaximumDistance;
-
- Parameter<kt_bool>* m_pDoLoopClosing;
-
- Parameter<kt_double>* m_pLoopSearchMaximumDistance;
-
- Parameter<kt_int32u>* m_pLoopMatchMinimumChainSize;
-
- Parameter<kt_double>* m_pLoopMatchMaximumVarianceCoarse;
-
- Parameter<kt_double>* m_pLoopMatchMinimumResponseCoarse;
-
- Parameter<kt_double>* m_pLoopMatchMinimumResponseFine;
-
-
-
- Parameter<kt_double>* m_pCorrelationSearchSpaceDimension;
-
- Parameter<kt_double>* m_pCorrelationSearchSpaceResolution;
-
- Parameter<kt_double>* m_pCorrelationSearchSpaceSmearDeviation;
-
-
-
- Parameter<kt_double>* m_pLoopSearchSpaceDimension;
-
- Parameter<kt_double>* m_pLoopSearchSpaceResolution;
-
- Parameter<kt_double>* m_pLoopSearchSpaceSmearDeviation;
-
-
-
-
-
- Parameter<kt_double>* m_pDistanceVariancePenalty;
- Parameter<kt_double>* m_pAngleVariancePenalty;
-
- Parameter<kt_double>* m_pFineSearchAngleOffset;
- Parameter<kt_double>* m_pCoarseSearchAngleOffset;
-
- Parameter<kt_double>* m_pCoarseAngleResolution;
-
-
- Parameter<kt_double>* m_pMinimumAnglePenalty;
- Parameter<kt_double>* m_pMinimumDistancePenalty;
-
- Parameter<kt_bool>* m_pUseResponseExpansion;
- public:
-
-
-
- bool getParamUseScanMatching();
- bool getParamUseScanBarycenter();
- double getParamMinimumTimeInterval();
- double getParamMinimumTravelDistance();
- double getParamMinimumTravelHeading();
- int getParamScanBufferSize();
- double getParamScanBufferMaximumScanDistance();
- double getParamLinkMatchMinimumResponseFine();
- double getParamLinkScanMaximumDistance();
- double getParamLoopSearchMaximumDistance();
- bool getParamDoLoopClosing();
- int getParamLoopMatchMinimumChainSize();
- double getParamLoopMatchMaximumVarianceCoarse();
- double getParamLoopMatchMinimumResponseCoarse();
- double getParamLoopMatchMinimumResponseFine();
-
- double getParamCorrelationSearchSpaceDimension();
- double getParamCorrelationSearchSpaceResolution();
- double getParamCorrelationSearchSpaceSmearDeviation();
-
- double getParamLoopSearchSpaceDimension();
- double getParamLoopSearchSpaceResolution();
- double getParamLoopSearchSpaceSmearDeviation();
-
- double getParamDistanceVariancePenalty();
- double getParamAngleVariancePenalty();
- double getParamFineSearchAngleOffset();
- double getParamCoarseSearchAngleOffset();
- double getParamCoarseAngleResolution();
- double getParamMinimumAnglePenalty();
- double getParamMinimumDistancePenalty();
- bool getParamUseResponseExpansion();
-
-
- void setParamUseScanMatching(bool b);
- void setParamUseScanBarycenter(bool b);
- void setParamMinimumTimeInterval(double d);
- void setParamMinimumTravelDistance(double d);
- void setParamMinimumTravelHeading(double d);
- void setParamScanBufferSize(int i);
- void setParamScanBufferMaximumScanDistance(double d);
- void setParamLinkMatchMinimumResponseFine(double d);
- void setParamLinkScanMaximumDistance(double d);
- void setParamLoopSearchMaximumDistance(double d);
- void setParamDoLoopClosing(bool b);
- void setParamLoopMatchMinimumChainSize(int i);
- void setParamLoopMatchMaximumVarianceCoarse(double d);
- void setParamLoopMatchMinimumResponseCoarse(double d);
- void setParamLoopMatchMinimumResponseFine(double d);
-
- void setParamCorrelationSearchSpaceDimension(double d);
- void setParamCorrelationSearchSpaceResolution(double d);
- void setParamCorrelationSearchSpaceSmearDeviation(double d);
-
- void setParamLoopSearchSpaceDimension(double d);
- void setParamLoopSearchSpaceResolution(double d);
- void setParamLoopSearchSpaceSmearDeviation(double d);
-
- void setParamDistanceVariancePenalty(double d);
- void setParamAngleVariancePenalty(double d);
- void setParamFineSearchAngleOffset(double d);
- void setParamCoarseSearchAngleOffset(double d);
- void setParamCoarseAngleResolution(double d);
- void setParamMinimumAnglePenalty(double d);
- void setParamMinimumDistancePenalty(double d);
- void setParamUseResponseExpansion(bool b);
- };
- }
- #endif
|