3838#include < config_utilities/printing.h>
3939#include < config_utilities/validation.h>
4040#include < hydra/common/global_info.h>
41+ #include < hydra_visualizer/drawing.h>
4142#include < kimera_pgmo/mesh_delta.h>
4243
4344namespace hydra {
45+ namespace {
46+
47+ static const auto registration =
48+ config::RegistrationWithConfig<MeshSegmenter::Sink,
49+ ObjectVisualizer,
50+ ObjectVisualizer::Config>(" ObjectVisualizer" );
51+
52+ }
4453
4554using visualization_msgs::msg::Marker;
4655
@@ -51,18 +60,36 @@ void declare_config(ObjectVisualizer::Config& config) {
5160 field (config.point_scale , " point_scale" );
5261 field (config.point_alpha , " point_alpha" );
5362 field (config.use_spheres , " use_spheres" );
63+ field (config.bounding_box_scale , " bounding_box_scale" );
64+ field (config.colormap , " colormap" );
5465}
5566
5667ObjectVisualizer::ObjectVisualizer (const Config& config)
5768 : config(config::checkValid(config)),
5869 nh_ (ianvs::NodeHandle::this_node(config.module_ns)),
59- pubs_(nh_) {}
70+ pubs_(nh_),
71+ colormap_(config.colormap) {}
6072
6173std::string ObjectVisualizer::printInfo () const { return config::toString (config); }
6274
75+ struct DeltaPointAdaptor : spark_dsg::BoundingBox::PointAdaptor {
76+ DeltaPointAdaptor (const kimera_pgmo::MeshDelta& delta,
77+ const std::vector<size_t >& indices)
78+ : delta(delta), indices(indices) {}
79+
80+ size_t size () const override { return indices.size (); }
81+
82+ Eigen::Vector3f get (size_t index) const override {
83+ return delta.getVertex (indices.at (index)).pos ;
84+ }
85+ const kimera_pgmo::MeshDelta& delta;
86+ const std::vector<size_t >& indices;
87+ };
88+
6389void ObjectVisualizer::call (uint64_t timestamp_ns,
6490 const kimera_pgmo::MeshDelta& delta,
65- const LabelIndices& label_indices) const {
91+ const LabelIndices& label_indices,
92+ const MeshSegmenter::LabelClusters& clusters) const {
6693 pubs_.publish (" active_vertices" , [&]() {
6794 auto msg = std::make_unique<Marker>();
6895 msg->header .stamp = rclcpp::Time (timestamp_ns);
@@ -87,6 +114,27 @@ void ObjectVisualizer::call(uint64_t timestamp_ns,
87114 return msg;
88115 });
89116 }
117+
118+ pubs_.publish (" object_clusters" , [&]() {
119+ auto msg = std::make_unique<Marker>();
120+ msg->header .stamp = rclcpp::Time (timestamp_ns);
121+ msg->header .frame_id = GlobalInfo::instance ().getFrames ().odom ;
122+ msg->type = Marker::LINE_LIST;
123+ msg->action = Marker::ADD;
124+ msg->ns = " object_clusters" ;
125+ msg->id = 0 ;
126+ msg->scale .x = config.bounding_box_scale ;
127+ for (const auto & [label, label_clusters] : clusters) {
128+ const auto color = visualizer::makeColorMsg (colormap_ (label));
129+ for (const auto & cluster : label_clusters) {
130+ const DeltaPointAdaptor adaptor (delta, cluster.indices );
131+ const spark_dsg::BoundingBox bbox (adaptor);
132+ visualizer::drawBoundingBox (bbox, color, *msg);
133+ }
134+ }
135+
136+ return msg;
137+ });
90138}
91139
92140void ObjectVisualizer::fillMarkerFromCloud (const kimera_pgmo::MeshDelta& delta,
0 commit comments