当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python cusignal.estimation.filters.KalmanFilter用法及代码示例


用法:

class cusignal.estimation.filters.KalmanFilter(dim_x, dim_z, dim_u=0, points=1, dtype=<class 'numpy.float32'>)

这是一个multi-point卡尔曼滤波器实现https://github.com/rlabbe/filterpy/blob/master/filterpy/kalman/kalman_filter.py,具有函数的子集。

所有卡尔曼滤波器矩阵都堆叠在 X 轴上。这是为了在 GPU 上实现最佳的全局访问。

参数

dim_xint

卡尔曼滤波器的状态变量数。例如,如果您在二维中跟踪对象的位置和速度,dim_x 将为 4。这用于设置 P、Q 和 u 的默认大小

dim_zint

测量输入的数量。例如,如果传感器为您提供 (x,y) 中的位置,则 dim_z 将为 2。

dim_uint(可选)

控制输入的大小(如果正在使用)。默认值 0 表示不使用。

pointsint(可选)

要跟踪的卡尔曼滤波器点数。

dtypedtype(可选)

计算的数据类型。

参考

1

Dan Simon. “Optimal State Estimation.” John Wiley & Sons. p. 208-212. (2006)

2

Roger Labbe. “Kalman and Bayesian Filters in Python” https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python

例子

这是一个使用仅读取位置的传感器跟踪位置和速度的过滤器。

首先构造具有所需维度、点数和数据类型的对象。

import cupy as cp
import numpy as np

from cusignal import KalmanFilter

points = 1024
kf = KalmanFilter(dim_x=4, dim_z=2, points=points, dtype=cp.float64)

为所有卡尔曼滤波器点分配状态(位置和速度)的初始值。

initial_location = np.array(
    [[10.0, 10.0, 0.0, 0.0]], dtype=dt
).T  # x, y, v_x, v_y
kf.x = cp.repeat(
    cp.asarray(initial_location[cp.newaxis, :, :]), points, axis=0
)

定义所有卡尔曼滤波器点的状态转移矩阵:

F = np.array(
    [
        [1.0, 0.0, 1.0, 0.0],  # x = x0 + v_x*dt
        [0.0, 1.0, 0.0, 1.0],  # y = y0 + v_y*dt
        [0.0, 0.0, 1.0, 0.0],  # dx = v_x
        [1.0, 0.0, 0.0, 1.0],
    ],  # dy = v_y
    dtype=dt,
)
kf.F = cp.repeat(cp.asarray(F[cp.newaxis, :, :]), points, axis=0)

定义所有卡尔曼滤波器点的测量函数:

H = np.array(
    [[1.0, 0.0, 1.0, 0.0], [0.0, 1.0, 0.0, 1.0]],
    dtype=dt,  # x_0  # y_0
)
kf.H = cp.repeat(cp.asarray(H[cp.newaxis, :, :]), points, axis=0)

定义所有卡尔曼滤波器点的协方差矩阵:

initial_estimate_error = np.eye(dim_x, dtype=dt) * np.array(
    [1.0, 1.0, 2.0, 2.0], dtype=dt
)
kf.P = cp.repeat(
    cp.asarray(initial_estimate_error[cp.newaxis, :, :]),
    points,
    axis=0,
)

定义所有卡尔曼滤波器点的测量噪声:

measurement_noise = np.eye(dim_z, dtype=dt) * 0.01
kf.R = cp.repeat(
    cp.asarray(measurement_noise[cp.newaxis, :, :]), points, axis=0
)

定义所有卡尔曼滤波器点的过程噪声:

现在只需执行标准的预测/更新循环: 注意:此示例仅对所有点使用相同的传感器读数

kf.predict()
z = get_sensor_reading() (dim_z, 1)
kf.z = cp.repeat(z[cp.newaxis, :, :], points, axis=0)
kf.update()

结果在:

相关用法


注:本文由纯净天空筛选整理自rapids.ai大神的英文原创作品 cusignal.estimation.filters.KalmanFilter。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。