-
Notifications
You must be signed in to change notification settings - Fork 123
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Rotate position in motion model constraint #365
base: devel
Are you sure you want to change the base?
Changes from 1 commit
2432748
c4c8109
6cdf326
de94366
50a30ba
8958141
d178d86
e5e4c15
7512da2
d24b42b
805bca1
629dfc5
6b51158
fe8d05e
fa46de3
8b8a633
d0f9cb7
043a2ba
ebee7fe
bbefa2f
71cb055
a692a76
eacf435
df22203
076af21
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -146,7 +146,7 @@ bool Unicycle2DStateCostFunctor::operator()( | |
T* residual) const | ||
{ | ||
T delta_position_pred[2]; | ||
T yaw_pred[1]; | ||
T delta_yaw_pred[1]; | ||
T vel_linear_pred[2]; | ||
T vel_yaw_pred[1]; | ||
T acc_linear_pred[2]; | ||
|
@@ -163,19 +163,21 @@ bool Unicycle2DStateCostFunctor::operator()( | |
acc_linear1, | ||
T(dt_), | ||
delta_position_pred, | ||
yaw_pred, | ||
delta_yaw_pred, | ||
vel_linear_pred, | ||
vel_yaw_pred, | ||
acc_linear_pred); | ||
|
||
// rotate the position residual into the local frame | ||
T sin_pred_inv = ceres::sin(-yaw_pred[0]); | ||
T cos_pred_inv = ceres::cos(-yaw_pred[0]); | ||
const Eigen::Matrix<T, 2, 1> position1_map(position1[0], position1[1]); | ||
const Eigen::Matrix<T, 2, 1> position2_map(position2[0], position2[1]); | ||
const Eigen::Matrix<T, 2, 1> delta_position = fuse_core::rotationMatrix2D(-yaw1[0]) * (position2_map - position1_map); | ||
const T delta_yaw = yaw2[0] - yaw1[0]; // omitting fuse_core::wrapAngle2D because it is done later on | ||
const Eigen::Matrix<T, 2, 1> delta_position_pred_map(delta_position_pred[0], delta_position_pred[1]); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These aren't really Eigen maps, but I just realized you can use Just highlighting that. I don't really have a better option, so it's ok for me. Maybe others have a better suggestion 🤔 |
||
|
||
Eigen::Map<Eigen::Matrix<T, 8, 1>> residuals_map(residual); | ||
residuals_map(0) = cos_pred_inv * delta_position_pred[0] - sin_pred_inv * delta_position_pred[1]; | ||
residuals_map(1) = sin_pred_inv * delta_position_pred[0] + cos_pred_inv * delta_position_pred[1]; | ||
residuals_map(2) = yaw2[0] - yaw_pred[0]; | ||
residuals_map.template head<2>() = fuse_core::rotationMatrix2D(-delta_yaw) * (delta_position - delta_position_pred_map); | ||
residuals_map(2) = delta_yaw - delta_yaw_pred[0]; // omitting fuse_core::wrapAngle2D because it is done later on | ||
residuals_map(3) = vel_linear2[0] - vel_linear_pred[0]; | ||
residuals_map(4) = vel_linear2[1] - vel_linear_pred[1]; | ||
residuals_map(5) = vel_yaw2[0] - vel_yaw_pred[0]; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -99,7 +99,17 @@ TEST(CostFunction, evaluateCostFunction) | |
|
||
// Check jacobians are correct using a gradient checker | ||
ceres::NumericDiffOptions numeric_diff_options; | ||
ceres::GradientChecker gradient_checker(&cost_function, nullptr, numeric_diff_options); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This looks like a change from another MR If possible, get rid of this change here |
||
// #if !CERES_SUPPORTS_MANIFOLDS | ||
// ceres::GradientChecker gradient_checker( | ||
// &cost_function, | ||
// static_cast<std::vector<const ceres::LocalParameterization*>*>(nullptr), | ||
// numeric_diff_options); | ||
// #else | ||
ceres::GradientChecker gradient_checker( | ||
&cost_function, | ||
static_cast<std::vector<const ceres::Manifold*>*>(nullptr), | ||
numeric_diff_options); | ||
// #endif | ||
|
||
// We cannot use std::numeric_limits<double>::epsilon() tolerance because the worst relative error is 5.26356e-10 | ||
ceres::GradientChecker::ProbeResults probe_results; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure I understand why the difference of position changes are being transformed into....is this the Pose2 frame?
I feel like this should simply be:
Both
delta_position
anddelta_position_pred
are represented in the Pose1 frame. If we just subtract the positions, that error will also be in the Pose1 frame/orientaiton. And that seems like the natural frame to compute the measurement covariance in as well.