2929#include < grid_map_ros/grid_map_ros.hpp>
3030
3131#include " easynav_gridmap_maps_builder/GridmapMapsBuilderNode.hpp"
32- #include " easynav_common/types/Perceptions .hpp"
32+ #include " easynav_common/types/PointPerception .hpp"
3333
3434namespace easynav
3535{
@@ -39,33 +39,28 @@ GridmapMapsBuilderNode::GridmapMapsBuilderNode(const rclcpp::NodeOptions & optio
3939{
4040 cbg_ = create_callback_group (rclcpp::CallbackGroupType::MutuallyExclusive);
4141
42- if (!has_parameter (" sensor_topic" )) {
43- declare_parameter (" sensor_topic" , " points" );
44- }
45-
4642 if (!has_parameter (" downsample_resolution" )) {
4743 declare_parameter (" downsample_resolution" , 1.0 );
4844 }
45+ if (!has_parameter (" sensors" )) {
46+ declare_parameter (" sensors" , std::vector<std::string>());
47+ }
4948
5049 if (!has_parameter (" perception_default_frame" )) {
5150 declare_parameter (" perception_default_frame" , " map" );
5251 }
5352
5453 pub_ = this ->create_publisher <grid_map_msgs::msg::GridMap>(
55- " map_builder/gridmap" , rclcpp::QoS (1 ).transient_local ().reliable ());
54+ " map_builder_gridmap/gridmap" , rclcpp::QoS (1 ).transient_local ().reliable ());
55+
56+ register_handler (std::make_shared<PointPerceptionHandler>());
5657}
5758
5859GridmapMapsBuilderNode::~GridmapMapsBuilderNode ()
5960{
6061 if (get_current_state ().id () != lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) {
6162 trigger_transition (lifecycle_msgs::msg::Transition::TRANSITION_ACTIVE_SHUTDOWN);
6263 }
63- if (get_current_state ().id () != lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE) {
64- trigger_transition (lifecycle_msgs::msg::Transition::TRANSITION_INACTIVE_SHUTDOWN);
65- }
66- if (get_current_state ().id () != lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED) {
67- trigger_transition (lifecycle_msgs::msg::Transition::TRANSITION_UNCONFIGURED_SHUTDOWN);
68- }
6964}
7065
7166using CallbackReturnT = rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn;
@@ -75,22 +70,46 @@ GridmapMapsBuilderNode::on_configure(const rclcpp_lifecycle::State & state)
7570{
7671 (void )state;
7772
78- get_parameter (" sensor_topic" , sensor_topic_);
73+ std::vector<std::string> sensors;
74+ get_parameter (" sensors" , sensors);
7975 get_parameter (" downsample_resolution" , downsample_resolution_);
8076 get_parameter (" perception_default_frame" , perception_default_frame_);
8177
82- auto perception_entry = std::make_shared<Perception>();
83- perception_entry->data .points .clear ();
84- perception_entry->data .clear ();
85- perception_entry->frame_id = " " ;
86- perception_entry->stamp = now ();
87- perception_entry->valid = false ;
88- perception_entry->new_data = true ;
78+ for (const auto & sensor_id : sensors) {
79+ std::string topic, msg_type, group;
8980
90- perceptions_.push_back (perception_entry);
81+ if (!has_parameter (sensor_id + " .topic" )) {
82+ declare_parameter (sensor_id + " .topic" , topic);
83+ }
84+ if (!has_parameter (sensor_id + " .type" )) {
85+ declare_parameter (sensor_id + " .type" , msg_type);
86+ }
87+ if (!has_parameter (sensor_id + " .group" )) {
88+ declare_parameter (sensor_id + " .group" , group);
89+ }
9190
92- perception_entry->subscription = create_typed_subscription<sensor_msgs::msg::PointCloud2>(
93- *this , sensor_topic_, perception_entry, cbg_);
91+ get_parameter (sensor_id + " .topic" , topic);
92+ get_parameter (sensor_id + " .type" , msg_type);
93+ get_parameter (sensor_id + " .group" , group);
94+
95+ RCLCPP_DEBUG (get_logger (),
96+ " Loaded sensor parameters: id=%s topic=%s type=%s group=%s" ,
97+ sensor_id.c_str (), topic.c_str (), msg_type.c_str (), group.c_str ());
98+
99+ auto handler_it = handlers_.find (group);
100+ if (handler_it == handlers_.end ()) {
101+ RCLCPP_WARN (get_logger (), " No handler for group [%s]" , group.c_str ());
102+ continue ;
103+ }
104+
105+ auto ptr = handler_it->second ->create (sensor_id);
106+ auto sub = handler_it->second ->create_subscription (*this , topic, msg_type, ptr, cbg_);
107+
108+ perceptions_[group].emplace_back (PerceptionPtr{ptr, sub});
109+
110+ RCLCPP_DEBUG (get_logger (), " Creating perception for sensor %s" , sensor_id.c_str ());
111+ RCLCPP_DEBUG (get_logger (), " Handler group = %s" , group.c_str ());
112+ }
94113
95114 return CallbackReturnT::SUCCESS;
96115}
@@ -125,24 +144,26 @@ GridmapMapsBuilderNode::on_cleanup(const rclcpp_lifecycle::State & state)
125144void GridmapMapsBuilderNode::cycle ()
126145{
127146 // Finish cycle if no new perceptions
128- if (std::none_of (perceptions_.begin (), perceptions_.end (),
129- [](const auto & perception )
130- {return perception && perception->new_data ;}))
147+ if (std::none_of (perceptions_[ " points " ] .begin (), perceptions_[ " points " ] .end (),
148+ [](const auto & p )
149+ {return p. perception ->new_data ;}))
131150 {
132151 return ;
133152 }
134153
135154 if (pub_->get_subscription_count () > 0 ) {
136- auto processed_perceptions = PerceptionsOpsView (perceptions_);
155+ auto point_perceptions = get_point_perceptions (perceptions_[" points" ]);
156+ auto processed_perceptions = PointPerceptionsOpsView (point_perceptions);
137157 // Fuse perceptions if the frame_id is different from default and downsample
138- if (!perceptions_ .empty () && perceptions_ [0 ] &&
139- perceptions_ [0 ]->frame_id != perception_default_frame_)
158+ if (!point_perceptions .empty () && point_perceptions [0 ] &&
159+ point_perceptions [0 ]->frame_id != perception_default_frame_)
140160 {
141161 processed_perceptions.downsample (downsample_resolution_).fuse (perception_default_frame_);
142162 } else {
143163 processed_perceptions.downsample (downsample_resolution_);
144164 }
145165
166+
146167 auto downsampled_points = processed_perceptions.as_points ();
147168 if (downsampled_points.empty ()) {
148169 return ;
@@ -152,8 +173,8 @@ void GridmapMapsBuilderNode::cycle()
152173 grid_map::GridMap map ({" elevation" });
153174 map.setFrameId (perception_default_frame_);
154175
155- if (perceptions_ [0 ]->stamp .nanoseconds () != 0 ) {
156- map.setTimestamp (perceptions_ [0 ]->stamp .nanoseconds ());
176+ if (point_perceptions [0 ]->stamp .nanoseconds () != 0 ) {
177+ map.setTimestamp (point_perceptions [0 ]->stamp .nanoseconds ());
157178 } else {
158179 map.setTimestamp (now ().nanoseconds ());
159180 }
@@ -201,11 +222,18 @@ void GridmapMapsBuilderNode::cycle()
201222 pub_->publish (std::move (msg));
202223
203224 // Mark perceptions as not new after published
204- for (auto & perception : perceptions_) {
205- if (perception->new_data ) {
206- perception->new_data = false ;
225+ for (auto & p : perceptions_[ " points " ] ) {
226+ if (p. perception ->new_data ) {
227+ p. perception ->new_data = false ;
207228 }
208229 }
209230 }
210231}
232+
233+ void
234+ GridmapMapsBuilderNode::register_handler (std::shared_ptr<PerceptionHandler> handler)
235+ {
236+ handlers_[handler->group ()] = handler;
237+ }
238+
211239} // namespace easynav
0 commit comments