| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | 
							- using System.Collections.Generic;
 
- using System.Linq;
 
- using UnityEngine;
 
- using UnscentedKalmanFilter;
 
- namespace ZIM
 
- {
 
-     // 固定时间间隔下,预测位置轨迹
 
-     public class SimpleLocationEstimation
 
-     {
 
-         //public bool Initialized;
 
-         public Vector2 Predict;
 
-         Vector2 LastLocation;
 
-         Vector2 LastSpeed;
 
-         Vector2 LastAcc;
 
-         float AccChangeScale;
 
-         List<Vector2> Locations;
 
-         // 卡尔曼滤波作用于速度
 
-         UKF filterx;
 
-         UKF filtery;
 
-         public SimpleLocationEstimation(float accChangeScale = 1)
 
-         {
 
-             Locations = new List<Vector2>();
 
-             AccChangeScale = accChangeScale;
 
-             filterx = new UKF();
 
-             filtery = new UKF();
 
-         }
 
-         public Vector2 Update(Vector2 loc)
 
-         {
 
-             if (Locations == null)
 
-             {
 
-                 var newSpeed = loc - LastLocation;
 
-                 var newAcc = newSpeed - LastSpeed;
 
-                 var accPredict = newAcc + (newAcc - LastAcc) * AccChangeScale;
 
-                 var speedPredict = newSpeed + accPredict;
 
-                 //if (speedPredict.x * newSpeed.x < 0)
 
-                 //    speedPredict.x = 0;
 
-                 //if (speedPredict.y * newSpeed.y < 0)
 
-                 //    speedPredict.y = 0;
 
-                 //var LocationPredict = loc + speedPredict;
 
-                 filterx.Update(new double[] { speedPredict.x });
 
-                 filtery.Update(new double[] { speedPredict.y });
 
-                 var LocationPredict = loc + new Vector2((float)filterx.getState()[0], (float)filtery.getState()[0]);
 
-                 LastSpeed = newSpeed;
 
-                 LastAcc = newAcc;
 
-                 LastLocation = loc;
 
-                 return Predict = LocationPredict;
 
-                 //return Predict = new Vector2((float)filterx.getState()[0], (float)filtery.getState()[0]);
 
-             }
 
-             if (Locations.Count < 2)
 
-             {
 
-                 Locations.Add(loc);
 
-             }
 
-             else
 
-             {
 
-                 Locations.Add(loc);
 
-                 var speed = new Vector2[] { Locations.ElementAt(1) - Locations.ElementAt(0), Locations.ElementAt(2) - Locations.ElementAt(1) };
 
-                 LastLocation = loc;
 
-                 LastSpeed = speed[1];
 
-                 LastAcc = speed[1] - speed[0];
 
-                 Locations = null;
 
-             }
 
-             return Predict = loc;
 
-         }
 
-     }
 
- }
 
 
  |