我在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。