Kalman2DPositionFilter.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Emgu.CV;
  7. using Emgu.CV.Structure;
  8. namespace bbiwarg.Utility
  9. {
  10. class Kalman2DPositionFilter
  11. {
  12. private Kalman kalman;
  13. // state: x, y, v_x, v_y
  14. // x: current x position
  15. // y: current y position
  16. // v_x: velocity in x direction
  17. // v_y: velocity in y direction
  18. public Kalman2DPositionFilter(Vector2D initialPosition, float measurementNoiseFactor = 1.0e-1f, float processNoiseFactor = 1.0e-4f)
  19. {
  20. // 4 state variables and 2 measurements (0 controls)
  21. kalman = new Kalman(4, 2, 0);
  22. // initial state (x, y, v_x, v_y)
  23. Matrix<float> initialState = new Matrix<float>(new float[] { initialPosition.X, initialPosition.Y, 0.0f, 0.0f });
  24. kalman.CorrectedState = initialState;
  25. // transition matrix
  26. Matrix<float> transitionMatrix = new Matrix<float>(new float[,]
  27. { {1.0f, 0.0f, 1.0f, 0.0f}, // x = x + v_x
  28. {0.0f, 1.0f, 0.0f, 1.0f}, // y = y + v_y
  29. {0.0f, 0.0f, 1.0f, 0.0f}, // v_x = v_x
  30. {0.0f, 0.0f, 0.0f, 1.0f}}); // v_y = v_y
  31. kalman.TransitionMatrix = transitionMatrix;
  32. // measurement matrix
  33. Matrix<float> measurementMatrix = new Matrix<float>(new float[,]
  34. { {1.0f, 0.0f, 0.0f, 0.0f}, // first measurement = x
  35. {0.0f, 1.0f, 0.0f, 0.0f} // second measurement = y
  36. });
  37. kalman.MeasurementMatrix = measurementMatrix;
  38. // measurement noise covariance matrix
  39. Matrix<float> measurementNoiseCovarianceMatrix = new Matrix<float>(2, 2);
  40. measurementNoiseCovarianceMatrix.SetIdentity(new MCvScalar(measurementNoiseFactor));
  41. kalman.MeasurementNoiseCovariance = measurementNoiseCovarianceMatrix;
  42. // process noise covariance matrix
  43. Matrix<float> processNoiseCovarianceMatrix = new Matrix<float>(4, 4);
  44. processNoiseCovarianceMatrix.SetIdentity(new MCvScalar(processNoiseFactor));
  45. kalman.ProcessNoiseCovariance = processNoiseCovarianceMatrix;
  46. // error covariance post matrix (initial value)
  47. Matrix<float> errorCovariancePostMatrix = new Matrix<float>(4, 4);
  48. errorCovariancePostMatrix.SetIdentity();
  49. kalman.ErrorCovariancePost = errorCovariancePostMatrix;
  50. }
  51. // updates the filter and returns the corrected position
  52. public Vector2D getCorrectedPosition(Vector2D rawPosition)
  53. {
  54. Matrix<float> rawPositionMatrix = new Matrix<float>(new float[,]
  55. { {rawPosition.X},
  56. {rawPosition.Y}});
  57. // prediction according to model
  58. Matrix<float> prediction = kalman.Predict();
  59. // corrected point
  60. Matrix<float> estimate = kalman.Correct(rawPositionMatrix);
  61. return new Vector2D(estimate[0, 0], estimate[1, 0]);
  62. }
  63. }
  64. }