使用卡尔曼滤波器跟踪圆周运动的机器人

Mo *_*o K 2 python kalman-filter

我正在尝试做的事情:

  • 使用卡尔曼滤波器或扩展卡尔曼滤波器定位以圆周运动移动的机器人
  • 使用三角学和线性代数,我能够预测“圆周运动”,但我想知道是否可以使用卡尔曼滤波器来定位机器人(不假设它处于圆周运动)
  • 机器人感知其坐标(x,y)。

我遇到的问题是:

我的代码实现

Cla*_*len 5

我认为这里有两个问题。一是您缺少过程协方差矩阵 Q。如果您的状态转换模型不完美,这将提示算法预测的不确定性。大的 Q 将使算法更多地依赖于测量。尝试初始化

self.q = 0.001*self.f.dot(self.f.transpose())
Run Code Online (Sandbox Code Playgroud)

然后在预测函数中

self.p = self.f.dot(self.p).dot(self.f.transpose()) + self.q
Run Code Online (Sandbox Code Playgroud)

另一个问题是您正在测量笛卡尔平面中的圆周(极)运动。旋转给出了 X 和 Y 方向的加速度,但 F 矩阵中缺少该加速度。我将更新 F 矩阵以包含完整的物理模型(包括加速度)。时间步长 (dT) 也缺失,可以作为参数添加。

class KalmanFilter(Filter):
    def __init__(self, sigma, dT):
    ...
    self.f = np.array([[1, 0, dT, 0, dT*dT/2,   0],
                       [0, 1, 0, dT,   0, dT*dT/2],
                       [0, 0, 1, 0,   dT,   0],
                       [0, 0, 0, 1,   0,   dT],
                       [0, 0, 0, 0,   1,   0],
                       [0, 0, 0, 0,   0,   1]])
Run Code Online (Sandbox Code Playgroud)

最后在你的主要功能中

KF = KalmanFilter(sigma=1,dT=0.1)
Run Code Online (Sandbox Code Playgroud)

我还将 sigma 增加到 1 以获得更平滑的预测,并将 P 初始化从 999 减少到 1 以可视化初始超调。

结果如下: 在此输入图像描述