4 个版本

使用旧的 Rust 2015

0.1.3 2017 年 2 月 8 日
0.1.2 2017 年 2 月 1 日
0.1.1 2017 年 1 月 19 日
0.1.0 2017 年 1 月 19 日

#536 in 科学

GPL-3.0 许可证

12KB
89

用 Rust 编写的卡尔曼滤波和光滑库

Build Status License: GPL v3

在此处访问库的文档 这里。库也在 Cargo 索引中引用。

目前,库仅提供时不变线性卡尔曼滤波和光滑技术,称为固定间隔光滑(Rauch-Tung-Striebel 光滑器),该技术依赖于整个数据集的卡尔曼滤波估计。linearkalman 依赖于 rulinalg 库来实现线性代数结构和操作,因此输入数据应为一个 std::vec::VecVector 对象,即向量的向量。

为了使用此库,请确保您的 Cargo.toml 文件包含以下内容

[dependencies]
linearkalman = "0.1.3"

然后可以使用以下方式导入库

extern crate linearkalman;

示例

以下示例假设具有 2 维状态空间模型的 3 维测量数据。借助来自 rulinalg 的几个宏,使用库运行卡尔曼滤波和光滑器的简单尝试如下。

#[macro_use]
extern crate rulinalg;
extern crate linearkalman;

use rulinalg::vector::Vector;
use linearkalman::KalmanFilter;

fn main() {

  let kalman_filter = KalmanFilter {
    // Process noise covariance
    q: matrix![1.0, 0.1;
               0.1, 1.0],
    // Measurement noise matrix
    r: matrix![1.0, 0.2, 0.1;
               0.2, 0.8, 0.5;
               0.1, 0.5, 1.2],
    // Observation matrix
    h: matrix![1.0, 0.7;
               0.5, 0.7;
               0.8, 0.1],
    // State transition matrix
    f: matrix![0.6, 0.2;
               0.1, 0.3],
    // Initial guess for state mean at time 1
    x0: vector![1.0, 1.0],
    // Initial guess for state covariance at time 1
    p0: matrix![1.0, 0.0;
                0.0, 1.0],
  };

  let data: Vec<Vector<f64>> = vec![vector![1.04, 2.20, 3.12],
                                    vector![1.11, 2.33, 3.34],
                                    vector![1.23, 2.21, 3.45]];

  let run_filter = kalman_filter.filter(&data);
  let run_smooth = kalman_filter.smooth(&run_filter.0, &run_filter.1);

  // Print filtered and smoothened state variable coordinates
  println!("filtered.1,filtered.2,smoothed.1,smoothed.2");
  for k in 0..3 {
      println!("{:.6},{:.6},{:.6},{:.6}",
               &run_filter.0[k].x[0], &run_filter.0[k].x[1],
               &run_smooth[k].x[0], &run_smooth[k].x[1])
  }
}

examples 目录包含代码示例,允许从 CSV 文件导入数据并将过滤和光滑数据返回到 stdout

许可证

本项目许可协议为 GPL3。

依赖项

~1MB
~18K SLoC