如何在 Apache Commons 卡尔曼滤波器实现中填充矩阵
How to populating matrices in the Apache Commons Kalman filter Implementation
背景:为了给大家一些背景知识,我正在尝试使用卡尔曼滤波器(Apache)平滑从设备接收到的 GPS 数据
共同实施)。我应该包括什么样的动态噪音
在我关于矩阵 P0、Q 和 R 的实现中知道
除了位置(X 和 Y),我唯一的输入是水平的
X 和 Y 分量的精度和速度。这不是一个常数
速度示例,因为速度可能从 1 ping 变为
另一个 ping。
实施库:Apache Common
- http://commons.apache.org/proper/commons-math/userguide/filter.html
用法:我现在只考虑 2D space
我的输入:
1.纬度
2. 经度
3. meters/sec
中的水平精度或水平精度稀释 (HDOP)
4. 两次 ping 之间的时间 (dt) = 30 秒
我关心的输出
1. 新纬度
2.新经度
计算值:Vx(X方向的速度)Vy(Y方向的速度)物体将不断移动,但随着
不同的速度,所以我可以使用公式计算 Vx 和 Vy
V * sin(theta) 和 V * Cosine(theta)
我应该如何将我的值映射到 Apache Common 实现。?
当前设置:
X = Initial State = [
{X Y X-Vel Y-Vel}
]
// I only care about X and Y coordinates so this is a 2 * 4 matrix
H = Observation variables = [
{1, 0, 0, 0},
{0, 1, 0, 0}
]
// This is a 4 * 4 matrix
P0 = Cov(X) = [
{(horizontal accuracy from i/p), 0, 0, 0},
{0, (horizontal accuracy from i/p), 0, 0},
{0, 0, (some initial value for VY), 0},
{0, 0, 0, (some initial value for VX) }
]
// Copied this from somewhere. What values should I have in this? //
This is a 4 * 4 matrix
Q = Cov(Dynamic noise) = [
{ Math.pow(dt, 4d)/4d, 0d, Math.pow(dt, 3d)/2d, 0d },
{ 0d, Math.pow(dt, 4d)/4d, 0d, Math.pow(dt, 3d)/2d },
{ Math.pow(dt, 3d)/2d, 0d, Math.pow(dt, 2d), 0d },
{ 0d, Math.pow(dt, 3d)/2d, 0d, Math.pow(dt, 2d) }
]
// This is a 2 * 2 matrix
R = Cov(measurement noise) = [
{ Math.pow((horizontal accuracy from i/p), 2d) , 0},
{ 0, Math.pow((horizontal accuracy from i/p), 2d)}
]
// This is a 4 * 4 matrix
A = State transition matrix = [
{ 1d, 0d, dt, 0d },
{ 0d, 1d, 0d, dt },
{ 0d, 0d, 1d, 0 },
{ 0d, 0d, 0d, 1d }
]
我的矩阵是否适合我正在尝试做的事情?当我 运行 他们的时候
不断收到 MatrixDimensionMismatchException,因此我决定
问一个问题。任何帮助将不胜感激。
我使用最新版本的 Apache Commons Math 库解决了这个问题。
事实证明 Apache Commons Math 3.2 及更早版本存在重大错误
此处报告:https://issues.apache.org/jira/browse/MATH-1033
问题是 measNoise 列维度必须始终为 1,这意味着矩阵 R 应该始终只有 1 列
// row dimension of R must be equal to row dimension of H
if (measNoise.getRowDimension() != measurementMatrix.getRowDimension() ||
measNoise.getColumnDimension() != 1) {
throw new MatrixDimensionMismatchException(measNoise.getRowDimension(), measNoise.getColumnDimension(), measurementMatrix.getRowDimension(), 1);
}
背景:为了给大家一些背景知识,我正在尝试使用卡尔曼滤波器(Apache)平滑从设备接收到的 GPS 数据 共同实施)。我应该包括什么样的动态噪音 在我关于矩阵 P0、Q 和 R 的实现中知道 除了位置(X 和 Y),我唯一的输入是水平的 X 和 Y 分量的精度和速度。这不是一个常数 速度示例,因为速度可能从 1 ping 变为 另一个 ping。
实施库:Apache Common
- http://commons.apache.org/proper/commons-math/userguide/filter.html
用法:我现在只考虑 2D space
我的输入:
1.纬度
2. 经度
3. meters/sec
中的水平精度或水平精度稀释 (HDOP)
4. 两次 ping 之间的时间 (dt) = 30 秒
我关心的输出
1. 新纬度
2.新经度
计算值:Vx(X方向的速度)Vy(Y方向的速度)物体将不断移动,但随着 不同的速度,所以我可以使用公式计算 Vx 和 Vy V * sin(theta) 和 V * Cosine(theta)
我应该如何将我的值映射到 Apache Common 实现。?
当前设置:
X = Initial State = [
{X Y X-Vel Y-Vel}
]
// I only care about X and Y coordinates so this is a 2 * 4 matrix
H = Observation variables = [
{1, 0, 0, 0},
{0, 1, 0, 0}
]
// This is a 4 * 4 matrix
P0 = Cov(X) = [
{(horizontal accuracy from i/p), 0, 0, 0},
{0, (horizontal accuracy from i/p), 0, 0},
{0, 0, (some initial value for VY), 0},
{0, 0, 0, (some initial value for VX) }
]
// Copied this from somewhere. What values should I have in this? //
This is a 4 * 4 matrix
Q = Cov(Dynamic noise) = [
{ Math.pow(dt, 4d)/4d, 0d, Math.pow(dt, 3d)/2d, 0d },
{ 0d, Math.pow(dt, 4d)/4d, 0d, Math.pow(dt, 3d)/2d },
{ Math.pow(dt, 3d)/2d, 0d, Math.pow(dt, 2d), 0d },
{ 0d, Math.pow(dt, 3d)/2d, 0d, Math.pow(dt, 2d) }
]
// This is a 2 * 2 matrix
R = Cov(measurement noise) = [
{ Math.pow((horizontal accuracy from i/p), 2d) , 0},
{ 0, Math.pow((horizontal accuracy from i/p), 2d)}
]
// This is a 4 * 4 matrix
A = State transition matrix = [
{ 1d, 0d, dt, 0d },
{ 0d, 1d, 0d, dt },
{ 0d, 0d, 1d, 0 },
{ 0d, 0d, 0d, 1d }
]
我的矩阵是否适合我正在尝试做的事情?当我 运行 他们的时候 不断收到 MatrixDimensionMismatchException,因此我决定 问一个问题。任何帮助将不胜感激。
我使用最新版本的 Apache Commons Math 库解决了这个问题。
事实证明 Apache Commons Math 3.2 及更早版本存在重大错误
此处报告:https://issues.apache.org/jira/browse/MATH-1033
问题是 measNoise 列维度必须始终为 1,这意味着矩阵 R 应该始终只有 1 列
// row dimension of R must be equal to row dimension of H
if (measNoise.getRowDimension() != measurementMatrix.getRowDimension() ||
measNoise.getColumnDimension() != 1) {
throw new MatrixDimensionMismatchException(measNoise.getRowDimension(), measNoise.getColumnDimension(), measurementMatrix.getRowDimension(), 1);
}