37. Coding the Observation Model
The final individual model we will implement is the observation model. The observation model accepts the pseudo range vector from the previous assignment, an observation vector (from vehicle sensors), and returns the observation model probability. Ultimately, we will multiply this by the motion model probability, then normalize to produce the belief state for the current time step.
The starter code below steps through each pseudo position x, calls the observation_model function and prints the results to standout. To complete this exercise fill in the observation_model function.
To implement the observation_model function we must do the following for each pseudo position x:
- For each observation:
- determine if a pseudo range vector exists for the current pseudo position x
- if the vector exists, extract and store the minimum distance, element 0 of the sorted vector, and remove that element (so we don't re-use it). This will be passed to
norm_pdf - if the pseudo range vector does not exist, pass the maximum distance to
norm_pdf - use
norm_pdfto determine the observation model probability - return the total probability
Start Quiz:
#include <iostream>
#include <algorithm>
#include <vector>
#include "helpers.h"
using namespace std;
//function to get pseudo ranges
std::vector<float> pseudo_range_estimator(std::vector<float> landmark_positions,
float pseudo_position);
//observation model: calculates likelihood prob term based on landmark proximity
float observation_model(std::vector<float> landmark_positions, std::vector<float> observations,
std::vector<float> pseudo_ranges, float distance_max,
float observation_stdev);
int main() {
//set observation standard deviation:
float observation_stdev = 1.0f;
//number of x positions on map
int map_size = 25;
//set distance max
float distance_max = map_size;
//define landmarks
std::vector<float> landmark_positions {5, 10, 12, 20};
//define observations
std::vector<float> observations {5.5, 13, 15};
//step through each pseudo position x (i)
for (unsigned int i = 0; i < map_size; ++i) {
float pseudo_position = float(i);
//get pseudo ranges
std::vector<float> pseudo_ranges = pseudo_range_estimator(landmark_positions,
pseudo_position);
//get observation probability
float observation_prob = observation_model(landmark_positions, observations,
pseudo_ranges, distance_max,
observation_stdev);
//print to stdout
std::cout << observation_prob << endl;
}
return 0;
};
//TODO Complete the observation model function
//calculates likelihood prob term based on landmark proximity
float observation_model(std::vector<float> landmark_positions, std::vector<float> observations,
std::vector<float> pseudo_ranges, float distance_max,
float observation_stdev) {
float distance_prob;
//YOUR CODE HERE
return distance_prob;
}
std::vector<float> pseudo_range_estimator(std::vector<float> landmark_positions,
float pseudo_position) {
//define pseudo observation vector:
std::vector<float> pseudo_ranges;
//loop over number of landmarks and estimate pseudo ranges:
for (unsigned int l=0; l< landmark_positions.size(); ++l) {
//estimate pseudo range for each single landmark
//and the current state position pose_i:
float range_l = landmark_positions[l] - pseudo_position;
//check if distances are positive:
if (range_l > 0.0f) {
pseudo_ranges.push_back(range_l);
}
}
//sort pseudo range vector:
sort(pseudo_ranges.begin(), pseudo_ranges.end());
return pseudo_ranges;
}
//=================================================================================
// Name : help_functions.h
// Version : 2.0.0
// Copyright : Udacity
//=================================================================================
#ifndef HELP_FUNCTIONS_H_
#define HELP_FUNCTIONS_H_
#include <math.h>
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <iomanip>
using namespace std;
class Helpers {
public:
//definition of one over square root of 2*pi:
constexpr static float STATIC_ONE_OVER_SQRT_2PI = 1/sqrt(2*M_PI) ;
float ONE_OVER_SQRT_2PI = 1/sqrt(2*M_PI) ;
/*****************************************************************************
* normpdf(X,mu,sigma) computes the probability function at values x using the
* normal distribution with mean mu and standard deviation std. x, mu and
* sigma must be scalar! The parameter std must be positive.
* The normal pdf is y=f(x,mu,std)= 1/(std*sqrt(2pi)) e[ -(x−mu)^2 / 2*std^2 ]
*****************************************************************************/
static float normpdf(float x, float mu, float std) {
return (STATIC_ONE_OVER_SQRT_2PI/std)*exp(-0.5*pow((x-mu)/std,2));
}
};
#endif /* HELP_FUNCTIONS_H_ */