taylor_wls_tdoa.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #ifndef TAYLOR_WLS_TDOA_H
  2. #define TAYLOR_WLS_TDOA_H
  3. #include <Eigen/Dense>
  4. #include <SyncTime/Position.h>
  5. #include <memory>
  6. #include <limits>
  7. //#include "classdef.h"
  8. //#include <unordered_map>
  9. #include "../base/base_data_struct.h"
  10. #include "../Functions/Functions.h"
  11. namespace Tdoa{
  12. using namespace HostServer;
  13. //第三方矩阵库
  14. using namespace Eigen;
  15. const double DEFAULT_ITERATIVE_ACCURACY = 0.5; // 默认迭代精度
  16. const unsigned int DEFAULT_ITERATIVE_TIMES = 20; // 默认迭代次数
  17. class TaylorWls{
  18. public:
  19. TaylorWls(){
  20. is_initial = false;
  21. this->accuracy = DEFAULT_ITERATIVE_ACCURACY;
  22. this->iterator_times = DEFAULT_ITERATIVE_TIMES;
  23. }
  24. TaylorWls(double accuracy,unsigned int times){
  25. is_initial = false;
  26. this->accuracy = accuracy;
  27. this->iterator_times = times;
  28. }
  29. ~TaylorWls(){}
  30. private:
  31. unsigned int iterator_times; // 迭代次数
  32. bool is_initial; // 是否初始化了初始坐标
  33. double accuracy; // 迭代精度
  34. Position pos; // 迭代函数的输出坐标
  35. Position iter_pos; // 迭代函数的输入坐标
  36. private:
  37. Matrix<double,Eigen::Dynamic,Eigen::Dynamic,Eigen::DontAlign> anchors; // 分站坐标
  38. Matrix<unsigned long long,Eigen::Dynamic,1,Eigen::DontAlign> T; // 分站时间戳
  39. private:
  40. //计算m的广义逆矩阵
  41. Matrix<double,Eigen::Dynamic,Eigen::Dynamic,Eigen::DontAlign>& pinv(Matrix<double,Eigen::Dynamic,Eigen::Dynamic,Eigen::DontAlign>& m);
  42. //生成符合正太分布的随机数
  43. double gauss_rand(double mu, double sigma);
  44. double gauss_rand();
  45. public:
  46. double get_accuracy(){return accuracy;};
  47. void set_accuracy(const double & accuracy){this->accuracy = accuracy;};
  48. Position& get_position(){return pos;};
  49. void set_position(const Position& p){
  50. pos = p;
  51. };
  52. unsigned int get_iterative_times(){return iterator_times;};
  53. void set_iterative_times(unsigned int times){this->iterator_times = times;}
  54. // 计算坐标
  55. Position& calc_position(std::shared_ptr<algorithm::base::ReceiveDataUnorderedMap>& pRdm);
  56. // taylor+加权最小二乘算法
  57. Position& taylor_wls(Matrix<double,Eigen::Dynamic,Eigen::Dynamic,Eigen::DontAlign>& anchors,Matrix<unsigned long long,Eigen::Dynamic,1,Eigen::DontAlign>& T,const Position& pos,unsigned int size);
  58. // 初始化迭代的初始坐标
  59. void init_position(const Position& pos){
  60. this->iter_pos = pos;
  61. this->pos = pos;
  62. is_initial = true;
  63. };
  64. int init_params(std::shared_ptr<algorithm::base::ReceiveDataUnorderedMap> pRdm); //除了第一次定位以外,每次调用算法都会初始化分站坐标和tt
  65. };
  66. };
  67. #endif