Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <math.h>
00019 #include <assert.h>
00020 #include <float.h>
00021 #include <limits.h>
00022 #include <stdlib.h>
00023 #include <string.h>
00024 #include <stdio.h>
00025
00026 #include "open_karto/Karto.h"
00027
00028 namespace karto
00029 {
00030
00034
00035 SensorManager* SensorManager::GetInstance()
00036 {
00037 static Singleton<SensorManager> sInstance;
00038 return sInstance.Get();
00039 }
00040
00044
00045 Object::Object()
00046 : m_pParameterManager(new ParameterManager())
00047 {
00048 }
00049
00050 Object::Object(const Name& rName)
00051 : m_Name(rName)
00052 , m_pParameterManager(new ParameterManager())
00053 {
00054 }
00055
00056 Object::~Object()
00057 {
00058 delete m_pParameterManager;
00059 m_pParameterManager = NULL;
00060 }
00061
00065
00066 Module::Module(const std::string& rName)
00067 : Object(rName)
00068 {
00069 }
00070
00071 Module::~Module()
00072 {
00073 }
00074
00078
00079 Sensor::Sensor(const Name& rName)
00080 : Object(rName)
00081 {
00082 m_pOffsetPose = new Parameter<Pose2>("OffsetPose", Pose2(), GetParameterManager());
00083 }
00084
00085 Sensor::~Sensor()
00086 {
00087 }
00088
00092
00093 SensorData::SensorData(const Name& rSensorName)
00094 : Object()
00095 , m_StateId(-1)
00096 , m_UniqueId(-1)
00097 , m_SensorName(rSensorName)
00098 , m_Time(0.0)
00099 {
00100 }
00101
00102 SensorData::~SensorData()
00103 {
00104 forEach(CustomDataVector, &m_CustomData)
00105 {
00106 delete *iter;
00107 }
00108
00109 m_CustomData.clear();
00110 }
00111
00115
00116 void CellUpdater::operator() (kt_int32u index)
00117 {
00118 kt_int8u* pDataPtr = m_pOccupancyGrid->GetDataPointer();
00119 kt_int32u* pCellPassCntPtr = m_pOccupancyGrid->m_pCellPassCnt->GetDataPointer();
00120 kt_int32u* pCellHitCntPtr = m_pOccupancyGrid->m_pCellHitsCnt->GetDataPointer();
00121
00122 m_pOccupancyGrid->UpdateCell(&pDataPtr[index], pCellPassCntPtr[index], pCellHitCntPtr[index]);
00123 }
00124
00128
00129 std::ostream& operator << (std::ostream& rStream, Exception& rException)
00130 {
00131 rStream << "Error detect: " << std::endl;
00132 rStream << " ==> error code: " << rException.GetErrorCode() << std::endl;
00133 rStream << " ==> error message: " << rException.GetErrorMessage() << std::endl;
00134
00135 return rStream;
00136 }
00137
00141
00142 const PointVectorDouble LaserRangeFinder::GetPointReadings(LocalizedRangeScan* pLocalizedRangeScan,
00143 CoordinateConverter* pCoordinateConverter,
00144 kt_bool ignoreThresholdPoints,
00145 kt_bool flipY) const
00146 {
00147 PointVectorDouble pointReadings;
00148
00149 Pose2 scanPose = pLocalizedRangeScan->GetSensorPose();
00150
00151
00152 kt_int32u beamNum = 0;
00153 kt_double* pRangeReadings = pLocalizedRangeScan->GetRangeReadings();
00154 for (kt_int32u i = 0; i < m_NumberOfRangeReadings; i++, beamNum++)
00155 {
00156 kt_double rangeReading = pRangeReadings[i];
00157
00158 if (ignoreThresholdPoints)
00159 {
00160 if (!math::InRange(rangeReading, GetMinimumRange(), GetRangeThreshold()))
00161 {
00162 continue;
00163 }
00164 }
00165 else
00166 {
00167 rangeReading = math::Clip(rangeReading, GetMinimumRange(), GetRangeThreshold());
00168 }
00169
00170 kt_double angle = scanPose.GetHeading() + GetMinimumAngle() + beamNum * GetAngularResolution();
00171
00172 Vector2<kt_double> point;
00173
00174 point.SetX(scanPose.GetX() + (rangeReading * cos(angle)));
00175 point.SetY(scanPose.GetY() + (rangeReading * sin(angle)));
00176
00177 if (pCoordinateConverter != NULL)
00178 {
00179 Vector2<kt_int32s> gridPoint = pCoordinateConverter->WorldToGrid(point, flipY);
00180 point.SetX(gridPoint.GetX());
00181 point.SetY(gridPoint.GetY());
00182 }
00183
00184 pointReadings.push_back(point);
00185 }
00186
00187 return pointReadings;
00188 }
00189
00190 kt_bool LaserRangeFinder::Validate(SensorData* pSensorData)
00191 {
00192 LaserRangeScan* pLaserRangeScan = dynamic_cast<LaserRangeScan*>(pSensorData);
00193
00194
00195 if (pLaserRangeScan->GetNumberOfRangeReadings() != GetNumberOfRangeReadings())
00196 {
00197 std::cout << "LaserRangeScan contains " << pLaserRangeScan->GetNumberOfRangeReadings()
00198 << " range readings, expected " << GetNumberOfRangeReadings() << std::endl;
00199 return false;
00200 }
00201
00202 return true;
00203 }
00204
00208
00209 void ParameterManager::Clear()
00210 {
00211 forEach(karto::ParameterVector, &m_Parameters)
00212 {
00213 delete *iter;
00214 }
00215
00216 m_Parameters.clear();
00217
00218 m_ParameterLookup.clear();
00219 }
00220
00221 void ParameterManager::Add(AbstractParameter* pParameter)
00222 {
00223 if (pParameter != NULL && pParameter->GetName() != "")
00224 {
00225 if (m_ParameterLookup.find(pParameter->GetName()) == m_ParameterLookup.end())
00226 {
00227 m_Parameters.push_back(pParameter);
00228
00229 m_ParameterLookup[pParameter->GetName()] = pParameter;
00230 }
00231 else
00232 {
00233 m_ParameterLookup[pParameter->GetName()]->SetValueFromString(pParameter->GetValueAsString());
00234
00235 assert(false);
00236 }
00237 }
00238 }
00239
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 }