我在c ++中遇到了一些设计问题。 我的基本想法是:
我有一个州级和两个卡尔曼过滤器类。卡尔曼滤波器类具有相同的基类,具有相同的接口校正(状态,测量)。但每个实现都以不同的方式工作。
我的州级,基本上处理一个向量。
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;
派生卡尔曼A类
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,以将状态向量的维度映射到测量向量的维度。
所以从外面我只想定义测量类型和状态类型,并执行以下操作:
KalmanBase* Kalman
Kalman = new KalmanA_CV
state = Kalman.CreateState()
// Measurement1 m;
// m.initMeasurement(...)
Kalman.correction(*state, m)
并且根据测量类型,我希望kalmanA或KalmanB使用相应的C_矩阵或C_Function。
我很感激一些设计建议。
答案 0 :(得分:1)
我并不确切地知道你是如何想象这一点的,但基本上这对于我猜的访客模式来说是一个很好的选择。如需粗略概述,请查看wikipedia page。
答案 1 :(得分:0)
对于初学者来说,StateBase::state_
似乎未被使用。有道理:它既不是卡尔曼的状态,也不是卡尔曼的状态。
其次,KalmanA只是KalmanB的专用版本。特别是,
StateFunc
为[](Eigen::VectorXd& state) { state *= A_; }
。
因此,我建议你删除整个继承模型,然后用class Kalman
创建一个std::function<void(Eigen::VectorXd& state)> StateFunc
。
最后一点,你正在使用new
。这可以避免,只需直接使用变量:Kalman kal { A_matrix, C_matrix }; // Selects the right ctor overload