示例#1
0
    def test_level_hovering_with_gravity(self):
        imu = localization.sensors.imu.ImuCompensated(
                10., 0.5, 'Madgwick', gravity_drift=9.81)
        self.assertAlmostEqual(9.81, imu.gravity)
        self.assertAlmostEqual(10., imu.next_measurement_time)

        desired_covariance = numpy.diag(
                [8.726646259971648e-05] * 3 + [1.4709975e-3] * 3)
        self.assertSequenceEqual([6, 6], imu.covariance.shape)
        for i in xrange(6):
            for j in xrange(6):
                self.assertAlmostEqual(
                        desired_covariance[i, j], imu.covariance[i, j])

        # Set a zero covariance matrix to make tests deterministic
        imu.sensor.covariance = numpy.zeros([6, 6])

        state_vector = numpy.zeros([15, 1])

        for t in numpy.arange(10., 12., 1. / 4000.):
            imu.getStateMeasurementsUntil(state_vector, t)

        meas = imu.getStateMeasurementsUntil(state_vector, 12.)

        self.assertAlmostEqual(9.81, imu.gravity)

        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(0., meas.measurement[0, 0])
        self.assertAlmostEqual(0., meas.measurement[1, 0])
        self.assertAlmostEqual(0., meas.measurement[2, 0])
        self.assertAlmostEqual(0., meas.measurement[3, 0])
        self.assertAlmostEqual(0., meas.measurement[4, 0])
        self.assertAlmostEqual(0., meas.measurement[5, 0])
示例#2
0
    def test_level_hovering_with_bad_attitude_and_gravity(self):
        imu = localization.sensors.imu.ImuCompensated(
                10., 1000., 'Madgwick', gravity_drift=9.81)
        imu.setGravity(9.75)
        imu.setGravityCorrectionRate(0.5)
        self.assertAlmostEqual(9.75, imu.gravity)

        # Set a zero covariance matrix to make tests deterministic
        imu.sensor.covariance = numpy.zeros([6, 6])

        state_vector = numpy.zeros([15, 1])

        state_vector[localization.util.StateMember.roll, 0] = 0.1
        state_vector[localization.util.StateMember.pitch, 0] = 0.2

        for t in numpy.arange(10., 30., 1. / 1000.):
            imu.getStateMeasurementsUntil(state_vector, t)

        meas = imu.getStateMeasurementsUntil(state_vector, 30.)

        self.assertAlmostEqual(9.81, imu.gravity, delta=0.001)

        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(0., meas.measurement[0, 0], delta=0.001)
        self.assertAlmostEqual(0., meas.measurement[1, 0], delta=0.001)
        self.assertAlmostEqual(0., meas.measurement[2, 0], delta=0.001)
        self.assertAlmostEqual(0., meas.measurement[3, 0], delta=0.001)
        self.assertAlmostEqual(0., meas.measurement[4, 0], delta=0.001)
        self.assertAlmostEqual(0., meas.measurement[5, 0], delta=0.001)
示例#3
0
    def test_level_hovering_with_bad_attitude_and_gravity(self):
        imu = localization.sensors.imu.ImuCompensated(10.,
                                                      1000.,
                                                      'Madgwick',
                                                      gravity_drift=9.81)
        imu.setGravity(9.75)
        imu.setGravityCorrectionRate(0.5)
        self.assertAlmostEqual(9.75, imu.gravity)

        # Set a zero covariance matrix to make tests deterministic
        imu.sensor.covariance = numpy.zeros([6, 6])

        state_vector = numpy.zeros([15, 1])

        state_vector[localization.util.StateMember.roll, 0] = 0.1
        state_vector[localization.util.StateMember.pitch, 0] = 0.2

        for t in numpy.arange(10., 30., 1. / 1000.):
            imu.getStateMeasurementsUntil(state_vector, t)

        meas = imu.getStateMeasurementsUntil(state_vector, 30.)

        self.assertAlmostEqual(9.81, imu.gravity, delta=0.001)

        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(0., meas.measurement[0, 0], delta=0.001)
        self.assertAlmostEqual(0., meas.measurement[1, 0], delta=0.001)
        self.assertAlmostEqual(0., meas.measurement[2, 0], delta=0.001)
        self.assertAlmostEqual(0., meas.measurement[3, 0], delta=0.001)
        self.assertAlmostEqual(0., meas.measurement[4, 0], delta=0.001)
        self.assertAlmostEqual(0., meas.measurement[5, 0], delta=0.001)
