Skip to content

Commit 4fb68f6

Browse files
author
lei.gu
committed
feat(object_merger): add diagnostics warning for timeout when merge messages are incomplete
1 parent e69b61d commit 4fb68f6

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

perception/autoware_object_merger/include/autoware/object_merger/object_association_merger_node.hpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#include <rclcpp/rclcpp.hpp>
2424

2525
#include "autoware_perception_msgs/msg/detected_objects.hpp"
26-
26+
#include <autoware_utils/ros/diagnostics_interface.hpp>
2727
#include <message_filters/subscriber.h>
2828
#include <message_filters/sync_policies/approximate_time.h>
2929
#include <message_filters/synchronizer.h>
@@ -57,6 +57,8 @@ class ObjectAssociationMergerNode : public rclcpp::Node
5757
void objectsCallback(
5858
const autoware_perception_msgs::msg::DetectedObjects::ConstSharedPtr & input_objects0_msg,
5959
const autoware_perception_msgs::msg::DetectedObjects::ConstSharedPtr & input_objects1_msg);
60+
61+
void timeoutCallback();
6062

6163
tf2_ros::Buffer tf_buffer_;
6264
tf2_ros::TransformListener tf_listener_;
@@ -73,6 +75,14 @@ class ObjectAssociationMergerNode : public rclcpp::Node
7375
std::unique_ptr<DataAssociation> data_association_;
7476
std::string base_link_frame_id_; // associated with the base_link frame
7577

78+
// Timeout Related
79+
double message_timeout_sec_;
80+
rclcpp::Time last_sync_time_;
81+
bool timeout_sent_;
82+
rclcpp::TimerBase::SharedPtr timeout_timer_;
83+
std::unique_ptr<autoware_utils::DiagnosticsInterface> diagnostics_interface_ptr_;
84+
85+
7686
PriorityMode priority_mode_;
7787
bool remove_overlapped_unknown_objects_;
7888
struct

perception/autoware_object_merger/src/object_association_merger_node.cpp

+40
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,16 @@ ObjectAssociationMergerNode::ObjectAssociationMergerNode(const rclcpp::NodeOptio
130130
stop_watch_ptr_->tic("cyclic_time");
131131
stop_watch_ptr_->tic("processing_time");
132132
published_time_publisher_ = std::make_unique<autoware_utils::PublishedTimePublisher>(this);
133+
// Timeout process initialization
134+
message_timeout_sec_ = this->declare_parameter<double>("message_timeout_sec", 0.001);
135+
last_sync_time_ = this->now();
136+
timeout_sent_ = false;
137+
timeout_timer_ = this->create_wall_timer(
138+
std::chrono::duration<double>(message_timeout_sec_),
139+
std::bind(&ObjectAssociationMergerNode::timeoutCallback, this));
140+
diagnostics_interface_ptr_ =
141+
std::make_unique<autoware_utils::DiagnosticsInterface>(this, "object_association_merger");
142+
133143
}
134144

135145
void ObjectAssociationMergerNode::objectsCallback(
@@ -142,6 +152,15 @@ void ObjectAssociationMergerNode::objectsCallback(
142152
}
143153
stop_watch_ptr_->toc("processing_time", true);
144154

155+
156+
// If messages normally synced
157+
diagnostics_interface_ptr_->clear();
158+
diagnostics_interface_ptr_->add_key_value("are_merge_messages_synced", true);
159+
diagnostics_interface_ptr_->add_key_value("messages_interval", (this->now() - last_sync_time_).seconds() );
160+
diagnostics_interface_ptr_->publish(input_objects0_msg->header.stamp);
161+
last_sync_time_ = this->now();
162+
timeout_sent_ = false;
163+
145164
/* transform to base_link coordinate */
146165
autoware_perception_msgs::msg::DetectedObjects transformed_objects0, transformed_objects1;
147166
if (
@@ -238,6 +257,27 @@ void ObjectAssociationMergerNode::objectsCallback(
238257
processing_time_publisher_->publish<autoware_internal_debug_msgs::msg::Float64Stamped>(
239258
"debug/processing_time_ms", stop_watch_ptr_->toc("processing_time", true));
240259
}
260+
261+
262+
void ObjectAssociationMergerNode::timeoutCallback()
263+
{
264+
rclcpp::Time now = this->now();
265+
if ((now - last_sync_time_).seconds() >= message_timeout_sec_ && !timeout_sent_) {
266+
diagnostics_interface_ptr_->clear();
267+
diagnostics_interface_ptr_->add_key_value("are_merge_messages_synced", false);
268+
diagnostics_interface_ptr_->add_key_value("messages_interval", (now - last_sync_time_).seconds() );
269+
270+
271+
std::stringstream message;
272+
message << "ObjectAssociationMergerNode Timeout: Merging messages not received";
273+
diagnostics_interface_ptr_->update_level_and_message(
274+
diagnostic_msgs::msg::DiagnosticStatus::WARN, message.str());
275+
diagnostics_interface_ptr_->publish(now);
276+
timeout_sent_ = true;
277+
}
278+
}
279+
280+
241281
} // namespace autoware::object_merger
242282

243283
#include <rclcpp_components/register_node_macro.hpp>

0 commit comments

Comments
 (0)