@@ -44,6 +44,8 @@ namespace hydra {
4444
4545using kimera_pgmo::MeshDeltaTypeAdapter;
4646using pose_graph_tools::PoseGraphTypeAdapter;
47+ using BaseInterface = rclcpp::node_interfaces::NodeBaseInterface;
48+ using rclcpp::CallbackGroupType;
4749
4850namespace {
4951
@@ -60,10 +62,19 @@ void declare_config(RosFrontendPublisher::Config& config) {
6062 using namespace config ;
6163 name (" RosFrontendPublisher::Config" );
6264 field (config.dsg_sender , " " );
65+ field (config.mesh_delta_queue_size , " mesh_delta_queue_size" );
6366}
6467
6568RosFrontendPublisher::RosFrontendPublisher (ianvs::NodeHandle nh)
6669 : config(config::checkValid(get_config())) {
70+ auto group = nh.as <BaseInterface>()->create_callback_group (
71+ CallbackGroupType::MutuallyExclusive);
72+ mesh_delta_server_ =
73+ nh.create_service <MeshDeltaSrv>(" mesh_delta_query" ,
74+ &RosFrontendPublisher::processMeshDeltaQuery,
75+ this ,
76+ rclcpp::ServicesQoS (),
77+ group);
6778 dsg_sender_ = std::make_unique<DsgSender>(config.dsg_sender , nh);
6879 mesh_graph_pub_ = nh.create_publisher <PoseGraphTypeAdapter>(
6980 " mesh_graph_incremental" , rclcpp::QoS (100 ).transient_local ());
@@ -79,9 +90,32 @@ void RosFrontendPublisher::call(uint64_t timestamp_ns,
7990 if (backend_input.mesh_update ) {
8091 backend_input.mesh_update ->timestamp_ns = timestamp_ns;
8192 mesh_update_pub_->publish (*backend_input.mesh_update );
93+ stored_delta_.insert (
94+ {backend_input.mesh_update ->sequence_number , backend_input.mesh_update });
95+ if (config.mesh_delta_queue_size > 0 &&
96+ stored_delta_.size () > static_cast <size_t >(config.mesh_delta_queue_size )) {
97+ stored_delta_.erase (stored_delta_.begin ());
98+ }
8299 }
83100
84101 dsg_sender_->sendGraph (graph, rclcpp::Time (timestamp_ns));
85102}
86103
104+ void RosFrontendPublisher::processMeshDeltaQuery (
105+ const MeshDeltaSrv::Request::SharedPtr req,
106+ MeshDeltaSrv::Response::SharedPtr resp) {
107+ LOG (INFO) << " Received request for " << req->sequence_numbers .size ()
108+ << " mesh deltas..." ;
109+ for (const auto & seq : req->sequence_numbers ) {
110+ auto & msg = resp->deltas .emplace_back ();
111+ // Check TypeAdater documentation TODO(Yun)
112+ if (!stored_delta_.count (seq)) {
113+ LOG (ERROR) << " Mesh delta sequence " << seq << " not found" ;
114+ continue ;
115+ }
116+ mesh_delta_converter_.convert_to_ros_message (*stored_delta_.at (seq), msg);
117+ }
118+ LOG (INFO) << " Responding with " << resp->deltas .size () << " deltas..." ;
119+ }
120+
87121} // namespace hydra
0 commit comments