Actually accelerometer and gravity has no place in the AHRS factor. Basically this factor integrates rotations based on gyroscope data.
Removed all of acc and gravity things.release/4.3a0
parent
73ec571f4b
commit
4d50156ff1
|
|
@ -28,16 +28,11 @@ public:
|
||||||
double deltaTij;
|
double deltaTij;
|
||||||
Matrix3 delRdelBiasOmega;
|
Matrix3 delRdelBiasOmega;
|
||||||
Matrix PreintMeasCov;
|
Matrix PreintMeasCov;
|
||||||
bool use2ndOrderIntegration_;
|
|
||||||
|
|
||||||
PreintegratedMeasurements(const imuBias::ConstantBias& bias,
|
PreintegratedMeasurements(const imuBias::ConstantBias& bias,
|
||||||
const Matrix3& measurementAccCovariance,
|
const Matrix3& measuredOmegaCovariance) :
|
||||||
const Matrix3& measuredOmegaCovariance,
|
|
||||||
const Matrix3& integrationErrorCovariance,
|
|
||||||
const bool use2ndOrderIntegration = false) :
|
|
||||||
biasHat(bias), measurementCovariance(3,3), delRdelBiasOmega(
|
biasHat(bias), measurementCovariance(3,3), delRdelBiasOmega(
|
||||||
Matrix3::Zero()), PreintMeasCov(3,3), use2ndOrderIntegration_(
|
Matrix3::Zero()), PreintMeasCov(3,3) {
|
||||||
use2ndOrderIntegration) {
|
|
||||||
// measurementCovariance << integrationErrorCovariance, Matrix3::Zero(), Matrix3::Zero(), Matrix3::Zero(), measurementAccCovariance, Matrix3::Zero(), Matrix3::Zero(), Matrix3::Zero(), measuredOmegaCovariance;
|
// measurementCovariance << integrationErrorCovariance, Matrix3::Zero(), Matrix3::Zero(), Matrix3::Zero(), measurementAccCovariance, Matrix3::Zero(), Matrix3::Zero(), Matrix3::Zero(), measuredOmegaCovariance;
|
||||||
measurementCovariance <<measuredOmegaCovariance;
|
measurementCovariance <<measuredOmegaCovariance;
|
||||||
PreintMeasCov = Matrix::Zero(3,3);
|
PreintMeasCov = Matrix::Zero(3,3);
|
||||||
|
|
@ -77,19 +72,15 @@ public:
|
||||||
PreintMeasCov = Matrix::Zero(9, 9);
|
PreintMeasCov = Matrix::Zero(9, 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
void integrateMeasurement(const Vector3& measuredAcc,
|
void integrateMeasurement(
|
||||||
const Vector3& measuredOmega, double deltaT,
|
const Vector3& measuredOmega, double deltaT,
|
||||||
boost::optional<const Pose3&> body_P_sensor = boost::none) {
|
boost::optional<const Pose3&> body_P_sensor = boost::none) {
|
||||||
Vector3 correctedAcc = biasHat.correctAccelerometer(measuredAcc);
|
|
||||||
Vector3 correctedOmega = biasHat.correctGyroscope(measuredOmega);
|
Vector3 correctedOmega = biasHat.correctGyroscope(measuredOmega);
|
||||||
|
|
||||||
if (body_P_sensor) {
|
if (body_P_sensor) {
|
||||||
Matrix3 body_R_sensor = body_P_sensor->rotation().matrix();
|
Matrix3 body_R_sensor = body_P_sensor->rotation().matrix();
|
||||||
correctedOmega = body_R_sensor * correctedOmega;
|
correctedOmega = body_R_sensor * correctedOmega;
|
||||||
Matrix3 body_omega_body_cross = skewSymmetric(correctedOmega);
|
Matrix3 body_omega_body_cross = skewSymmetric(correctedOmega);
|
||||||
correctedAcc = body_R_sensor * correctedAcc
|
|
||||||
- body_omega_body_cross * body_omega_body_cross
|
|
||||||
* body_P_sensor->translation().vector();
|
|
||||||
}
|
}
|
||||||
const Vector3 theta_incr = correctedOmega * deltaT;
|
const Vector3 theta_incr = correctedOmega * deltaT;
|
||||||
const Rot3 Rincr = Rot3::Expmap(theta_incr);
|
const Rot3 Rincr = Rot3::Expmap(theta_incr);
|
||||||
|
|
@ -156,7 +147,6 @@ private:
|
||||||
Vector3 gravity_;
|
Vector3 gravity_;
|
||||||
Vector3 omegaCoriolis_;
|
Vector3 omegaCoriolis_;
|
||||||
boost::optional<Pose3> body_P_sensor_;
|
boost::optional<Pose3> body_P_sensor_;
|
||||||
bool use2ndOrderCoriolis_;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
@ -169,21 +159,17 @@ public:
|
||||||
|
|
||||||
/** Default constructor - only use for serialization */
|
/** Default constructor - only use for serialization */
|
||||||
AHRSFactor() :
|
AHRSFactor() :
|
||||||
preintegratedMeasurements_(imuBias::ConstantBias(), Matrix3::Zero(),
|
preintegratedMeasurements_(imuBias::ConstantBias(), Matrix3::Zero()) {}
|
||||||
Matrix3::Zero(), Matrix3::Zero()) {
|
|
||||||
}
|
|
||||||
|
|
||||||
AHRSFactor(Key rot_i, Key rot_j, Key bias,
|
AHRSFactor(Key rot_i, Key rot_j, Key bias,
|
||||||
const PreintegratedMeasurements& preintegratedMeasurements,
|
const PreintegratedMeasurements& preintegratedMeasurements,
|
||||||
const Vector3& gravity, const Vector3& omegaCoriolis,
|
const Vector3& omegaCoriolis,
|
||||||
boost::optional<const Pose3&> body_P_sensor = boost::none,
|
boost::optional<const Pose3&> body_P_sensor = boost::none) :
|
||||||
const bool use2ndOrderCoriolis = false) :
|
|
||||||
Base(
|
Base(
|
||||||
noiseModel::Gaussian::Covariance(
|
noiseModel::Gaussian::Covariance(
|
||||||
preintegratedMeasurements.PreintMeasCov), rot_i, rot_j, bias), preintegratedMeasurements_(
|
preintegratedMeasurements.PreintMeasCov), rot_i, rot_j, bias), preintegratedMeasurements_(
|
||||||
preintegratedMeasurements), gravity_(gravity), omegaCoriolis_(
|
preintegratedMeasurements), omegaCoriolis_(
|
||||||
omegaCoriolis), body_P_sensor_(body_P_sensor), use2ndOrderCoriolis_(
|
omegaCoriolis), body_P_sensor_(body_P_sensor) {
|
||||||
use2ndOrderCoriolis) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~AHRSFactor() {}
|
virtual ~AHRSFactor() {}
|
||||||
|
|
@ -203,7 +189,6 @@ public:
|
||||||
<< keyFormatter(this->key2()) << "," << keyFormatter(this->key3())
|
<< keyFormatter(this->key2()) << "," << keyFormatter(this->key3())
|
||||||
<< ",";
|
<< ",";
|
||||||
preintegratedMeasurements_.print(" preintegrated measurements:");
|
preintegratedMeasurements_.print(" preintegrated measurements:");
|
||||||
std::cout << " gravity: [ " << gravity_.transpose() << " ]" << std::endl;
|
|
||||||
std::cout << " omegaCoriolis: [ " << omegaCoriolis_.transpose() << " ]"
|
std::cout << " omegaCoriolis: [ " << omegaCoriolis_.transpose() << " ]"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
this->noiseModel_->print(" noise model: ");
|
this->noiseModel_->print(" noise model: ");
|
||||||
|
|
@ -216,7 +201,6 @@ public:
|
||||||
const This *e = dynamic_cast<const This*>(&expected);
|
const This *e = dynamic_cast<const This*>(&expected);
|
||||||
return e != NULL && Base::equals(*e, tol)
|
return e != NULL && Base::equals(*e, tol)
|
||||||
&& preintegratedMeasurements_.equals(e->preintegratedMeasurements_, tol)
|
&& preintegratedMeasurements_.equals(e->preintegratedMeasurements_, tol)
|
||||||
&& equal_with_abs_tol(gravity_, e->gravity_, tol)
|
|
||||||
&& equal_with_abs_tol(omegaCoriolis_, e->omegaCoriolis_, tol)
|
&& equal_with_abs_tol(omegaCoriolis_, e->omegaCoriolis_, tol)
|
||||||
&& ((!body_P_sensor_ && !e->body_P_sensor_)
|
&& ((!body_P_sensor_ && !e->body_P_sensor_)
|
||||||
|| (body_P_sensor_ && e->body_P_sensor_
|
|| (body_P_sensor_ && e->body_P_sensor_
|
||||||
|
|
@ -227,9 +211,6 @@ public:
|
||||||
return preintegratedMeasurements_;
|
return preintegratedMeasurements_;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Vector3& gravity() const {
|
|
||||||
return gravity_;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Vector3& omegaCoriolis() const {
|
const Vector3& omegaCoriolis() const {
|
||||||
return omegaCoriolis_;
|
return omegaCoriolis_;
|
||||||
|
|
@ -321,9 +302,9 @@ public:
|
||||||
static void Predict(const Rot3& rot_i, const Rot3& rot_j,
|
static void Predict(const Rot3& rot_i, const Rot3& rot_j,
|
||||||
const imuBias::ConstantBias& bias,
|
const imuBias::ConstantBias& bias,
|
||||||
const PreintegratedMeasurements preintegratedMeasurements,
|
const PreintegratedMeasurements preintegratedMeasurements,
|
||||||
const Vector3& gravity, const Vector3& omegaCoriolis,
|
const Vector3& omegaCoriolis,
|
||||||
boost::optional<const Pose3&> body_P_sensor = boost::none,
|
boost::optional<const Pose3&> body_P_sensor = boost::none
|
||||||
const bool use2ndOrderCoriolis = false) {
|
) {
|
||||||
|
|
||||||
const double& deltaTij = preintegratedMeasurements.deltaTij;
|
const double& deltaTij = preintegratedMeasurements.deltaTij;
|
||||||
// const Vector3 biasAccIncr = bias.accelerometer()
|
// const Vector3 biasAccIncr = bias.accelerometer()
|
||||||
|
|
@ -360,7 +341,6 @@ private:
|
||||||
& boost::serialization::make_nvp("NoiseModelFactor3",
|
& boost::serialization::make_nvp("NoiseModelFactor3",
|
||||||
boost::serialization::base_object<Base>(*this));
|
boost::serialization::base_object<Base>(*this));
|
||||||
ar & BOOST_SERIALIZATION_NVP(preintegratedMeasurements_);
|
ar & BOOST_SERIALIZATION_NVP(preintegratedMeasurements_);
|
||||||
ar & BOOST_SERIALIZATION_NVP(gravity_);
|
|
||||||
ar & BOOST_SERIALIZATION_NVP(omegaCoriolis_);
|
ar & BOOST_SERIALIZATION_NVP(omegaCoriolis_);
|
||||||
ar & BOOST_SERIALIZATION_NVP(body_P_sensor_);
|
ar & BOOST_SERIALIZATION_NVP(body_P_sensor_);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,27 +48,27 @@ Rot3 evaluateRotationError(const AHRSFactor& factor, const Rot3 rot_i,
|
||||||
}
|
}
|
||||||
|
|
||||||
AHRSFactor::PreintegratedMeasurements evaluatePreintegratedMeasurements(
|
AHRSFactor::PreintegratedMeasurements evaluatePreintegratedMeasurements(
|
||||||
const imuBias::ConstantBias& bias, const list<Vector3>& measuredAccs,
|
const imuBias::ConstantBias& bias,
|
||||||
const list<Vector3>& measuredOmegas, const list<double>& deltaTs,
|
const list<Vector3>& measuredOmegas,
|
||||||
|
const list<double>& deltaTs,
|
||||||
const Vector3& initialRotationRate = Vector3(0.0, 0.0, 0.0)) {
|
const Vector3& initialRotationRate = Vector3(0.0, 0.0, 0.0)) {
|
||||||
AHRSFactor::PreintegratedMeasurements result(bias, Matrix3::Identity(),
|
AHRSFactor::PreintegratedMeasurements result(bias, Matrix3::Identity());
|
||||||
Matrix3::Identity(), Matrix3::Identity());
|
|
||||||
|
|
||||||
list<Vector3>::const_iterator itAcc = measuredAccs.begin();
|
|
||||||
list<Vector3>::const_iterator itOmega = measuredOmegas.begin();
|
list<Vector3>::const_iterator itOmega = measuredOmegas.begin();
|
||||||
list<double>::const_iterator itDeltaT = deltaTs.begin();
|
list<double>::const_iterator itDeltaT = deltaTs.begin();
|
||||||
for (; itAcc != measuredAccs.end(); ++itAcc, ++itOmega, ++itDeltaT) {
|
for (; itOmega != measuredOmegas.end(); ++itOmega, ++itDeltaT) {
|
||||||
result.integrateMeasurement(*itAcc, *itOmega, *itDeltaT);
|
result.integrateMeasurement(*itOmega, *itDeltaT);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rot3 evaluatePreintegratedMeasurementsRotation(
|
Rot3 evaluatePreintegratedMeasurementsRotation(
|
||||||
const imuBias::ConstantBias& bias, const list<Vector3>& measuredAccs,
|
const imuBias::ConstantBias& bias,
|
||||||
const list<Vector3>& measuredOmegas, const list<double>& deltaTs,
|
const list<Vector3>& measuredOmegas,
|
||||||
|
const list<double>& deltaTs,
|
||||||
const Vector3& initialRotationRate = Vector3(0.0, 0.0, 0.0)) {
|
const Vector3& initialRotationRate = Vector3(0.0, 0.0, 0.0)) {
|
||||||
return evaluatePreintegratedMeasurements(bias, measuredAccs, measuredOmegas,
|
return evaluatePreintegratedMeasurements(bias, measuredOmegas,
|
||||||
deltaTs, initialRotationRate).deltaRij;
|
deltaTs, initialRotationRate).deltaRij;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -88,7 +88,6 @@ TEST( AHRSFactor, PreintegratedMeasurements ) {
|
||||||
imuBias::ConstantBias bias(Vector3(0, 0, 0), Vector3(0, 0, 0)); ///< Current estimate of acceleration and angular rate biases
|
imuBias::ConstantBias bias(Vector3(0, 0, 0), Vector3(0, 0, 0)); ///< Current estimate of acceleration and angular rate biases
|
||||||
|
|
||||||
// Measurements
|
// Measurements
|
||||||
Vector3 measuredAcc(0.1, 0.0, 0.0);
|
|
||||||
Vector3 measuredOmega(M_PI / 100.0, 0.0, 0.0);
|
Vector3 measuredOmega(M_PI / 100.0, 0.0, 0.0);
|
||||||
double deltaT = 0.5;
|
double deltaT = 0.5;
|
||||||
|
|
||||||
|
|
@ -96,11 +95,9 @@ TEST( AHRSFactor, PreintegratedMeasurements ) {
|
||||||
Rot3 expectedDeltaR1 = Rot3::RzRyRx(0.5 * M_PI / 100.0, 0.0, 0.0);
|
Rot3 expectedDeltaR1 = Rot3::RzRyRx(0.5 * M_PI / 100.0, 0.0, 0.0);
|
||||||
double expectedDeltaT1(0.5);
|
double expectedDeltaT1(0.5);
|
||||||
|
|
||||||
bool use2ndOrderIntegration = true;
|
|
||||||
// Actual preintegrated values
|
// Actual preintegrated values
|
||||||
AHRSFactor::PreintegratedMeasurements actual1(bias, Matrix3::Zero(),
|
AHRSFactor::PreintegratedMeasurements actual1(bias, Matrix3::Zero());
|
||||||
Matrix3::Zero(), Matrix3::Zero(), use2ndOrderIntegration);
|
actual1.integrateMeasurement(measuredOmega, deltaT);
|
||||||
actual1.integrateMeasurement(measuredAcc, measuredOmega, deltaT);
|
|
||||||
|
|
||||||
EXPECT(assert_equal(expectedDeltaR1, actual1.deltaRij, 1e-6));
|
EXPECT(assert_equal(expectedDeltaR1, actual1.deltaRij, 1e-6));
|
||||||
DOUBLES_EQUAL(expectedDeltaT1, actual1.deltaTij, 1e-6);
|
DOUBLES_EQUAL(expectedDeltaT1, actual1.deltaTij, 1e-6);
|
||||||
|
|
@ -111,7 +108,7 @@ TEST( AHRSFactor, PreintegratedMeasurements ) {
|
||||||
|
|
||||||
// Actual preintegrated values
|
// Actual preintegrated values
|
||||||
AHRSFactor::PreintegratedMeasurements actual2 = actual1;
|
AHRSFactor::PreintegratedMeasurements actual2 = actual1;
|
||||||
actual2.integrateMeasurement(measuredAcc, measuredOmega, deltaT);
|
actual2.integrateMeasurement(measuredOmega, deltaT);
|
||||||
|
|
||||||
EXPECT(assert_equal(expectedDeltaR2, actual2.deltaRij, 1e-6));
|
EXPECT(assert_equal(expectedDeltaR2, actual2.deltaRij, 1e-6));
|
||||||
DOUBLES_EQUAL(expectedDeltaT2, actual2.deltaTij, 1e-6);
|
DOUBLES_EQUAL(expectedDeltaT2, actual2.deltaTij, 1e-6);
|
||||||
|
|
@ -131,15 +128,12 @@ TEST( ImuFactor, Error ) {
|
||||||
omegaCoriolis << 0, 0, 0;
|
omegaCoriolis << 0, 0, 0;
|
||||||
Vector3 measuredOmega;
|
Vector3 measuredOmega;
|
||||||
measuredOmega << M_PI / 100, 0, 0;
|
measuredOmega << M_PI / 100, 0, 0;
|
||||||
Vector3 measuredAcc = x1.unrotate(-Point3(gravity)).vector();
|
|
||||||
double deltaT = 1.0;
|
double deltaT = 1.0;
|
||||||
bool use2ndOrderIntegration = true;
|
AHRSFactor::PreintegratedMeasurements pre_int_data(bias, Matrix3::Zero());
|
||||||
AHRSFactor::PreintegratedMeasurements pre_int_data(bias, Matrix3::Zero(),
|
pre_int_data.integrateMeasurement(measuredOmega, deltaT);
|
||||||
Matrix3::Zero(), Matrix3::Zero(), use2ndOrderIntegration);
|
|
||||||
pre_int_data.integrateMeasurement(measuredAcc, measuredOmega, deltaT);
|
|
||||||
|
|
||||||
// Create factor
|
// Create factor
|
||||||
AHRSFactor factor(X(1), X(2), B(1), pre_int_data, gravity, omegaCoriolis,
|
AHRSFactor factor(X(1), X(2), B(1), pre_int_data, omegaCoriolis,
|
||||||
false);
|
false);
|
||||||
|
|
||||||
Vector errorActual = factor.evaluateError(x1, x2, bias);
|
Vector errorActual = factor.evaluateError(x1, x2, bias);
|
||||||
|
|
@ -192,26 +186,21 @@ TEST( ImuFactor, ErrorWithBiases ) {
|
||||||
Rot3 x2(Rot3::Expmap(Vector3(0, 0, M_PI / 4.0 + M_PI / 10.0)));
|
Rot3 x2(Rot3::Expmap(Vector3(0, 0, M_PI / 4.0 + M_PI / 10.0)));
|
||||||
|
|
||||||
// Measurements
|
// Measurements
|
||||||
Vector3 gravity;
|
|
||||||
gravity << 0, 0, 9.81;
|
|
||||||
Vector3 omegaCoriolis;
|
Vector3 omegaCoriolis;
|
||||||
omegaCoriolis << 0, 0.1, 0.1;
|
omegaCoriolis << 0, 0.1, 0.1;
|
||||||
Vector3 measuredOmega;
|
Vector3 measuredOmega;
|
||||||
measuredOmega << 0, 0, M_PI / 10.0 + 0.3;
|
measuredOmega << 0, 0, M_PI / 10.0 + 0.3;
|
||||||
Vector3 measuredAcc = x1.unrotate(-Point3(gravity)).vector()
|
|
||||||
+ Vector3(0.2, 0.0, 0.0);
|
|
||||||
double deltaT = 1.0;
|
double deltaT = 1.0;
|
||||||
|
|
||||||
AHRSFactor::PreintegratedMeasurements pre_int_data(
|
AHRSFactor::PreintegratedMeasurements pre_int_data(
|
||||||
imuBias::ConstantBias(Vector3(0.2, 0.0, 0.0), Vector3(0.0, 0.0, 0.0)),
|
imuBias::ConstantBias(Vector3(0.2, 0.0, 0.0), Vector3(0.0, 0.0, 0.0)), Matrix3::Zero());
|
||||||
Matrix3::Zero(), Matrix3::Zero(), Matrix3::Zero());
|
pre_int_data.integrateMeasurement(measuredOmega, deltaT);
|
||||||
pre_int_data.integrateMeasurement(measuredAcc, measuredOmega, deltaT);
|
|
||||||
|
|
||||||
// ImuFactor::PreintegratedMeasurements pre_int_data(bias.head(3), bias.tail(3));
|
// ImuFactor::PreintegratedMeasurements pre_int_data(bias.head(3), bias.tail(3));
|
||||||
// pre_int_data.integrateMeasurement(measuredAcc, measuredOmega, deltaT);
|
// pre_int_data.integrateMeasurement(measuredAcc, measuredOmega, deltaT);
|
||||||
|
|
||||||
// Create factor
|
// Create factor
|
||||||
AHRSFactor factor(X(1), X(2), B(1), pre_int_data, gravity, omegaCoriolis);
|
AHRSFactor factor(X(1), X(2), B(1), pre_int_data, omegaCoriolis);
|
||||||
|
|
||||||
SETDEBUG("ImuFactor evaluateError", false);
|
SETDEBUG("ImuFactor evaluateError", false);
|
||||||
Vector errorActual = factor.evaluateError(x1, x2, bias);
|
Vector errorActual = factor.evaluateError(x1, x2, bias);
|
||||||
|
|
@ -344,16 +333,13 @@ TEST( AHRSFactor, FirstOrderPreIntegratedMeasurements ) {
|
||||||
Pose3 body_P_sensor(Rot3::Expmap(Vector3(0, 0.1, 0.1)), Point3(1, 0, 1));
|
Pose3 body_P_sensor(Rot3::Expmap(Vector3(0, 0.1, 0.1)), Point3(1, 0, 1));
|
||||||
|
|
||||||
// Measurements
|
// Measurements
|
||||||
list<Vector3> measuredAccs, measuredOmegas;
|
list<Vector3> measuredOmegas;
|
||||||
list<double> deltaTs;
|
list<double> deltaTs;
|
||||||
measuredAccs.push_back(Vector3(0.1, 0.0, 0.0));
|
|
||||||
measuredOmegas.push_back(Vector3(M_PI / 100.0, 0.0, 0.0));
|
measuredOmegas.push_back(Vector3(M_PI / 100.0, 0.0, 0.0));
|
||||||
deltaTs.push_back(0.01);
|
deltaTs.push_back(0.01);
|
||||||
measuredAccs.push_back(Vector3(0.1, 0.0, 0.0));
|
|
||||||
measuredOmegas.push_back(Vector3(M_PI / 100.0, 0.0, 0.0));
|
measuredOmegas.push_back(Vector3(M_PI / 100.0, 0.0, 0.0));
|
||||||
deltaTs.push_back(0.01);
|
deltaTs.push_back(0.01);
|
||||||
for (int i = 1; i < 100; i++) {
|
for (int i = 1; i < 100; i++) {
|
||||||
measuredAccs.push_back(Vector3(0.05, 0.09, 0.01));
|
|
||||||
measuredOmegas.push_back(
|
measuredOmegas.push_back(
|
||||||
Vector3(M_PI / 100.0, M_PI / 300.0, 2 * M_PI / 100.0));
|
Vector3(M_PI / 100.0, M_PI / 300.0, 2 * M_PI / 100.0));
|
||||||
deltaTs.push_back(0.01);
|
deltaTs.push_back(0.01);
|
||||||
|
|
@ -361,14 +347,14 @@ TEST( AHRSFactor, FirstOrderPreIntegratedMeasurements ) {
|
||||||
|
|
||||||
// Actual preintegrated values
|
// Actual preintegrated values
|
||||||
AHRSFactor::PreintegratedMeasurements preintegrated =
|
AHRSFactor::PreintegratedMeasurements preintegrated =
|
||||||
evaluatePreintegratedMeasurements(bias, measuredAccs, measuredOmegas,
|
evaluatePreintegratedMeasurements(bias, measuredOmegas,
|
||||||
deltaTs, Vector3(M_PI / 100.0, 0.0, 0.0));
|
deltaTs, Vector3(M_PI / 100.0, 0.0, 0.0));
|
||||||
|
|
||||||
// Compute numerical derivatives
|
// Compute numerical derivatives
|
||||||
Matrix expectedDelRdelBias =
|
Matrix expectedDelRdelBias =
|
||||||
numericalDerivative11<Rot3, imuBias::ConstantBias>(
|
numericalDerivative11<Rot3, imuBias::ConstantBias>(
|
||||||
boost::bind(&evaluatePreintegratedMeasurementsRotation, _1,
|
boost::bind(&evaluatePreintegratedMeasurementsRotation, _1,
|
||||||
measuredAccs, measuredOmegas, deltaTs,
|
measuredOmegas, deltaTs,
|
||||||
Vector3(M_PI / 100.0, 0.0, 0.0)), bias);
|
Vector3(M_PI / 100.0, 0.0, 0.0)), bias);
|
||||||
Matrix expectedDelRdelBiasAcc = expectedDelRdelBias.leftCols(3);
|
Matrix expectedDelRdelBiasAcc = expectedDelRdelBias.leftCols(3);
|
||||||
Matrix expectedDelRdelBiasOmega = expectedDelRdelBias.rightCols(3);
|
Matrix expectedDelRdelBiasOmega = expectedDelRdelBias.rightCols(3);
|
||||||
|
|
@ -397,8 +383,6 @@ TEST( AHRSFactor, ErrorWithBiasesAndSensorBodyDisplacement ) {
|
||||||
omegaCoriolis << 0, 0.1, 0.1;
|
omegaCoriolis << 0, 0.1, 0.1;
|
||||||
Vector3 measuredOmega;
|
Vector3 measuredOmega;
|
||||||
measuredOmega << 0, 0, M_PI / 10.0 + 0.3;
|
measuredOmega << 0, 0, M_PI / 10.0 + 0.3;
|
||||||
Vector3 measuredAcc = x1.unrotate(-Point3(gravity)).vector()
|
|
||||||
+ Vector3(0.2, 0.0, 0.0);
|
|
||||||
double deltaT = 1.0;
|
double deltaT = 1.0;
|
||||||
|
|
||||||
const Pose3 body_P_sensor(Rot3::Expmap(Vector3(0, 0.10, 0.10)),
|
const Pose3 body_P_sensor(Rot3::Expmap(Vector3(0, 0.10, 0.10)),
|
||||||
|
|
@ -409,12 +393,12 @@ TEST( AHRSFactor, ErrorWithBiasesAndSensorBodyDisplacement ) {
|
||||||
|
|
||||||
AHRSFactor::PreintegratedMeasurements pre_int_data(
|
AHRSFactor::PreintegratedMeasurements pre_int_data(
|
||||||
imuBias::ConstantBias(Vector3(0.2, 0.0, 0.0), Vector3(0.0, 0.0, 0.0)),
|
imuBias::ConstantBias(Vector3(0.2, 0.0, 0.0), Vector3(0.0, 0.0, 0.0)),
|
||||||
Matrix3::Zero(), Matrix3::Zero(), Matrix3::Zero());
|
Matrix3::Zero());
|
||||||
|
|
||||||
pre_int_data.integrateMeasurement(measuredAcc, measuredOmega, deltaT);
|
pre_int_data.integrateMeasurement(measuredOmega, deltaT);
|
||||||
|
|
||||||
// Create factor
|
// Create factor
|
||||||
AHRSFactor factor(X(1), X(2), B(1), pre_int_data, gravity, omegaCoriolis);
|
AHRSFactor factor(X(1), X(2), B(1), pre_int_data, omegaCoriolis);
|
||||||
|
|
||||||
// Expected Jacobians
|
// Expected Jacobians
|
||||||
Matrix H1e = numericalDerivative11<Rot3>(
|
Matrix H1e = numericalDerivative11<Rot3>(
|
||||||
|
|
@ -458,7 +442,7 @@ TEST (AHRSFactor, graphTest) {
|
||||||
Vector3 omegaCoriolis;
|
Vector3 omegaCoriolis;
|
||||||
omegaCoriolis << 0, 0, 0;
|
omegaCoriolis << 0, 0, 0;
|
||||||
AHRSFactor::PreintegratedMeasurements pre_int_data(biasHat,
|
AHRSFactor::PreintegratedMeasurements pre_int_data(biasHat,
|
||||||
Matrix3::Identity(), Matrix3::Identity(), Matrix3::Identity());
|
Matrix3::Identity());
|
||||||
|
|
||||||
// Pre-integrate measurements
|
// Pre-integrate measurements
|
||||||
Vector3 measuredAcc(0.0, 0.0, 0.0);
|
Vector3 measuredAcc(0.0, 0.0, 0.0);
|
||||||
|
|
@ -473,10 +457,10 @@ TEST (AHRSFactor, graphTest) {
|
||||||
NonlinearFactorGraph graph;
|
NonlinearFactorGraph graph;
|
||||||
Values values;
|
Values values;
|
||||||
for(size_t i = 0; i < 5; ++i) {
|
for(size_t i = 0; i < 5; ++i) {
|
||||||
pre_int_data.integrateMeasurement(measuredAcc, measuredOmega, deltaT);
|
pre_int_data.integrateMeasurement(measuredOmega, deltaT);
|
||||||
}
|
}
|
||||||
// pre_int_data.print("Pre integrated measurementes");
|
// pre_int_data.print("Pre integrated measurementes");
|
||||||
AHRSFactor factor(X(1), X(2), B(1), pre_int_data, gravity, omegaCoriolis);
|
AHRSFactor factor(X(1), X(2), B(1), pre_int_data, omegaCoriolis);
|
||||||
values.insert(X(1), x1);
|
values.insert(X(1), x1);
|
||||||
values.insert(X(2), x2);
|
values.insert(X(2), x2);
|
||||||
values.insert(B(1), bias);
|
values.insert(B(1), bias);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue