Skip to content

Commit 7063220

Browse files
committed
feat: subdivide diagnostics items by signal and module
Signed-off-by: Motsu-san <83898149+Motsu-san@users.noreply.github.com>
1 parent d3e6427 commit 7063220

1 file changed

Lines changed: 79 additions & 44 deletions

File tree

localization/autoware_ekf_localizer/src/ekf_localizer.cpp

Lines changed: 79 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -370,55 +370,90 @@ void EKFLocalizer::publish_estimate_result(
370370
void EKFLocalizer::publish_diagnostics(
371371
const geometry_msgs::msg::PoseStamped & current_ekf_pose, const rclcpp::Time & current_time)
372372
{
373-
std::vector<diagnostic_msgs::msg::DiagnosticStatus> diag_status_array;
373+
diagnostic_msgs::msg::DiagnosticArray diag_msg;
374+
diag_msg.header.stamp = current_time;
374375

375-
diag_status_array.push_back(check_process_activated(is_activated_));
376-
diag_status_array.push_back(check_set_initialpose(is_set_initialpose_));
376+
// 1. General status (その他)
377+
{
378+
std::vector<diagnostic_msgs::msg::DiagnosticStatus> general_diag_array;
379+
general_diag_array.push_back(check_process_activated(is_activated_));
380+
general_diag_array.push_back(check_set_initialpose(is_set_initialpose_));
381+
382+
diagnostic_msgs::msg::DiagnosticStatus general_status =
383+
merge_diagnostic_status(general_diag_array);
384+
general_status.name = "localization: " + std::string(this->get_name()) + ": general_status";
385+
general_status.hardware_id = this->get_name();
386+
diag_msg.status.push_back(general_status);
387+
}
377388

378389
if (is_activated_ && is_set_initialpose_) {
379-
diag_status_array.push_back(check_measurement_updated(
380-
"pose", pose_diag_info_.no_update_count, params_.pose_no_update_count_threshold_warn,
381-
params_.pose_no_update_count_threshold_error));
382-
diag_status_array.push_back(check_measurement_queue_size("pose", pose_diag_info_.queue_size));
383-
diag_status_array.push_back(check_measurement_delay_gate(
384-
"pose", pose_diag_info_.is_passed_delay_gate, pose_diag_info_.delay_time,
385-
pose_diag_info_.delay_time_threshold));
386-
diag_status_array.push_back(check_measurement_mahalanobis_gate(
387-
"pose", pose_diag_info_.is_passed_mahalanobis_gate, pose_diag_info_.mahalanobis_distance,
388-
params_.pose_gate_dist));
389-
390-
diag_status_array.push_back(check_measurement_updated(
391-
"twist", twist_diag_info_.no_update_count, params_.twist_no_update_count_threshold_warn,
392-
params_.twist_no_update_count_threshold_error));
393-
diag_status_array.push_back(check_measurement_queue_size("twist", twist_diag_info_.queue_size));
394-
diag_status_array.push_back(check_measurement_delay_gate(
395-
"twist", twist_diag_info_.is_passed_delay_gate, twist_diag_info_.delay_time,
396-
twist_diag_info_.delay_time_threshold));
397-
diag_status_array.push_back(check_measurement_mahalanobis_gate(
398-
"twist", twist_diag_info_.is_passed_mahalanobis_gate, twist_diag_info_.mahalanobis_distance,
399-
params_.twist_gate_dist));
400-
401-
geometry_msgs::msg::PoseWithCovariance pose_cov;
402-
pose_cov.pose = current_ekf_pose.pose;
403-
pose_cov.covariance = ekf_module_->get_current_pose_covariance();
404-
const autoware::localization_util::Ellipse ellipse =
405-
autoware::localization_util::calculate_xy_ellipse(pose_cov, params_.ellipse_scale);
406-
diag_status_array.push_back(check_covariance_ellipse(
407-
"cov_ellipse_long_axis", ellipse.long_radius, params_.warn_ellipse_size,
408-
params_.error_ellipse_size));
409-
diag_status_array.push_back(check_covariance_ellipse(
410-
"cov_ellipse_lateral_direction", ellipse.size_lateral_direction,
411-
params_.warn_ellipse_size_lateral_direction, params_.error_ellipse_size_lateral_direction));
412-
}
390+
// 2. Pose diagnostics (pose_...)
391+
{
392+
std::vector<diagnostic_msgs::msg::DiagnosticStatus> pose_diag_array;
393+
pose_diag_array.push_back(check_measurement_updated(
394+
"pose", pose_diag_info_.no_update_count, params_.pose_no_update_count_threshold_warn,
395+
params_.pose_no_update_count_threshold_error));
396+
pose_diag_array.push_back(check_measurement_queue_size("pose", pose_diag_info_.queue_size));
397+
pose_diag_array.push_back(check_measurement_delay_gate(
398+
"pose", pose_diag_info_.is_passed_delay_gate, pose_diag_info_.delay_time,
399+
pose_diag_info_.delay_time_threshold));
400+
pose_diag_array.push_back(check_measurement_mahalanobis_gate(
401+
"pose", pose_diag_info_.is_passed_mahalanobis_gate, pose_diag_info_.mahalanobis_distance,
402+
params_.pose_gate_dist));
403+
404+
diagnostic_msgs::msg::DiagnosticStatus pose_status = merge_diagnostic_status(pose_diag_array);
405+
pose_status.name = "localization: " + std::string(this->get_name()) + ": pose_measurement";
406+
pose_status.hardware_id = this->get_name();
407+
diag_msg.status.push_back(pose_status);
408+
}
413409

414-
diagnostic_msgs::msg::DiagnosticStatus diag_merged_status;
415-
diag_merged_status = merge_diagnostic_status(diag_status_array);
416-
diag_merged_status.name = "localization: " + std::string(this->get_name());
417-
diag_merged_status.hardware_id = this->get_name();
410+
// 3. Twist diagnostics (twist_...)
411+
{
412+
std::vector<diagnostic_msgs::msg::DiagnosticStatus> twist_diag_array;
413+
twist_diag_array.push_back(check_measurement_updated(
414+
"twist", twist_diag_info_.no_update_count, params_.twist_no_update_count_threshold_warn,
415+
params_.twist_no_update_count_threshold_error));
416+
twist_diag_array.push_back(
417+
check_measurement_queue_size("twist", twist_diag_info_.queue_size));
418+
twist_diag_array.push_back(check_measurement_delay_gate(
419+
"twist", twist_diag_info_.is_passed_delay_gate, twist_diag_info_.delay_time,
420+
twist_diag_info_.delay_time_threshold));
421+
twist_diag_array.push_back(check_measurement_mahalanobis_gate(
422+
"twist", twist_diag_info_.is_passed_mahalanobis_gate, twist_diag_info_.mahalanobis_distance,
423+
params_.twist_gate_dist));
424+
425+
diagnostic_msgs::msg::DiagnosticStatus twist_status =
426+
merge_diagnostic_status(twist_diag_array);
427+
twist_status.name = "localization: " + std::string(this->get_name()) + ": twist_measurement";
428+
twist_status.hardware_id = this->get_name();
429+
diag_msg.status.push_back(twist_status);
430+
}
431+
432+
// 4. Covariance ellipse diagnostics (cov_ellipse_...)
433+
{
434+
geometry_msgs::msg::PoseWithCovariance pose_cov;
435+
pose_cov.pose = current_ekf_pose.pose;
436+
pose_cov.covariance = ekf_module_->get_current_pose_covariance();
437+
const autoware::localization_util::Ellipse ellipse =
438+
autoware::localization_util::calculate_xy_ellipse(pose_cov, params_.ellipse_scale);
439+
440+
std::vector<diagnostic_msgs::msg::DiagnosticStatus> covariance_diag_array;
441+
covariance_diag_array.push_back(check_covariance_ellipse(
442+
"cov_ellipse_long_axis", ellipse.long_radius, params_.warn_ellipse_size,
443+
params_.error_ellipse_size));
444+
covariance_diag_array.push_back(check_covariance_ellipse(
445+
"cov_ellipse_lateral_direction", ellipse.size_lateral_direction,
446+
params_.warn_ellipse_size_lateral_direction, params_.error_ellipse_size_lateral_direction));
447+
448+
diagnostic_msgs::msg::DiagnosticStatus covariance_status =
449+
merge_diagnostic_status(covariance_diag_array);
450+
covariance_status.name =
451+
"localization: " + std::string(this->get_name()) + ": covariance_ellipse";
452+
covariance_status.hardware_id = this->get_name();
453+
diag_msg.status.push_back(covariance_status);
454+
}
455+
}
418456

419-
diagnostic_msgs::msg::DiagnosticArray diag_msg;
420-
diag_msg.header.stamp = current_time;
421-
diag_msg.status.push_back(diag_merged_status);
422457
pub_diag_->publish(diag_msg);
423458
}
424459

0 commit comments

Comments
 (0)