TDOAFunctor.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #pragma once
  2. #include <Eigen/Dense>
  3. #include <unsupported/Eigen/NonLinearOptimization>
  4. #include <unsupported/Eigen/NumericalDiff>
  5. namespace algorithm{
  6. template<typename _Scalar, int NX = Eigen::Dynamic, int NY = Eigen::Dynamic>
  7. class Functor
  8. {
  9. private:
  10. int m_inputs, m_values;
  11. public:
  12. typedef _Scalar Scalar;
  13. enum {
  14. InputsAtCompileTime = NX,
  15. ValuesAtCompileTime = NY
  16. };
  17. typedef Eigen::Matrix<Scalar,InputsAtCompileTime,1> InputType;
  18. typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,1> ValueType;
  19. typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;
  20. Functor() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {}
  21. Functor(int inputs, int values) : m_inputs(inputs), m_values(values) {}
  22. int inputs() const { return m_inputs; }
  23. int values() const { return m_values; }
  24. };
  25. class TDOAFunctor : public Functor<double>
  26. {
  27. private:
  28. Eigen::MatrixXd _data, _pos;
  29. public:
  30. TDOAFunctor(const Eigen::MatrixXd &data,const Eigen::MatrixXd &pos): Functor<double>(3,3),_data(data),_pos(pos) {}
  31. int operator()(const Eigen::VectorXd &x, Eigen::VectorXd &fvec) const
  32. {
  33. for (int i = 0; i < values(); i++)
  34. {
  35. fvec(i) = sqrt(pow(_data(i,0) - x(0),2) + pow(_data(i,1) - x(1),2) + pow(_data(i,2) - x(2),2))
  36. - sqrt(pow(_pos(0) - x(0),2) + pow(_pos(1) - x(1),2) + pow(_pos(2) - x(2),2))
  37. - _data(i,3);
  38. }
  39. return 0;
  40. }
  41. };
  42. class TofFunctor : public Functor<double>
  43. {
  44. private:
  45. Eigen::MatrixXd _data;
  46. public:
  47. TofFunctor(const Eigen::MatrixXd &data): Functor<double>(3,3),_data(data){}
  48. int operator()(const Eigen::VectorXd &x, Eigen::VectorXd &fvec) const
  49. {
  50. for (int i = 0; i < values(); i++)
  51. {
  52. double x1 = _data(i,0);
  53. double y1 = _data(i,1);
  54. fvec(i) = pow(_data(i,0) - x(0),2) + pow(_data(i,1) - x(1),2) - _data(i,3);
  55. }
  56. return 0;
  57. }
  58. };
  59. };