diff --git a/src/processor/processor_diff_drive.cpp b/src/processor/processor_diff_drive.cpp index e8a1403fcaef199f968b901339e28b51a40a0bd7..d6eae581157c15a9994d1764439d8359b3dd8386 100644 --- a/src/processor/processor_diff_drive.cpp +++ b/src/processor/processor_diff_drive.cpp @@ -65,19 +65,18 @@ void ProcessorDiffDrive::computeCurrentDelta(const Eigen::VectorXd& _data, * dth : arc angle [rad] */ const double& k = radians_per_tick_; - const auto& calib = _calib.at("I"); // sensor intrinsics - const double& r_l = calib(0); // wheel radii + const auto& calib = _calib.at("I"); // sensor intrinsics + const double& r_l = calib(0); // wheel radii const double& r_r = calib(1); - const double& d = calib(2); // wheel separation - double dl = k * (_data(1) * r_r + _data(0) * r_l) / 2.0; - double dth = k * (_data(1) * r_r - _data(0) * r_l) / d; + const double& d = calib(2); // wheel separation + double dl = k * (_data(1) * r_r + _data(0) * r_l) / 2.0; // length of arc of trajectory + double dth = k * (_data(1) * r_r - _data(0) * r_l) / d; // angle of arc of trajectory /// 1. Tangent space: calibrate and go to se2 tangent ----------------------------------------------- - VectorComposite tangent; - tangent.emplace("P", Vector2d(dl,0)); - tangent.emplace("O", Vector1d(dth)); + VectorComposite tangent ("PO", { Vector2d( dl, 0 ), + Vector1d( dth ) } ); MatrixComposite J_tangent_calib; @@ -90,29 +89,32 @@ void ProcessorDiffDrive::computeCurrentDelta(const Eigen::VectorXd& _data, 0.0, // d ds / d r_l 0.0, // d ds / d r_r 0.0 // d ds / d d - ).finished()); + ).finished()); J_tangent_calib.emplace("O", "I", (Matrix<double,1,3>() << - k * _data(0) / d, // d dth / d r_l + k * _data(1) / d, // d dth / d r_r - dth / d // d dth / d d - ).finished()); + ).finished()); MatrixComposite J_tangent_data; J_tangent_data.emplace("P", "d", (Matrix<double,2,2>() << k * r_l / 2.0, // d dl / d data(0) k * r_r / 2.0, // d dl / d data(1) 0.0, // d ds / d data(0) 0.0 // d ds / d data(1) - ).finished()); + ).finished()); + J_tangent_data.emplace("O", "d", (Matrix<double,1,2>() << - k * r_l / d, // d dth / d data(0) + k * r_r / d // d dth / d data(1) - ).finished()); + ).finished()); MatrixComposite J_tangent_side; J_tangent_side.emplace("P", "s", (Matrix<double,2,1>() << 0.0, // d dl / d ds 1.0 // d ds / d ds - ).finished()); + ).finished()); + J_tangent_side.emplace("O", "s", Matrix1d( 0.0 )); // d dth / d ds + /// 2. Current delta: go to SE2 manifold ----------------------------------------------- MatrixComposite J_delta_tangent; @@ -122,12 +124,14 @@ void ProcessorDiffDrive::computeCurrentDelta(const Eigen::VectorXd& _data, /// 3. delta covariance ----------------------------------------------- const auto& side_cov = unmeasured_perturbation_cov_; // rename for better reading + MatrixComposite data_cov; data_cov.emplace("d","d",_data_cov); _delta_cov = (J_delta_tangent * J_tangent_data).propagate(data_cov) + (J_delta_tangent * J_tangent_side).propagate(side_cov); + /// 4. Jacobian of delta wrt calibration params ----------------------------------------------- _jacobian_calib = J_delta_tangent * J_tangent_calib; diff --git a/src/processor/processor_odom_2d.cpp b/src/processor/processor_odom_2d.cpp index 20fbcd5aa0f2f436628b9b019e2c68bc8bd3bd57..28f2af51dd70f8da3b473198c5531e6c0b9ac2a5 100644 --- a/src/processor/processor_odom_2d.cpp +++ b/src/processor/processor_odom_2d.cpp @@ -12,10 +12,7 @@ ProcessorOdom2d::ProcessorOdom2d(ParamsProcessorOdom2dPtr _params) : { double unmeasured_var = _params->unmeasured_perturbation_std * _params->unmeasured_perturbation_std; - unmeasured_perturbation_cov_.emplace("P","P", Matrix2d::Identity() * unmeasured_var); - unmeasured_perturbation_cov_.emplace("P","O", Vector2d::Zero()); - unmeasured_perturbation_cov_.emplace("O","P", RowVector2d::Zero()); - unmeasured_perturbation_cov_.emplace("O","P", Matrix1d::Identity() * unmeasured_var); + unmeasured_perturbation_cov_ = MatrixComposite(unmeasured_var*Matrix3d::Identity(), "PO", {2,1}, "PO", {2,1}); } ProcessorOdom2d::~ProcessorOdom2d()