我在C++中遇到一些设计问题。
我的基本想法:

我有一个状态类和两个卡尔曼过滤器类。卡尔曼滤波器类具有相同的基类,具有相同的接口(interface)校正(状态,测量)。但是每种实现方式的工作方式都不同。

我的州课,基本上处理一个 vector 。

class StateBase{
protected:
  Eigen::VectorXd state_;
};

class StateCV : public StateBase {}
class StateCA : public StateBase {}

卡尔曼滤波器基类:
class KalmanBase {
public:
  virtual void prediction(Eigen::VectorXd& state)
  virtual void Correction(Eigen::VectorXd& state, Eigen::VectorXd& measurement) = 0;
 ...
};
  virtual StateBase* CreateState() = 0;

派生KalmanA类
class KalmanA : public KalmanBase {
public:
  void Prediction(Eigen::VectorXd& state) {
      state = A_ * state;
  void Correction(Eigen::VectorXd& state, Eigen::VectorXd& measurement) {
      ...
      Eigen::VectorXd x = C_*state - measurement;
      ...
  }
protected:
  Eigen::MatrixXd A_, C_ ;
};

派生KalmanB类
class KalmanB : public KalmanBase {
public:
  void Prediction(Eigen::VectorXd& state) {
    StateFunc(state);
  }
  void Correction(Eigen::VectorXd& state, Eigen::VectorXd& measurement) {
      ...
      Eigen::VectorXd x = measurement - CFunc(state);
      ...
  }
private:
    void StateFunc(Eigen::VectorXd& state) {}
    CFunc(const Eigen::VectorXd& measurement) {}
};

对于每种状态,我也有KalmanA和KalmanB的子类。
class KalmanA_CV : public KalmanA {
  StateBase* CreateState() { return new StateCV(); }
}
class KalmanA_CA : public KalmanA {
  StateBase* CreateState() { return new StateCA(); }
}

class KalmanB_CV : public KalmanB { ...}
class KalmanB_CA : public KalmanB { ... }

根据我的测量,我必须更改KalmanA中的C_ Matrix或KalmanB中的CFunc,以将状态 vector 的维映射到测量 vector 的维。

所以从外面,我只想定义一个度量类型和状态类型,然后执行以下操作:
KalmanBase* Kalman
Kalman = new KalmanA_CV
state = Kalman.CreateState()
// Measurement1 m;
// m.initMeasurement(...)
Kalman.correction(*state, m)

根据测量类型,我希望kalmanA或KalmanB使用相对应的C_ Matrix或C_Function。

对于某些设计建议,我将不胜感激。

最佳答案

我不知道您如何想象此方法的工作原理,但是从本质上讲,这对于我想的访客模式来说将是一个很好的选择。要大致了解一下,请查看wikipedia page

09-26 11:18