29 #ifndef HECTOR_GAZEBO_PLUGINS_SENSOR_MODEL_H 30 #define HECTOR_GAZEBO_PLUGINS_SENSOR_MODEL_H 33 #if (GAZEBO_MAJOR_VERSION < 8) 34 #include <gazebo/math/Vector3.hh> 37 #include <hector_gazebo_plugins/SensorModelConfig.h> 42 using hector_gazebo_plugins::SensorModelConfig;
50 virtual void Load(sdf::ElementPtr _sdf,
const std::string& prefix = std::string());
55 virtual T
update(
double dt);
57 virtual void reset(
const T& value);
69 virtual bool LoadImpl(sdf::ElementPtr _element, T& _value);
90 drift_frequency = 1.0/3600.0;
100 template <
typename T>
103 std::string _offset, _drift, _drift_frequency, _gaussian_noise, _scale_error;
105 if (prefix.empty()) {
108 _drift_frequency =
"driftFrequency";
109 _gaussian_noise =
"gaussianNoise";
110 _scale_error =
"scaleError";
112 _offset = prefix +
"Offset";
113 _drift = prefix +
"Drift";
114 _drift_frequency = prefix +
"DriftFrequency";
115 _gaussian_noise = prefix +
"GaussianNoise";
116 _scale_error = prefix +
"ScaleError";
119 if (_sdf->HasElement(_offset)) LoadImpl(_sdf->GetElement(_offset), offset);
120 if (_sdf->HasElement(_drift)) LoadImpl(_sdf->GetElement(_drift), drift);
121 if (_sdf->HasElement(_drift_frequency)) LoadImpl(_sdf->GetElement(_drift_frequency), drift_frequency);
122 if (_sdf->HasElement(_gaussian_noise)) LoadImpl(_sdf->GetElement(_gaussian_noise), gaussian_noise);
123 if (_sdf->HasElement(_scale_error)) LoadImpl(_sdf->GetElement(_scale_error), scale_error);
128 template <
typename T>
130 if (!_element->GetValue())
return false;
131 return _element->GetValue()->Get(_value);
135 template <
typename T>
136 static inline T SensorModelGaussianKernel(T mu, T sigma)
140 T U = (T)rand()/(T)RAND_MAX;
141 T V = (T)rand()/(T)RAND_MAX;
142 T X = sqrt(-2.0 * ::log(U)) * cos( 2.0*M_PI * V);
147 template <
typename T>
148 static inline T SensorModelInternalUpdate(T& current_drift, T drift, T drift_frequency, T offset, T gaussian_noise,
double dt)
151 current_drift = exp(-dt * drift_frequency) * current_drift + dt * SensorModelGaussianKernel(T(), sqrt(2*drift_frequency)*drift);
152 return offset + current_drift + SensorModelGaussianKernel(T(), gaussian_noise);
156 template <
typename T>
159 for(std::size_t i = 0; i < current_error_.size(); ++i) current_error_[i] = SensorModelInternalUpdate(current_drift_[i], drift[i], drift_frequency[i], offset[i], gaussian_noise[i], dt);
160 return current_error_;
166 current_error_ = SensorModelInternalUpdate(current_drift_, drift, drift_frequency, offset, gaussian_noise, dt);
167 return current_error_;
170 #if (GAZEBO_MAJOR_VERSION >= 8) 174 current_error_.X() = SensorModelInternalUpdate(current_drift_.X(), drift.X(), drift_frequency.X(), offset.X(), gaussian_noise.X(), dt);
175 current_error_.Y() = SensorModelInternalUpdate(current_drift_.Y(), drift.Y(), drift_frequency.Y(), offset.Y(), gaussian_noise.Y(), dt);
176 current_error_.Z() = SensorModelInternalUpdate(current_drift_.Z(), drift.Z(), drift_frequency.Z(), offset.Z(), gaussian_noise.Z(), dt);
177 return current_error_;
183 current_error_.x = SensorModelInternalUpdate(current_drift_.x, drift.x, drift_frequency.x, offset.x, gaussian_noise.x, dt);
184 current_error_.y = SensorModelInternalUpdate(current_drift_.y, drift.y, drift_frequency.y, offset.y, gaussian_noise.y, dt);
185 current_error_.z = SensorModelInternalUpdate(current_drift_.z, drift.z, drift_frequency.z, offset.z, gaussian_noise.z, dt);
186 return current_error_;
190 template <
typename T>
193 for(std::size_t i = 0; i < current_drift_.size(); ++i) current_drift_[i] = SensorModelGaussianKernel(T::value_type(), drift[i]);
194 current_error_ = T();
200 current_drift_ = SensorModelGaussianKernel(0.0, drift);
201 current_error_ = 0.0;
204 #if (GAZEBO_MAJOR_VERSION >= 8) 208 current_drift_.X() = SensorModelGaussianKernel(0.0, drift.X());
209 current_drift_.Y() = SensorModelGaussianKernel(0.0, drift.Y());
210 current_drift_.Z() = SensorModelGaussianKernel(0.0, drift.Z());
211 current_error_ = ignition::math::Vector3d();
217 current_drift_.x = SensorModelGaussianKernel(0.0, drift.x);
218 current_drift_.y = SensorModelGaussianKernel(0.0, drift.y);
219 current_drift_.z = SensorModelGaussianKernel(0.0, drift.z);
220 current_error_ = math::Vector3();
224 template <
typename T>
227 current_drift_ = value;
228 current_error_ = T();
233 template <
typename T>
struct scalar_value<
std::vector<T> > {
static double toDouble(
const std::vector<T> &orig) {
return (
double) std::accumulate(orig.begin(), orig.end()) / orig.size(); } };
234 #if (GAZEBO_MAJOR_VERSION >= 8) 235 template <>
struct scalar_value<ignition::math::Vector3d> {
static double toDouble(
const ignition::math::Vector3d &orig) {
return (orig.X() + orig.Y() + orig.Z()) / 3; } };
241 template <
typename T>
246 offset = config.offset;
247 drift = config.drift;
248 drift_frequency = config.drift_frequency;
249 scale_error = config.scale_error;
260 #if (GAZEBO_MAJOR_VERSION >= 8) 268 #endif // HECTOR_GAZEBO_PLUGINS_SENSOR_MODEL_H virtual T update(double dt)
virtual void setCurrentDrift(const T &new_drift)
virtual void Load(sdf::ElementPtr _sdf, const std::string &prefix=std::string())
virtual const T & getScaleError() const
virtual T operator()(const T &value, double dt)
virtual bool LoadImpl(sdf::ElementPtr _element, T &_value)
virtual void dynamicReconfigureCallback(SensorModelConfig &config, uint32_t level)
virtual const T & getCurrentDrift() const
SensorModel_< math::Vector3 > SensorModel3
static double toDouble(const T &orig)
virtual const T & getCurrentError() const
virtual T getCurrentBias() const
SensorModel_< double > SensorModel
virtual T operator()(const T &value) const
static double toDouble(const math::Vector3 &orig)
static double toDouble(const std::vector< T > &orig)