@@ -370,55 +370,90 @@ void EKFLocalizer::publish_estimate_result(
370370void 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