#ifndef BASE_DATA_STRUCT_H #define BASE_DATA_STRUCT_H #include #include namespace algorithm{ namespace base{ // 分站接收数据结构体 struct ReceiveData{ unsigned int reader_id; // 分站号 unsigned short antenna_id; // 天线号 long long rec_time_stamp; // 分站接收时间,一个7字节的无符号数 int special; double x; //分站的x坐标 double y; //分站的y坐标 double z; //分站的z坐标 ReceiveData(){ reader_id = 0; antenna_id = 0; rec_time_stamp = 0; x = y = z = 0.0; special = 0; }; }; typedef unordered_map> ReceiveDataUnorderedMap; template class Functor { private: int m_inputs, m_values; public: typedef _Scalar Scalar; enum { InputsAtCompileTime = NX, ValuesAtCompileTime = NY }; typedef Eigen::Matrix InputType; typedef Eigen::Matrix ValueType; typedef Eigen::Matrix JacobianType; Functor() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {} Functor(int inputs, int values) : m_inputs(inputs), m_values(values) {} int inputs() const { return m_inputs; } int values() const { return m_values; } }; class TDOAFunctor : public Functor { private: Eigen::MatrixXd _data, _pos; public: TDOAFunctor(const Eigen::MatrixXd &data,const Eigen::MatrixXd &pos): Functor(3,3),_data(data),_pos(pos) {} int operator()(const Eigen::VectorXd &x, Eigen::VectorXd &fvec) const { for (int i = 0; i < values(); i++) { fvec(i) = sqrt(pow(_data(i,0) - x(0),2) + pow(_data(i,1) - x(1),2) + pow(_data(i,2) - x(2),2)) - sqrt(pow(_pos(0) - x(0),2) + pow(_pos(1) - x(1),2) + pow(_pos(2) - x(2),2)) - _data(i,3); } return 0; } }; }; const int MAX_READER_TDOA_PATH_NUMS = 10; //主要是因为拐弯处可能存在多解的原因 const double INVALID_COORDINATE = -1000.0; enum DIMENSION{ _1D = 1, _2D, _3D }; enum ALGO_LOC_TYPE{ ALGO_LOC_SUCCESSED = 0, //算法定位成功 ALGO_FAILED_CONDITION_1, //同步序号相差大于5 ALGO_FAILED_CONDITION_2, //相同卡序列号,时间同步序号却相差大于5 ALGO_FAILED_CONDITION_3, //时间同步戳值存在异常 ALGO_FAILED_CONDITION_4, //卡的上次时间戳大于卡的本次时间戳 ALGO_FAILED_CONDITION_5, //人卡加速度超限 ALGO_FAILED_CONDITION_6, //车卡加速度超限 ALGO_FAILED_CONDITION_7, //车卡速度超限 ALGO_FAILED_CONDITION_8, //卡尔曼连续2s定位失败等 ALGO_FAILED_CONDITION_9, //分站时间戳的距离差值大于分站之间的距离 ALGO_FAILED_CONDITION_10, //分站之间无地图集 ALGO_FAILED_CONDITION_11, //定位无解or解的个数为0 ALGO_FAILED_CONDITION_12, //分站附近(小于4m),分站不是特殊分站 ALGO_FAILED_CONDITION_13, //解与无地图集两分站之间的距离差(大于10m) ALGO_FAILED_CONDITION_14, //定位结果距离定位分站之间的距离差大于4 ALGO_FAILED_CONDITION_15, //参与定位的数据条数小于2 ALGO_LOC_TOTAL }; struct POS{ double posx; // 以米为单位坐标 double posy; double posz; //误差范围 double pos_radius; //以像素为单位的坐标,米/地图比例尺 = 像素 double cx; double cy; double cz; //三个方向的速度 double cvx; double cvy; double cvz; //加速度 double av; //保存定位结果的两个分站信息 int nFirstReader; int nSecondReader; //精度参考 double dDiff[MAX_READER_TDOA_PATH_NUMS]; double dis_diff; //定位失败的状态 int reason; int status; int dimension; unsigned long long card_count; //卡的ct号 unsigned short card_timestamp; bool update; //是否需要保存到同步队列中 bool is_back; bool is_fit; //是否是拟合数据 //当前分站同步序号与参考数据的分站同步序号时间差值 double diff_reader_sync_num; double delta_time; //时间差 //参考数据的定位坐标 double ref_x; double ref_y; double ref_z; double origin_speed; //原始定位结果算的速度 double sumVariance; // 保存各定位解之间差值的和 POS(){ card_timestamp = 0; nFirstReader = 0; nSecondReader = 0; pos_radius = 999999.9; posx = posy = posz = INVALID_COORDINATE; cx = cy = cz = cvx = cvy = cvz = 0.0; av = 0.0; status = 0; card_count = 0; for (int i=0;icard_count = tmp.card_count; this->card_timestamp = tmp.card_timestamp; nFirstReader = tmp.nFirstReader; nSecondReader = tmp.nSecondReader; posx = tmp.posx; posy = tmp.posy; posz = tmp.posz; cx = tmp.cx; cy = tmp.cy; cz = tmp.cz; cvx = tmp.cvx; cvy = tmp.cvy; cvz = tmp.cvz; av = tmp.av; update = tmp.update; origin_speed = tmp.origin_speed; status = tmp.status; is_back = tmp.is_back; diff_reader_sync_num = tmp.diff_reader_sync_num; delta_time = tmp.delta_time; dis_diff = tmp.dis_diff; ref_x = tmp.ref_x; ref_y = tmp.ref_y; ref_z = tmp.ref_z; sumVariance = tmp.sumVariance; for (int i=0;i