Skip to content

Commit 1640c06

Browse files
meliketanrikulupre-commit-ci[bot]YamatoAndo
authored
fix(ekf_localizer): add_delay_compensation_for_roll_and_pitch (#8095)
* fix(ekf_localizer)add_delay_compensation_for_roll_and_pitch Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * rename compensate_pose_with_delay function Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * rename variables Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * update comment Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * rename compensated pose name Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * rename function name Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * style(pre-commit): autofix * calculate delta_orientation with orientation Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * rename - angular velocity vector Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * add z element delay compensation Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * fix typo Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * check twist msg for last_angular_velocity_ Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * use corrected pitch for delta_z calculation Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * update pose_with_delay header stamp Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> * style(pre-commit): autofix * fix local variable naming Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> --------- Signed-off-by: Melike Tanrıkulu <melike@leodrive.ai> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Yamato Ando <yamato.ando@gmail.com>
1 parent ba5da74 commit 1640c06

File tree

4 files changed

+52
-14
lines changed

4 files changed

+52
-14
lines changed

localization/ekf_localizer/include/ekf_localizer/ekf_localizer.hpp

+5
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,11 @@ class EKFLocalizer : public rclcpp::Node
239239

240240
autoware::universe_utils::StopWatch<std::chrono::milliseconds> stop_watch_;
241241

242+
/**
243+
* @brief last angular velocity for compensating rph with delay
244+
*/
245+
tf2::Vector3 last_angular_velocity_;
246+
242247
friend class EKFLocalizerTestSuite; // for test code
243248
};
244249
#endif // EKF_LOCALIZER__EKF_LOCALIZER_HPP_

localization/ekf_localizer/include/ekf_localizer/ekf_module.hpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
#include <geometry_msgs/msg/twist_stamped.hpp>
3030
#include <geometry_msgs/msg/twist_with_covariance_stamped.hpp>
3131

32+
#include <tf2/utils.h>
33+
3234
#include <memory>
3335
#include <vector>
3436

@@ -77,8 +79,8 @@ class EKFModule
7779
bool measurement_update_twist(
7880
const TwistWithCovariance & twist, const rclcpp::Time & t_curr,
7981
EKFDiagnosticInfo & twist_diag_info);
80-
geometry_msgs::msg::PoseWithCovarianceStamped compensate_pose_with_z_delay(
81-
const PoseWithCovariance & pose, const double delay_time);
82+
geometry_msgs::msg::PoseWithCovarianceStamped compensate_rph_with_delay(
83+
const PoseWithCovariance & pose, tf2::Vector3 last_angular_velocity, const double delay_time);
8284

8385
private:
8486
TimeDelayKalmanFilter kalman_filter_;

localization/ekf_localizer/src/ekf_localizer.cpp

