def update_function(command, objects, noise): return [Angle3D.fromRotationAxis(pi/4+objects[0].getRotation()+noise,objects[0].getAxis())]
covars = [pi/6*matrix(identity(3))] def update_function(command, objects, noise): return [Angle3D.fromRotationAxis(pi/4+objects[0].getRotation()+noise,objects[0].getAxis())] def measurement_predict_function(objects, noise): pdb.set_trace() if magnitude(noise[1:]) == 0: axis = noise[1:] else: axis = noise[1:]/magnitude(noise[1:]) theta = noise[0,0] return [Angle3D(Quaternion(sin(theta/2)*axis[0,0],sin(theta/2)*axis[1,0],sin(theta/2)*axis[2,0],cos(theta/2))*objects[0].r)] covar_process_noise = matrix([[.001]]) covar_measurement_noise = .005*matrix(identity(4)) k = unscentedKalmanFilter(objects, covars, update_function, measurement_predict_function, [None], covar_process_noise, covar_measurement_noise) realPos = [Angle3D.fromRotationAxis(pi/2,matrix([[1/sqrt(3)],[1/sqrt(3)],[1/sqrt(3)]]))] for i in xrange(100): realPos = update_function(0,realPos,random.normal(0,covar_process_noise[0,0])) measurement = measurement_predict_function(realPos,matrix(random.multivariate_normal([0,0,0,0],covar_measurement_noise)).getT()) print measurement[0].r k.step(measurement, [0]) ret = k.mean print "filter, real" print ret[0].getRotation(), realPos[0].getRotation() print ret[0].getAxis() print realPos[0].getAxis() pdb.set_trace()