Karto.h
Go to the documentation of this file.
1 /*
2  * Copyright 2010 SRI International
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef OPEN_KARTO_KARTO_H
19 #define OPEN_KARTO_KARTO_H
20 
21 #include <string>
22 #include <fstream>
23 #include <limits>
24 #include <algorithm>
25 #include <map>
26 #include <vector>
27 #include <iostream>
28 #include <iomanip>
29 #include <sstream>
30 #include <stdexcept>
31 
32 #include <math.h>
33 #include <float.h>
34 #include <stdio.h>
35 #include <assert.h>
36 #include <string.h>
37 #include <boost/thread.hpp>
38 
39 #ifdef USE_POCO
40 #include <Poco/Mutex.h>
41 #endif
42 
43 #include <open_karto/Math.h>
44 #include <open_karto/Macros.h>
45 
46 #define KARTO_Object(name) \
47  virtual const char* GetClassName() const { return #name; } \
48  virtual kt_objecttype GetObjectType() const { return ObjectType_##name; }
49 
51 
52 const kt_objecttype ObjectType_None = 0x00000000;
53 const kt_objecttype ObjectType_Sensor = 0x00001000;
56 const kt_objecttype ObjectType_Misc = 0x10000000;
57 
61 
67 
72 
73 namespace karto
74 {
75 
80 
85  {
86  public:
92  Exception(const std::string& rMessage = "Karto Exception", kt_int32s errorCode = 0)
93  : m_Message(rMessage)
94  , m_ErrorCode(errorCode)
95  {
96  }
97 
101  Exception(const Exception& rException)
102  : m_Message(rException.m_Message)
103  , m_ErrorCode(rException.m_ErrorCode)
104  {
105  }
106 
110  virtual ~Exception()
111  {
112  }
113 
114  public:
118  Exception& operator = (const Exception& rException)
119  {
120  m_Message = rException.m_Message;
121  m_ErrorCode = rException.m_ErrorCode;
122 
123  return *this;
124  }
125 
126  public:
131  const std::string& GetErrorMessage() const
132  {
133  return m_Message;
134  }
135 
141  {
142  return m_ErrorCode;
143  }
144 
145  public:
151  friend KARTO_EXPORT std::ostream& operator << (std::ostream& rStream, Exception& rException);
152 
153  private:
154  std::string m_Message;
156  }; // class Exception
157 
161 
167  {
168  private:
169  NonCopyable(const NonCopyable&);
170  const NonCopyable& operator=(const NonCopyable&);
171 
172  protected:
174  {
175  }
176 
177  virtual ~NonCopyable()
178  {
179  }
180  }; // class NonCopyable
181 
185 
189  template <class T>
190  class Singleton
191  {
192  public:
197  : m_pPointer(NULL)
198  {
199  }
200 
204  virtual ~Singleton()
205  {
206  delete m_pPointer;
207  }
208 
213  T* Get()
214  {
215 #ifdef USE_POCO
216  Poco::FastMutex::ScopedLock lock(m_Mutex);
217 #endif
218  if (m_pPointer == NULL)
219  {
220  m_pPointer = new T;
221  }
222 
223  return m_pPointer;
224  }
225 
226  private:
228 
229 #ifdef USE_POCO
230  Poco::FastMutex m_Mutex;
231 #endif
232 
233  private:
234  Singleton(const Singleton&);
235  const Singleton& operator=(const Singleton&);
236  };
237 
241 
246  {
247  public:
251  virtual void operator() (kt_int32u) {};
252  }; // Functor
253 
257 
259 
263  typedef std::vector<AbstractParameter*> ParameterVector;
264 
269  {
270  public:
275  {
276  }
277 
282  {
283  Clear();
284  }
285 
286  public:
291  void Add(AbstractParameter* pParameter);
292 
298  AbstractParameter* Get(const std::string& rName)
299  {
300  if (m_ParameterLookup.find(rName) != m_ParameterLookup.end())
301  {
302  return m_ParameterLookup[rName];
303  }
304 
305  std::cout << "Unknown parameter: " << rName << std::endl;
306 
307  return NULL;
308  }
309 
313  void Clear();
314 
319  inline const ParameterVector& GetParameterVector() const
320  {
321  return m_Parameters;
322  }
323 
324  public:
330  AbstractParameter* operator() (const std::string& rName)
331  {
332  return Get(rName);
333  }
334 
335  private:
337  const ParameterManager& operator=(const ParameterManager&);
338 
339  private:
341  std::map<std::string, AbstractParameter*> m_ParameterLookup;
342  }; // ParameterManager
343 
347 
348  // valid names
349  // 'Test' -- no scope
350  // '/Test' -- no scope will be parsed to 'Test'
351  // '/scope/Test' - 'scope' scope and 'Test' name
352  // '/scope/name/Test' - 'scope/name' scope and 'Test' name
353  //
354  class Name
355  {
356  public:
361  {
362  }
363 
367  Name(const std::string& rName)
368  {
369  Parse(rName);
370  }
371 
375  Name(const Name& rOther)
376  : m_Name(rOther.m_Name)
377  , m_Scope(rOther.m_Scope)
378  {
379  }
380 
384  virtual ~Name()
385  {
386  }
387 
388  public:
393  inline const std::string& GetName() const
394  {
395  return m_Name;
396  }
397 
402  inline void SetName(const std::string& rName)
403  {
404  std::string::size_type pos = rName.find_last_of('/');
405  if (pos != 0 && pos != std::string::npos)
406  {
407  throw Exception("Name can't contain a scope!");
408  }
409 
410  m_Name = rName;
411  }
412 
417  inline const std::string& GetScope() const
418  {
419  return m_Scope;
420  }
421 
426  inline void SetScope(const std::string& rScope)
427  {
428  m_Scope = rScope;
429  }
430 
435  inline std::string ToString() const
436  {
437  if (m_Scope == "")
438  {
439  return m_Name;
440  }
441  else
442  {
443  std::string name;
444  name.append("/");
445  name.append(m_Scope);
446  name.append("/");
447  name.append(m_Name);
448 
449  return name;
450  }
451  }
452 
453  public:
457  Name& operator = (const Name& rOther)
458  {
459  if (&rOther != this)
460  {
461  m_Name = rOther.m_Name;
462  m_Scope = rOther.m_Scope;
463  }
464 
465  return *this;
466  }
467 
471  kt_bool operator == (const Name& rOther) const
472  {
473  return (m_Name == rOther.m_Name) && (m_Scope == rOther.m_Scope);
474  }
475 
479  kt_bool operator != (const Name& rOther) const
480  {
481  return !(*this == rOther);
482  }
483 
487  kt_bool operator < (const Name& rOther) const
488  {
489  return ToString() < rOther.ToString();
490  }
491 
497  friend inline std::ostream& operator << (std::ostream& rStream, const Name& rName)
498  {
499  rStream << rName.ToString();
500  return rStream;
501  }
502 
503  private:
508  void Parse(const std::string& rName)
509  {
510  std::string::size_type pos = rName.find_last_of('/');
511 
512  if (pos == std::string::npos)
513  {
514  m_Name = rName;
515  }
516  else
517  {
518  m_Scope = rName.substr(0, pos);
519  m_Name = rName.substr(pos+1, rName.size());
520 
521  // remove '/' from m_Scope if first!!
522  if (m_Scope.size() > 0 && m_Scope[0] == '/')
523  {
524  m_Scope = m_Scope.substr(1, m_Scope.size());
525  }
526  }
527  }
528 
533  void Validate(const std::string& rName)
534  {
535  if (rName.empty())
536  {
537  return;
538  }
539 
540  char c = rName[0];
541  if (IsValidFirst(c))
542  {
543  for (size_t i = 1; i < rName.size(); ++i)
544  {
545  c = rName[i];
546  if (!IsValid(c))
547  {
548  throw Exception("Invalid character in name. Valid characters must be within the ranges A-Z, a-z, 0-9, '/', '_' and '-'.");
549  }
550  }
551  }
552  else
553  {
554  throw Exception("Invalid first character in name. Valid characters must be within the ranges A-Z, a-z, and '/'.");
555  }
556  }
557 
563  inline kt_bool IsValidFirst(char c)
564  {
565  return (isalpha(c) || c == '/');
566  }
567 
573  inline kt_bool IsValid(char c)
574  {
575  return (isalnum(c) || c == '/' || c == '_' || c == '-');
576  }
577 
578  private:
579  std::string m_Name;
580  std::string m_Scope;
581  };
582 
586 
591  {
592  public:
596  Object();
597 
602  Object(const Name& rName);
603 
607  virtual ~Object();
608 
609  public:
614  inline const Name& GetName() const
615  {
616  return m_Name;
617  }
618 
623  virtual const char* GetClassName() const = 0;
624 
629  virtual kt_objecttype GetObjectType() const = 0;
630 
636  {
637  return m_pParameterManager;
638  }
639 
645  inline AbstractParameter* GetParameter(const std::string& rName) const
646  {
647  return m_pParameterManager->Get(rName);
648  }
649 
655  template<typename T>
656  inline void SetParameter(const std::string& rName, T value);
657 
662  inline const ParameterVector& GetParameters() const
663  {
664  return m_pParameterManager->GetParameterVector();
665  }
666 
667  private:
668  Object(const Object&);
669  const Object& operator=(const Object&);
670 
671  private:
674  };
675 
679  typedef std::vector<Object*> ObjectVector;
680 
684 
690  inline kt_bool IsSensor(Object* pObject)
691  {
692  return (pObject->GetObjectType() & ObjectType_Sensor) == ObjectType_Sensor;
693  }
694 
700  inline kt_bool IsSensorData(Object* pObject)
701  {
703  }
704 
711  {
713  }
714 
721  {
723  }
724 
731  {
733  }
734 
740  inline kt_bool IsParameters(Object* pObject)
741  {
743  }
744 
750  inline kt_bool IsDatasetInfo(Object* pObject)
751  {
753  }
754 
758 
762  class KARTO_EXPORT Module : public Object
763  {
764  public:
765  // @cond EXCLUDE
767  // @endcond
768 
769  public:
774  Module(const std::string& rName);
775 
779  virtual ~Module();
780 
781  public:
785  virtual void Reset() = 0;
786 
791  {
792  return false;
793  }
794 
795  private:
796  Module(const Module&);
797  const Module& operator=(const Module&);
798  };
799 
803 
807  template<typename T>
808  class Size2
809  {
810  public:
815  : m_Width(0)
816  , m_Height(0)
817  {
818  }
819 
825  Size2(T width, T height)
826  : m_Width(width)
827  , m_Height(height)
828  {
829  }
830 
835  Size2(const Size2& rOther)
836  : m_Width(rOther.m_Width)
837  , m_Height(rOther.m_Height)
838  {
839  }
840 
841  public:
846  inline const T GetWidth() const
847  {
848  return m_Width;
849  }
850 
855  inline void SetWidth(T width)
856  {
857  m_Width = width;
858  }
859 
864  inline const T GetHeight() const
865  {
866  return m_Height;
867  }
868 
873  inline void SetHeight(T height)
874  {
875  m_Height = height;
876  }
877 
881  inline Size2& operator = (const Size2& rOther)
882  {
883  m_Width = rOther.m_Width;
884  m_Height = rOther.m_Height;
885 
886  return(*this);
887  }
888 
892  inline kt_bool operator == (const Size2& rOther) const
893  {
894  return (m_Width == rOther.m_Width && m_Height == rOther.m_Height);
895  }
896 
900  inline kt_bool operator != (const Size2& rOther) const
901  {
902  return (m_Width != rOther.m_Width || m_Height != rOther.m_Height);
903  }
904 
910  friend inline std::ostream& operator << (std::ostream& rStream, const Size2& rSize)
911  {
912  rStream << "(" << rSize.m_Width << ", " << rSize.m_Height << ")";
913  return rStream;
914  }
915 
916  private:
919  }; // Size2<T>
920 
924 
928  template<typename T>
929  class Vector2
930  {
931  public:
936  {
937  m_Values[0] = 0;
938  m_Values[1] = 0;
939  }
940 
946  Vector2(T x, T y)
947  {
948  m_Values[0] = x;
949  m_Values[1] = y;
950  }
951 
952  public:
957  inline const T& GetX() const
958  {
959  return m_Values[0];
960  }
961 
966  inline void SetX(const T& x)
967  {
968  m_Values[0] = x;
969  }
970 
975  inline const T& GetY() const
976  {
977  return m_Values[1];
978  }
979 
984  inline void SetY(const T& y)
985  {
986  m_Values[1] = y;
987  }
988 
993  inline void MakeFloor(const Vector2& rOther)
994  {
995  if ( rOther.m_Values[0] < m_Values[0] ) m_Values[0] = rOther.m_Values[0];
996  if ( rOther.m_Values[1] < m_Values[1] ) m_Values[1] = rOther.m_Values[1];
997  }
998 
1003  inline void MakeCeil(const Vector2& rOther)
1004  {
1005  if ( rOther.m_Values[0] > m_Values[0] ) m_Values[0] = rOther.m_Values[0];
1006  if ( rOther.m_Values[1] > m_Values[1] ) m_Values[1] = rOther.m_Values[1];
1007  }
1008 
1013  inline kt_double SquaredLength() const
1014  {
1015  return math::Square(m_Values[0]) + math::Square(m_Values[1]);
1016  }
1017 
1022  inline kt_double Length() const
1023  {
1024  return sqrt(SquaredLength());
1025  }
1026 
1031  inline kt_double SquaredDistance(const Vector2& rOther) const
1032  {
1033  return (*this - rOther).SquaredLength();
1034  }
1035 
1041  inline kt_double Distance(const Vector2& rOther) const
1042  {
1043  return sqrt(SquaredDistance(rOther));
1044  }
1045 
1046  public:
1050  inline void operator += (const Vector2& rOther)
1051  {
1052  m_Values[0] += rOther.m_Values[0];
1053  m_Values[1] += rOther.m_Values[1];
1054  }
1055 
1059  inline void operator -= (const Vector2& rOther)
1060  {
1061  m_Values[0] -= rOther.m_Values[0];
1062  m_Values[1] -= rOther.m_Values[1];
1063  }
1064 
1070  inline const Vector2 operator + (const Vector2& rOther) const
1071  {
1072  return Vector2(m_Values[0] + rOther.m_Values[0], m_Values[1] + rOther.m_Values[1]);
1073  }
1074 
1080  inline const Vector2 operator - (const Vector2& rOther) const
1081  {
1082  return Vector2(m_Values[0] - rOther.m_Values[0], m_Values[1] - rOther.m_Values[1]);
1083  }
1084 
1089  inline void operator /= (T scalar)
1090  {
1091  m_Values[0] /= scalar;
1092  m_Values[1] /= scalar;
1093  }
1094 
1100  inline const Vector2 operator / (T scalar) const
1101  {
1102  return Vector2(m_Values[0] / scalar, m_Values[1] / scalar);
1103  }
1104 
1110  inline kt_double operator * (const Vector2& rOther) const
1111  {
1112  return m_Values[0] * rOther.m_Values[0] + m_Values[1] * rOther.m_Values[1];
1113  }
1114 
1119  inline const Vector2 operator * (T scalar) const
1120  {
1121  return Vector2(m_Values[0] * scalar, m_Values[1] * scalar);
1122  }
1123 
1128  inline const Vector2 operator - (T scalar) const
1129  {
1130  return Vector2(m_Values[0] - scalar, m_Values[1] - scalar);
1131  }
1132 
1137  inline void operator *= (T scalar)
1138  {
1139  m_Values[0] *= scalar;
1140  m_Values[1] *= scalar;
1141  }
1142 
1147  inline kt_bool operator == (const Vector2& rOther) const
1148  {
1149  return (m_Values[0] == rOther.m_Values[0] && m_Values[1] == rOther.m_Values[1]);
1150  }
1151 
1156  inline kt_bool operator != (const Vector2& rOther) const
1157  {
1158  return (m_Values[0] != rOther.m_Values[0] || m_Values[1] != rOther.m_Values[1]);
1159  }
1160 
1166  inline kt_bool operator < (const Vector2& rOther) const
1167  {
1168  if (m_Values[0] < rOther.m_Values[0])
1169  return true;
1170  else if (m_Values[0] > rOther.m_Values[0])
1171  return false;
1172  else
1173  return (m_Values[1] < rOther.m_Values[1]);
1174  }
1175 
1181  friend inline std::ostream& operator << (std::ostream& rStream, const Vector2& rVector)
1182  {
1183  rStream << rVector.GetX() << " " << rVector.GetY();
1184  return rStream;
1185  }
1186 
1191  friend inline std::istream& operator >> (std::istream& rStream, const Vector2& /*rVector*/)
1192  {
1193  // Implement me!! TODO(lucbettaieb): What the what? Do I need to implement this?
1194  return rStream;
1195  }
1196 
1197  private:
1198  T m_Values[2];
1199  }; // Vector2<T>
1200 
1204  typedef std::vector< Vector2<kt_double> > PointVectorDouble;
1205 
1209 
1213  template<typename T>
1214  class Vector3
1215  {
1216  public:
1221  {
1222  m_Values[0] = 0;
1223  m_Values[1] = 0;
1224  m_Values[2] = 0;
1225  }
1226 
1233  Vector3(T x, T y, T z)
1234  {
1235  m_Values[0] = x;
1236  m_Values[1] = y;
1237  m_Values[2] = z;
1238  }
1239 
1244  Vector3(const Vector3& rOther)
1245  {
1246  m_Values[0] = rOther.m_Values[0];
1247  m_Values[1] = rOther.m_Values[1];
1248  m_Values[2] = rOther.m_Values[2];
1249  }
1250 
1251  public:
1256  inline const T& GetX() const
1257  {
1258  return m_Values[0];
1259  }
1260 
1265  inline void SetX(const T& x)
1266  {
1267  m_Values[0] = x;
1268  }
1269 
1274  inline const T& GetY() const
1275  {
1276  return m_Values[1];
1277  }
1278 
1283  inline void SetY(const T& y)
1284  {
1285  m_Values[1] = y;
1286  }
1287 
1292  inline const T& GetZ() const
1293  {
1294  return m_Values[2];
1295  }
1296 
1301  inline void SetZ(const T& z)
1302  {
1303  m_Values[2] = z;
1304  }
1305 
1310  inline void MakeFloor(const Vector3& rOther)
1311  {
1312  if (rOther.m_Values[0] < m_Values[0]) m_Values[0] = rOther.m_Values[0];
1313  if (rOther.m_Values[1] < m_Values[1]) m_Values[1] = rOther.m_Values[1];
1314  if (rOther.m_Values[2] < m_Values[2]) m_Values[2] = rOther.m_Values[2];
1315  }
1316 
1321  inline void MakeCeil(const Vector3& rOther)
1322  {
1323  if (rOther.m_Values[0] > m_Values[0]) m_Values[0] = rOther.m_Values[0];
1324  if (rOther.m_Values[1] > m_Values[1]) m_Values[1] = rOther.m_Values[1];
1325  if (rOther.m_Values[2] > m_Values[2]) m_Values[2] = rOther.m_Values[2];
1326  }
1327 
1332  inline kt_double SquaredLength() const
1333  {
1335  }
1336 
1341  inline kt_double Length() const
1342  {
1343  return sqrt(SquaredLength());
1344  }
1345 
1350  inline std::string ToString() const
1351  {
1352  std::stringstream converter;
1353  converter.precision(std::numeric_limits<double>::digits10);
1354 
1355  converter << GetX() << " " << GetY() << " " << GetZ();
1356 
1357  return converter.str();
1358  }
1359 
1360  public:
1364  inline Vector3& operator = (const Vector3& rOther)
1365  {
1366  m_Values[0] = rOther.m_Values[0];
1367  m_Values[1] = rOther.m_Values[1];
1368  m_Values[2] = rOther.m_Values[2];
1369 
1370  return *this;
1371  }
1372 
1378  inline const Vector3 operator + (const Vector3& rOther) const
1379  {
1380  return Vector3(m_Values[0] + rOther.m_Values[0],
1381  m_Values[1] + rOther.m_Values[1],
1382  m_Values[2] + rOther.m_Values[2]);
1383  }
1384 
1390  inline const Vector3 operator + (kt_double scalar) const
1391  {
1392  return Vector3(m_Values[0] + scalar,
1393  m_Values[1] + scalar,
1394  m_Values[2] + scalar);
1395  }
1396 
1402  inline const Vector3 operator - (const Vector3& rOther) const
1403  {
1404  return Vector3(m_Values[0] - rOther.m_Values[0],
1405  m_Values[1] - rOther.m_Values[1],
1406  m_Values[2] - rOther.m_Values[2]);
1407  }
1408 
1414  inline const Vector3 operator - (kt_double scalar) const
1415  {
1416  return Vector3(m_Values[0] - scalar, m_Values[1] - scalar, m_Values[2] - scalar);
1417  }
1418 
1423  inline const Vector3 operator * (T scalar) const
1424  {
1425  return Vector3(m_Values[0] * scalar, m_Values[1] * scalar, m_Values[2] * scalar);
1426  }
1427 
1432  inline kt_bool operator == (const Vector3& rOther) const
1433  {
1434  return (m_Values[0] == rOther.m_Values[0] &&
1435  m_Values[1] == rOther.m_Values[1] &&
1436  m_Values[2] == rOther.m_Values[2]);
1437  }
1438 
1443  inline kt_bool operator != (const Vector3& rOther) const
1444  {
1445  return (m_Values[0] != rOther.m_Values[0] ||
1446  m_Values[1] != rOther.m_Values[1] ||
1447  m_Values[2] != rOther.m_Values[2]);
1448  }
1449 
1455  friend inline std::ostream& operator << (std::ostream& rStream, const Vector3& rVector)
1456  {
1457  rStream << rVector.ToString();
1458  return rStream;
1459  }
1460 
1465  friend inline std::istream& operator >> (std::istream& rStream, const Vector3& /*rVector*/)
1466  {
1467  // Implement me!!
1468  return rStream;
1469  }
1470 
1471  private:
1472  T m_Values[3];
1473  }; // Vector3
1474 
1478 
1501  {
1502  public:
1506  inline Quaternion()
1507  {
1508  m_Values[0] = 0.0;
1509  m_Values[1] = 0.0;
1510  m_Values[2] = 0.0;
1511  m_Values[3] = 1.0;
1512  }
1513 
1522  {
1523  m_Values[0] = x;
1524  m_Values[1] = y;
1525  m_Values[2] = z;
1526  m_Values[3] = w;
1527  }
1528 
1532  inline Quaternion(const Quaternion& rQuaternion)
1533  {
1534  m_Values[0] = rQuaternion.m_Values[0];
1535  m_Values[1] = rQuaternion.m_Values[1];
1536  m_Values[2] = rQuaternion.m_Values[2];
1537  m_Values[3] = rQuaternion.m_Values[3];
1538  }
1539 
1540  public:
1545  inline kt_double GetX() const
1546  {
1547  return m_Values[0];
1548  }
1549 
1554  inline void SetX(kt_double x)
1555  {
1556  m_Values[0] = x;
1557  }
1558 
1563  inline kt_double GetY() const
1564  {
1565  return m_Values[1];
1566  }
1567 
1572  inline void SetY(kt_double y)
1573  {
1574  m_Values[1] = y;
1575  }
1576 
1581  inline kt_double GetZ() const
1582  {
1583  return m_Values[2];
1584  }
1585 
1590  inline void SetZ(kt_double z)
1591  {
1592  m_Values[2] = z;
1593  }
1594 
1599  inline kt_double GetW() const
1600  {
1601  return m_Values[3];
1602  }
1603 
1608  inline void SetW(kt_double w)
1609  {
1610  m_Values[3] = w;
1611  }
1612 
1620  void ToEulerAngles(kt_double& rYaw, kt_double& rPitch, kt_double& rRoll) const
1621  {
1622  kt_double test = m_Values[0] * m_Values[1] + m_Values[2] * m_Values[3];
1623 
1624  if (test > 0.499)
1625  {
1626  // singularity at north pole
1627  rYaw = 2 * atan2(m_Values[0], m_Values[3]);;
1628  rPitch = KT_PI_2;
1629  rRoll = 0;
1630  }
1631  else if (test < -0.499)
1632  {
1633  // singularity at south pole
1634  rYaw = -2 * atan2(m_Values[0], m_Values[3]);
1635  rPitch = -KT_PI_2;
1636  rRoll = 0;
1637  }
1638  else
1639  {
1640  kt_double sqx = m_Values[0] * m_Values[0];
1641  kt_double sqy = m_Values[1] * m_Values[1];
1642  kt_double sqz = m_Values[2] * m_Values[2];
1643 
1644  rYaw = atan2(2 * m_Values[1] * m_Values[3] - 2 * m_Values[0] * m_Values[2], 1 - 2 * sqy - 2 * sqz);
1645  rPitch = asin(2 * test);
1646  rRoll = atan2(2 * m_Values[0] * m_Values[3] - 2 * m_Values[1] * m_Values[2], 1 - 2 * sqx - 2 * sqz);
1647  }
1648  }
1649 
1658  {
1659  kt_double angle;
1660 
1661  angle = yaw * 0.5;
1662  kt_double cYaw = cos(angle);
1663  kt_double sYaw = sin(angle);
1664 
1665  angle = pitch * 0.5;
1666  kt_double cPitch = cos(angle);
1667  kt_double sPitch = sin(angle);
1668 
1669  angle = roll * 0.5;
1670  kt_double cRoll = cos(angle);
1671  kt_double sRoll = sin(angle);
1672 
1673  m_Values[0] = sYaw * sPitch * cRoll + cYaw * cPitch * sRoll;
1674  m_Values[1] = sYaw * cPitch * cRoll + cYaw * sPitch * sRoll;
1675  m_Values[2] = cYaw * sPitch * cRoll - sYaw * cPitch * sRoll;
1676  m_Values[3] = cYaw * cPitch * cRoll - sYaw * sPitch * sRoll;
1677  }
1678 
1683  inline Quaternion& operator = (const Quaternion& rQuaternion)
1684  {
1685  m_Values[0] = rQuaternion.m_Values[0];
1686  m_Values[1] = rQuaternion.m_Values[1];
1687  m_Values[2] = rQuaternion.m_Values[2];
1688  m_Values[3] = rQuaternion.m_Values[3];
1689 
1690  return(*this);
1691  }
1692 
1697  inline kt_bool operator == (const Quaternion& rOther) const
1698  {
1699  return (m_Values[0] == rOther.m_Values[0] &&
1700  m_Values[1] == rOther.m_Values[1] &&
1701  m_Values[2] == rOther.m_Values[2] &&
1702  m_Values[3] == rOther.m_Values[3]);
1703  }
1704 
1709  inline kt_bool operator != (const Quaternion& rOther) const
1710  {
1711  return (m_Values[0] != rOther.m_Values[0] ||
1712  m_Values[1] != rOther.m_Values[1] ||
1713  m_Values[2] != rOther.m_Values[2] ||
1714  m_Values[3] != rOther.m_Values[3]);
1715  }
1716 
1722  friend inline std::ostream& operator << (std::ostream& rStream, const Quaternion& rQuaternion)
1723  {
1724  rStream << rQuaternion.m_Values[0] << " "
1725  << rQuaternion.m_Values[1] << " "
1726  << rQuaternion.m_Values[2] << " "
1727  << rQuaternion.m_Values[3];
1728  return rStream;
1729  }
1730 
1731  private:
1733  };
1734 
1738 
1743  template<typename T>
1745  {
1746  public:
1751  {
1752  }
1753 
1761  Rectangle2(T x, T y, T width, T height)
1762  : m_Position(x, y)
1763  , m_Size(width, height)
1764  {
1765  }
1766 
1772  Rectangle2(const Vector2<T>& rPosition, const Size2<T>& rSize)
1773  : m_Position(rPosition)
1774  , m_Size(rSize)
1775  {
1776  }
1777 
1781  Rectangle2(const Rectangle2& rOther)
1782  : m_Position(rOther.m_Position)
1783  , m_Size(rOther.m_Size)
1784  {
1785  }
1786 
1787  public:
1792  inline T GetX() const
1793  {
1794  return m_Position.GetX();
1795  }
1796 
1801  inline void SetX(T x)
1802  {
1803  m_Position.SetX(x);
1804  }
1805 
1810  inline T GetY() const
1811  {
1812  return m_Position.GetY();
1813  }
1814 
1819  inline void SetY(T y)
1820  {
1821  m_Position.SetY(y);
1822  }
1823 
1828  inline T GetWidth() const
1829  {
1830  return m_Size.GetWidth();
1831  }
1832 
1837  inline void SetWidth(T width)
1838  {
1839  m_Size.SetWidth(width);
1840  }
1841 
1846  inline T GetHeight() const
1847  {
1848  return m_Size.GetHeight();
1849  }
1850 
1855  inline void SetHeight(T height)
1856  {
1857  m_Size.SetHeight(height);
1858  }
1859 
1864  inline const Vector2<T>& GetPosition() const
1865  {
1866  return m_Position;
1867  }
1868 
1874  inline void SetPosition(const T& rX, const T& rY)
1875  {
1876  m_Position = Vector2<T>(rX, rY);
1877  }
1878 
1883  inline void SetPosition(const Vector2<T>& rPosition)
1884  {
1885  m_Position = rPosition;
1886  }
1887 
1892  inline const Size2<T>& GetSize() const
1893  {
1894  return m_Size;
1895  }
1896 
1901  inline void SetSize(const Size2<T>& rSize)
1902  {
1903  m_Size = rSize;
1904  }
1905 
1910  inline const Vector2<T> GetCenter() const
1911  {
1912  return Vector2<T>(m_Position.GetX() + m_Size.GetWidth() * 0.5, m_Position.GetY() + m_Size.GetHeight() * 0.5);
1913  }
1914 
1915  public:
1920  {
1921  m_Position = rOther.m_Position;
1922  m_Size = rOther.m_Size;
1923 
1924  return *this;
1925  }
1926 
1930  inline kt_bool operator == (const Rectangle2& rOther) const
1931  {
1932  return (m_Position == rOther.m_Position && m_Size == rOther.m_Size);
1933  }
1934 
1938  inline kt_bool operator != (const Rectangle2& rOther) const
1939  {
1940  return (m_Position != rOther.m_Position || m_Size != rOther.m_Size);
1941  }
1942 
1943  private:
1946  }; // Rectangle2
1947 
1951 
1952  class Pose3;
1953 
1957  class Pose2
1958  {
1959  public:
1964  : m_Heading(0.0)
1965  {
1966  }
1967 
1973  Pose2(const Vector2<kt_double>& rPosition, kt_double heading)
1974  : m_Position(rPosition)
1975  , m_Heading(heading)
1976  {
1977  }
1978 
1986  : m_Position(x, y)
1987  , m_Heading(heading)
1988  {
1989  }
1990 
1994  Pose2(const Pose3& rPose);
1995 
1999  Pose2(const Pose2& rOther)
2000  : m_Position(rOther.m_Position)
2001  , m_Heading(rOther.m_Heading)
2002  {
2003  }
2004 
2005  public:
2010  inline kt_double GetX() const
2011  {
2012  return m_Position.GetX();
2013  }
2014 
2019  inline void SetX(kt_double x)
2020  {
2021  m_Position.SetX(x);
2022  }
2023 
2028  inline kt_double GetY() const
2029  {
2030  return m_Position.GetY();
2031  }
2032 
2037  inline void SetY(kt_double y)
2038  {
2039  m_Position.SetY(y);
2040  }
2041 
2046  inline const Vector2<kt_double>& GetPosition() const
2047  {
2048  return m_Position;
2049  }
2050 
2055  inline void SetPosition(const Vector2<kt_double>& rPosition)
2056  {
2057  m_Position = rPosition;
2058  }
2059 
2064  inline kt_double GetHeading() const
2065  {
2066  return m_Heading;
2067  }
2068 
2073  inline void SetHeading(kt_double heading)
2074  {
2075  m_Heading = heading;
2076  }
2077 
2082  inline kt_double SquaredDistance(const Pose2& rOther) const
2083  {
2084  return m_Position.SquaredDistance(rOther.m_Position);
2085  }
2086 
2087  public:
2091  inline Pose2& operator = (const Pose2& rOther)
2092  {
2093  m_Position = rOther.m_Position;
2094  m_Heading = rOther.m_Heading;
2095 
2096  return *this;
2097  }
2098 
2102  inline kt_bool operator == (const Pose2& rOther) const
2103  {
2104  return (m_Position == rOther.m_Position && m_Heading == rOther.m_Heading);
2105  }
2106 
2110  inline kt_bool operator != (const Pose2& rOther) const
2111  {
2112  return (m_Position != rOther.m_Position || m_Heading != rOther.m_Heading);
2113  }
2114 
2118  inline void operator += (const Pose2& rOther)
2119  {
2120  m_Position += rOther.m_Position;
2122  }
2123 
2129  inline Pose2 operator + (const Pose2& rOther) const
2130  {
2131  return Pose2(m_Position + rOther.m_Position, math::NormalizeAngle(m_Heading + rOther.m_Heading));
2132  }
2133 
2139  inline Pose2 operator - (const Pose2& rOther) const
2140  {
2141  return Pose2(m_Position - rOther.m_Position, math::NormalizeAngle(m_Heading - rOther.m_Heading));
2142  }
2143 
2148  friend inline std::istream& operator >> (std::istream& rStream, const Pose2& /*rPose*/)
2149  {
2150  // Implement me!!
2151  return rStream;
2152  }
2153 
2159  friend inline std::ostream& operator << (std::ostream& rStream, const Pose2& rPose)
2160  {
2161  rStream << rPose.m_Position.GetX() << " " << rPose.m_Position.GetY() << " " << rPose.m_Heading;
2162  return rStream;
2163  }
2164 
2165  private:
2167 
2169  }; // Pose2
2170 
2174  typedef std::vector< Pose2 > Pose2Vector;
2175 
2179 
2187  class Pose3
2188  {
2189  public:
2194  {
2195  }
2196 
2201  Pose3(const Vector3<kt_double>& rPosition)
2202  : m_Position(rPosition)
2203  {
2204  }
2205 
2211  Pose3(const Vector3<kt_double>& rPosition, const karto::Quaternion& rOrientation)
2212  : m_Position(rPosition)
2213  , m_Orientation(rOrientation)
2214  {
2215  }
2216 
2220  Pose3(const Pose3& rOther)
2221  : m_Position(rOther.m_Position)
2222  , m_Orientation(rOther.m_Orientation)
2223  {
2224  }
2225 
2229  Pose3(const Pose2& rPose)
2230  {
2231  m_Position = Vector3<kt_double>(rPose.GetX(), rPose.GetY(), 0.0);
2232  m_Orientation.FromEulerAngles(rPose.GetHeading(), 0.0, 0.0);
2233  }
2234 
2235  public:
2240  inline const Vector3<kt_double>& GetPosition() const
2241  {
2242  return m_Position;
2243  }
2244 
2249  inline void SetPosition(const Vector3<kt_double>& rPosition)
2250  {
2251  m_Position = rPosition;
2252  }
2253 
2258  inline const Quaternion& GetOrientation() const
2259  {
2260  return m_Orientation;
2261  }
2262 
2267  inline void SetOrientation(const Quaternion& rOrientation)
2268  {
2269  m_Orientation = rOrientation;
2270  }
2271 
2276  inline std::string ToString()
2277  {
2278  std::stringstream converter;
2279  converter.precision(std::numeric_limits<double>::digits10);
2280 
2281  converter << GetPosition() << " " << GetOrientation();
2282 
2283  return converter.str();
2284  }
2285 
2286  public:
2290  inline Pose3& operator = (const Pose3& rOther)
2291  {
2292  m_Position = rOther.m_Position;
2293  m_Orientation = rOther.m_Orientation;
2294 
2295  return *this;
2296  }
2297 
2301  inline kt_bool operator == (const Pose3& rOther) const
2302  {
2303  return (m_Position == rOther.m_Position && m_Orientation == rOther.m_Orientation);
2304  }
2305 
2309  inline kt_bool operator != (const Pose3& rOther) const
2310  {
2311  return (m_Position != rOther.m_Position || m_Orientation != rOther.m_Orientation);
2312  }
2313 
2319  friend inline std::ostream& operator << (std::ostream& rStream, const Pose3& rPose)
2320  {
2321  rStream << rPose.GetPosition() << ", " << rPose.GetOrientation();
2322  return rStream;
2323  }
2324 
2329  friend inline std::istream& operator >> (std::istream& rStream, const Pose3& /*rPose*/)
2330  {
2331  // Implement me!!
2332  return rStream;
2333  }
2334 
2335  private:
2338  }; // Pose3
2339 
2343 
2347  class Matrix3
2348  {
2349  public:
2354  {
2355  Clear();
2356  }
2357 
2361  inline Matrix3(const Matrix3& rOther)
2362  {
2363  memcpy(m_Matrix, rOther.m_Matrix, 9*sizeof(kt_double));
2364  }
2365 
2366  public:
2371  {
2372  memset(m_Matrix, 0, 9*sizeof(kt_double));
2373 
2374  for (kt_int32s i = 0; i < 3; i++)
2375  {
2376  m_Matrix[i][i] = 1.0;
2377  }
2378  }
2379 
2383  void Clear()
2384  {
2385  memset(m_Matrix, 0, 9*sizeof(kt_double));
2386  }
2387 
2395  void FromAxisAngle(kt_double x, kt_double y, kt_double z, const kt_double radians)
2396  {
2397  kt_double cosRadians = cos(radians);
2398  kt_double sinRadians = sin(radians);
2399  kt_double oneMinusCos = 1.0 - cosRadians;
2400 
2401  kt_double xx = x * x;
2402  kt_double yy = y * y;
2403  kt_double zz = z * z;
2404 
2405  kt_double xyMCos = x * y * oneMinusCos;
2406  kt_double xzMCos = x * z * oneMinusCos;
2407  kt_double yzMCos = y * z * oneMinusCos;
2408 
2409  kt_double xSin = x * sinRadians;
2410  kt_double ySin = y * sinRadians;
2411  kt_double zSin = z * sinRadians;
2412 
2413  m_Matrix[0][0] = xx * oneMinusCos + cosRadians;
2414  m_Matrix[0][1] = xyMCos - zSin;
2415  m_Matrix[0][2] = xzMCos + ySin;
2416 
2417  m_Matrix[1][0] = xyMCos + zSin;
2418  m_Matrix[1][1] = yy * oneMinusCos + cosRadians;
2419  m_Matrix[1][2] = yzMCos - xSin;
2420 
2421  m_Matrix[2][0] = xzMCos - ySin;
2422  m_Matrix[2][1] = yzMCos + xSin;
2423  m_Matrix[2][2] = zz * oneMinusCos + cosRadians;
2424  }
2425 
2431  {
2432  Matrix3 transpose;
2433 
2434  for (kt_int32u row = 0; row < 3; row++)
2435  {
2436  for (kt_int32u col = 0; col < 3; col++)
2437  {
2438  transpose.m_Matrix[row][col] = m_Matrix[col][row];
2439  }
2440  }
2441 
2442  return transpose;
2443  }
2444 
2449  {
2450  Matrix3 kInverse = *this;
2451  kt_bool haveInverse = InverseFast(kInverse, 1e-14);
2452  if (haveInverse == false)
2453  {
2454  assert(false);
2455  }
2456  return kInverse;
2457  }
2458 
2463  kt_bool InverseFast(Matrix3& rkInverse, kt_double fTolerance = KT_TOLERANCE) const
2464  {
2465  // Invert a 3x3 using cofactors. This is about 8 times faster than
2466  // the Numerical Recipes code which uses Gaussian elimination.
2467  rkInverse.m_Matrix[0][0] = m_Matrix[1][1]*m_Matrix[2][2] - m_Matrix[1][2]*m_Matrix[2][1];
2468  rkInverse.m_Matrix[0][1] = m_Matrix[0][2]*m_Matrix[2][1] - m_Matrix[0][1]*m_Matrix[2][2];
2469  rkInverse.m_Matrix[0][2] = m_Matrix[0][1]*m_Matrix[1][2] - m_Matrix[0][2]*m_Matrix[1][1];
2470  rkInverse.m_Matrix[1][0] = m_Matrix[1][2]*m_Matrix[2][0] - m_Matrix[1][0]*m_Matrix[2][2];
2471  rkInverse.m_Matrix[1][1] = m_Matrix[0][0]*m_Matrix[2][2] - m_Matrix[0][2]*m_Matrix[2][0];
2472  rkInverse.m_Matrix[1][2] = m_Matrix[0][2]*m_Matrix[1][0] - m_Matrix[0][0]*m_Matrix[1][2];
2473  rkInverse.m_Matrix[2][0] = m_Matrix[1][0]*m_Matrix[2][1] - m_Matrix[1][1]*m_Matrix[2][0];
2474  rkInverse.m_Matrix[2][1] = m_Matrix[0][1]*m_Matrix[2][0] - m_Matrix[0][0]*m_Matrix[2][1];
2475  rkInverse.m_Matrix[2][2] = m_Matrix[0][0]*m_Matrix[1][1] - m_Matrix[0][1]*m_Matrix[1][0];
2476 
2477  kt_double fDet = m_Matrix[0][0]*rkInverse.m_Matrix[0][0] +
2478  m_Matrix[0][1]*rkInverse.m_Matrix[1][0] +
2479  m_Matrix[0][2]*rkInverse.m_Matrix[2][0];
2480 
2481  if (fabs(fDet) <= fTolerance)
2482  {
2483  return false;
2484  }
2485 
2486  kt_double fInvDet = 1.0/fDet;
2487  for (size_t row = 0; row < 3; row++)
2488  {
2489  for (size_t col = 0; col < 3; col++)
2490  {
2491  rkInverse.m_Matrix[row][col] *= fInvDet;
2492  }
2493  }
2494 
2495  return true;
2496  }
2497 
2502  inline std::string ToString() const
2503  {
2504  std::stringstream converter;
2505  converter.precision(std::numeric_limits<double>::digits10);
2506 
2507  for (int row = 0; row < 3; row++)
2508  {
2509  for (int col = 0; col < 3; col++)
2510  {
2511  converter << m_Matrix[row][col] << " ";
2512  }
2513  }
2514 
2515  return converter.str();
2516  }
2517 
2518  public:
2522  inline Matrix3& operator = (const Matrix3& rOther)
2523  {
2524  memcpy(m_Matrix, rOther.m_Matrix, 9*sizeof(kt_double));
2525  return *this;
2526  }
2527 
2535  {
2536  return m_Matrix[row][column];
2537  }
2538 
2545  inline kt_double operator()(kt_int32u row, kt_int32u column) const
2546  {
2547  return m_Matrix[row][column];
2548  }
2549 
2555  Matrix3 operator * (const Matrix3& rOther) const
2556  {
2557  Matrix3 product;
2558 
2559  for (size_t row = 0; row < 3; row++)
2560  {
2561  for (size_t col = 0; col < 3; col++)
2562  {
2563  product.m_Matrix[row][col] = m_Matrix[row][0]*rOther.m_Matrix[0][col] +
2564  m_Matrix[row][1]*rOther.m_Matrix[1][col] +
2565  m_Matrix[row][2]*rOther.m_Matrix[2][col];
2566  }
2567  }
2568 
2569  return product;
2570  }
2571 
2577  inline Pose2 operator * (const Pose2& rPose2) const
2578  {
2579  Pose2 pose2;
2580 
2581  pose2.SetX(m_Matrix[0][0] * rPose2.GetX() + m_Matrix[0][1] *
2582  rPose2.GetY() + m_Matrix[0][2] * rPose2.GetHeading());
2583  pose2.SetY(m_Matrix[1][0] * rPose2.GetX() + m_Matrix[1][1] *
2584  rPose2.GetY() + m_Matrix[1][2] * rPose2.GetHeading());
2585  pose2.SetHeading(m_Matrix[2][0] * rPose2.GetX() + m_Matrix[2][1] *
2586  rPose2.GetY() + m_Matrix[2][2] * rPose2.GetHeading());
2587 
2588  return pose2;
2589  }
2590 
2595  inline void operator += (const Matrix3& rkMatrix)
2596  {
2597  for (kt_int32u row = 0; row < 3; row++)
2598  {
2599  for (kt_int32u col = 0; col < 3; col++)
2600  {
2601  m_Matrix[row][col] += rkMatrix.m_Matrix[row][col];
2602  }
2603  }
2604  }
2605 
2611  friend inline std::ostream& operator << (std::ostream& rStream, const Matrix3& rMatrix)
2612  {
2613  rStream << rMatrix.ToString();
2614  return rStream;
2615  }
2616 
2617  private:
2619  }; // Matrix3
2620 
2624 
2628  class Matrix
2629  {
2630  public:
2634  Matrix(kt_int32u rows, kt_int32u columns)
2635  : m_Rows(rows)
2636  , m_Columns(columns)
2637  , m_pData(NULL)
2638  {
2639  Allocate();
2640 
2641  Clear();
2642  }
2643 
2647  virtual ~Matrix()
2648  {
2649  delete [] m_pData;
2650  }
2651 
2652  public:
2656  void Clear()
2657  {
2658  if (m_pData != NULL)
2659  {
2660  memset(m_pData, 0, sizeof(kt_double) * m_Rows * m_Columns);
2661  }
2662  }
2663 
2668  inline kt_int32u GetRows() const
2669  {
2670  return m_Rows;
2671  }
2672 
2677  inline kt_int32u GetColumns() const
2678  {
2679  return m_Columns;
2680  }
2681 
2689  {
2690  RangeCheck(row, column);
2691 
2692  return m_pData[row + column * m_Rows];
2693  }
2694 
2701  inline const kt_double& operator()(kt_int32u row, kt_int32u column) const
2702  {
2703  RangeCheck(row, column);
2704 
2705  return m_pData[row + column * m_Rows];
2706  }
2707 
2708  private:
2712  void Allocate()
2713  {
2714  try
2715  {
2716  if (m_pData != NULL)
2717  {
2718  delete[] m_pData;
2719  }
2720 
2721  m_pData = new kt_double[m_Rows * m_Columns];
2722  }
2723  catch (const std::bad_alloc& ex)
2724  {
2725  throw Exception("Matrix allocation error");
2726  }
2727 
2728  if (m_pData == NULL)
2729  {
2730  throw Exception("Matrix allocation error");
2731  }
2732  }
2733 
2739  inline void RangeCheck(kt_int32u row, kt_int32u column) const
2740  {
2741  if (math::IsUpTo(row, m_Rows) == false)
2742  {
2743  throw Exception("Matrix - RangeCheck ERROR!!!!");
2744  }
2745 
2746  if (math::IsUpTo(column, m_Columns) == false)
2747  {
2748  throw Exception("Matrix - RangeCheck ERROR!!!!");
2749  }
2750  }
2751 
2752  private:
2755 
2757  }; // Matrix
2758 
2762 
2767  {
2768  public:
2769  /*
2770  * Default constructor
2771  */
2773  : m_Minimum(999999999999999999.99999, 999999999999999999.99999)
2774  , m_Maximum(-999999999999999999.99999, -999999999999999999.99999)
2775  {
2776  }
2777 
2778  public:
2782  inline const Vector2<kt_double>& GetMinimum() const
2783  {
2784  return m_Minimum;
2785  }
2786 
2790  inline void SetMinimum(const Vector2<kt_double>& mMinimum)
2791  {
2792  m_Minimum = mMinimum;
2793  }
2794 
2798  inline const Vector2<kt_double>& GetMaximum() const
2799  {
2800  return m_Maximum;
2801  }
2802 
2806  inline void SetMaximum(const Vector2<kt_double>& rMaximum)
2807  {
2808  m_Maximum = rMaximum;
2809  }
2810 
2814  inline Size2<kt_double> GetSize() const
2815  {
2817 
2818  return Size2<kt_double>(size.GetX(), size.GetY());
2819  }
2820 
2824  inline void Add(const Vector2<kt_double>& rPoint)
2825  {
2826  m_Minimum.MakeFloor(rPoint);
2827  m_Maximum.MakeCeil(rPoint);
2828  }
2829 
2833  inline void Add(const BoundingBox2& rBoundingBox)
2834  {
2835  Add(rBoundingBox.GetMinimum());
2836  Add(rBoundingBox.GetMaximum());
2837  }
2838 
2844  inline kt_bool IsInBounds(const Vector2<kt_double>& rPoint) const
2845  {
2846  return (math::InRange(rPoint.GetX(), m_Minimum.GetX(), m_Maximum.GetX()) &&
2847  math::InRange(rPoint.GetY(), m_Minimum.GetY(), m_Maximum.GetY()));
2848  }
2849 
2850  private:
2853  }; // BoundingBox2
2854 
2858 
2863  {
2864  public:
2869  Transform(const Pose2& rPose)
2870  {
2871  SetTransform(Pose2(), rPose);
2872  }
2873 
2879  Transform(const Pose2& rPose1, const Pose2& rPose2)
2880  {
2881  SetTransform(rPose1, rPose2);
2882  }
2883 
2884  public:
2890  inline Pose2 TransformPose(const Pose2& rSourcePose)
2891  {
2892  Pose2 newPosition = m_Transform + m_Rotation * rSourcePose;
2893  kt_double angle = math::NormalizeAngle(rSourcePose.GetHeading() + m_Transform.GetHeading());
2894 
2895  return Pose2(newPosition.GetPosition(), angle);
2896  }
2897 
2903  inline Pose2 InverseTransformPose(const Pose2& rSourcePose)
2904  {
2905  Pose2 newPosition = m_InverseRotation * (rSourcePose - m_Transform);
2906  kt_double angle = math::NormalizeAngle(rSourcePose.GetHeading() - m_Transform.GetHeading());
2907 
2908  // components of transform
2909  return Pose2(newPosition.GetPosition(), angle);
2910  }
2911 
2912  private:
2918  void SetTransform(const Pose2& rPose1, const Pose2& rPose2)
2919  {
2920  if (rPose1 == rPose2)
2921  {
2924  m_Transform = Pose2();
2925  return;
2926  }
2927 
2928  // heading transformation
2929  m_Rotation.FromAxisAngle(0, 0, 1, rPose2.GetHeading() - rPose1.GetHeading());
2930  m_InverseRotation.FromAxisAngle(0, 0, 1, rPose1.GetHeading() - rPose2.GetHeading());
2931 
2932  // position transformation
2933  Pose2 newPosition;
2934  if (rPose1.GetX() != 0.0 || rPose1.GetY() != 0.0)
2935  {
2936  newPosition = rPose2 - m_Rotation * rPose1;
2937  }
2938  else
2939  {
2940  newPosition = rPose2;
2941  }
2942 
2943  m_Transform = Pose2(newPosition.GetPosition(), rPose2.GetHeading() - rPose1.GetHeading());
2944  }
2945 
2946  private:
2947  // pose transformation
2949 
2952  }; // Transform
2953 
2957 
2961  typedef enum
2962  {
2964 
2968 
2972 
2976 
2981  {
2982  public:
2988  AbstractParameter(const std::string& rName, ParameterManager* pParameterManger = NULL)
2989  : m_Name(rName)
2990  {
2991  // if parameter manager is provided add myself to it!
2992  if (pParameterManger != NULL)
2993  {
2994  pParameterManger->Add(this);
2995  }
2996  }
2997 
3004  AbstractParameter(const std::string& rName,
3005  const std::string& rDescription,
3006  ParameterManager* pParameterManger = NULL)
3007  : m_Name(rName)
3008  , m_Description(rDescription)
3009  {
3010  // if parameter manager is provided add myself to it!
3011  if (pParameterManger != NULL)
3012  {
3013  pParameterManger->Add(this);
3014  }
3015  }
3016 
3021  {
3022  }
3023 
3024  public:
3029  inline const std::string& GetName() const
3030  {
3031  return m_Name;
3032  }
3033 
3038  inline const std::string& GetDescription() const
3039  {
3040  return m_Description;
3041  }
3042 
3047  virtual const std::string GetValueAsString() const = 0;
3048 
3053  virtual void SetValueFromString(const std::string& rStringValue) = 0;
3054 
3059  virtual AbstractParameter* Clone() = 0;
3060 
3061  public:
3067  friend std::ostream& operator << (std::ostream& rStream, const AbstractParameter& rParameter)
3068  {
3069  rStream.precision(6);
3070  rStream.flags(std::ios::fixed);
3071 
3072  rStream << rParameter.GetName() << " = " << rParameter.GetValueAsString();
3073  return rStream;
3074  }
3075 
3076  private:
3077  std::string m_Name;
3078  std::string m_Description;
3079  }; // AbstractParameter
3080 
3084 
3088  template<typename T>
3090  {
3091  public:
3098  Parameter(const std::string& rName, T value, ParameterManager* pParameterManger = NULL)
3099  : AbstractParameter(rName, pParameterManger)
3100  , m_Value(value)
3101  {
3102  }
3103 
3111  Parameter(const std::string& rName,
3112  const std::string& rDescription,
3113  T value,
3114  ParameterManager* pParameterManger = NULL)
3115  : AbstractParameter(rName, rDescription, pParameterManger)
3116  , m_Value(value)
3117  {
3118  }
3119 
3123  virtual ~Parameter()
3124  {
3125  }
3126 
3127  public:
3132  inline const T& GetValue() const
3133  {
3134  return m_Value;
3135  }
3136 
3141  inline void SetValue(const T& rValue)
3142  {
3143  m_Value = rValue;
3144  }
3145 
3150  virtual const std::string GetValueAsString() const
3151  {
3152  std::stringstream converter;
3153  converter << m_Value;
3154  return converter.str();
3155  }
3156 
3161  virtual void SetValueFromString(const std::string& rStringValue)
3162  {
3163  std::stringstream converter;
3164  converter.str(rStringValue);
3165  converter >> m_Value;
3166  }
3167 
3172  virtual Parameter* Clone()
3173  {
3174  return new Parameter(GetName(), GetDescription(), GetValue());
3175  }
3176 
3177  public:
3182  {
3183  m_Value = rOther.m_Value;
3184 
3185  return *this;
3186  }
3187 
3191  T operator = (T value)
3192  {
3193  m_Value = value;
3194 
3195  return m_Value;
3196  }
3197 
3198  protected:
3203  }; // Parameter
3204 
3205  template<>
3206  inline void Parameter<kt_double>::SetValueFromString(const std::string& rStringValue)
3207  {
3208  int precision = std::numeric_limits<double>::digits10;
3209  std::stringstream converter;
3210  converter.precision(precision);
3211 
3212  converter.str(rStringValue);
3213 
3214  m_Value = 0.0;
3215  converter >> m_Value;
3216  }
3217 
3218  template<>
3219  inline const std::string Parameter<kt_double>::GetValueAsString() const
3220  {
3221  std::stringstream converter;
3222  converter.precision(std::numeric_limits<double>::digits10);
3223  converter << m_Value;
3224  return converter.str();
3225  }
3226 
3227  template<>
3228  inline void Parameter<kt_bool>::SetValueFromString(const std::string& rStringValue)
3229  {
3230  if (rStringValue == "true" || rStringValue == "TRUE")
3231  {
3232  m_Value = true;
3233  }
3234  else
3235  {
3236  m_Value = false;
3237  }
3238  }
3239 
3240  template<>
3241  inline const std::string Parameter<kt_bool>::GetValueAsString() const
3242  {
3243  if (m_Value == true)
3244  {
3245  return "true";
3246  }
3247 
3248  return "false";
3249  }
3250 
3254 
3258  class ParameterEnum : public Parameter<kt_int32s>
3259  {
3260  typedef std::map<std::string, kt_int32s> EnumMap;
3261 
3262  public:
3269  ParameterEnum(const std::string& rName, kt_int32s value, ParameterManager* pParameterManger = NULL)
3270  : Parameter<kt_int32s>(rName, value, pParameterManger)
3271  {
3272  }
3273 
3277  virtual ~ParameterEnum()
3278  {
3279  }
3280 
3281  public:
3287  {
3288  ParameterEnum* pEnum = new ParameterEnum(GetName(), GetValue());
3289 
3290  pEnum->m_EnumDefines = m_EnumDefines;
3291 
3292  return pEnum;
3293  }
3294 
3299  virtual void SetValueFromString(const std::string& rStringValue)
3300  {
3301  if (m_EnumDefines.find(rStringValue) != m_EnumDefines.end())
3302  {
3303  m_Value = m_EnumDefines[rStringValue];
3304  }
3305  else
3306  {
3307  std::string validValues;
3308 
3309  const_forEach(EnumMap, &m_EnumDefines)
3310  {
3311  validValues += iter->first + ", ";
3312  }
3313 
3314  throw Exception("Unable to set enum: " + rStringValue + ". Valid values are: " + validValues);
3315  }
3316  }
3317 
3322  virtual const std::string GetValueAsString() const
3323  {
3324  const_forEach(EnumMap, &m_EnumDefines)
3325  {
3326  if (iter->second == m_Value)
3327  {
3328  return iter->first;
3329  }
3330  }
3331 
3332  throw Exception("Unable to lookup enum");
3333  }
3334 
3340  void DefineEnumValue(kt_int32s value, const std::string& rName)
3341  {
3342  if (m_EnumDefines.find(rName) == m_EnumDefines.end())
3343  {
3344  m_EnumDefines[rName] = value;
3345  }
3346  else
3347  {
3348  std::cerr << "Overriding enum value: " << m_EnumDefines[rName] << " with " << value << std::endl;
3349 
3350  m_EnumDefines[rName] = value;
3351 
3352  assert(false);
3353  }
3354  }
3355 
3356  public:
3360  ParameterEnum& operator = (const ParameterEnum& rOther)
3361  {
3362  SetValue(rOther.GetValue());
3363 
3364  return *this;
3365  }
3366 
3370  kt_int32s operator = (kt_int32s value)
3371  {
3372  SetValue(value);
3373 
3374  return m_Value;
3375  }
3376 
3377  private:
3379  }; // ParameterEnum
3380 
3384 
3388  class Parameters : public Object
3389  {
3390  public:
3391  // @cond EXCLUDE
3393  // @endcond
3394 
3395  public:
3400  Parameters(const std::string& rName)
3401  : Object(rName)
3402  {
3403  }
3404 
3408  virtual ~Parameters()
3409  {
3410  }
3411 
3412  private:
3413  Parameters(const Parameters&);
3414  const Parameters& operator=(const Parameters&);
3415  }; // Parameters
3416 
3420 
3421  class SensorData;
3422 
3426  class KARTO_EXPORT Sensor : public Object
3427  {
3428  public:
3429  // @cond EXCLUDE
3431  // @endcond
3432 
3433  protected:
3438  Sensor(const Name& rName);
3439 
3440  public:
3444  virtual ~Sensor();
3445 
3446  public:
3451  inline const Pose2& GetOffsetPose() const
3452  {
3453  return m_pOffsetPose->GetValue();
3454  }
3455 
3460  inline void SetOffsetPose(const Pose2& rPose)
3461  {
3462  m_pOffsetPose->SetValue(rPose);
3463  }
3464 
3469  virtual kt_bool Validate() = 0;
3470 
3476  virtual kt_bool Validate(SensorData* pSensorData) = 0;
3477 
3478  private:
3482  Sensor(const Sensor&);
3483 
3487  const Sensor& operator=(const Sensor&);
3488 
3489  private:
3494  }; // Sensor
3495 
3499  typedef std::vector<Sensor*> SensorVector;
3500 
3504 
3508  typedef std::map<Name, Sensor*> SensorManagerMap;
3509 
3514  {
3515  public:
3520  {
3521  }
3522 
3526  virtual ~SensorManager()
3527  {
3528  }
3529 
3530  public:
3534  static SensorManager* GetInstance();
3535 
3536  public:
3544  void RegisterSensor(Sensor* pSensor, kt_bool override = false)
3545  {
3546  Validate(pSensor);
3547 
3548  if ((m_Sensors.find(pSensor->GetName()) != m_Sensors.end()) && !override)
3549  {
3550  throw Exception("Cannot register sensor: already registered: [" +
3551  pSensor->GetName().ToString() +
3552  "] (Consider setting 'override' to true)");
3553  }
3554 
3555  std::cout << "Registering sensor: [" << pSensor->GetName().ToString() << "]" << std::endl;
3556 
3557  m_Sensors[pSensor->GetName()] = pSensor;
3558  }
3559 
3564  void UnregisterSensor(Sensor* pSensor)
3565  {
3566  Validate(pSensor);
3567 
3568  if (m_Sensors.find(pSensor->GetName()) != m_Sensors.end())
3569  {
3570  std::cout << "Unregistering sensor: " << pSensor->GetName().ToString() << std::endl;
3571 
3572  m_Sensors.erase(pSensor->GetName());
3573  }
3574  else
3575  {
3576  throw Exception("Cannot unregister sensor: not registered: [" + pSensor->GetName().ToString() + "]");
3577  }
3578  }
3579 
3585  Sensor* GetSensorByName(const Name& rName)
3586  {
3587  if (m_Sensors.find(rName) != m_Sensors.end())
3588  {
3589  return m_Sensors[rName];
3590  }
3591 
3592  throw Exception("Sensor not registered: [" + rName.ToString() + "] (Did you add the sensor to the Dataset?)");
3593  }
3594 
3600  template<class T>
3601  T* GetSensorByName(const Name& rName)
3602  {
3603  Sensor* pSensor = GetSensorByName(rName);
3604 
3605  return dynamic_cast<T*>(pSensor);
3606  }
3607 
3613  {
3614  SensorVector sensors;
3615 
3616  forEach(SensorManagerMap, &m_Sensors)
3617  {
3618  sensors.push_back(iter->second);
3619  }
3620 
3621  return sensors;
3622  }
3623 
3624  protected:
3629  static void Validate(Sensor* pSensor)
3630  {
3631  if (pSensor == NULL)
3632  {
3633  throw Exception("Invalid sensor: NULL");
3634  }
3635  else if (pSensor->GetName().ToString() == "")
3636  {
3637  throw Exception("Invalid sensor: nameless");
3638  }
3639  }
3640 
3641  protected:
3646  };
3647 
3651 
3658  class Drive : public Sensor
3659  {
3660  public:
3661  // @cond EXCLUDE
3663  // @endcond
3664 
3665  public:
3669  Drive(const std::string& rName)
3670  : Sensor(rName)
3671  {
3672  }
3673 
3677  virtual ~Drive()
3678  {
3679  }
3680 
3681  public:
3682  virtual kt_bool Validate()
3683  {
3684  return true;
3685  }
3686 
3687  virtual kt_bool Validate(SensorData* pSensorData)
3688  {
3689  if (pSensorData == NULL)
3690  {
3691  return false;
3692  }
3693 
3694  return true;
3695  }
3696 
3697  private:
3698  Drive(const Drive&);
3699  const Drive& operator=(const Drive&);
3700  }; // class Drive
3701 
3705 
3706  class LocalizedRangeScan;
3707  class CoordinateConverter;
3708 
3722  {
3723  public:
3724  // @cond EXCLUDE
3726  // @endcond
3727 
3728  public:
3733  {
3734  }
3735 
3736  public:
3742  {
3743  return m_pMinimumRange->GetValue();
3744  }
3745 
3750  inline void SetMinimumRange(kt_double minimumRange)
3751  {
3752  m_pMinimumRange->SetValue(minimumRange);
3753 
3754  SetRangeThreshold(GetRangeThreshold());
3755  }
3756 
3762  {
3763  return m_pMaximumRange->GetValue();
3764  }
3765 
3770  inline void SetMaximumRange(kt_double maximumRange)
3771  {
3772  m_pMaximumRange->SetValue(maximumRange);
3773 
3774  SetRangeThreshold(GetRangeThreshold());
3775  }
3776 
3782  {
3783  return m_pRangeThreshold->GetValue();
3784  }
3785 
3790  inline void SetRangeThreshold(kt_double rangeThreshold)
3791  {
3792  // make sure rangeThreshold is within laser range finder range
3793  m_pRangeThreshold->SetValue(math::Clip(rangeThreshold, GetMinimumRange(), GetMaximumRange()));
3794 
3795  if (math::DoubleEqual(GetRangeThreshold(), rangeThreshold) == false)
3796  {
3797  std::cout << "Info: clipped range threshold to be within minimum and maximum range!" << std::endl;
3798  }
3799  }
3800 
3806  {
3807  return m_pMinimumAngle->GetValue();
3808  }
3809 
3814  inline void SetMinimumAngle(kt_double minimumAngle)
3815  {
3816  m_pMinimumAngle->SetValue(minimumAngle);
3817 
3818  Update();
3819  }
3820 
3826  {
3827  return m_pMaximumAngle->GetValue();
3828  }
3829 
3834  inline void SetMaximumAngle(kt_double maximumAngle)
3835  {
3836  m_pMaximumAngle->SetValue(maximumAngle);
3837 
3838  Update();
3839  }
3840 
3846  {
3847  return m_pAngularResolution->GetValue();
3848  }
3849 
3854  inline void SetAngularResolution(kt_double angularResolution)
3855  {
3856  if (m_pType->GetValue() == LaserRangeFinder_Custom)
3857  {
3858  m_pAngularResolution->SetValue(angularResolution);
3859  }
3860  else if (m_pType->GetValue() == LaserRangeFinder_Sick_LMS100)
3861  {
3862  if (math::DoubleEqual(angularResolution, math::DegreesToRadians(0.25)))
3863  {
3864  m_pAngularResolution->SetValue(math::DegreesToRadians(0.25));
3865  }
3866  else if (math::DoubleEqual(angularResolution, math::DegreesToRadians(0.50)))
3867  {
3868  m_pAngularResolution->SetValue(math::DegreesToRadians(0.50));
3869  }
3870  else
3871  {
3872  std::stringstream stream;
3873  stream << "Invalid resolution for Sick LMS100: ";
3874  stream << angularResolution;
3875  throw Exception(stream.str());
3876  }
3877  }
3878  else if (m_pType->GetValue() == LaserRangeFinder_Sick_LMS200 ||
3879  m_pType->GetValue() == LaserRangeFinder_Sick_LMS291)
3880  {
3881  if (math::DoubleEqual(angularResolution, math::DegreesToRadians(0.25)))
3882  {
3883  m_pAngularResolution->SetValue(math::DegreesToRadians(0.25));
3884  }
3885  else if (math::DoubleEqual(angularResolution, math::DegreesToRadians(0.50)))
3886  {
3887  m_pAngularResolution->SetValue(math::DegreesToRadians(0.50));
3888  }
3889  else if (math::DoubleEqual(angularResolution, math::DegreesToRadians(1.00)))
3890  {
3891  m_pAngularResolution->SetValue(math::DegreesToRadians(1.00));
3892  }
3893  else
3894  {
3895  std::stringstream stream;
3896  stream << "Invalid resolution for Sick LMS291: ";
3897  stream << angularResolution;
3898  throw Exception(stream.str());
3899  }
3900  }
3901  else if (m_pType->GetValue() == LaserRangeFinder_Hokuyo_UTM_30LX)
3902  {
3903  if (math::DoubleEqual(angularResolution, math::DegreesToRadians(0.25)))
3904  {
3905  m_pAngularResolution->SetValue(math::DegreesToRadians(0.25));
3906  }
3907  else
3908  {
3909  std::stringstream stream;
3910  stream << "Invalid resolution for Hokuyo_UTM_30LX: ";
3911  stream << angularResolution;
3912  throw Exception(stream.str());
3913  }
3914  }
3915  else if (m_pType->GetValue() == LaserRangeFinder_Hokuyo_URG_04LX)
3916  {
3917  if (math::DoubleEqual(angularResolution, math::DegreesToRadians(0.352)))
3918  {
3919  m_pAngularResolution->SetValue(math::DegreesToRadians(0.352));
3920  }
3921  else
3922  {
3923  std::stringstream stream;
3924  stream << "Invalid resolution for Hokuyo_URG_04LX: ";
3925  stream << angularResolution;
3926  throw Exception(stream.str());
3927  }
3928  }
3929  else
3930  {
3931  throw Exception("Can't set angular resolution, please create a LaserRangeFinder of type Custom");
3932  }
3933 
3934  Update();
3935  }
3936 
3941  {
3942  return m_pType->GetValue();
3943  }
3944 
3950  {
3951  return m_NumberOfRangeReadings;
3952  }
3953 
3954  virtual kt_bool Validate()
3955  {
3956  Update();
3957 
3958  if (math::InRange(GetRangeThreshold(), GetMinimumRange(), GetMaximumRange()) == false)
3959  {
3960  std::cout << "Please set range threshold to a value between ["
3961  << GetMinimumRange() << ";" << GetMaximumRange() << "]" << std::endl;
3962  return false;
3963  }
3964 
3965  return true;
3966  }
3967 
3968  virtual kt_bool Validate(SensorData* pSensorData);
3969 
3977  const PointVectorDouble GetPointReadings(LocalizedRangeScan* pLocalizedRangeScan,
3978  CoordinateConverter* pCoordinateConverter,
3979  kt_bool ignoreThresholdPoints = true,
3980  kt_bool flipY = false) const;
3981 
3982  public:
3990  {
3991  LaserRangeFinder* pLrf = NULL;
3992 
3993  switch (type)
3994  {
3995  // see http://www.hizook.com/files/publications/SICK_LMS100.pdf
3996  // set range threshold to 18m
3998  {
3999  pLrf = new LaserRangeFinder((rName.GetName() != "") ? rName : Name("Sick LMS 100"));
4000 
4001  // Sensing range is 18 meters (at 10% reflectivity, max range of 20 meters), with an error of about 20mm
4002  pLrf->m_pMinimumRange->SetValue(0.0);
4003  pLrf->m_pMaximumRange->SetValue(20.0);
4004 
4005  // 270 degree range, 50 Hz
4008 
4009  // 0.25 degree angular resolution
4011 
4012  pLrf->m_NumberOfRangeReadings = 1081;
4013  }
4014  break;
4015 
4016  // see http://www.hizook.com/files/publications/SICK_LMS200-291_Tech_Info.pdf
4017  // set range threshold to 10m
4019  {
4020  pLrf = new LaserRangeFinder((rName.GetName() != "") ? rName : Name("Sick LMS 200"));
4021 
4022  // Sensing range is 80 meters
4023  pLrf->m_pMinimumRange->SetValue(0.0);
4024  pLrf->m_pMaximumRange->SetValue(80.0);
4025 
4026  // 180 degree range, 75 Hz
4029 
4030  // 0.5 degree angular resolution
4032 
4033  pLrf->m_NumberOfRangeReadings = 361;
4034  }
4035  break;
4036 
4037  // see http://www.hizook.com/files/publications/SICK_LMS200-291_Tech_Info.pdf
4038  // set range threshold to 30m
4040  {
4041  pLrf = new LaserRangeFinder((rName.GetName() != "") ? rName : Name("Sick LMS 291"));
4042 
4043  // Sensing range is 80 meters
4044  pLrf->m_pMinimumRange->SetValue(0.0);
4045  pLrf->m_pMaximumRange->SetValue(80.0);
4046 
4047  // 180 degree range, 75 Hz
4050 
4051  // 0.5 degree angular resolution
4053 
4054  pLrf->m_NumberOfRangeReadings = 361;
4055  }
4056  break;
4057 
4058  // see http://www.hizook.com/files/publications/Hokuyo_UTM_LaserRangeFinder_LIDAR.pdf
4059  // set range threshold to 30m
4061  {
4062  pLrf = new LaserRangeFinder((rName.GetName() != "") ? rName : Name("Hokuyo UTM-30LX"));
4063 
4064  // Sensing range is 30 meters
4065  pLrf->m_pMinimumRange->SetValue(0.1);
4066  pLrf->m_pMaximumRange->SetValue(30.0);
4067 
4068  // 270 degree range, 40 Hz
4071 
4072  // 0.25 degree angular resolution
4074 
4075  pLrf->m_NumberOfRangeReadings = 1081;
4076  }
4077  break;
4078 
4079  // see http://www.hizook.com/files/publications/HokuyoURG_Datasheet.pdf
4080  // set range threshold to 3.5m
4082  {
4083  pLrf = new LaserRangeFinder((rName.GetName() != "") ? rName : Name("Hokuyo URG-04LX"));
4084 
4085  // Sensing range is 4 meters. It has detection problems when
4086  // scanning absorptive surfaces (such as black trimming).
4087  pLrf->m_pMinimumRange->SetValue(0.02);
4088  pLrf->m_pMaximumRange->SetValue(4.0);
4089 
4090  // 240 degree range, 10 Hz
4093 
4094  // 0.352 degree angular resolution
4096 
4097  pLrf->m_NumberOfRangeReadings = 751;
4098  }
4099  break;
4100 
4102  {
4103  pLrf = new LaserRangeFinder((rName.GetName() != "") ? rName : Name("User-Defined LaserRangeFinder"));
4104 
4105  // Sensing range is 80 meters.
4106  pLrf->m_pMinimumRange->SetValue(0.0);
4107  pLrf->m_pMaximumRange->SetValue(80.0);
4108 
4109  // 180 degree range
4112 
4113  // 1.0 degree angular resolution
4115 
4116  pLrf->m_NumberOfRangeReadings = 181;
4117  }
4118  break;
4119  }
4120 
4121  if (pLrf != NULL)
4122  {
4123  pLrf->m_pType->SetValue(type);
4124 
4125  Pose2 defaultOffset;
4126  pLrf->SetOffsetPose(defaultOffset);
4127  }
4128 
4129  return pLrf;
4130  }
4131 
4132  private:
4136  LaserRangeFinder(const Name& rName)
4137  : Sensor(rName)
4138  , m_NumberOfRangeReadings(0)
4139  {
4140  m_pMinimumRange = new Parameter<kt_double>("MinimumRange", 0.0, GetParameterManager());
4141  m_pMaximumRange = new Parameter<kt_double>("MaximumRange", 80.0, GetParameterManager());
4142 
4143  m_pMinimumAngle = new Parameter<kt_double>("MinimumAngle", -KT_PI_2, GetParameterManager());
4144  m_pMaximumAngle = new Parameter<kt_double>("MaximumAngle", KT_PI_2, GetParameterManager());
4145 
4146  m_pAngularResolution = new Parameter<kt_double>("AngularResolution",
4149 
4150  m_pRangeThreshold = new Parameter<kt_double>("RangeThreshold", 12.0, GetParameterManager());
4151 
4152  m_pType = new ParameterEnum("Type", LaserRangeFinder_Custom, GetParameterManager());
4153  m_pType->DefineEnumValue(LaserRangeFinder_Custom, "Custom");
4154  m_pType->DefineEnumValue(LaserRangeFinder_Sick_LMS100, "Sick_LMS100");
4155  m_pType->DefineEnumValue(LaserRangeFinder_Sick_LMS200, "Sick_LMS200");
4156  m_pType->DefineEnumValue(LaserRangeFinder_Sick_LMS291, "Sick_LMS291");
4157  m_pType->DefineEnumValue(LaserRangeFinder_Hokuyo_UTM_30LX, "Hokuyo_UTM_30LX");
4158  m_pType->DefineEnumValue(LaserRangeFinder_Hokuyo_URG_04LX, "Hokuyo_URG_04LX");
4159  }
4160 
4165  void Update()
4166  {
4167  m_NumberOfRangeReadings = static_cast<kt_int32u>(math::Round((GetMaximumAngle() -
4168  GetMinimumAngle())
4169  / GetAngularResolution()) + 1);
4170  }
4171 
4172  private:
4175 
4176  private:
4177  // sensor m_Parameters
4180 
4182 
4185 
4187 
4189 
4191 
4192  // static std::string LaserRangeFinderTypeNames[6];
4193  }; // LaserRangeFinder
4194 
4198 
4202  typedef enum
4203  {
4207  } GridStates;
4208 
4212 
4219  {
4220  public:
4225  : m_Scale(20.0)
4226  {
4227  }
4228 
4229  public:
4236  {
4237  return value * m_Scale;
4238  }
4239 
4246  inline Vector2<kt_int32s> WorldToGrid(const Vector2<kt_double>& rWorld, kt_bool flipY = false) const
4247  {
4248  kt_double gridX = (rWorld.GetX() - m_Offset.GetX()) * m_Scale;
4249  kt_double gridY = 0.0;
4250 
4251  if (flipY == false)
4252  {
4253  gridY = (rWorld.GetY() - m_Offset.GetY()) * m_Scale;
4254  }
4255  else
4256  {
4257  gridY = (m_Size.GetHeight() / m_Scale - rWorld.GetY() + m_Offset.GetY()) * m_Scale;
4258  }
4259 
4260  return Vector2<kt_int32s>(static_cast<kt_int32s>(math::Round(gridX)), static_cast<kt_int32s>(math::Round(gridY)));
4261  }
4262 
4269  inline Vector2<kt_double> GridToWorld(const Vector2<kt_int32s>& rGrid, kt_bool flipY = false) const
4270  {
4271  kt_double worldX = m_Offset.GetX() + rGrid.GetX() / m_Scale;
4272  kt_double worldY = 0.0;
4273 
4274  if (flipY == false)
4275  {
4276  worldY = m_Offset.GetY() + rGrid.GetY() / m_Scale;
4277  }
4278  else
4279  {
4280  worldY = m_Offset.GetY() + (m_Size.GetHeight() - rGrid.GetY()) / m_Scale;
4281  }
4282 
4283  return Vector2<kt_double>(worldX, worldY);
4284  }
4285 
4290  inline kt_double GetScale() const
4291  {
4292  return m_Scale;
4293  }
4294 
4299  inline void SetScale(kt_double scale)
4300  {
4301  m_Scale = scale;
4302  }
4303 
4308  inline const Vector2<kt_double>& GetOffset() const
4309  {
4310  return m_Offset;
4311  }
4312 
4317  inline void SetOffset(const Vector2<kt_double>& rOffset)
4318  {
4319  m_Offset = rOffset;
4320  }
4321 
4326  inline void SetSize(const Size2<kt_int32s>& rSize)
4327  {
4328  m_Size = rSize;
4329  }
4330 
4335  inline const Size2<kt_int32s>& GetSize() const
4336  {
4337  return m_Size;
4338  }
4339 
4344  inline kt_double GetResolution() const
4345  {
4346  return 1.0 / m_Scale;
4347  }
4348 
4353  inline void SetResolution(kt_double resolution)
4354  {
4355  m_Scale = 1.0 / resolution;
4356  }
4357 
4363  {
4364  BoundingBox2 box;
4365 
4366  kt_double minX = GetOffset().GetX();
4367  kt_double minY = GetOffset().GetY();
4368  kt_double maxX = minX + GetSize().GetWidth() * GetResolution();
4369  kt_double maxY = minY + GetSize().GetHeight() * GetResolution();
4370 
4371  box.SetMinimum(GetOffset());
4372  box.SetMaximum(Vector2<kt_double>(maxX, maxY));
4373  return box;
4374  }
4375 
4376  private:
4379 
4381  }; // CoordinateConverter
4382 
4386 
4390  template<typename T>
4391  class Grid
4392  {
4393  public:
4401  static Grid* CreateGrid(kt_int32s width, kt_int32s height, kt_double resolution)
4402  {
4403  Grid* pGrid = new Grid(width, height);
4404 
4405  pGrid->GetCoordinateConverter()->SetScale(1.0 / resolution);
4406 
4407  return pGrid;
4408  }
4409 
4413  virtual ~Grid()
4414  {
4415  delete [] m_pData;
4416  delete m_pCoordinateConverter;
4417  }
4418 
4419  public:
4423  void Clear()
4424  {
4425  memset(m_pData, 0, GetDataSize() * sizeof(T));
4426  }
4427 
4433  {
4434  Grid* pGrid = CreateGrid(GetWidth(), GetHeight(), GetResolution());
4435  pGrid->GetCoordinateConverter()->SetOffset(GetCoordinateConverter()->GetOffset());
4436 
4437  memcpy(pGrid->GetDataPointer(), GetDataPointer(), GetDataSize());
4438 
4439  return pGrid;
4440  }
4441 
4447  virtual void Resize(kt_int32s width, kt_int32s height)
4448  {
4449  m_Width = width;
4450  m_Height = height;
4451  m_WidthStep = math::AlignValue<kt_int32s>(width, 8);
4452 
4453  if (m_pData != NULL)
4454  {
4455  delete[] m_pData;
4456  m_pData = NULL;
4457  }
4458 
4459  try
4460  {
4461  m_pData = new T[GetDataSize()];
4462 
4463  if (m_pCoordinateConverter == NULL)
4464  {
4465  m_pCoordinateConverter = new CoordinateConverter();
4466  }
4467 
4468  m_pCoordinateConverter->SetSize(Size2<kt_int32s>(width, height));
4469  }
4470  catch(...)
4471  {
4472  m_pData = NULL;
4473 
4474  m_Width = 0;
4475  m_Height = 0;
4476  m_WidthStep = 0;
4477  }
4478 
4479  Clear();
4480  }
4481 
4486  inline kt_bool IsValidGridIndex(const Vector2<kt_int32s>& rGrid) const
4487  {
4488  return (math::IsUpTo(rGrid.GetX(), m_Width) && math::IsUpTo(rGrid.GetY(), m_Height));
4489  }
4490 
4497  virtual kt_int32s GridIndex(const Vector2<kt_int32s>& rGrid, kt_bool boundaryCheck = true) const
4498  {
4499  if (boundaryCheck == true)
4500  {
4501  if (IsValidGridIndex(rGrid) == false)
4502  {
4503  std::stringstream error;
4504  error << "Index " << rGrid << " out of range. Index must be between [0; "
4505  << m_Width << ") and [0; " << m_Height << ")";
4506  throw Exception(error.str());
4507  }
4508  }
4509 
4510  kt_int32s index = rGrid.GetX() + (rGrid.GetY() * m_WidthStep);
4511 
4512  if (boundaryCheck == true)
4513  {
4514  assert(math::IsUpTo(index, GetDataSize()));
4515  }
4516 
4517  return index;
4518  }
4519 
4526  {
4527  Vector2<kt_int32s> grid;
4528 
4529  grid.SetY(index / m_WidthStep);
4530  grid.SetX(index - grid.GetY() * m_WidthStep);
4531 
4532  return grid;
4533  }
4534 
4541  inline Vector2<kt_int32s> WorldToGrid(const Vector2<kt_double>& rWorld, kt_bool flipY = false) const
4542  {
4543  return GetCoordinateConverter()->WorldToGrid(rWorld, flipY);
4544  }
4545 
4552  inline Vector2<kt_double> GridToWorld(const Vector2<kt_int32s>& rGrid, kt_bool flipY = false) const
4553  {
4554  return GetCoordinateConverter()->GridToWorld(rGrid, flipY);
4555  }
4556 
4563  {
4564  kt_int32s index = GridIndex(rGrid, true);
4565  return m_pData + index;
4566  }
4567 
4573  T* GetDataPointer(const Vector2<kt_int32s>& rGrid) const
4574  {
4575  kt_int32s index = GridIndex(rGrid, true);
4576  return m_pData + index;
4577  }
4578 
4583  inline kt_int32s GetWidth() const
4584  {
4585  return m_Width;
4586  };
4587 
4592  inline kt_int32s GetHeight() const
4593  {
4594  return m_Height;
4595  };
4596 
4601  inline const Size2<kt_int32s> GetSize() const
4602  {
4603  return Size2<kt_int32s>(m_Width, m_Height);
4604  }
4605 
4610  inline kt_int32s GetWidthStep() const
4611  {
4612  return m_WidthStep;
4613  }
4614 
4619  inline T* GetDataPointer()
4620  {
4621  return m_pData;
4622  }
4623 
4628  inline T* GetDataPointer() const
4629  {
4630  return m_pData;
4631  }
4632 
4637  inline kt_int32s GetDataSize() const
4638  {
4639  return m_WidthStep * m_Height;
4640  }
4641 
4647  inline T GetValue(const Vector2<kt_int32s>& rGrid) const
4648  {
4649  kt_int32s index = GridIndex(rGrid);
4650  return m_pData[index];
4651  }
4652 
4658  {
4659  return m_pCoordinateConverter;
4660  }
4661 
4666  inline kt_double GetResolution() const
4667  {
4668  return GetCoordinateConverter()->GetResolution();
4669  }
4670 
4676  {
4677  return GetCoordinateConverter()->GetBoundingBox();
4678  }
4679 
4689  void TraceLine(kt_int32s x0, kt_int32s y0, kt_int32s x1, kt_int32s y1, Functor* f = NULL)
4690  {
4691  kt_bool steep = abs(y1 - y0) > abs(x1 - x0);
4692  if (steep)
4693  {
4694  std::swap(x0, y0);
4695  std::swap(x1, y1);
4696  }
4697  if (x0 > x1)
4698  {
4699  std::swap(x0, x1);
4700  std::swap(y0, y1);
4701  }
4702 
4703  kt_int32s deltaX = x1 - x0;
4704  kt_int32s deltaY = abs(y1 - y0);
4705  kt_int32s error = 0;
4706  kt_int32s ystep;
4707  kt_int32s y = y0;
4708 
4709  if (y0 < y1)
4710  {
4711  ystep = 1;
4712  }
4713  else
4714  {
4715  ystep = -1;
4716  }
4717 
4718  kt_int32s pointX;
4719  kt_int32s pointY;
4720  for (kt_int32s x = x0; x <= x1; x++)
4721  {
4722  if (steep)
4723  {
4724  pointX = y;
4725  pointY = x;
4726  }
4727  else
4728  {
4729  pointX = x;
4730  pointY = y;
4731  }
4732 
4733  error += deltaY;
4734 
4735  if (2 * error >= deltaX)
4736  {
4737  y += ystep;
4738  error -= deltaX;
4739  }
4740 
4741  Vector2<kt_int32s> gridIndex(pointX, pointY);
4742  if (IsValidGridIndex(gridIndex))
4743  {
4744  kt_int32s index = GridIndex(gridIndex, false);
4745  T* pGridPointer = GetDataPointer();
4746  pGridPointer[index]++;
4747 
4748  if (f != NULL)
4749  {
4750  (*f)(index);
4751  }
4752  }
4753  }
4754  }
4755 
4756  protected:
4762  Grid(kt_int32s width, kt_int32s height)
4763  : m_pData(NULL)
4764  , m_pCoordinateConverter(NULL)
4765  {
4766  Resize(width, height);
4767  }
4768 
4769  private:
4770  kt_int32s m_Width; // width of grid
4771  kt_int32s m_Height; // height of grid
4772  kt_int32s m_WidthStep; // 8 bit aligned width of grid
4773  T* m_pData; // grid data
4774 
4775  // coordinate converter to convert between world coordinates and grid coordinates
4777  }; // Grid
4778 
4782 
4786  class CustomData : public Object
4787  {
4788  public:
4789  // @cond EXCLUDE
4791  // @endcond
4792 
4793  public:
4798  : Object()
4799  {
4800  }
4801 
4805  virtual ~CustomData()
4806  {
4807  }
4808 
4809  public:
4814  virtual const std::string Write() const = 0;
4815 
4820  virtual void Read(const std::string& rValue) = 0;
4821 
4822  private:
4823  CustomData(const CustomData&);
4824  const CustomData& operator=(const CustomData&);
4825  };
4826 
4830  typedef std::vector<CustomData*> CustomDataVector;
4831 
4835 
4840  {
4841  public:
4842  // @cond EXCLUDE
4844  // @endcond
4845 
4846  public:
4850  virtual ~SensorData();
4851 
4852  public:
4857  inline kt_int32s GetStateId() const
4858  {
4859  return m_StateId;
4860  }
4861 
4866  inline void SetStateId(kt_int32s stateId)
4867  {
4868  m_StateId = stateId;
4869  }
4870 
4875  inline kt_int32s GetUniqueId() const
4876  {
4877  return m_UniqueId;
4878  }
4879 
4884  inline void SetUniqueId(kt_int32u uniqueId)
4885  {
4886  m_UniqueId = uniqueId;
4887  }
4888 
4893  inline kt_double GetTime() const
4894  {
4895  return m_Time;
4896  }
4897 
4902  inline void SetTime(kt_double time)
4903  {
4904  m_Time = time;
4905  }
4906 
4911  inline const Name& GetSensorName() const
4912  {
4913  return m_SensorName;
4914  }
4915 
4920  inline void AddCustomData(CustomData* pCustomData)
4921  {
4922  m_CustomData.push_back(pCustomData);
4923  }
4924 
4929  inline const CustomDataVector& GetCustomData() const
4930  {
4931  return m_CustomData;
4932  }
4933 
4934  protected:
4938  SensorData(const Name& rSensorName);
4939 
4940  private:
4944  SensorData(const SensorData&);
4945 
4949  const SensorData& operator=(const SensorData&);
4950 
4951  private:
4956 
4961 
4966 
4971 
4973  };
4974 
4978 
4982  typedef std::vector<kt_double> RangeReadingsVector;
4983 
4988  {
4989  public:
4990  // @cond EXCLUDE
4992  // @endcond
4993 
4994  public:
4999  LaserRangeScan(const Name& rSensorName)
5000  : SensorData(rSensorName)
5001  , m_pRangeReadings(NULL)
5002  , m_NumberOfRangeReadings(0)
5003  {
5004  }
5005 
5011  LaserRangeScan(const Name& rSensorName, const RangeReadingsVector& rRangeReadings)
5012  : SensorData(rSensorName)
5013  , m_pRangeReadings(NULL)
5014  , m_NumberOfRangeReadings(0)
5015  {
5016  assert(rSensorName.ToString() != "");
5017 
5018  SetRangeReadings(rRangeReadings);
5019  }
5020 
5025  {
5026  delete [] m_pRangeReadings;
5027  }
5028 
5029  public:
5034  inline kt_double* GetRangeReadings() const
5035  {
5036  return m_pRangeReadings;
5037  }
5038 
5040  {
5041  return RangeReadingsVector(m_pRangeReadings, m_pRangeReadings + m_NumberOfRangeReadings);
5042  }
5043 
5048  inline void SetRangeReadings(const RangeReadingsVector& rRangeReadings)
5049  {
5050  // ignore for now! XXXMAE BUGUBUG 05/21/2010 << TODO(lucbettaieb): What the heck is this??
5051  // if (rRangeReadings.size() != GetNumberOfRangeReadings())
5052  // {
5053  // std::stringstream error;
5054  // error << "Given number of readings (" << rRangeReadings.size()
5055  // << ") does not match expected number of range finder (" << GetNumberOfRangeReadings() << ")";
5056  // throw Exception(error.str());
5057  // }
5058 
5059  if (!rRangeReadings.empty())
5060  {
5061  if (rRangeReadings.size() != m_NumberOfRangeReadings)
5062  {
5063  // delete old readings
5064  delete [] m_pRangeReadings;
5065 
5066  // store size of array!
5067  m_NumberOfRangeReadings = static_cast<kt_int32u>(rRangeReadings.size());
5068 
5069  // allocate range readings
5070  m_pRangeReadings = new kt_double[m_NumberOfRangeReadings];
5071  }
5072 
5073  // copy readings
5074  kt_int32u index = 0;
5075  const_forEach(RangeReadingsVector, &rRangeReadings)
5076  {
5077  m_pRangeReadings[index++] = *iter;
5078  }
5079  }
5080  else
5081  {
5082  delete [] m_pRangeReadings;
5083  m_pRangeReadings = NULL;
5084  }
5085  }
5086 
5092  {
5093  return SensorManager::GetInstance()->GetSensorByName<LaserRangeFinder>(GetSensorName());
5094  }
5095 
5101  {
5102  return m_NumberOfRangeReadings;
5103  }
5104 
5105  private:
5107  const LaserRangeScan& operator=(const LaserRangeScan&);
5108 
5109  private:
5112  }; // LaserRangeScan
5113 
5117 
5121  class DrivePose : public SensorData
5122  {
5123  public:
5124  // @cond EXCLUDE
5126  // @endcond
5127 
5128  public:
5133  DrivePose(const Name& rSensorName)
5134  : SensorData(rSensorName)
5135  {
5136  }
5137 
5141  virtual ~DrivePose()
5142  {
5143  }
5144 
5145  public:
5150  inline const Pose3& GetOdometricPose() const
5151  {
5152  return m_OdometricPose;
5153  }
5154 
5159  inline void SetOdometricPose(const Pose3& rPose)
5160  {
5161  m_OdometricPose = rPose;
5162  }
5163 
5164  private:
5165  DrivePose(const DrivePose&);
5166  const DrivePose& operator=(const DrivePose&);
5167 
5168  private:
5173  }; // class DrivePose
5174 
5178 
5186  {
5187  public:
5188  // @cond EXCLUDE
5190  // @endcond
5191 
5192  public:
5196  LocalizedRangeScan(const Name& rSensorName, const RangeReadingsVector& rReadings)
5197  : LaserRangeScan(rSensorName, rReadings)
5198  , m_IsDirty(true)
5199  {
5200  }
5201 
5206  {
5207  }
5208 
5209  private:
5210  mutable boost::shared_mutex m_Lock;
5211 
5212  public:
5217  inline const Pose2& GetOdometricPose() const
5218  {
5219  return m_OdometricPose;
5220  }
5221 
5226  inline void SetOdometricPose(const Pose2& rPose)
5227  {
5228  m_OdometricPose = rPose;
5229  }
5230 
5239  inline const Pose2& GetCorrectedPose() const
5240  {
5241  return m_CorrectedPose;
5242  }
5243 
5248  inline void SetCorrectedPose(const Pose2& rPose)
5249  {
5250  m_CorrectedPose = rPose;
5251 
5252  m_IsDirty = true;
5253  }
5254 
5258  inline const Pose2& GetBarycenterPose() const
5259  {
5260  boost::shared_lock<boost::shared_mutex> lock(m_Lock);
5261  if (m_IsDirty)
5262  {
5263  // throw away constness and do an update!
5264  lock.unlock();
5265  boost::unique_lock<boost::shared_mutex> uniqueLock(m_Lock);
5266  const_cast<LocalizedRangeScan*>(this)->Update();
5267  }
5268 
5269  return m_BarycenterPose;
5270  }
5271 
5277  inline Pose2 GetReferencePose(kt_bool useBarycenter) const
5278  {
5279  boost::shared_lock<boost::shared_mutex> lock(m_Lock);
5280  if (m_IsDirty)
5281  {
5282  // throw away constness and do an update!
5283  lock.unlock();
5284  boost::unique_lock<boost::shared_mutex> uniqueLock(m_Lock);
5285  const_cast<LocalizedRangeScan*>(this)->Update();
5286  }
5287 
5288  return useBarycenter ? GetBarycenterPose() : GetSensorPose();
5289  }
5290 
5295  inline Pose2 GetSensorPose() const
5296  {
5297  return GetSensorAt(m_CorrectedPose);
5298  }
5299 
5304  void SetSensorPose(const Pose2& rScanPose)
5305  {
5306  Pose2 deviceOffsetPose2 = GetLaserRangeFinder()->GetOffsetPose();
5307  kt_double offsetLength = deviceOffsetPose2.GetPosition().Length();
5308  kt_double offsetHeading = deviceOffsetPose2.GetHeading();
5309  kt_double angleoffset = atan2(deviceOffsetPose2.GetY(), deviceOffsetPose2.GetX());
5310  kt_double correctedHeading = math::NormalizeAngle(rScanPose.GetHeading());
5311  Pose2 worldSensorOffset = Pose2(offsetLength * cos(correctedHeading + angleoffset - offsetHeading),
5312  offsetLength * sin(correctedHeading + angleoffset - offsetHeading),
5313  offsetHeading);
5314 
5315  m_CorrectedPose = rScanPose - worldSensorOffset;
5316 
5317  Update();
5318  }
5319 
5325  inline Pose2 GetSensorAt(const Pose2& rPose) const
5326  {
5327  return Transform(rPose).TransformPose(GetLaserRangeFinder()->GetOffsetPose());
5328  }
5329 
5334  inline const BoundingBox2& GetBoundingBox() const
5335  {
5336  boost::shared_lock<boost::shared_mutex> lock(m_Lock);
5337  if (m_IsDirty)
5338  {
5339  // throw away constness and do an update!
5340  lock.unlock();
5341  boost::unique_lock<boost::shared_mutex> uniqueLock(m_Lock);
5342  const_cast<LocalizedRangeScan*>(this)->Update();
5343  }
5344 
5345  return m_BoundingBox;
5346  }
5347 
5351  inline const PointVectorDouble& GetPointReadings(kt_bool wantFiltered = false) const
5352  {
5353  boost::shared_lock<boost::shared_mutex> lock(m_Lock);
5354  if (m_IsDirty)
5355  {
5356  // throw away constness and do an update!
5357  lock.unlock();
5358  boost::unique_lock<boost::shared_mutex> uniqueLock(m_Lock);
5359  const_cast<LocalizedRangeScan*>(this)->Update();
5360  }
5361 
5362  if (wantFiltered == true)
5363  {
5364  return m_PointReadings;
5365  }
5366  else
5367  {
5368  return m_UnfilteredPointReadings;
5369  }
5370  }
5371 
5372  private:
5377  virtual void Update()
5378  {
5379  LaserRangeFinder* pLaserRangeFinder = GetLaserRangeFinder();
5380 
5381  if (pLaserRangeFinder != NULL)
5382  {
5383  m_PointReadings.clear();
5384  m_UnfilteredPointReadings.clear();
5385 
5386  kt_double rangeThreshold = pLaserRangeFinder->GetRangeThreshold();
5387  kt_double minimumAngle = pLaserRangeFinder->GetMinimumAngle();
5388  kt_double angularResolution = pLaserRangeFinder->GetAngularResolution();
5389  Pose2 scanPose = GetSensorPose();
5390 
5391  // compute point readings
5392  Vector2<kt_double> rangePointsSum;
5393  kt_int32u beamNum = 0;
5394  for (kt_int32u i = 0; i < pLaserRangeFinder->GetNumberOfRangeReadings(); i++, beamNum++)
5395  {
5396  kt_double rangeReading = GetRangeReadings()[i];
5397  if (!math::InRange(rangeReading, pLaserRangeFinder->GetMinimumRange(), rangeThreshold))
5398  {
5399  kt_double angle = scanPose.GetHeading() + minimumAngle + beamNum * angularResolution;
5400 
5401  Vector2<kt_double> point;
5402  point.SetX(scanPose.GetX() + (rangeReading * cos(angle)));
5403  point.SetY(scanPose.GetY() + (rangeReading * sin(angle)));
5404 
5405  m_UnfilteredPointReadings.push_back(point);
5406  continue;
5407  }
5408 
5409  kt_double angle = scanPose.GetHeading() + minimumAngle + beamNum * angularResolution;
5410 
5411  Vector2<kt_double> point;
5412  point.SetX(scanPose.GetX() + (rangeReading * cos(angle)));
5413  point.SetY(scanPose.GetY() + (rangeReading * sin(angle)));
5414 
5415  m_PointReadings.push_back(point);
5416  m_UnfilteredPointReadings.push_back(point);
5417 
5418  rangePointsSum += point;
5419  }
5420 
5421  // compute barycenter
5422  kt_double nPoints = static_cast<kt_double>(m_PointReadings.size());
5423  if (nPoints != 0.0)
5424  {
5425  Vector2<kt_double> averagePosition = Vector2<kt_double>(rangePointsSum / nPoints);
5426  m_BarycenterPose = Pose2(averagePosition, 0.0);
5427  }
5428  else
5429  {
5430  m_BarycenterPose = scanPose;
5431  }
5432 
5433  // calculate bounding box of scan
5434  m_BoundingBox = BoundingBox2();
5435  m_BoundingBox.Add(scanPose.GetPosition());
5436  forEach(PointVectorDouble, &m_PointReadings)
5437  {
5438  m_BoundingBox.Add(*iter);
5439  }
5440  }
5441 
5442  m_IsDirty = false;
5443  }
5444 
5445  private:
5447  const LocalizedRangeScan& operator=(const LocalizedRangeScan&);
5448 
5449  private:
5454 
5459 
5460  protected:
5465 
5470 
5475 
5480 
5485  }; // LocalizedRangeScan
5486 
5490  typedef std::vector<LocalizedRangeScan*> LocalizedRangeScanVector;
5491 
5495 
5500  {
5501  public:
5502  // @cond EXCLUDE
5504  // @endcond
5505 
5506  public:
5511  LocalizedRangeScanWithPoints(const Name& rSensorName, const RangeReadingsVector& rReadings,
5512  const PointVectorDouble& rPoints)
5513  : LocalizedRangeScan(rSensorName, rReadings),
5514  m_Points(rPoints)
5515  {
5516  }
5517 
5522  {
5523  }
5524 
5525  private:
5529  void Update()
5530  {
5531  m_PointReadings.clear();
5532  m_UnfilteredPointReadings.clear();
5533 
5534  Pose2 scanPose = GetSensorPose();
5535  Pose2 robotPose = GetCorrectedPose();
5536 
5537  // update point readings
5538  Vector2<kt_double> rangePointsSum;
5539  for (kt_int32u i = 0; i < m_Points.size(); i++)
5540  {
5541  // check if this has a NaN
5542  if (!std::isfinite(m_Points[i].GetX()) || !std::isfinite(m_Points[i].GetY()))
5543  {
5544  Vector2<kt_double> point(m_Points[i].GetX(), m_Points[i].GetY());
5545  m_UnfilteredPointReadings.push_back(point);
5546 
5547  continue;
5548  }
5549 
5550  // transform into world coords
5551  Pose2 pointPose(m_Points[i].GetX(), m_Points[i].GetY(), 0);
5552  Pose2 result = Transform(robotPose).TransformPose(pointPose);
5553  Vector2<kt_double> point(result.GetX(), result.GetY());
5554 
5555  m_PointReadings.push_back(point);
5556  m_UnfilteredPointReadings.push_back(point);
5557 
5558  rangePointsSum += point;
5559  }
5560 
5561  // compute barycenter
5562  kt_double nPoints = static_cast<kt_double>(m_PointReadings.size());
5563  if (nPoints != 0.0)
5564  {
5565  Vector2<kt_double> averagePosition = Vector2<kt_double>(rangePointsSum / nPoints);
5566  m_BarycenterPose = Pose2(averagePosition, 0.0);
5567  }
5568  else
5569  {
5570  m_BarycenterPose = scanPose;
5571  }
5572 
5573  // calculate bounding box of scan
5574  m_BoundingBox = BoundingBox2();
5575  m_BoundingBox.Add(scanPose.GetPosition());
5576  forEach(PointVectorDouble, &m_PointReadings)
5577  {
5578  m_BoundingBox.Add(*iter);
5579  }
5580 
5581  m_IsDirty = false;
5582  }
5583 
5584  private:
5587 
5588  private:
5590  }; // LocalizedRangeScanWithPoints
5591 
5595 
5596  class OccupancyGrid;
5597 
5599  {
5600  public:
5602  : m_pOccupancyGrid(pGrid)
5603  {
5604  }
5605 
5609  virtual ~CellUpdater() {}
5610 
5615  virtual void operator() (kt_int32u index);
5616 
5617  private:
5619  }; // CellUpdater
5620 
5624  class OccupancyGrid : public Grid<kt_int8u>
5625  {
5626  friend class CellUpdater;
5627  friend class IncrementalOccupancyGrid;
5628 
5629  public:
5637  OccupancyGrid(kt_int32s width, kt_int32s height, const Vector2<kt_double>& rOffset, kt_double resolution)
5638  : Grid<kt_int8u>(width, height)
5639  , m_pCellPassCnt(Grid<kt_int32u>::CreateGrid(0, 0, resolution))
5640  , m_pCellHitsCnt(Grid<kt_int32u>::CreateGrid(0, 0, resolution))
5641  , m_pCellUpdater(NULL)
5642  {
5643  m_pCellUpdater = new CellUpdater(this);
5644 
5645  if (karto::math::DoubleEqual(resolution, 0.0))
5646  {
5647  throw Exception("Resolution cannot be 0");
5648  }
5649 
5650  m_pMinPassThrough = new Parameter<kt_int32u>("MinPassThrough", 2);
5651  m_pOccupancyThreshold = new Parameter<kt_double>("OccupancyThreshold", 0.1);
5652 
5653  GetCoordinateConverter()->SetScale(1.0 / resolution);
5654  GetCoordinateConverter()->SetOffset(rOffset);
5655  }
5656 
5660  virtual ~OccupancyGrid()
5661  {
5662  delete m_pCellUpdater;
5663 
5664  delete m_pCellPassCnt;
5665  delete m_pCellHitsCnt;
5666 
5667  delete m_pMinPassThrough;
5668  delete m_pOccupancyThreshold;
5669  }
5670 
5671  public:
5678  {
5679  if (rScans.empty())
5680  {
5681  return NULL;
5682  }
5683 
5684  kt_int32s width, height;
5685  Vector2<kt_double> offset;
5686  ComputeDimensions(rScans, resolution, width, height, offset);
5687  OccupancyGrid* pOccupancyGrid = new OccupancyGrid(width, height, offset, resolution);
5688  pOccupancyGrid->CreateFromScans(rScans);
5689 
5690  return pOccupancyGrid;
5691  }
5692 
5698  {
5699  OccupancyGrid* pOccupancyGrid = new OccupancyGrid(GetWidth(),
5700  GetHeight(),
5701  GetCoordinateConverter()->GetOffset(),
5702  1.0 / GetCoordinateConverter()->GetScale());
5703  memcpy(pOccupancyGrid->GetDataPointer(), GetDataPointer(), GetDataSize());
5704 
5705  pOccupancyGrid->GetCoordinateConverter()->SetSize(GetCoordinateConverter()->GetSize());
5706  pOccupancyGrid->m_pCellPassCnt = m_pCellPassCnt->Clone();
5707  pOccupancyGrid->m_pCellHitsCnt = m_pCellHitsCnt->Clone();
5708 
5709  return pOccupancyGrid;
5710  }
5711 
5717  virtual kt_bool IsFree(const Vector2<kt_int32s>& rPose) const
5718  {
5719  kt_int8u* pOffsets = reinterpret_cast<kt_int8u*>(GetDataPointer(rPose));
5720  if (*pOffsets == GridStates_Free)
5721  {
5722  return true;
5723  }
5724 
5725  return false;
5726  }
5727 
5735  virtual kt_double RayCast(const Pose2& rPose2, kt_double maxRange) const
5736  {
5737  double scale = GetCoordinateConverter()->GetScale();
5738 
5739  kt_double x = rPose2.GetX();
5740  kt_double y = rPose2.GetY();
5741  kt_double theta = rPose2.GetHeading();
5742 
5743  kt_double sinTheta = sin(theta);
5744  kt_double cosTheta = cos(theta);
5745 
5746  kt_double xStop = x + maxRange * cosTheta;
5747  kt_double xSteps = 1 + fabs(xStop - x) * scale;
5748 
5749  kt_double yStop = y + maxRange * sinTheta;
5750  kt_double ySteps = 1 + fabs(yStop - y) * scale;
5751 
5752  kt_double steps = math::Maximum(xSteps, ySteps);
5753  kt_double delta = maxRange / steps;
5754  kt_double distance = delta;
5755 
5756  for (kt_int32u i = 1; i < steps; i++)
5757  {
5758  kt_double x1 = x + distance * cosTheta;
5759  kt_double y1 = y + distance * sinTheta;
5760 
5761  Vector2<kt_int32s> gridIndex = WorldToGrid(Vector2<kt_double>(x1, y1));
5762  if (IsValidGridIndex(gridIndex) && IsFree(gridIndex))
5763  {
5764  distance = (i + 1) * delta;
5765  }
5766  else
5767  {
5768  break;
5769  }
5770  }
5771 
5772  return (distance < maxRange)? distance : maxRange;
5773  }
5774 
5781  {
5782  m_pMinPassThrough->SetValue(count);
5783  }
5784 
5790  {
5791  m_pOccupancyThreshold->SetValue(thresh);
5792  }
5793 
5794  protected:
5800  {
5801  return m_pCellHitsCnt;
5802  }
5803 
5809  {
5810  return m_pCellPassCnt;
5811  }
5812 
5813  protected:
5822  static void ComputeDimensions(const LocalizedRangeScanVector& rScans,
5823  kt_double resolution,
5824  kt_int32s& rWidth,
5825  kt_int32s& rHeight,
5826  Vector2<kt_double>& rOffset)
5827  {
5828  BoundingBox2 boundingBox;
5830  {
5831  boundingBox.Add((*iter)->GetBoundingBox());
5832  }
5833 
5834  kt_double scale = 1.0 / resolution;
5835  Size2<kt_double> size = boundingBox.GetSize();
5836 
5837  rWidth = static_cast<kt_int32s>(math::Round(size.GetWidth() * scale));
5838  rHeight = static_cast<kt_int32s>(math::Round(size.GetHeight() * scale));
5839  rOffset = boundingBox.GetMinimum();
5840  }
5841 
5846  virtual void CreateFromScans(const LocalizedRangeScanVector& rScans)
5847  {
5848  m_pCellPassCnt->Resize(GetWidth(), GetHeight());
5849  m_pCellPassCnt->GetCoordinateConverter()->SetOffset(GetCoordinateConverter()->GetOffset());
5850 
5851  m_pCellHitsCnt->Resize(GetWidth(), GetHeight());
5852  m_pCellHitsCnt->GetCoordinateConverter()->SetOffset(GetCoordinateConverter()->GetOffset());
5853 
5855  {
5856  LocalizedRangeScan* pScan = *iter;
5857  AddScan(pScan);
5858  }
5859 
5860  Update();
5861  }
5862 
5870  virtual kt_bool AddScan(LocalizedRangeScan* pScan, kt_bool doUpdate = false)
5871  {
5872  kt_double rangeThreshold = pScan->GetLaserRangeFinder()->GetRangeThreshold();
5873  kt_double maxRange = pScan->GetLaserRangeFinder()->GetMaximumRange();
5874  kt_double minRange = pScan->GetLaserRangeFinder()->GetMinimumRange();
5875 
5876  Vector2<kt_double> scanPosition = pScan->GetSensorPose().GetPosition();
5877 
5878  // get scan point readings
5879  const PointVectorDouble& rPointReadings = pScan->GetPointReadings(false);
5880 
5881  kt_bool isAllInMap = true;
5882 
5883  // draw lines from scan position to all point readings
5884  int pointIndex = 0;
5885  const_forEachAs(PointVectorDouble, &rPointReadings, pointsIter)
5886  {
5887  Vector2<kt_double> point = *pointsIter;
5888  kt_double rangeReading = pScan->GetRangeReadings()[pointIndex];
5889  kt_bool isEndPointValid = rangeReading < (rangeThreshold - KT_TOLERANCE);
5890 
5891  if (rangeReading <= minRange || rangeReading >= maxRange || std::isnan(rangeReading))
5892  {
5893  // ignore these readings
5894  pointIndex++;
5895  continue;
5896  }
5897  else if (rangeReading >= rangeThreshold)
5898  {
5899  // trace up to range reading
5900  kt_double ratio = rangeThreshold / rangeReading;
5901  kt_double dx = point.GetX() - scanPosition.GetX();
5902  kt_double dy = point.GetY() - scanPosition.GetY();
5903  point.SetX(scanPosition.GetX() + ratio * dx);
5904  point.SetY(scanPosition.GetY() + ratio * dy);
5905  }
5906 
5907  kt_bool isInMap = RayTrace(scanPosition, point, isEndPointValid, doUpdate);
5908  if (!isInMap)
5909  {
5910  isAllInMap = false;
5911  }
5912 
5913  pointIndex++;
5914  }
5915 
5916  return isAllInMap;
5917  }
5918 
5928  virtual kt_bool RayTrace(const Vector2<kt_double>& rWorldFrom,
5929  const Vector2<kt_double>& rWorldTo,
5930  kt_bool isEndPointValid,
5931  kt_bool doUpdate = false)
5932  {
5933  assert(m_pCellPassCnt != NULL && m_pCellHitsCnt != NULL);
5934 
5935  Vector2<kt_int32s> gridFrom = m_pCellPassCnt->WorldToGrid(rWorldFrom);
5936  Vector2<kt_int32s> gridTo = m_pCellPassCnt->WorldToGrid(rWorldTo);
5937 
5938  CellUpdater* pCellUpdater = doUpdate ? m_pCellUpdater : NULL;
5939  m_pCellPassCnt->TraceLine(gridFrom.GetX(), gridFrom.GetY(), gridTo.GetX(), gridTo.GetY(), pCellUpdater);
5940 
5941  // for the end point
5942  if (isEndPointValid)
5943  {
5944  if (m_pCellPassCnt->IsValidGridIndex(gridTo))
5945  {
5946  kt_int32s index = m_pCellPassCnt->GridIndex(gridTo, false);
5947 
5948  kt_int32u* pCellPassCntPtr = m_pCellPassCnt->GetDataPointer();
5949  kt_int32u* pCellHitCntPtr = m_pCellHitsCnt->GetDataPointer();
5950 
5951  // increment cell pass through and hit count
5952  pCellPassCntPtr[index]++;
5953  pCellHitCntPtr[index]++;
5954 
5955  if (doUpdate)
5956  {
5957  (*m_pCellUpdater)(index);
5958  }
5959  }
5960  }
5961 
5962  return m_pCellPassCnt->IsValidGridIndex(gridTo);
5963  }
5964 
5971  virtual void UpdateCell(kt_int8u* pCell, kt_int32u cellPassCnt, kt_int32u cellHitCnt)
5972  {
5973  if (cellPassCnt > m_pMinPassThrough->GetValue())
5974  {
5975  kt_double hitRatio = static_cast<kt_double>(cellHitCnt) / static_cast<kt_double>(cellPassCnt);
5976 
5977  if (hitRatio > m_pOccupancyThreshold->GetValue())
5978  {
5979  *pCell = GridStates_Occupied;
5980  }
5981  else
5982  {
5983  *pCell = GridStates_Free;
5984  }
5985  }
5986  }
5987 
5991  virtual void Update()
5992  {
5993  assert(m_pCellPassCnt != NULL && m_pCellHitsCnt != NULL);
5994 
5995  // clear grid
5996  Clear();
5997 
5998  // set occupancy status of cells
5999  kt_int8u* pDataPtr = GetDataPointer();
6000  kt_int32u* pCellPassCntPtr = m_pCellPassCnt->GetDataPointer();
6001  kt_int32u* pCellHitCntPtr = m_pCellHitsCnt->GetDataPointer();
6002 
6003  kt_int32u nBytes = GetDataSize();
6004  for (kt_int32u i = 0; i < nBytes; i++, pDataPtr++, pCellPassCntPtr++, pCellHitCntPtr++)
6005  {
6006  UpdateCell(pDataPtr, *pCellPassCntPtr, *pCellHitCntPtr);
6007  }
6008  }
6009 
6015  virtual void Resize(kt_int32s width, kt_int32s height)
6016  {
6017  Grid<kt_int8u>::Resize(width, height);
6018  m_pCellPassCnt->Resize(width, height);
6019  m_pCellHitsCnt->Resize(width, height);
6020  }
6021 
6022  protected:
6027 
6032 
6033  private:
6037  OccupancyGrid(const OccupancyGrid&);
6038 
6042  const OccupancyGrid& operator=(const OccupancyGrid&);
6043 
6044  private:
6046 
6048  // NOTE: These two values are dependent on the resolution. If the resolution is too small,
6049  // then not many beams will hit the cell!
6050 
6051  // Number of beams that must pass through a cell before it will be considered to be occupied
6052  // or unoccupied. This prevents stray beams from messing up the map.
6054 
6055  // Minimum ratio of beams hitting cell to beams passing through cell for cell to be marked as occupied
6057  }; // OccupancyGrid
6058 
6062 
6067  class DatasetInfo : public Object
6068  {
6069  public:
6070  // @cond EXCLUDE
6072  // @endcond
6073 
6074  public:
6076  : Object()
6077  {
6078  m_pTitle = new Parameter<std::string>("Title", "", GetParameterManager());
6079  m_pAuthor = new Parameter<std::string>("Author", "", GetParameterManager());
6080  m_pDescription = new Parameter<std::string>("Description", "", GetParameterManager());
6081  m_pCopyright = new Parameter<std::string>("Copyright", "", GetParameterManager());
6082  }
6083 
6084  virtual ~DatasetInfo()
6085  {
6086  }
6087 
6088  public:
6092  const std::string& GetTitle() const
6093  {
6094  return m_pTitle->GetValue();
6095  }
6096 
6100  const std::string& GetAuthor() const
6101  {
6102  return m_pAuthor->GetValue();
6103  }
6104 
6108  const std::string& GetDescription() const
6109  {
6110  return m_pDescription->GetValue();
6111  }
6112 
6116  const std::string& GetCopyright() const
6117  {
6118  return m_pCopyright->GetValue();
6119  }
6120 
6121  private:
6122  DatasetInfo(const DatasetInfo&);
6123  const DatasetInfo& operator=(const DatasetInfo&);
6124 
6125  private:
6130  }; // class DatasetInfo
6131 
6135 
6140  class Dataset
6141  {
6142  public:
6147  : m_pDatasetInfo(NULL)
6148  {
6149  }
6150 
6154  virtual ~Dataset()
6155  {
6156  Clear();
6157  }
6158 
6159  public:
6164  void Add(Object* pObject)
6165  {
6166  if (pObject != NULL)
6167  {
6168  if (dynamic_cast<Sensor*>(pObject))
6169  {
6170  Sensor* pSensor = dynamic_cast<Sensor*>(pObject);
6171  if (pSensor != NULL)
6172  {
6173  m_SensorNameLookup[pSensor->GetName()] = pSensor;
6174 
6176  }
6177 
6178  m_Objects.push_back(pObject);
6179  }
6180  else if (dynamic_cast<SensorData*>(pObject))
6181  {
6182  SensorData* pSensorData = dynamic_cast<SensorData*>(pObject);
6183  m_Objects.push_back(pSensorData);
6184  }
6185  else if (dynamic_cast<DatasetInfo*>(pObject))
6186  {
6187  m_pDatasetInfo = dynamic_cast<DatasetInfo*>(pObject);
6188  }
6189  else
6190  {
6191  m_Objects.push_back(pObject);
6192  }
6193  }
6194  }
6195 
6200  inline const ObjectVector& GetObjects() const
6201  {
6202  return m_Objects;
6203  }
6204 
6210  {
6211  return m_pDatasetInfo;
6212  }
6213 
6217  virtual void Clear()
6218  {
6219  for (std::map<Name, Sensor*>::iterator iter = m_SensorNameLookup.begin(); iter != m_SensorNameLookup.end(); ++iter)
6220  {
6222  }
6223 
6224  forEach(ObjectVector, &m_Objects)
6225  {
6226  delete *iter;
6227  }
6228 
6229  m_Objects.clear();
6230 
6231  if (m_pDatasetInfo != NULL)
6232  {
6233  delete m_pDatasetInfo;
6234  m_pDatasetInfo = NULL;
6235  }
6236  }
6237 
6238  private:
6239  std::map<Name, Sensor*> m_SensorNameLookup;
6242  }; // Dataset
6243 
6247 
6253  {
6254  public:
6259  : m_pArray(NULL)
6260  , m_Capacity(0)
6261  , m_Size(0)
6262  {
6263  }
6264 
6268  virtual ~LookupArray()
6269  {
6270  assert(m_pArray != NULL);
6271 
6272  delete[] m_pArray;
6273  m_pArray = NULL;
6274  }
6275 
6276  public:
6280  void Clear()
6281  {
6282  memset(m_pArray, 0, sizeof(kt_int32s) * m_Capacity);
6283  }
6284 
6290  {
6291  return m_Size;
6292  }
6293 
6298  void SetSize(kt_int32u size)
6299  {
6300  assert(size != 0);
6301 
6302  if (size > m_Capacity)
6303  {
6304  if (m_pArray != NULL)
6305  {
6306  delete [] m_pArray;
6307  }
6308  m_Capacity = size;
6309  m_pArray = new kt_int32s[m_Capacity];
6310  }
6311 
6312  m_Size = size;
6313  }
6314 
6320  inline kt_int32s& operator [] (kt_int32u index)
6321  {
6322  assert(index < m_Size);
6323 
6324  return m_pArray[index];
6325  }
6326 
6332  inline kt_int32s operator [] (kt_int32u index) const
6333  {
6334  assert(index < m_Size);
6335 
6336  return m_pArray[index];
6337  }
6338 
6344  {
6345  return m_pArray;
6346  }
6347 
6352  inline kt_int32s* GetArrayPointer() const
6353  {
6354  return m_pArray;
6355  }
6356 
6357  private:
6361  }; // LookupArray
6362 
6366 
6380  template<typename T>
6382  {
6383  public:
6389  : m_pGrid(pGrid)
6390  , m_Capacity(0)
6391  , m_Size(0)
6392  , m_ppLookupArray(NULL)
6393  {
6394  }
6395 
6400  {
6401  DestroyArrays();
6402  }
6403 
6404  public:
6411  {
6412  assert(math::IsUpTo(index, m_Size));
6413 
6414  return m_ppLookupArray[index];
6415  }
6416 
6421  const std::vector<kt_double>& GetAngles() const
6422  {
6423  return m_Angles;
6424  }
6425 
6434  kt_double angleCenter,
6435  kt_double angleOffset,
6436  kt_double angleResolution)
6437  {
6438  assert(angleOffset != 0.0);
6439  assert(angleResolution != 0.0);
6440 
6441  kt_int32u nAngles = static_cast<kt_int32u>(math::Round(angleOffset * 2.0 / angleResolution) + 1);
6442  SetSize(nAngles);
6443 
6445  // convert points into local coordinates of scan pose
6446 
6447  const PointVectorDouble& rPointReadings = pScan->GetPointReadings();
6448 
6449  // compute transform to scan pose
6450  Transform transform(pScan->GetSensorPose());
6451 
6452  Pose2Vector localPoints;
6453  const_forEach(PointVectorDouble, &rPointReadings)
6454  {
6455  // do inverse transform to get points in local coordinates
6456  Pose2 vec = transform.InverseTransformPose(Pose2(*iter, 0.0));
6457  localPoints.push_back(vec);
6458  }
6459 
6461  // create lookup array for different angles
6462  kt_double angle = 0.0;
6463  kt_double startAngle = angleCenter - angleOffset;
6464  for (kt_int32u angleIndex = 0; angleIndex < nAngles; angleIndex++)
6465  {
6466  angle = startAngle + angleIndex * angleResolution;
6467  ComputeOffsets(angleIndex, angle, localPoints, pScan);
6468  }
6469  // assert(math::DoubleEqual(angle, angleCenter + angleOffset));
6470  }
6471 
6472  private:
6479  void ComputeOffsets(kt_int32u angleIndex, kt_double angle, const Pose2Vector& rLocalPoints, LocalizedRangeScan* pScan)
6480  {
6481  m_ppLookupArray[angleIndex]->SetSize(static_cast<kt_int32u>(rLocalPoints.size()));
6482  m_Angles.at(angleIndex) = angle;
6483 
6484  // set up point array by computing relative offsets to points readings
6485  // when rotated by given angle
6486 
6487  const Vector2<kt_double>& rGridOffset = m_pGrid->GetCoordinateConverter()->GetOffset();
6488 
6489  kt_double cosine = cos(angle);
6490  kt_double sine = sin(angle);
6491 
6492  kt_int32u readingIndex = 0;
6493 
6494  kt_int32s* pAngleIndexPointer = m_ppLookupArray[angleIndex]->GetArrayPointer();
6495 
6496  kt_double maxRange = pScan->GetLaserRangeFinder()->GetMaximumRange();
6497 
6498  const_forEach(Pose2Vector, &rLocalPoints)
6499  {
6500  const Vector2<kt_double>& rPosition = iter->GetPosition();
6501 
6502  if (std::isnan(pScan->GetRangeReadings()[readingIndex]) || std::isinf(pScan->GetRangeReadings()[readingIndex]))
6503  {
6504  pAngleIndexPointer[readingIndex] = INVALID_SCAN;
6505  readingIndex++;
6506  continue;
6507  }
6508 
6509 
6510  // counterclockwise rotation and that rotation is about the origin (0, 0).
6511  Vector2<kt_double> offset;
6512  offset.SetX(cosine * rPosition.GetX() - sine * rPosition.GetY());
6513  offset.SetY(sine * rPosition.GetX() + cosine * rPosition.GetY());
6514 
6515  // have to compensate for the grid offset when getting the grid index
6516  Vector2<kt_int32s> gridPoint = m_pGrid->WorldToGrid(offset + rGridOffset);
6517 
6518  // use base GridIndex to ignore ROI
6519  kt_int32s lookupIndex = m_pGrid->Grid<T>::GridIndex(gridPoint, false);
6520 
6521  pAngleIndexPointer[readingIndex] = lookupIndex;
6522 
6523  readingIndex++;
6524  }
6525  assert(readingIndex == rLocalPoints.size());
6526  }
6527 
6532  void SetSize(kt_int32u size)
6533  {
6534  assert(size != 0);
6535 
6536  if (size > m_Capacity)
6537  {
6538  if (m_ppLookupArray != NULL)
6539  {
6540  DestroyArrays();
6541  }
6542 
6543  m_Capacity = size;
6544  m_ppLookupArray = new LookupArray*[m_Capacity];
6545  for (kt_int32u i = 0; i < m_Capacity; i++)
6546  {
6547  m_ppLookupArray[i] = new LookupArray();
6548  }
6549  }
6550 
6551  m_Size = size;
6552 
6553  m_Angles.resize(size);
6554  }
6555 
6560  {
6561  for (kt_int32u i = 0; i < m_Capacity; i++)
6562  {
6563  delete m_ppLookupArray[i];
6564  }
6565 
6566  delete[] m_ppLookupArray;
6567  m_ppLookupArray = NULL;
6568  }
6569 
6570  private:
6572 
6575 
6577 
6578  // for sanity check
6579  std::vector<kt_double> m_Angles;
6580  }; // class GridIndexLookup
6581 
6585 
6586  inline Pose2::Pose2(const Pose3& rPose)
6587  : m_Position(rPose.GetPosition().GetX(), rPose.GetPosition().GetY())
6588  {
6589  kt_double t1, t2;
6590 
6591  // calculates heading from orientation
6592  rPose.GetOrientation().ToEulerAngles(m_Heading, t1, t2);
6593  }
6594 
6598 
6599  // @cond EXCLUDE
6600 
6601  template<typename T>
6602  inline void Object::SetParameter(const std::string& rName, T value)
6603  {
6604  AbstractParameter* pParameter = GetParameter(rName);
6605  if (pParameter != NULL)
6606  {
6607  std::stringstream stream;
6608  stream << value;
6609  pParameter->SetValueFromString(stream.str());
6610  }
6611  else
6612  {
6613  throw Exception("Parameter does not exist: " + rName);
6614  }
6615  }
6616 
6617  template<>
6618  inline void Object::SetParameter(const std::string& rName, kt_bool value)
6619  {
6620  AbstractParameter* pParameter = GetParameter(rName);
6621  if (pParameter != NULL)
6622  {
6623  pParameter->SetValueFromString(value ? "true" : "false");
6624  }
6625  else
6626  {
6627  throw Exception("Parameter does not exist: " + rName);
6628  }
6629  }
6630 
6631  // @endcond
6632 
6634 } // namespace karto
6635 
6636 #endif // OPEN_KARTO_KARTO_H
karto::OccupancyGrid::RayCast
virtual kt_double RayCast(const Pose2 &rPose2, kt_double maxRange) const
Definition: Karto.h:5735
karto::Exception::Exception
Exception(const Exception &rException)
Definition: Karto.h:101
karto::Name
Definition: Karto.h:354
const_forEach
#define const_forEach(listtype, list)
Definition: Macros.h:72
karto::math::Round
kt_double Round(kt_double value)
Definition: Math.h:87
karto::Name::operator<<
friend std::ostream & operator<<(std::ostream &rStream, const Name &rName)
Definition: Karto.h:497
karto::Vector2::operator+=
void operator+=(const Vector2 &rOther)
Definition: Karto.h:1050
karto::Vector2::operator>>
friend std::istream & operator>>(std::istream &rStream, const Vector2 &)
Definition: Karto.h:1191
karto::ParameterEnum::~ParameterEnum
virtual ~ParameterEnum()
Definition: Karto.h:3277
karto::Rectangle2::m_Size
Size2< T > m_Size
Definition: Karto.h:1945
karto::CoordinateConverter::m_Size
Size2< kt_int32s > m_Size
Definition: Karto.h:4377
karto::Vector3::m_Values
T m_Values[3]
Definition: Karto.h:1472
karto::Pose2::SquaredDistance
kt_double SquaredDistance(const Pose2 &rOther) const
Definition: Karto.h:2082
karto::LaserRangeFinder::GetMinimumRange
kt_double GetMinimumRange() const
Definition: Karto.h:3741
karto::Singleton
Definition: Karto.h:190
karto::Quaternion::GetX
kt_double GetX() const
Definition: Karto.h:1545
karto::LaserRangeFinder::m_pMaximumRange
Parameter< kt_double > * m_pMaximumRange
Definition: Karto.h:4184
karto::KT_TOLERANCE
const kt_double KT_TOLERANCE
Definition: Math.h:41
karto::Transform::TransformPose
Pose2 TransformPose(const Pose2 &rSourcePose)
Definition: Karto.h:2890
karto::Size2::Size2
Size2()
Definition: Karto.h:814
karto::Quaternion::operator=
Quaternion & operator=(const Quaternion &rQuaternion)
Definition: Karto.h:1683
karto::Vector2::operator!=
kt_bool operator!=(const Vector2 &rOther) const
Definition: Karto.h:1156
karto::Rectangle2
Definition: Karto.h:1744
karto::Name::SetName
void SetName(const std::string &rName)
Definition: Karto.h:402
karto::LocalizedRangeScan::GetBoundingBox
const BoundingBox2 & GetBoundingBox() const
Definition: Karto.h:5334
karto::Pose2::m_Heading
kt_double m_Heading
Definition: Karto.h:2168
karto::Grid::~Grid
virtual ~Grid()
Definition: Karto.h:4413
karto::SensorManager::RegisterSensor
void RegisterSensor(Sensor *pSensor, kt_bool override=false)
Definition: Karto.h:3544
karto::Vector2::Vector2
Vector2()
Definition: Karto.h:935
karto::Size2::operator!=
kt_bool operator!=(const Size2 &rOther) const
Definition: Karto.h:900
karto::LookupArray::m_Capacity
kt_int32u m_Capacity
Definition: Karto.h:6359
karto::Vector2::operator-
const Vector2 operator-(const Vector2 &rOther) const
Definition: Karto.h:1080
karto::ParameterEnum::SetValueFromString
virtual void SetValueFromString(const std::string &rStringValue)
Definition: Karto.h:3299
karto::Pose2::Pose2
Pose2(kt_double x, kt_double y, kt_double heading)
Definition: Karto.h:1985
karto::LaserRangeFinder::Update
void Update()
Definition: Karto.h:4165
karto::Pose3::Pose3
Pose3()
Definition: Karto.h:2193
karto::ParameterEnum::Clone
virtual Parameter< kt_int32s > * Clone()
Definition: Karto.h:3286
karto::OccupancyGrid::m_pOccupancyThreshold
Parameter< kt_double > * m_pOccupancyThreshold
Definition: Karto.h:6056
karto::GridIndexLookup::ComputeOffsets
void ComputeOffsets(LocalizedRangeScan *pScan, kt_double angleCenter, kt_double angleOffset, kt_double angleResolution)
Definition: Karto.h:6433
karto::BoundingBox2::SetMinimum
void SetMinimum(const Vector2< kt_double > &mMinimum)
Definition: Karto.h:2790
karto::Pose2Vector
std::vector< Pose2 > Pose2Vector
Definition: Karto.h:2174
karto::Pose2::Pose2
Pose2(const Vector2< kt_double > &rPosition, kt_double heading)
Definition: Karto.h:1973
karto::LaserRangeScan::GetLaserRangeFinder
LaserRangeFinder * GetLaserRangeFinder() const
Definition: Karto.h:5091
karto::Size2::m_Width
T m_Width
Definition: Karto.h:917
karto::Vector2::Distance
kt_double Distance(const Vector2 &rOther) const
Definition: Karto.h:1041
karto::LaserRangeFinder::SetAngularResolution
void SetAngularResolution(kt_double angularResolution)
Definition: Karto.h:3854
karto::LookupArray::m_pArray
kt_int32s * m_pArray
Definition: Karto.h:6358
karto::Object::GetName
const Name & GetName() const
Definition: Karto.h:614
karto::Vector3::operator==
kt_bool operator==(const Vector3 &rOther) const
Definition: Karto.h:1432
ObjectType_None
const kt_objecttype ObjectType_None
Definition: Karto.h:52
karto::Grid::GetWidthStep
kt_int32s GetWidthStep() const
Definition: Karto.h:4610
kt_double
double kt_double
Definition: Types.h:67
Macros.h
karto::NonCopyable
Definition: Karto.h:166
karto::Rectangle2::Rectangle2
Rectangle2(const Rectangle2 &rOther)
Definition: Karto.h:1781
karto::CoordinateConverter::WorldToGrid
Vector2< kt_int32s > WorldToGrid(const Vector2< kt_double > &rWorld, kt_bool flipY=false) const
Definition: Karto.h:4246
karto::Parameter::m_Value
T m_Value
Definition: Karto.h:3202
karto::LocalizedRangeScan::GetOdometricPose
const Pose2 & GetOdometricPose() const
Definition: Karto.h:5217
karto::LaserRangeFinder
Definition: Karto.h:3721
karto::LocalizedRangeScan::GetReferencePose
Pose2 GetReferencePose(kt_bool useBarycenter) const
Definition: Karto.h:5277
karto::CoordinateConverter::SetSize
void SetSize(const Size2< kt_int32s > &rSize)
Definition: Karto.h:4326
karto::LocalizedRangeScanWithPoints::m_Points
const PointVectorDouble m_Points
Definition: Karto.h:5589
karto::Pose2::GetPosition
const Vector2< kt_double > & GetPosition() const
Definition: Karto.h:2046
karto::SensorManager::GetSensorByName
Sensor * GetSensorByName(const Name &rName)
Definition: Karto.h:3585
karto::CoordinateConverter::m_Scale
kt_double m_Scale
Definition: Karto.h:4378
karto::LocalizedRangeScan::m_BarycenterPose
Pose2 m_BarycenterPose
Definition: Karto.h:5464
karto::LocalizedRangeScan::GetSensorPose
Pose2 GetSensorPose() const
Definition: Karto.h:5295
karto::Dataset::GetObjects
const ObjectVector & GetObjects() const
Definition: Karto.h:6200
karto::Pose2::SetPosition
void SetPosition(const Vector2< kt_double > &rPosition)
Definition: Karto.h:2055
karto::OccupancyGrid::AddScan
virtual kt_bool AddScan(LocalizedRangeScan *pScan, kt_bool doUpdate=false)
Definition: Karto.h:5870
karto::LaserRangeScan::SetRangeReadings
void SetRangeReadings(const RangeReadingsVector &rRangeReadings)
Definition: Karto.h:5048
karto::OccupancyGrid::GetCellPassCounts
virtual Grid< kt_int32u > * GetCellPassCounts()
Definition: Karto.h:5808
karto::IsParameters
kt_bool IsParameters(Object *pObject)
Definition: Karto.h:740
karto::AbstractParameter::AbstractParameter
AbstractParameter(const std::string &rName, ParameterManager *pParameterManger=NULL)
Definition: Karto.h:2988
karto::Object::GetParameters
const ParameterVector & GetParameters() const
Definition: Karto.h:662
karto::Rectangle2::GetX
T GetX() const
Definition: Karto.h:1792
karto::Quaternion::SetX
void SetX(kt_double x)
Definition: Karto.h:1554
karto::Parameter::SetValue
void SetValue(const T &rValue)
Definition: Karto.h:3141
karto::LaserRangeFinder::~LaserRangeFinder
virtual ~LaserRangeFinder()
Definition: Karto.h:3732
karto::Matrix3::InverseFast
kt_bool InverseFast(Matrix3 &rkInverse, kt_double fTolerance=KT_TOLERANCE) const
Definition: Karto.h:2463
karto::AbstractParameter::Clone
virtual AbstractParameter * Clone()=0
karto::ParameterManager::GetParameterVector
const ParameterVector & GetParameterVector() const
Definition: Karto.h:319
karto::LocalizedRangeScan::m_BoundingBox
BoundingBox2 m_BoundingBox
Definition: Karto.h:5479
karto::IsLocalizedRangeScanWithPoints
kt_bool IsLocalizedRangeScanWithPoints(Object *pObject)
Definition: Karto.h:730
karto::Module
Definition: Karto.h:762
karto::BoundingBox2::BoundingBox2
BoundingBox2()
Definition: Karto.h:2772
karto::OccupancyGrid
Definition: Karto.h:5624
karto::CellUpdater::CellUpdater
CellUpdater(OccupancyGrid *pGrid)
Definition: Karto.h:5601
karto::LookupArray::~LookupArray
virtual ~LookupArray()
Definition: Karto.h:6268
karto::Quaternion::SetW
void SetW(kt_double w)
Definition: Karto.h:1608
karto::OccupancyGrid::GetCellHitsCounts
virtual Grid< kt_int32u > * GetCellHitsCounts()
Definition: Karto.h:5799
karto::Matrix3::operator<<
friend std::ostream & operator<<(std::ostream &rStream, const Matrix3 &rMatrix)
Definition: Karto.h:2611
karto::Pose3::operator<<
friend std::ostream & operator<<(std::ostream &rStream, const Pose3 &rPose)
Definition: Karto.h:2319
karto::Quaternion::FromEulerAngles
void FromEulerAngles(kt_double yaw, kt_double pitch, kt_double roll)
Definition: Karto.h:1657
karto::Rectangle2::SetY
void SetY(T y)
Definition: Karto.h:1819
karto::IsLocalizedRangeScan
kt_bool IsLocalizedRangeScan(Object *pObject)
Definition: Karto.h:720
karto::GridStates
GridStates
Definition: Karto.h:4202
karto::Exception::GetErrorMessage
const std::string & GetErrorMessage() const
Definition: Karto.h:131
karto::math::DegreesToRadians
kt_double DegreesToRadians(kt_double degrees)
Definition: Math.h:56
karto::Pose2::GetY
kt_double GetY() const
Definition: Karto.h:2028
karto::Vector3::GetZ
const T & GetZ() const
Definition: Karto.h:1292
karto::DatasetInfo::GetTitle
const std::string & GetTitle() const
Definition: Karto.h:6092
karto::LaserRangeFinder::m_NumberOfRangeReadings
kt_int32u m_NumberOfRangeReadings
Definition: Karto.h:4190
karto::BoundingBox2::Add
void Add(const BoundingBox2 &rBoundingBox)
Definition: Karto.h:2833
karto::Quaternion::m_Values
kt_double m_Values[4]
Definition: Karto.h:1732
karto::Name::ToString
std::string ToString() const
Definition: Karto.h:435
karto::Object::GetObjectType
virtual kt_objecttype GetObjectType() const =0
karto::LocalizedRangeScan::m_UnfilteredPointReadings
PointVectorDouble m_UnfilteredPointReadings
Definition: Karto.h:5474
karto::Name::IsValidFirst
kt_bool IsValidFirst(char c)
Definition: Karto.h:563
karto::CoordinateConverter::m_Offset
Vector2< kt_double > m_Offset
Definition: Karto.h:4380
karto::AbstractParameter::~AbstractParameter
virtual ~AbstractParameter()
Definition: Karto.h:3020
karto::LookupArray::Clear
void Clear()
Definition: Karto.h:6280
karto::Dataset::m_SensorNameLookup
std::map< Name, Sensor * > m_SensorNameLookup
Definition: Karto.h:6239
karto::Vector3::operator-
const Vector3 operator-(const Vector3 &rOther) const
Definition: Karto.h:1402
karto::CoordinateConverter::GetResolution
kt_double GetResolution() const
Definition: Karto.h:4344
karto::LocalizedRangeScan::m_Lock
boost::shared_mutex m_Lock
Definition: Karto.h:5210
karto::SensorManager::SensorManager
SensorManager()
Definition: Karto.h:3519
karto::GridIndexLookup::m_Capacity
kt_int32u m_Capacity
Definition: Karto.h:6573
karto::Pose3::Pose3
Pose3(const Pose2 &rPose)
Definition: Karto.h:2229
karto::Matrix::GetColumns
kt_int32u GetColumns() const
Definition: Karto.h:2677
karto::Pose2::operator-
Pose2 operator-(const Pose2 &rOther) const
Definition: Karto.h:2139
karto::OccupancyGrid::IsFree
virtual kt_bool IsFree(const Vector2< kt_int32s > &rPose) const
Definition: Karto.h:5717
karto::Object::m_Name
Name m_Name
Definition: Karto.h:672
karto::LaserRangeScan::LaserRangeScan
LaserRangeScan(const Name &rSensorName)
Definition: Karto.h:4999
karto::Vector3::MakeFloor
void MakeFloor(const Vector3 &rOther)
Definition: Karto.h:1310
karto::OccupancyGrid::OccupancyGrid
OccupancyGrid(kt_int32s width, kt_int32s height, const Vector2< kt_double > &rOffset, kt_double resolution)
Definition: Karto.h:5637
karto::GridIndexLookup::m_pGrid
Grid< T > * m_pGrid
Definition: Karto.h:6571
karto::LookupArray
Definition: Karto.h:6252
karto::Grid::Clone
Grid * Clone()
Definition: Karto.h:4432
karto::LaserRangeFinder::GetRangeThreshold
kt_double GetRangeThreshold() const
Definition: Karto.h:3781
karto::LookupArray::m_Size
kt_int32u m_Size
Definition: Karto.h:6360
karto::LocalizedRangeScan::GetBarycenterPose
const Pose2 & GetBarycenterPose() const
Definition: Karto.h:5258
karto::SensorManager::GetSensorByName
T * GetSensorByName(const Name &rName)
Definition: Karto.h:3601
karto::LocalizedRangeScan::SetOdometricPose
void SetOdometricPose(const Pose2 &rPose)
Definition: Karto.h:5226
karto::Dataset::~Dataset
virtual ~Dataset()
Definition: Karto.h:6154
karto::LaserRangeFinder::GetMaximumAngle
kt_double GetMaximumAngle() const
Definition: Karto.h:3825
karto::Vector2::GetX
const T & GetX() const
Definition: Karto.h:957
karto::LocalizedRangeScan::m_OdometricPose
Pose2 m_OdometricPose
Definition: Karto.h:5453
karto::Matrix3::Transpose
Matrix3 Transpose() const
Definition: Karto.h:2430
karto::CoordinateConverter::SetScale
void SetScale(kt_double scale)
Definition: Karto.h:4299
karto::Transform::m_InverseRotation
Matrix3 m_InverseRotation
Definition: Karto.h:2951
karto::Vector3::SetY
void SetY(const T &y)
Definition: Karto.h:1283
karto::Size2::SetHeight
void SetHeight(T height)
Definition: Karto.h:873
karto::Vector2::m_Values
T m_Values[2]
Definition: Karto.h:1198
karto::Pose2::Pose2
Pose2()
Definition: Karto.h:1963
karto::LookupArray::LookupArray
LookupArray()
Definition: Karto.h:6258
karto::Exception::GetErrorCode
kt_int32s GetErrorCode()
Definition: Karto.h:140
karto::Pose2::operator<<
friend std::ostream & operator<<(std::ostream &rStream, const Pose2 &rPose)
Definition: Karto.h:2159
karto::Pose2::operator!=
kt_bool operator!=(const Pose2 &rOther) const
Definition: Karto.h:2110
ObjectType_Camera
const kt_objecttype ObjectType_Camera
Definition: Karto.h:60
karto::Grid::GetDataPointer
T * GetDataPointer()
Definition: Karto.h:4619
karto::Vector2::operator+
const Vector2 operator+(const Vector2 &rOther) const
Definition: Karto.h:1070
ObjectType_SensorData
const kt_objecttype ObjectType_SensorData
Definition: Karto.h:54
karto::Grid::Resize
virtual void Resize(kt_int32s width, kt_int32s height)
Definition: Karto.h:4447
karto::Matrix::Matrix
Matrix(kt_int32u rows, kt_int32u columns)
Definition: Karto.h:2634
ObjectType_Module
const kt_objecttype ObjectType_Module
Definition: Karto.h:71
karto::Vector2::MakeCeil
void MakeCeil(const Vector2 &rOther)
Definition: Karto.h:1003
karto::Vector3::Length
kt_double Length() const
Definition: Karto.h:1341
karto::Vector3::GetX
const T & GetX() const
Definition: Karto.h:1256
karto::SensorData::GetCustomData
const CustomDataVector & GetCustomData() const
Definition: Karto.h:4929
karto::LocalizedRangeScan
Definition: Karto.h:5185
karto::Matrix3::operator()
kt_double & operator()(kt_int32u row, kt_int32u column)
Definition: Karto.h:2534
karto::SensorManager::~SensorManager
virtual ~SensorManager()
Definition: Karto.h:3526
karto::Parameter::Parameter
Parameter(const std::string &rName, const std::string &rDescription, T value, ParameterManager *pParameterManger=NULL)
Definition: Karto.h:3111
karto::Vector3::ToString
std::string ToString() const
Definition: Karto.h:1350
karto::Pose3::SetOrientation
void SetOrientation(const Quaternion &rOrientation)
Definition: Karto.h:2267
karto::LookupArray::GetArrayPointer
kt_int32s * GetArrayPointer()
Definition: Karto.h:6343
karto::ParameterManager::Get
AbstractParameter * Get(const std::string &rName)
Definition: Karto.h:298
karto::Quaternion::Quaternion
Quaternion(const Quaternion &rQuaternion)
Definition: Karto.h:1532
karto::Matrix3::FromAxisAngle
void FromAxisAngle(kt_double x, kt_double y, kt_double z, const kt_double radians)
Definition: Karto.h:2395
karto::Quaternion::ToEulerAngles
void ToEulerAngles(kt_double &rYaw, kt_double &rPitch, kt_double &rRoll) const
Definition: Karto.h:1620
karto::LaserRangeFinder_Hokuyo_URG_04LX
@ LaserRangeFinder_Hokuyo_URG_04LX
Definition: Karto.h:2970
karto::Parameter::Parameter
Parameter(const std::string &rName, T value, ParameterManager *pParameterManger=NULL)
Definition: Karto.h:3098
karto::AbstractParameter::GetValueAsString
virtual const std::string GetValueAsString() const =0
karto::Quaternion::operator<<
friend std::ostream & operator<<(std::ostream &rStream, const Quaternion &rQuaternion)
Definition: Karto.h:1722
karto::Rectangle2::SetX
void SetX(T x)
Definition: Karto.h:1801
ObjectType_LocalizedRangeScanWithPoints
const kt_objecttype ObjectType_LocalizedRangeScanWithPoints
Definition: Karto.h:66
karto::LocalizedRangeScan::GetPointReadings
const PointVectorDouble & GetPointReadings(kt_bool wantFiltered=false) const
Definition: Karto.h:5351
karto::Matrix3::operator()
kt_double operator()(kt_int32u row, kt_int32u column) const
Definition: Karto.h:2545
karto::LaserRangeFinder_Sick_LMS200
@ LaserRangeFinder_Sick_LMS200
Definition: Karto.h:2966
karto::OccupancyGrid::RayTrace
virtual kt_bool RayTrace(const Vector2< kt_double > &rWorldFrom, const Vector2< kt_double > &rWorldTo, kt_bool isEndPointValid, kt_bool doUpdate=false)
Definition: Karto.h:5928
karto::DatasetInfo::DatasetInfo
DatasetInfo()
Definition: Karto.h:6075
karto::SensorData::m_SensorName
Name m_SensorName
Definition: Karto.h:4965
karto::Grid::TraceLine
void TraceLine(kt_int32s x0, kt_int32s y0, kt_int32s x1, kt_int32s y1, Functor *f=NULL)
Definition: Karto.h:4689
karto::Grid::m_Width
kt_int32s m_Width
Definition: Karto.h:4770
karto::ParameterManager::m_Parameters
ParameterVector m_Parameters
Definition: Karto.h:340
KARTO_Object
#define KARTO_Object(name)
Definition: Karto.h:46
karto::Matrix3::Clear
void Clear()
Definition: Karto.h:2383
ObjectType_Drive
const kt_objecttype ObjectType_Drive
Definition: Karto.h:58
karto::Parameters
Definition: Karto.h:3388
karto::LocalizedRangeScanWithPoints
Definition: Karto.h:5499
karto::Grid::GetDataPointer
T * GetDataPointer(const Vector2< kt_int32s > &rGrid) const
Definition: Karto.h:4573
karto::Grid::Grid
Grid(kt_int32s width, kt_int32s height)
Definition: Karto.h:4762
karto::Size2
Definition: Karto.h:808
karto::DatasetInfo::m_pCopyright
Parameter< std::string > * m_pCopyright
Definition: Karto.h:6129
karto::CoordinateConverter::GetBoundingBox
BoundingBox2 GetBoundingBox() const
Definition: Karto.h:4362
karto::Rectangle2::GetCenter
const Vector2< T > GetCenter() const
Definition: Karto.h:1910
karto::Pose3::m_Orientation
Quaternion m_Orientation
Definition: Karto.h:2337
kt_int32s
int32_t kt_int32s
Definition: Types.h:51
karto::Grid::GridIndex
virtual kt_int32s GridIndex(const Vector2< kt_int32s > &rGrid, kt_bool boundaryCheck=true) const
Definition: Karto.h:4497
karto::LocalizedRangeScanWithPoints::LocalizedRangeScanWithPoints
LocalizedRangeScanWithPoints(const Name &rSensorName, const RangeReadingsVector &rReadings, const PointVectorDouble &rPoints)
Definition: Karto.h:5511
karto::math::Maximum
const T & Maximum(const T &value1, const T &value2)
Definition: Math.h:111
karto::LocalizedRangeScan::SetSensorPose
void SetSensorPose(const Pose2 &rScanPose)
Definition: Karto.h:5304
karto::Vector3::SquaredLength
kt_double SquaredLength() const
Definition: Karto.h:1332
karto::SensorData
Definition: Karto.h:4839
karto::Matrix3::SetToIdentity
void SetToIdentity()
Definition: Karto.h:2370
karto::SensorVector
std::vector< Sensor * > SensorVector
Definition: Karto.h:3499
karto::Rectangle2::GetPosition
const Vector2< T > & GetPosition() const
Definition: Karto.h:1864
karto::Name::GetName
const std::string & GetName() const
Definition: Karto.h:393
karto::Name::Parse
void Parse(const std::string &rName)
Definition: Karto.h:508
kt_objecttype
kt_int32u kt_objecttype
Definition: Karto.h:50
karto::DatasetInfo::m_pDescription
Parameter< std::string > * m_pDescription
Definition: Karto.h:6128
karto::Transform::SetTransform
void SetTransform(const Pose2 &rPose1, const Pose2 &rPose2)
Definition: Karto.h:2918
karto::Object::operator=
const Object & operator=(const Object &)
karto::CoordinateConverter::CoordinateConverter
CoordinateConverter()
Definition: Karto.h:4224
f
f
karto::LocalizedRangeScan::m_CorrectedPose
Pose2 m_CorrectedPose
Definition: Karto.h:5458
karto::CoordinateConverter::Transform
kt_double Transform(kt_double value)
Definition: Karto.h:4235
karto::Matrix::operator()
kt_double & operator()(kt_int32u row, kt_int32u column)
Definition: Karto.h:2688
karto::SensorData::SetUniqueId
void SetUniqueId(kt_int32u uniqueId)
Definition: Karto.h:4884
karto::Parameter::GetValueAsString
virtual const std::string GetValueAsString() const
Definition: Karto.h:3150
karto::Size2::operator==
kt_bool operator==(const Size2 &rOther) const
Definition: Karto.h:892
karto::CoordinateConverter::SetResolution
void SetResolution(kt_double resolution)
Definition: Karto.h:4353
karto::OccupancyGrid::m_pCellHitsCnt
Grid< kt_int32u > * m_pCellHitsCnt
Definition: Karto.h:6031
karto::OccupancyGrid::CreateFromScans
virtual void CreateFromScans(const LocalizedRangeScanVector &rScans)
Definition: Karto.h:5846
karto::Matrix3
Definition: Karto.h:2347
karto::LookupArray::SetSize
void SetSize(kt_int32u size)
Definition: Karto.h:6298
karto::Name::Name
Name(const Name &rOther)
Definition: Karto.h:375
karto::Matrix::RangeCheck
void RangeCheck(kt_int32u row, kt_int32u column) const
Definition: Karto.h:2739
karto::Vector3::SetZ
void SetZ(const T &z)
Definition: Karto.h:1301
karto::Name::operator!=
kt_bool operator!=(const Name &rOther) const
Definition: Karto.h:479
karto::LocalizedRangeScanWithPoints::~LocalizedRangeScanWithPoints
virtual ~LocalizedRangeScanWithPoints()
Definition: Karto.h:5521
ObjectType_Misc
const kt_objecttype ObjectType_Misc
Definition: Karto.h:56
karto::Matrix::m_Columns
kt_int32u m_Columns
Definition: Karto.h:2754
karto::Grid
Definition: Karto.h:4391
karto::LaserRangeFinder::m_pType
ParameterEnum * m_pType
Definition: Karto.h:4188
karto::IsLaserRangeFinder
kt_bool IsLaserRangeFinder(Object *pObject)
Definition: Karto.h:710
karto::Matrix3::operator+=
void operator+=(const Matrix3 &rkMatrix)
Definition: Karto.h:2595
karto::Quaternion::SetZ
void SetZ(kt_double z)
Definition: Karto.h:1590
karto::Sensor::m_pOffsetPose
Parameter< Pose2 > * m_pOffsetPose
Definition: Karto.h:3493
karto::OccupancyGrid::m_pMinPassThrough
Parameter< kt_int32u > * m_pMinPassThrough
Definition: Karto.h:6053
karto::Dataset::m_Objects
ObjectVector m_Objects
Definition: Karto.h:6240
karto::GridIndexLookup::SetSize
void SetSize(kt_int32u size)
Definition: Karto.h:6532
karto::Vector2::operator/
const Vector2 operator/(T scalar) const
Definition: Karto.h:1100
karto::LocalizedRangeScan::GetSensorAt
Pose2 GetSensorAt(const Pose2 &rPose) const
Definition: Karto.h:5325
karto::DatasetInfo::GetCopyright
const std::string & GetCopyright() const
Definition: Karto.h:6116
karto::math::Clip
const T & Clip(const T &n, const T &minValue, const T &maxValue)
Definition: Math.h:124
karto::LaserRangeFinder_Sick_LMS100
@ LaserRangeFinder_Sick_LMS100
Definition: Karto.h:2965
karto::Pose3::m_Position
Vector3< kt_double > m_Position
Definition: Karto.h:2336
karto::Matrix3::Inverse
Matrix3 Inverse() const
Definition: Karto.h:2448
ObjectType_LaserRangeFinder
const kt_objecttype ObjectType_LaserRangeFinder
Definition: Karto.h:59
karto::LocalizedRangeScan::Update
virtual void Update()
Definition: Karto.h:5377
karto::LaserRangeFinder::m_pMaximumAngle
Parameter< kt_double > * m_pMaximumAngle
Definition: Karto.h:4179
karto::Functor::operator()
virtual void operator()(kt_int32u)
Definition: Karto.h:251
karto::Pose2::Pose2
Pose2(const Pose2 &rOther)
Definition: Karto.h:1999
ObjectType_Parameters
const kt_objecttype ObjectType_Parameters
Definition: Karto.h:69
karto::Grid::GetCoordinateConverter
CoordinateConverter * GetCoordinateConverter() const
Definition: Karto.h:4657
karto::Grid::CreateGrid
static Grid * CreateGrid(kt_int32s width, kt_int32s height, kt_double resolution)
Definition: Karto.h:4401
karto::OccupancyGrid::ComputeDimensions
static void ComputeDimensions(const LocalizedRangeScanVector &rScans, kt_double resolution, kt_int32s &rWidth, kt_int32s &rHeight, Vector2< kt_double > &rOffset)
Definition: Karto.h:5822
karto::Parameters::~Parameters
virtual ~Parameters()
Definition: Karto.h:3408
karto::Matrix3::operator=
Matrix3 & operator=(const Matrix3 &rOther)
Definition: Karto.h:2522
karto::LaserRangeFinder::SetMinimumRange
void SetMinimumRange(kt_double minimumRange)
Definition: Karto.h:3750
karto::Singleton::operator=
const Singleton & operator=(const Singleton &)
karto::Pose2::m_Position
Vector2< kt_double > m_Position
Definition: Karto.h:2166
karto::Matrix
Definition: Karto.h:2628
karto::OccupancyGrid::CreateFromScans
static OccupancyGrid * CreateFromScans(const LocalizedRangeScanVector &rScans, kt_double resolution)
Definition: Karto.h:5677
karto::Pose3::Pose3
Pose3(const Pose3 &rOther)
Definition: Karto.h:2220
karto::OccupancyGrid::SetOccupancyThreshold
void SetOccupancyThreshold(kt_double thresh)
Definition: Karto.h:5789
karto::SensorData::m_Time
kt_double m_Time
Definition: Karto.h:4970
karto::Pose2::operator=
Pose2 & operator=(const Pose2 &rOther)
Definition: Karto.h:2091
karto::Matrix::operator()
const kt_double & operator()(kt_int32u row, kt_int32u column) const
Definition: Karto.h:2701
karto::Transform::m_Rotation
Matrix3 m_Rotation
Definition: Karto.h:2950
karto::OccupancyGrid::UpdateCell
virtual void UpdateCell(kt_int8u *pCell, kt_int32u cellPassCnt, kt_int32u cellHitCnt)
Definition: Karto.h:5971
karto::CoordinateConverter::GetScale
kt_double GetScale() const
Definition: Karto.h:4290
karto::math::NormalizeAngle
kt_double NormalizeAngle(kt_double angle)
Definition: Math.h:182
karto::SensorData::GetStateId
kt_int32s GetStateId() const
Definition: Karto.h:4857
karto::Matrix3::m_Matrix
kt_double m_Matrix[3][3]
Definition: Karto.h:2618
karto::Sensor::SetOffsetPose
void SetOffsetPose(const Pose2 &rPose)
Definition: Karto.h:3460
karto::Size2::Size2
Size2(const Size2 &rOther)
Definition: Karto.h:835
Math.h
karto::Vector2::GetY
const T & GetY() const
Definition: Karto.h:975
karto::Pose2::operator==
kt_bool operator==(const Pose2 &rOther) const
Definition: Karto.h:2102
karto::Quaternion::operator==
kt_bool operator==(const Quaternion &rOther) const
Definition: Karto.h:1697
karto::LaserRangeFinder::GetMinimumAngle
kt_double GetMinimumAngle() const
Definition: Karto.h:3805
karto::SensorManager::GetInstance
static SensorManager * GetInstance()
Definition: Karto.cpp:35
karto::Quaternion::GetZ
kt_double GetZ() const
Definition: Karto.h:1581
karto::DrivePose::m_OdometricPose
Pose3 m_OdometricPose
Definition: Karto.h:5172
karto::Transform::Transform
Transform(const Pose2 &rPose1, const Pose2 &rPose2)
Definition: Karto.h:2879
karto::Grid::GetDataPointer
T * GetDataPointer(const Vector2< kt_int32s > &rGrid)
Definition: Karto.h:4562
karto::Size2::GetHeight
const T GetHeight() const
Definition: Karto.h:864
karto::Grid::GetSize
const Size2< kt_int32s > GetSize() const
Definition: Karto.h:4601
karto::Dataset
Definition: Karto.h:6140
karto::LaserRangeFinder_Sick_LMS291
@ LaserRangeFinder_Sick_LMS291
Definition: Karto.h:2967
KARTO_EXPORT
#define KARTO_EXPORT
Definition: Macros.h:56
ObjectType_Sensor
const kt_objecttype ObjectType_Sensor
Definition: Karto.h:53
karto::LocalizedRangeScanVector
std::vector< LocalizedRangeScan * > LocalizedRangeScanVector
Definition: Karto.h:5490
karto::Exception::Exception
Exception(const std::string &rMessage="Karto Exception", kt_int32s errorCode=0)
Definition: Karto.h:92
karto::LaserRangeScan::m_NumberOfRangeReadings
kt_int32u m_NumberOfRangeReadings
Definition: Karto.h:5111
karto::Name::m_Scope
std::string m_Scope
Definition: Karto.h:580
karto::AbstractParameter::AbstractParameter
AbstractParameter(const std::string &rName, const std::string &rDescription, ParameterManager *pParameterManger=NULL)
Definition: Karto.h:3004
karto::SensorData::m_CustomData
CustomDataVector m_CustomData
Definition: Karto.h:4972
karto::ParameterEnum::GetValueAsString
virtual const std::string GetValueAsString() const
Definition: Karto.h:3322
karto::Parameter
Definition: Karto.h:3089
karto::Grid::GetResolution
kt_double GetResolution() const
Definition: Karto.h:4666
karto::ParameterManager::ParameterManager
ParameterManager()
Definition: Karto.h:274
karto::BoundingBox2::GetSize
Size2< kt_double > GetSize() const
Definition: Karto.h:2814
karto::LocalizedRangeScanWithPoints::Update
void Update()
Definition: Karto.h:5529
karto::Pose3::SetPosition
void SetPosition(const Vector3< kt_double > &rPosition)
Definition: Karto.h:2249
karto::SensorManagerMap
std::map< Name, Sensor * > SensorManagerMap
Definition: Karto.h:3508
karto::Exception::~Exception
virtual ~Exception()
Definition: Karto.h:110
karto::Rectangle2::operator!=
kt_bool operator!=(const Rectangle2 &rOther) const
Definition: Karto.h:1938
karto::NonCopyable::NonCopyable
NonCopyable()
Definition: Karto.h:173
karto::LaserRangeFinder::SetRangeThreshold
void SetRangeThreshold(kt_double rangeThreshold)
Definition: Karto.h:3790
karto::Vector3::operator=
Vector3 & operator=(const Vector3 &rOther)
Definition: Karto.h:1364
karto::Pose2::SetY
void SetY(kt_double y)
Definition: Karto.h:2037
karto::Vector3::operator+
const Vector3 operator+(const Vector3 &rOther) const
Definition: Karto.h:1378
karto::Vector2::operator==
kt_bool operator==(const Vector2 &rOther) const
Definition: Karto.h:1147
karto::Singleton::Get
T * Get()
Definition: Karto.h:213
karto::CoordinateConverter
Definition: Karto.h:4218
karto::BoundingBox2::Add
void Add(const Vector2< kt_double > &rPoint)
Definition: Karto.h:2824
karto::Dataset::GetDatasetInfo
DatasetInfo * GetDatasetInfo()
Definition: Karto.h:6209
karto::SensorData::SetStateId
void SetStateId(kt_int32s stateId)
Definition: Karto.h:4866
karto::Sensor::GetOffsetPose
const Pose2 & GetOffsetPose() const
Definition: Karto.h:3451
karto::Sensor::Validate
virtual kt_bool Validate()=0
karto::LaserRangeScan::GetNumberOfRangeReadings
kt_int32u GetNumberOfRangeReadings() const
Definition: Karto.h:5100
karto::Vector2::operator*=
void operator*=(T scalar)
Definition: Karto.h:1137
karto::Exception::m_ErrorCode
kt_int32s m_ErrorCode
Definition: Karto.h:155
karto::LaserRangeFinder::SetMaximumRange
void SetMaximumRange(kt_double maximumRange)
Definition: Karto.h:3770
const_forEachAs
#define const_forEachAs(listtype, list, iter)
Definition: Macros.h:75
karto::OccupancyGrid::Resize
virtual void Resize(kt_int32s width, kt_int32s height)
Definition: Karto.h:6015
karto::Transform::InverseTransformPose
Pose2 InverseTransformPose(const Pose2 &rSourcePose)
Definition: Karto.h:2903
karto::LocalizedRangeScan::SetCorrectedPose
void SetCorrectedPose(const Pose2 &rPose)
Definition: Karto.h:5248
karto::Vector3::SetX
void SetX(const T &x)
Definition: Karto.h:1265
karto::GridIndexLookup::GetLookupArray
const LookupArray * GetLookupArray(kt_int32u index) const
Definition: Karto.h:6410
karto::CellUpdater::~CellUpdater
virtual ~CellUpdater()
Definition: Karto.h:5609
karto::Grid::GetWidth
kt_int32s GetWidth() const
Definition: Karto.h:4583
karto::Object::SetParameter
void SetParameter(const std::string &rName, T value)
karto::LaserRangeFinder::m_pMinimumRange
Parameter< kt_double > * m_pMinimumRange
Definition: Karto.h:4183
ObjectType_LocalizedRangeScan
const kt_objecttype ObjectType_LocalizedRangeScan
Definition: Karto.h:64
karto::AbstractParameter::m_Description
std::string m_Description
Definition: Karto.h:3078
karto::Singleton::~Singleton
virtual ~Singleton()
Definition: Karto.h:204
karto::Grid::IsValidGridIndex
kt_bool IsValidGridIndex(const Vector2< kt_int32s > &rGrid) const
Definition: Karto.h:4486
karto::LocalizedRangeScan::GetCorrectedPose
const Pose2 & GetCorrectedPose() const
Definition: Karto.h:5239
karto::Vector3::operator>>
friend std::istream & operator>>(std::istream &rStream, const Vector3 &)
Definition: Karto.h:1465
karto::Sensor::operator=
const Sensor & operator=(const Sensor &)
karto::Vector3::operator!=
kt_bool operator!=(const Vector3 &rOther) const
Definition: Karto.h:1443
karto::LaserRangeScan::LaserRangeScan
LaserRangeScan(const Name &rSensorName, const RangeReadingsVector &rRangeReadings)
Definition: Karto.h:5011
karto::CustomDataVector
std::vector< CustomData * > CustomDataVector
Definition: Karto.h:4830
karto::GridIndexLookup::DestroyArrays
void DestroyArrays()
Definition: Karto.h:6559
karto::Drive::~Drive
virtual ~Drive()
Definition: Karto.h:3677
karto::Rectangle2::GetHeight
T GetHeight() const
Definition: Karto.h:1846
karto::Pose3::operator==
kt_bool operator==(const Pose3 &rOther) const
Definition: Karto.h:2301
karto::CoordinateConverter::GridToWorld
Vector2< kt_double > GridToWorld(const Vector2< kt_int32s > &rGrid, kt_bool flipY=false) const
Definition: Karto.h:4269
karto::LaserRangeFinder_Hokuyo_UTM_30LX
@ LaserRangeFinder_Hokuyo_UTM_30LX
Definition: Karto.h:2969
karto::Rectangle2::SetHeight
void SetHeight(T height)
Definition: Karto.h:1855
kt_bool
bool kt_bool
Definition: Types.h:64
karto::Name::Name
Name(const std::string &rName)
Definition: Karto.h:367
karto::Parameter::operator=
Parameter & operator=(const Parameter &rOther)
Definition: Karto.h:3181
karto::GridIndexLookup::GridIndexLookup
GridIndexLookup(Grid< T > *pGrid)
Definition: Karto.h:6388
karto::Name::Validate
void Validate(const std::string &rName)
Definition: Karto.h:533
karto::BoundingBox2::SetMaximum
void SetMaximum(const Vector2< kt_double > &rMaximum)
Definition: Karto.h:2806
karto::Vector2::operator-=
void operator-=(const Vector2 &rOther)
Definition: Karto.h:1059
ObjectType_DrivePose
const kt_objecttype ObjectType_DrivePose
Definition: Karto.h:62
karto::Quaternion::SetY
void SetY(kt_double y)
Definition: Karto.h:1572
karto::DrivePose
Definition: Karto.h:5121
ObjectType_CustomData
const kt_objecttype ObjectType_CustomData
Definition: Karto.h:55
karto::LaserRangeFinder::m_pMinimumAngle
Parameter< kt_double > * m_pMinimumAngle
Definition: Karto.h:4178
karto::SensorData::m_UniqueId
kt_int32s m_UniqueId
Definition: Karto.h:4960
karto::LaserRangeFinder::GetMaximumRange
kt_double GetMaximumRange() const
Definition: Karto.h:3761
karto::CoordinateConverter::GetSize
const Size2< kt_int32s > & GetSize() const
Definition: Karto.h:4335
karto::Drive::Validate
virtual kt_bool Validate(SensorData *pSensorData)
Definition: Karto.h:3687
karto::Parameter::SetValueFromString
virtual void SetValueFromString(const std::string &rStringValue)
Definition: Karto.h:3161
karto::CoordinateConverter::SetOffset
void SetOffset(const Vector2< kt_double > &rOffset)
Definition: Karto.h:4317
karto::AbstractParameter::operator<<
friend std::ostream & operator<<(std::ostream &rStream, const AbstractParameter &rParameter)
Definition: Karto.h:3067
karto::Size2::m_Height
T m_Height
Definition: Karto.h:918
karto::SensorData::m_StateId
kt_int32s m_StateId
Definition: Karto.h:4955
karto::Matrix3::Matrix3
Matrix3(const Matrix3 &rOther)
Definition: Karto.h:2361
karto::Pose3
Definition: Karto.h:2187
karto::Pose3::Pose3
Pose3(const Vector3< kt_double > &rPosition)
Definition: Karto.h:2201
karto::Pose3::operator!=
kt_bool operator!=(const Pose3 &rOther) const
Definition: Karto.h:2309
karto::ParameterEnum
Definition: Karto.h:3258
karto::GridStates_Free
@ GridStates_Free
Definition: Karto.h:4206
karto::Size2::GetWidth
const T GetWidth() const
Definition: Karto.h:846
karto::LaserRangeScan::m_pRangeReadings
kt_double * m_pRangeReadings
Definition: Karto.h:5110
karto::LaserRangeScan::GetRangeReadings
kt_double * GetRangeReadings() const
Definition: Karto.h:5034
karto::Size2::SetWidth
void SetWidth(T width)
Definition: Karto.h:855
karto::SensorManager::Validate
static void Validate(Sensor *pSensor)
Definition: Karto.h:3629
karto::math::InRange
kt_bool InRange(const T &value, const T &a, const T &b)
Definition: Math.h:172
karto::CellUpdater::m_pOccupancyGrid
OccupancyGrid * m_pOccupancyGrid
Definition: Karto.h:5618
karto::PointVectorDouble
std::vector< Vector2< kt_double > > PointVectorDouble
Definition: Karto.h:1204
karto::AbstractParameter::m_Name
std::string m_Name
Definition: Karto.h:3077
karto::Name::GetScope
const std::string & GetScope() const
Definition: Karto.h:417
karto::Grid::IndexToGrid
Vector2< kt_int32s > IndexToGrid(kt_int32s index) const
Definition: Karto.h:4525
karto::OccupancyGrid::~OccupancyGrid
virtual ~OccupancyGrid()
Definition: Karto.h:5660
karto::LaserRangeFinder::Validate
virtual kt_bool Validate()
Definition: Karto.h:3954
karto::KT_PI_2
const kt_double KT_PI_2
Definition: Math.h:34
karto::Pose3::GetPosition
const Vector3< kt_double > & GetPosition() const
Definition: Karto.h:2240
karto::Vector2
Definition: Karto.h:929
karto::Vector3::Vector3
Vector3(T x, T y, T z)
Definition: Karto.h:1233
karto::LookupArray::GetSize
kt_int32u GetSize() const
Definition: Karto.h:6289
karto::SensorManager::m_Sensors
SensorManagerMap m_Sensors
Definition: Karto.h:3645
karto::LaserRangeFinder::GetNumberOfRangeReadings
kt_int32u GetNumberOfRangeReadings() const
Definition: Karto.h:3949
karto::AbstractParameter
Definition: Karto.h:2980
karto::Size2::operator=
Size2 & operator=(const Size2 &rOther)
Definition: Karto.h:881
karto::NonCopyable::~NonCopyable
virtual ~NonCopyable()
Definition: Karto.h:177
karto::GridIndexLookup::GetAngles
const std::vector< kt_double > & GetAngles() const
Definition: Karto.h:6421
karto::Dataset::Dataset
Dataset()
Definition: Karto.h:6146
karto::GridIndexLookup::m_Size
kt_int32u m_Size
Definition: Karto.h:6574
karto::AbstractParameter::GetDescription
const std::string & GetDescription() const
Definition: Karto.h:3038
karto::LaserRangeFinder::LaserRangeFinder
LaserRangeFinder(const Name &rName)
Definition: Karto.h:4136
karto::Rectangle2::Rectangle2
Rectangle2(T x, T y, T width, T height)
Definition: Karto.h:1761
karto::math::DoubleEqual
kt_bool DoubleEqual(kt_double a, kt_double b)
Definition: Math.h:135
karto::Grid::m_pData
T * m_pData
Definition: Karto.h:4773
karto::BoundingBox2::GetMinimum
const Vector2< kt_double > & GetMinimum() const
Definition: Karto.h:2782
karto::ParameterManager::~ParameterManager
virtual ~ParameterManager()
Definition: Karto.h:281
karto::Matrix::Allocate
void Allocate()
Definition: Karto.h:2712
karto::Parameter::Clone
virtual Parameter * Clone()
Definition: Karto.h:3172
karto::Vector2::SetX
void SetX(const T &x)
Definition: Karto.h:966
karto::Grid::GetValue
T GetValue(const Vector2< kt_int32s > &rGrid) const
Definition: Karto.h:4647
karto::GridIndexLookup::m_ppLookupArray
LookupArray ** m_ppLookupArray
Definition: Karto.h:6576
karto::Object::GetParameterManager
virtual ParameterManager * GetParameterManager()
Definition: Karto.h:635
karto::Exception
Definition: Karto.h:84
karto::Grid::GetDataSize
kt_int32s GetDataSize() const
Definition: Karto.h:4637
karto::ParameterEnum::DefineEnumValue
void DefineEnumValue(kt_int32s value, const std::string &rName)
Definition: Karto.h:3340
karto::AbstractParameter::GetName
const std::string & GetName() const
Definition: Karto.h:3029
karto::CustomData::~CustomData
virtual ~CustomData()
Definition: Karto.h:4805
karto::SensorManager::UnregisterSensor
void UnregisterSensor(Sensor *pSensor)
Definition: Karto.h:3564
karto::OccupancyGrid::SetMinPassThrough
void SetMinPassThrough(kt_int32u count)
Definition: Karto.h:5780
karto::Transform
Definition: Karto.h:2862
karto::Pose3::GetOrientation
const Quaternion & GetOrientation() const
Definition: Karto.h:2258
karto::CoordinateConverter::GetOffset
const Vector2< kt_double > & GetOffset() const
Definition: Karto.h:4308
karto::Name::SetScope
void SetScope(const std::string &rScope)
Definition: Karto.h:426
karto::LocalizedRangeScan::m_IsDirty
kt_bool m_IsDirty
Definition: Karto.h:5484
karto::Drive::Drive
Drive(const std::string &rName)
Definition: Karto.h:3669
karto::SensorData::GetUniqueId
kt_int32s GetUniqueId() const
Definition: Karto.h:4875
karto::Vector2::operator/=
void operator/=(T scalar)
Definition: Karto.h:1089
karto::OccupancyGrid::m_pCellUpdater
CellUpdater * m_pCellUpdater
Definition: Karto.h:6045
karto::GridIndexLookup::ComputeOffsets
void ComputeOffsets(kt_int32u angleIndex, kt_double angle, const Pose2Vector &rLocalPoints, LocalizedRangeScan *pScan)
Definition: Karto.h:6479
karto::Name::operator==
kt_bool operator==(const Name &rOther) const
Definition: Karto.h:471
karto::Grid::m_WidthStep
kt_int32s m_WidthStep
Definition: Karto.h:4772
karto::Matrix::m_pData
kt_double * m_pData
Definition: Karto.h:2756
karto::Quaternion::Quaternion
Quaternion()
Definition: Karto.h:1506
karto::Parameter::~Parameter
virtual ~Parameter()
Definition: Karto.h:3123
karto::Rectangle2::SetWidth
void SetWidth(T width)
Definition: Karto.h:1837
karto::Vector3::GetY
const T & GetY() const
Definition: Karto.h:1274
karto::Transform::m_Transform
Pose2 m_Transform
Definition: Karto.h:2948
karto::Transform::Transform
Transform(const Pose2 &rPose)
Definition: Karto.h:2869
karto::Vector2::operator<
kt_bool operator<(const Vector2 &rOther) const
Definition: Karto.h:1166
karto::LaserRangeFinder::SetMaximumAngle
void SetMaximumAngle(kt_double maximumAngle)
Definition: Karto.h:3834
karto::Object::m_pParameterManager
ParameterManager * m_pParameterManager
Definition: Karto.h:673
karto::DrivePose::DrivePose
DrivePose(const Name &rSensorName)
Definition: Karto.h:5133
ObjectType_DatasetInfo
const kt_objecttype ObjectType_DatasetInfo
Definition: Karto.h:70
karto::CustomData
Definition: Karto.h:4786
karto::ParameterEnum::ParameterEnum
ParameterEnum(const std::string &rName, kt_int32s value, ParameterManager *pParameterManger=NULL)
Definition: Karto.h:3269
karto::math::Square
T Square(T value)
Definition: Math.h:77
karto::Dataset::Clear
virtual void Clear()
Definition: Karto.h:6217
kt_int32u
uint32_t kt_int32u
Definition: Types.h:52
karto::Size2::operator<<
friend std::ostream & operator<<(std::ostream &rStream, const Size2 &rSize)
Definition: Karto.h:910
karto::Pose2::GetX
kt_double GetX() const
Definition: Karto.h:2010
karto::Rectangle2::GetWidth
T GetWidth() const
Definition: Karto.h:1828
karto::Quaternion
Definition: Karto.h:1500
karto::Rectangle2::SetPosition
void SetPosition(const Vector2< T > &rPosition)
Definition: Karto.h:1883
karto::Matrix::Clear
void Clear()
Definition: Karto.h:2656
karto::Vector3::Vector3
Vector3(const Vector3 &rOther)
Definition: Karto.h:1244
karto::Matrix3::ToString
std::string ToString() const
Definition: Karto.h:2502
karto::Name::~Name
virtual ~Name()
Definition: Karto.h:384
karto::IsDatasetInfo
kt_bool IsDatasetInfo(Object *pObject)
Definition: Karto.h:750
ObjectType_CameraImage
const kt_objecttype ObjectType_CameraImage
Definition: Karto.h:65
karto::GridIndexLookup::m_Angles
std::vector< kt_double > m_Angles
Definition: Karto.h:6579
karto::Pose3::Pose3
Pose3(const Vector3< kt_double > &rPosition, const karto::Quaternion &rOrientation)
Definition: Karto.h:2211
karto::Matrix::~Matrix
virtual ~Matrix()
Definition: Karto.h:2647
karto::Grid::Clear
void Clear()
Definition: Karto.h:4423
karto::BoundingBox2::IsInBounds
kt_bool IsInBounds(const Vector2< kt_double > &rPoint) const
Definition: Karto.h:2844
karto::Pose2::SetHeading
void SetHeading(kt_double heading)
Definition: Karto.h:2073
karto::LaserRangeFinder::m_pAngularResolution
Parameter< kt_double > * m_pAngularResolution
Definition: Karto.h:4181
karto::CellUpdater
Definition: Karto.h:5598
karto::Size2::Size2
Size2(T width, T height)
Definition: Karto.h:825
karto::LocalizedRangeScan::m_PointReadings
PointVectorDouble m_PointReadings
Definition: Karto.h:5469
karto::ParameterEnum::EnumMap
std::map< std::string, kt_int32s > EnumMap
Definition: Karto.h:3260
karto::GridIndexLookup
Definition: Karto.h:6381
karto::Name::operator=
Name & operator=(const Name &rOther)
Definition: Karto.h:457
karto::Dataset::Add
void Add(Object *pObject)
Definition: Karto.h:6164
karto::Vector2::SetY
void SetY(const T &y)
Definition: Karto.h:984
karto::Rectangle2::SetPosition
void SetPosition(const T &rX, const T &rY)
Definition: Karto.h:1874
karto::Matrix3::operator*
Matrix3 operator*(const Matrix3 &rOther) const
Definition: Karto.h:2555
karto::Name::m_Name
std::string m_Name
Definition: Karto.h:579
karto::SensorManager::GetAllSensors
SensorVector GetAllSensors()
Definition: Karto.h:3612
karto::Vector3::operator<<
friend std::ostream & operator<<(std::ostream &rStream, const Vector3 &rVector)
Definition: Karto.h:1455
karto::Drive::Validate
virtual kt_bool Validate()
Definition: Karto.h:3682
karto::LaserRangeFinder::GetAngularResolution
kt_double GetAngularResolution() const
Definition: Karto.h:3845
karto::Vector3::Vector3
Vector3()
Definition: Karto.h:1220
karto::Quaternion::GetY
kt_double GetY() const
Definition: Karto.h:1563
karto::Singleton::m_pPointer
T * m_pPointer
Definition: Karto.h:227
karto::Pose2::operator>>
friend std::istream & operator>>(std::istream &rStream, const Pose2 &)
Definition: Karto.h:2148
karto::LaserRangeFinder_Custom
@ LaserRangeFinder_Custom
Definition: Karto.h:2963
karto::LaserRangeFinder::m_pRangeThreshold
Parameter< kt_double > * m_pRangeThreshold
Definition: Karto.h:4186
karto::Grid::m_Height
kt_int32s m_Height
Definition: Karto.h:4771
karto::CustomData::CustomData
CustomData()
Definition: Karto.h:4797
karto::SensorManager
Definition: Karto.h:3513
karto::Functor
Definition: Karto.h:245
karto::Matrix3::Matrix3
Matrix3()
Definition: Karto.h:2353
karto::OccupancyGrid::Clone
OccupancyGrid * Clone() const
Definition: Karto.h:5697
forEach
#define forEach(listtype, list)
Definition: Macros.h:66
ObjectType_Header
const kt_objecttype ObjectType_Header
Definition: Karto.h:68
karto::Pose2
Definition: Karto.h:1957
karto::SensorData::SetTime
void SetTime(kt_double time)
Definition: Karto.h:4902
karto::LaserRangeFinder::CreateLaserRangeFinder
static LaserRangeFinder * CreateLaserRangeFinder(LaserRangeFinderType type, const Name &rName)
Definition: Karto.h:3989
karto::Vector3::MakeCeil
void MakeCeil(const Vector3 &rOther)
Definition: Karto.h:1321
karto::Rectangle2::GetSize
const Size2< T > & GetSize() const
Definition: Karto.h:1892
karto::Vector2::MakeFloor
void MakeFloor(const Vector2 &rOther)
Definition: Karto.h:993
karto::ParameterVector
std::vector< AbstractParameter * > ParameterVector
Definition: Karto.h:258
karto::Matrix::GetRows
kt_int32u GetRows() const
Definition: Karto.h:2668
karto::Object
Definition: Karto.h:590
karto::Quaternion::operator!=
kt_bool operator!=(const Quaternion &rOther) const
Definition: Karto.h:1709
karto::LaserRangeFinderType
LaserRangeFinderType
Definition: Karto.h:2961
karto::DatasetInfo::GetAuthor
const std::string & GetAuthor() const
Definition: Karto.h:6100
karto::LaserRangeFinder::GetType
kt_int32s GetType()
Definition: Karto.h:3940
karto::Vector2::SquaredLength
kt_double SquaredLength() const
Definition: Karto.h:1013
karto::Quaternion::Quaternion
Quaternion(kt_double x, kt_double y, kt_double z, kt_double w)
Definition: Karto.h:1521
karto::Module::Process
virtual kt_bool Process(karto::Object *)
Definition: Karto.h:790
karto::DrivePose::SetOdometricPose
void SetOdometricPose(const Pose3 &rPose)
Definition: Karto.h:5159
karto::math::IsUpTo
kt_bool IsUpTo(const T &value, const T &maximum)
Definition: Math.h:147
karto::LookupArray::GetArrayPointer
kt_int32s * GetArrayPointer() const
Definition: Karto.h:6352
karto::Pose2::operator+
Pose2 operator+(const Pose2 &rOther) const
Definition: Karto.h:2129
karto::Dataset::m_pDatasetInfo
DatasetInfo * m_pDatasetInfo
Definition: Karto.h:6241
karto::Vector2::operator<<
friend std::ostream & operator<<(std::ostream &rStream, const Vector2 &rVector)
Definition: Karto.h:1181
karto::GridStates_Occupied
@ GridStates_Occupied
Definition: Karto.h:4205
karto::Parameters::Parameters
Parameters(const std::string &rName)
Definition: Karto.h:3400
karto::Singleton::Singleton
Singleton()
Definition: Karto.h:196
assert.h
karto::Matrix::m_Rows
kt_int32u m_Rows
Definition: Karto.h:2753
karto::Vector2::Length
kt_double Length() const
Definition: Karto.h:1022
karto::IsSensor
kt_bool IsSensor(Object *pObject)
Definition: Karto.h:690
karto::SensorData::AddCustomData
void AddCustomData(CustomData *pCustomData)
Definition: Karto.h:4920
karto::Drive
Definition: Karto.h:3658
karto::DatasetInfo
Definition: Karto.h:6067
karto::Rectangle2::operator=
Rectangle2 & operator=(const Rectangle2 &rOther)
Definition: Karto.h:1919
karto::DrivePose::~DrivePose
virtual ~DrivePose()
Definition: Karto.h:5141
karto::LocalizedRangeScan::~LocalizedRangeScan
virtual ~LocalizedRangeScan()
Definition: Karto.h:5205
kt_int8u
uint8_t kt_int8u
Definition: Types.h:46
karto::IsSensorData
kt_bool IsSensorData(Object *pObject)
Definition: Karto.h:700
karto::LaserRangeScan
Definition: Karto.h:4987
karto::DatasetInfo::GetDescription
const std::string & GetDescription() const
Definition: Karto.h:6108
karto::Vector3
Definition: Karto.h:1214
karto::Grid::WorldToGrid
Vector2< kt_int32s > WorldToGrid(const Vector2< kt_double > &rWorld, kt_bool flipY=false) const
Definition: Karto.h:4541
karto::LocalizedRangeScan::LocalizedRangeScan
LocalizedRangeScan(const Name &rSensorName, const RangeReadingsVector &rReadings)
Definition: Karto.h:5196
karto::Sensor
Definition: Karto.h:3426
karto::Pose3::operator=
Pose3 & operator=(const Pose3 &rOther)
Definition: Karto.h:2290
karto::DatasetInfo::m_pTitle
Parameter< std::string > * m_pTitle
Definition: Karto.h:6126
karto::GridStates_Unknown
@ GridStates_Unknown
Definition: Karto.h:4204
karto::Name::operator<
kt_bool operator<(const Name &rOther) const
Definition: Karto.h:487
karto::Pose3::operator>>
friend std::istream & operator>>(std::istream &rStream, const Pose3 &)
Definition: Karto.h:2329
karto::BoundingBox2
Definition: Karto.h:2766
karto::BoundingBox2::GetMaximum
const Vector2< kt_double > & GetMaximum() const
Definition: Karto.h:2798
karto::Grid::GridToWorld
Vector2< kt_double > GridToWorld(const Vector2< kt_int32s > &rGrid, kt_bool flipY=false) const
Definition: Karto.h:4552
karto::GridIndexLookup::~GridIndexLookup
virtual ~GridIndexLookup()
Definition: Karto.h:6399
karto::INVALID_SCAN
const kt_int32s INVALID_SCAN
Definition: Math.h:47
karto::operator<<
std::ostream & operator<<(std::ostream &rStream, Exception &rException)
Definition: Karto.cpp:129
karto::AbstractParameter::SetValueFromString
virtual void SetValueFromString(const std::string &rStringValue)=0
karto::ObjectVector
std::vector< Object * > ObjectVector
Definition: Karto.h:679
karto::Vector2::Vector2
Vector2(T x, T y)
Definition: Karto.h:946
karto::BoundingBox2::m_Maximum
Vector2< kt_double > m_Maximum
Definition: Karto.h:2852
karto::Vector2::operator*
kt_double operator*(const Vector2 &rOther) const
Definition: Karto.h:1110
karto::Parameter::GetValue
const T & GetValue() const
Definition: Karto.h:3132
karto::Name::Name
Name()
Definition: Karto.h:360
karto::Rectangle2::GetY
T GetY() const
Definition: Karto.h:1810
karto::LaserRangeFinder::SetMinimumAngle
void SetMinimumAngle(kt_double minimumAngle)
Definition: Karto.h:3814
karto::Pose2::SetX
void SetX(kt_double x)
Definition: Karto.h:2019
karto::Rectangle2::Rectangle2
Rectangle2()
Definition: Karto.h:1750
karto::ParameterManager
Definition: Karto.h:268
karto::Grid::GetDataPointer
T * GetDataPointer() const
Definition: Karto.h:4628
karto::ParameterEnum::m_EnumDefines
EnumMap m_EnumDefines
Definition: Karto.h:3378
karto::Quaternion::GetW
kt_double GetW() const
Definition: Karto.h:1599
karto::Grid::m_pCoordinateConverter
CoordinateConverter * m_pCoordinateConverter
Definition: Karto.h:4776
karto::Grid::GetBoundingBox
BoundingBox2 GetBoundingBox() const
Definition: Karto.h:4675
karto::Vector2::SquaredDistance
kt_double SquaredDistance(const Vector2 &rOther) const
Definition: Karto.h:1031
karto::RangeReadingsVector
std::vector< kt_double > RangeReadingsVector
Definition: Karto.h:4982
karto::ParameterManager::m_ParameterLookup
std::map< std::string, AbstractParameter * > m_ParameterLookup
Definition: Karto.h:341
karto::Pose2::GetHeading
kt_double GetHeading() const
Definition: Karto.h:2064
ObjectType_LaserRangeScan
const kt_objecttype ObjectType_LaserRangeScan
Definition: Karto.h:63
karto::LaserRangeScan::GetRangeReadingsVector
RangeReadingsVector GetRangeReadingsVector() const
Definition: Karto.h:5039
karto::Rectangle2::operator==
kt_bool operator==(const Rectangle2 &rOther) const
Definition: Karto.h:1930
karto::DrivePose::GetOdometricPose
const Pose3 & GetOdometricPose() const
Definition: Karto.h:5150
karto::OccupancyGrid::m_pCellPassCnt
Grid< kt_int32u > * m_pCellPassCnt
Definition: Karto.h:6026
karto::Object::GetParameter
AbstractParameter * GetParameter(const std::string &rName) const
Definition: Karto.h:645
karto::Rectangle2::m_Position
Vector2< T > m_Position
Definition: Karto.h:1944
karto::SensorData::GetTime
kt_double GetTime() const
Definition: Karto.h:4893
karto::BoundingBox2::m_Minimum
Vector2< kt_double > m_Minimum
Definition: Karto.h:2851
karto::OccupancyGrid::Update
virtual void Update()
Definition: Karto.h:5991
karto::Rectangle2::SetSize
void SetSize(const Size2< T > &rSize)
Definition: Karto.h:1901
karto::DatasetInfo::m_pAuthor
Parameter< std::string > * m_pAuthor
Definition: Karto.h:6127
karto::Rectangle2::Rectangle2
Rectangle2(const Vector2< T > &rPosition, const Size2< T > &rSize)
Definition: Karto.h:1772
karto
Definition: Karto.h:73
karto::DatasetInfo::~DatasetInfo
virtual ~DatasetInfo()
Definition: Karto.h:6084
karto::Pose2::operator+=
void operator+=(const Pose2 &rOther)
Definition: Karto.h:2118
karto::LaserRangeScan::~LaserRangeScan
virtual ~LaserRangeScan()
Definition: Karto.h:5024
karto::Vector3::operator*
const Vector3 operator*(T scalar) const
Definition: Karto.h:1423
karto::Name::IsValid
kt_bool IsValid(char c)
Definition: Karto.h:573
karto::Grid::GetHeight
kt_int32s GetHeight() const
Definition: Karto.h:4592
karto::SensorData::GetSensorName
const Name & GetSensorName() const
Definition: Karto.h:4911
karto::Pose3::ToString
std::string ToString()
Definition: Karto.h:2276
karto::Exception::m_Message
std::string m_Message
Definition: Karto.h:154


open_karto
Author(s):
autogenerated on Tue Jul 23 2024 02:26:00