+11-4
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ EKFLocalizer::EKFLocalizer(const rclcpp::NodeOptions & node_options)
4747
params_(this),
4848
ekf_dt_(params_.ekf_dt),
4949
pose_queue_(params_.pose_smoothing_steps),
50-
twist_queue_(params_.twist_smoothing_steps)
50+
twist_queue_(params_.twist_smoothing_steps),
51+
last_angular_velocity_(0.0, 0.0, 0.0)
5152
{
5253
/* convert to continuous to discrete */
5354
proc_cov_vx_d_ = std::pow(params_.proc_stddev_vx_c * ekf_dt_, 2.0);
@@ -187,11 +188,13 @@ void EKFLocalizer::timer_callback()
187188
if (is_updated) {
188189
pose_is_updated = true;
189190

190-
// Update Simple 1D filter with considering change of z value due to measurement pose delay
191+
// Update Simple 1D filter with considering change of roll, pitch and height (position z)
192+
// values due to measurement pose delay
191193
const double delay_time =
192194
(current_time - pose->header.stamp).seconds() + params_.pose_additional_delay;
193-
const auto pose_with_z_delay = ekf_module_->compensate_pose_with_z_delay(*pose, delay_time);
194-
update_simple_1d_filters(pose_with_z_delay, params_.pose_smoothing_steps);
195+
auto pose_with_rph_delay_compensation =
196+
ekf_module_->compensate_rph_with_delay(*pose, last_angular_velocity_, delay_time);
197+
update_simple_1d_filters(pose_with_rph_delay_compensation, params_.pose_smoothing_steps);
195198
}
196199
}
197200
DEBUG_INFO(
@@ -222,6 +225,10 @@ void EKFLocalizer::timer_callback()
222225
ekf_module_->measurement_update_twist(*twist, current_time, twist_diag_info_);
223226
if (is_updated) {
224227
twist_is_updated = true;
228+
last_angular_velocity_ = tf2::Vector3(
229+
twist->twist.twist.angular.x, twist->twist.twist.angular.y, twist->twist.twist.angular.z);
230+
} else {
231+
last_angular_velocity_ = tf2::Vector3(0.0, 0.0, 0.0);
225232
}
226233
}
227234
DEBUG_INFO(

localization/ekf_localizer/src/ekf_module.cpp

+32-8
Original file line numberDiff line numberDiff line change
@@ -282,15 +282,39 @@ bool EKFModule::measurement_update_pose(
282282
return true;
283283
}
284284

285-
geometry_msgs::msg::PoseWithCovarianceStamped EKFModule::compensate_pose_with_z_delay(
286-
const PoseWithCovariance & pose, const double delay_time)
285+
geometry_msgs::msg::PoseWithCovarianceStamped EKFModule::compensate_rph_with_delay(
286+
const PoseWithCovariance & pose, tf2::Vector3 last_angular_velocity, const double delay_time)
287287
{
288-
const auto rpy = autoware::universe_utils::getRPY(pose.pose.pose.orientation);
289-
const double dz_delay = kalman_filter_.getXelement(IDX::VX) * delay_time * std::sin(-rpy.y);
290-
PoseWithCovariance pose_with_z_delay;
291-
pose_with_z_delay = pose;
292-
pose_with_z_delay.pose.pose.position.z += dz_delay;
293-
return pose_with_z_delay;
288+
tf2::Quaternion delta_orientation;
289+
if (last_angular_velocity.length() > 0.0) {
290+
delta_orientation.setRotation(
291+
last_angular_velocity.normalized(), last_angular_velocity.length() * delay_time);
292+
} else {
293+
delta_orientation.setValue(0.0, 0.0, 0.0, 1.0);
294+
}
295+
296+
tf2::Quaternion prev_orientation = tf2::Quaternion(
297+
pose.pose.pose.orientation.x, pose.pose.pose.orientation.y, pose.pose.pose.orientation.z,
298+
pose.pose.pose.orientation.w);
299+
300+
tf2::Quaternion curr_orientation;
301+
curr_orientation = prev_orientation * delta_orientation;
302+
curr_orientation.normalize();
303+
304+
PoseWithCovariance pose_with_delay;
305+
pose_with_delay = pose;
306+
pose_with_delay.header.stamp =
307+
rclcpp::Time(pose.header.stamp) + rclcpp::Duration::from_seconds(delay_time);
308+
pose_with_delay.pose.pose.orientation.x = curr_orientation.x();
309+
pose_with_delay.pose.pose.orientation.y = curr_orientation.y();
310+
pose_with_delay.pose.pose.orientation.z = curr_orientation.z();
311+
pose_with_delay.pose.pose.orientation.w = curr_orientation.w();
312+
313+
const auto rpy = autoware::universe_utils::getRPY(pose_with_delay.pose.pose.orientation);
314+
const double delta_z = kalman_filter_.getXelement(IDX::VX) * delay_time * std::sin(-rpy.y);
315+
pose_with_delay.pose.pose.position.z += delta_z;
316+
317+
return pose_with_delay;
294318
}
295319

296320
bool EKFModule::measurement_update_twist(

0 commit comments

Comments
 (0)