示例#4
0
    def test_level_hovering_no_drift(self):
        imu = localization.sensors.imu.ImuCompensated(10., 0.5, 'Madgwick')
        self.assertAlmostEqual(0., imu.gravity)
        self.assertAlmostEqual(10., imu.next_measurement_time)

        desired_covariance = numpy.diag([8.726646259971648e-05] * 3 +
                                        [1.4709975e-3] * 3)
        self.assertSequenceEqual([6, 6], imu.covariance.shape)
        for i in xrange(6):
            for j in xrange(6):
                self.assertAlmostEqual(desired_covariance[i, j],
                                       imu.covariance[i, j])

        # Set a zero covariance matrix to make tests deterministic
        imu.sensor.covariance = numpy.zeros([6, 6])

        state_vector = numpy.zeros([15, 1])

        for t in numpy.arange(10., 12., 1. / 4000.):
            imu.getStateMeasurementsUntil(state_vector, t)

        meas = imu.getStateMeasurementsUntil(state_vector, 12.)

        self.assertAlmostEqual(0., imu.gravity)

        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(0., meas.measurement[0, 0])
        self.assertAlmostEqual(0., meas.measurement[1, 0])
        self.assertAlmostEqual(0., meas.measurement[2, 0])
        self.assertAlmostEqual(0., meas.measurement[3, 0])
        self.assertAlmostEqual(0., meas.measurement[4, 0])
        self.assertAlmostEqual(0., meas.measurement[5, 0])
示例#5
0
    def test_get_state_measurements_until_with_drift(self):
        imu = localization.sensors.imu.InvensenseMPU9250(
                10., 0.5, [1., 2., 3.], 9.81)
        self.assertAlmostEqual(10., imu.next_measurement_time)

        desired_covariance = numpy.diag(
                [8.726646259971648e-05] * 3 + [1.4709975e-3] * 3)
        self.assertSequenceEqual([6, 6], imu.covariance.shape)
        for i in xrange(6):
            for j in xrange(6):
                self.assertAlmostEqual(
                        desired_covariance[i, j], imu.covariance[i, j])


        # Set a zero covariance matrix to make tests deterministic
        imu.covariance = numpy.zeros([6, 6])

        # Test without tilting
        meas_val = numpy.arange(15.).reshape([15, 1])
        meas_val[3:6] = numpy.zeros([3, 1])
        meas = imu.getStateMeasurementsUntil(meas_val, 10.3)
        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(10., meas.measurement[0, 0])
        self.assertAlmostEqual(12., meas.measurement[1, 0])
        self.assertAlmostEqual(14., meas.measurement[2, 0])
        self.assertAlmostEqual(12., meas.measurement[3, 0])
        self.assertAlmostEqual(13., meas.measurement[4, 0])
        self.assertAlmostEqual(23.81, meas.measurement[5, 0])
        self.assertAlmostEqual(12., imu.next_measurement_time)

        meas = imu.getStateMeasurementsUntil(
                numpy.arange(2., 17.).reshape([15, 1]), 11.6)
        self.assertIsNone(meas)
        self.assertAlmostEqual(12., imu.next_measurement_time)

        # Test with tilting

        g = numpy.zeros([3, 1])
        g[2, 0] = 9.81
        meas = imu.getStateMeasurementsUntil(
                numpy.arange(15.).reshape([15, 1]), 10.3)
        g_offs = localization.util.rpyToRotationMatrix(3., 4., 5.).dot(g)

        meas = imu.getStateMeasurementsUntil(
                numpy.arange(4., 19.).reshape([15, 1]), 12.2)
        g_offs = localization.util.rpyToRotationMatrix(7., 8., 9.).dot(g)
        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(14., meas.measurement[0, 0])
        self.assertAlmostEqual(16., meas.measurement[1, 0])
        self.assertAlmostEqual(18., meas.measurement[2, 0])
        self.assertAlmostEqual(16. + g_offs[0, 0], meas.measurement[3, 0])
        self.assertAlmostEqual(17. + g_offs[1, 0], meas.measurement[4, 0])
        self.assertAlmostEqual(18. + g_offs[2, 0], meas.measurement[5, 0])
