private void Kalmanize() { Kalman k1 = new Kalman(); for (int i = 0; i < tds.trajectories.Count; i++) { if (tds.trajectories[i].average_velocity > 0) { TrajectoryDbDataSet.pointsRow[] rows = tds.points.Select(String.Format("t_id = {0}", tds.trajectories[i].t_id)) as TrajectoryDbDataSet.pointsRow[]; for (int j = 0; j < rows.Count(); j++) { // First point so reset the Kalman filter if (j == 0) { //Don't have vx, vz entries yet so we'll have to do with velocity to set the Kalman filter k1.Reset(rows[j].X, rows[j].Z, rows[j].velocity, rows[j].velocity, rows[j].milliseconds); lastX = rows[j].X; lastZ = rows[j].Z; lastTime = 0; } Matrix Xpred = k1.Prediction((double)rows[j].milliseconds / 1000 - lastTime); lastTime = rows[j].milliseconds / 1000; if (j < rows.Count() - 1) { double vx = 1000 * (rows[j + 1].X - lastX) / (rows[j + 1].milliseconds - lastTime); double vz = 1000 * (rows[j + 1].Z - lastZ) / (rows[j + 1].milliseconds - lastTime); Matrix Xup = k1.update(vx, vz); tds.points[j].velocity = Math.Sqrt(Xup.Data[2] * Xup.Data[2] + Xup.Data[3] * Xup.Data[3]); } else { tds.points[j].velocity = Math.Sqrt(Xpred.Data[2] * Xpred.Data[2] + Xpred.Data[3] * Xpred.Data[3]); } } } } }
private void Kalmanize() { Kalman k1 = new Kalman(); for (int i = 0; i < tds.trajectories.Count; i++) { if (tds.trajectories[i].average_velocity > 0) { TrajectoryDbDataSet.pointsRow[] rows = tds.points.Select(String.Format("t_id = {0}",tds.trajectories[i].t_id)) as TrajectoryDbDataSet.pointsRow[]; for(int j = 0; j < rows.Count(); j++) { // First point so reset the Kalman filter if (j == 0) { //Don't have vx, vz entries yet so we'll have to do with velocity to set the Kalman filter k1.Reset(rows[j].X,rows[j].Z,rows[j].velocity,rows[j].velocity,rows[j].milliseconds); lastX = rows[j].X; lastZ = rows[j].Z; lastTime = 0; } Matrix Xpred = k1.Prediction((double)rows[j].milliseconds/1000 - lastTime); lastTime = rows[j].milliseconds/1000; if (j < rows.Count() - 1) { double vx = 1000 * (rows[j+1].X - lastX)/(rows[j+1].milliseconds - lastTime); double vz = 1000 * (rows[j+1].Z - lastZ)/(rows[j+1].milliseconds - lastTime); Matrix Xup = k1.update(vx,vz); tds.points[j].velocity = Math.Sqrt(Xup.Data[2]*Xup.Data[2] + Xup.Data[3]*Xup.Data[3]); } else { tds.points[j].velocity = Math.Sqrt(Xpred.Data[2] * Xpred.Data[2] + Xpred.Data[3] * Xpred.Data[3]); } } } } }