46 double translationalNoise = 0.09;
47 double angularNoise = 0.002;
48 double sensingRangeNoise = 15;
49 double sensingAngleNoise = 0.01;
50 std::random_device rd;
51 std::mt19937 randomgen(rd());
59 NRT_CREATE_STATE_FIELD_GROUP(Position, (x)(y)(theta));
60 NRT_CREATE_STATE_FIELD_GROUP(Velocity, (translational)(angular));
64 NRT_CREATE_STATE_FIELD_GROUP(PolarPosition, (range)(angle));
72 struct ControlType { };
77 double x = state.
access<Position::x>();
78 double y = state.
access<Position::y>();
79 double a = state.
access<Position::theta>();
80 double dt = state.
access<Velocity::translational>();
81 double da = state.
access<Velocity::angular>();
84 predictedPosition.
access<Position::x>() = x + cos(a) * dt;
85 predictedPosition.access<Position::y>() = y + sin(a) * dt;
86 predictedPosition.access<Position::theta>() = a + da;
87 predictedPosition.access<Velocity::translational>() = dt;
88 predictedPosition.access<Velocity::angular>() = da;
91 if(predictedPosition.access<Position::theta>() > M_PI)
92 predictedPosition.access<Position::theta>() -= 2*M_PI;
93 if(predictedPosition.access<Position::theta>() < -M_PI)
94 predictedPosition.access<Position::theta>() += 2*M_PI;
96 return predictedPosition;
102 double x = state.
access<Position::x>();
103 double y = state.
access<Position::y>();
107 observation.
access<PolarPosition::range>() = sqrt(pow(x - worldDims.width()/2.0, 2) + pow(y - worldDims.height()/2.0, 2));
108 observation.access<PolarPosition::angle>() = atan2(y - worldDims.height() / 2.0, x - worldDims.width() / 2.0);
125 int main(
int argc,
const char **argv)
129 std::shared_ptr<nrt::ImageSink> display(
new nrt::ImageSink);
130 mgr.addSubComponent(display);
137 initialState.mean<Position::x>() = worldDims.
width() / 4;
138 initialState.mean<Position::y>() = worldDims.
height() / 4;
139 initialState.mean<Position::theta>() = 0;
140 initialState.mean<Velocity::translational>() = 5.0;
141 initialState.mean<Velocity::angular>() = 0.05;
142 initialState.covariance<>() = Eigen::Matrix<double, 5, 5>::Identity() * 0.00001;
149 movementCovariance.
covariance<Velocity::translational>() = pow(translationalNoise, 2.0)*2;
150 movementCovariance.
covariance<Velocity::angular>() = pow(angularNoise, 2.0)*2;
154 sensorCovariance.
covariance<PolarPosition::range>() = pow(sensingRangeNoise, 2.0);
155 sensorCovariance.
covariance<PolarPosition::angle>() = pow(sensingAngleNoise, 2.0);
168 for(
int timestep = 0; timestep < 500; ++timestep)
173 vehicleState = moveVehicle(vehicleState);
175 if(timestep % 10 == 0)
178 observation = takeMeasurement(vehicleState);
180 ukfTracker.update(observation);
184 ukfTracker.predict();
188 NRT_INFO(
"---------------\nStep " << timestep <<
189 "\nPos [" << vehicleState.access<>().transpose() <<
"]" <<
190 "\nPred [" << filteredState.
mean<>().transpose() <<
"]");
195 drawMeasurement(displayImage, observation);
206 double x = currentPosition.
access<Position::x>();
207 double y = currentPosition.
access<Position::y>();
208 double a = currentPosition.
access<Position::theta>();
209 double dt = currentPosition.
access<Velocity::translational>();
210 double da = currentPosition.
access<Velocity::angular>();
213 nextPosition.
access<Position::x>() = x + cos(a) * dt;
214 nextPosition.access<Position::y>() = y + sin(a) * dt;
215 nextPosition.access<Position::theta>() = a + da;
216 nextPosition.access<Velocity::translational>() = std::normal_distribution<double>(dt, translationalNoise)(randomgen);
217 nextPosition.access<Velocity::angular>() = std::normal_distribution<double>(da, angularNoise)(randomgen);
219 if(nextPosition.access<Position::theta>() > M_PI)
220 nextPosition.access<Position::theta>() -= 2*M_PI;
221 if(nextPosition.access<Position::theta>() < -M_PI)
222 nextPosition.access<Position::theta>() += 2*M_PI;
236 double angle = currentPosition.
access<Position::theta>();
244 darkcolor.alpha = 64;
261 double angle = currentPosition.
mean<Position::theta>();
271 darkcolor.alpha = 64;
282 double r = observation.
access<PolarPosition::range>();
283 double a = observation.
access<PolarPosition::angle>();
294 double x = vehicleState.
access<Position::x>();
295 double y = vehicleState.
access<Position::y>();
297 double randomRangeNoise = std::normal_distribution<double>(0, sensingRangeNoise)(randomgen);
298 double randomAngleNoise = std::normal_distribution<double>(0, sensingAngleNoise)(randomgen);
302 observation.
access<PolarPosition::range>() =
303 sqrt(pow(x - worldDims.
width()/2.0, 2) + pow(y - worldDims.
height()/2.0, 2)) + randomRangeNoise;
305 observation.
access<PolarPosition::angle>() =
306 atan2(y - worldDims.
height() / 2.0, x - worldDims.
width() / 2.0) + randomAngleNoise;