示例#6
0
    def test_get_state_measurements_until_with_drift(self):
        imu = localization.sensors.imu.InvensenseMPU9250(
            10., 0.5, [1., 2., 3.], 9.81)
        self.assertAlmostEqual(10., imu.next_measurement_time)

        desired_covariance = numpy.diag([8.726646259971648e-05] * 3 +
                                        [1.4709975e-3] * 3)
        self.assertSequenceEqual([6, 6], imu.covariance.shape)
        for i in xrange(6):
            for j in xrange(6):
                self.assertAlmostEqual(desired_covariance[i, j],
                                       imu.covariance[i, j])

        # Set a zero covariance matrix to make tests deterministic
        imu.covariance = numpy.zeros([6, 6])

        # Test without tilting
        meas_val = numpy.arange(15.).reshape([15, 1])
        meas_val[3:6] = numpy.zeros([3, 1])
        meas = imu.getStateMeasurementsUntil(meas_val, 10.3)
        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(10., meas.measurement[0, 0])
        self.assertAlmostEqual(12., meas.measurement[1, 0])
        self.assertAlmostEqual(14., meas.measurement[2, 0])
        self.assertAlmostEqual(12., meas.measurement[3, 0])
        self.assertAlmostEqual(13., meas.measurement[4, 0])
        self.assertAlmostEqual(23.81, meas.measurement[5, 0])
        self.assertAlmostEqual(12., imu.next_measurement_time)

        meas = imu.getStateMeasurementsUntil(
            numpy.arange(2., 17.).reshape([15, 1]), 11.6)
        self.assertIsNone(meas)
        self.assertAlmostEqual(12., imu.next_measurement_time)

        # Test with tilting

        g = numpy.zeros([3, 1])
        g[2, 0] = 9.81
        meas = imu.getStateMeasurementsUntil(
            numpy.arange(15.).reshape([15, 1]), 10.3)
        g_offs = localization.util.rpyToRotationMatrix(3., 4., 5.).dot(g)

        meas = imu.getStateMeasurementsUntil(
            numpy.arange(4., 19.).reshape([15, 1]), 12.2)
        g_offs = localization.util.rpyToRotationMatrix(7., 8., 9.).dot(g)
        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(14., meas.measurement[0, 0])
        self.assertAlmostEqual(16., meas.measurement[1, 0])
        self.assertAlmostEqual(18., meas.measurement[2, 0])
        self.assertAlmostEqual(16. + g_offs[0, 0], meas.measurement[3, 0])
        self.assertAlmostEqual(17. + g_offs[1, 0], meas.measurement[4, 0])
        self.assertAlmostEqual(18. + g_offs[2, 0], meas.measurement[5, 0])
示例#7
0
    def test_get_state_measurements_until_no_drift(self):
        imu = localization.sensors.imu.InvensenseMPU9250(10., 0.5)
        self.assertAlmostEqual(10., imu.next_measurement_time)

        desired_covariance = numpy.diag(
                [8.726646259971648e-05] * 3 + [1.4709975e-3] * 3)
        self.assertSequenceEqual([6, 6], imu.covariance.shape)
        for i in xrange(6):
            for j in xrange(6):
                self.assertAlmostEqual(
                        desired_covariance[i, j], imu.covariance[i, j])


        # Set a zero covariance matrix to make tests deterministic
        imu.covariance = numpy.zeros([6, 6])

        meas = imu.getStateMeasurementsUntil(
                numpy.arange(15.).reshape([15, 1]), 10.3)
        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(9., meas.measurement[0, 0])
        self.assertAlmostEqual(10., meas.measurement[1, 0])
        self.assertAlmostEqual(11., meas.measurement[2, 0])
        self.assertAlmostEqual(12., meas.measurement[3, 0])
        self.assertAlmostEqual(13., meas.measurement[4, 0])
        self.assertAlmostEqual(14., meas.measurement[5, 0])
        self.assertAlmostEqual(12., imu.next_measurement_time)

        meas = imu.getStateMeasurementsUntil(
                numpy.arange(2., 17.).reshape([15, 1]), 11.6)
        self.assertIsNone(meas)
        self.assertAlmostEqual(12., imu.next_measurement_time)

        meas = imu.getStateMeasurementsUntil(
                numpy.arange(4., 19.).reshape([15, 1]), 12.2)
        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(13., meas.measurement[0, 0])
        self.assertAlmostEqual(14., meas.measurement[1, 0])
        self.assertAlmostEqual(15., meas.measurement[2, 0])
        self.assertAlmostEqual(16., meas.measurement[3, 0])
        self.assertAlmostEqual(17., meas.measurement[4, 0])
        self.assertAlmostEqual(18., meas.measurement[5, 0])
示例#8
0
    def test_get_state_measurements_until_no_drift(self):
        imu = localization.sensors.imu.InvensenseMPU9250(10., 0.5)
        self.assertAlmostEqual(10., imu.next_measurement_time)

        desired_covariance = numpy.diag([8.726646259971648e-05] * 3 +
                                        [1.4709975e-3] * 3)
        self.assertSequenceEqual([6, 6], imu.covariance.shape)
        for i in xrange(6):
            for j in xrange(6):
                self.assertAlmostEqual(desired_covariance[i, j],
                                       imu.covariance[i, j])

        # Set a zero covariance matrix to make tests deterministic
        imu.covariance = numpy.zeros([6, 6])

        meas = imu.getStateMeasurementsUntil(
            numpy.arange(15.).reshape([15, 1]), 10.3)
        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(9., meas.measurement[0, 0])
        self.assertAlmostEqual(10., meas.measurement[1, 0])
        self.assertAlmostEqual(11., meas.measurement[2, 0])
        self.assertAlmostEqual(12., meas.measurement[3, 0])
        self.assertAlmostEqual(13., meas.measurement[4, 0])
        self.assertAlmostEqual(14., meas.measurement[5, 0])
        self.assertAlmostEqual(12., imu.next_measurement_time)

        meas = imu.getStateMeasurementsUntil(
            numpy.arange(2., 17.).reshape([15, 1]), 11.6)
        self.assertIsNone(meas)
        self.assertAlmostEqual(12., imu.next_measurement_time)

        meas = imu.getStateMeasurementsUntil(
            numpy.arange(4., 19.).reshape([15, 1]), 12.2)
        self.assertIsNotNone(meas)
        self.assertSequenceEqual([6, 1], meas.measurement.shape)
        self.assertAlmostEqual(13., meas.measurement[0, 0])
        self.assertAlmostEqual(14., meas.measurement[1, 0])
        self.assertAlmostEqual(15., meas.measurement[2, 0])
        self.assertAlmostEqual(16., meas.measurement[3, 0])
        self.assertAlmostEqual(17., meas.measurement[4, 0])
        self.assertAlmostEqual(18., meas.measurement[5, 0])