Skip to content

Commit 8b9bbd8

Browse files
committed
add active bounding boxes for objects to rviz
1 parent 4356ffe commit 8b9bbd8

File tree

3 files changed

+61
-7
lines changed

3 files changed

+61
-7
lines changed

hydra_ros/include/hydra_ros/frontend/object_visualizer.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
* -------------------------------------------------------------------------- */
3535
#pragma once
3636
#include <hydra/frontend/mesh_segmenter.h>
37+
#include <hydra_visualizer/color/colormap_utilities.h>
3738
#include <ianvs/lazy_publisher_group.h>
3839

3940
#include <visualization_msgs/msg/marker.hpp>
@@ -47,6 +48,8 @@ class ObjectVisualizer : public MeshSegmenter::Sink {
4748
double point_scale = 0.1;
4849
double point_alpha = 0.7;
4950
bool use_spheres = false;
51+
double bounding_box_scale = 0.1;
52+
visualizer::CategoricalColormap::Config colormap;
5053
} const config;
5154

5255
explicit ObjectVisualizer(const Config& config);
@@ -57,7 +60,8 @@ class ObjectVisualizer : public MeshSegmenter::Sink {
5760

5861
void call(uint64_t timestamp_ns,
5962
const kimera_pgmo::MeshDelta& delta,
60-
const LabelIndices& label_indices) const override;
63+
const LabelIndices& label_indices,
64+
const MeshSegmenter::LabelClusters& clusters) const override;
6165

6266
protected:
6367
void fillMarkerFromCloud(const kimera_pgmo::MeshDelta& delta,
@@ -68,10 +72,7 @@ class ObjectVisualizer : public MeshSegmenter::Sink {
6872
ianvs::NodeHandle nh_;
6973
ianvs::RosPublisherGroup<visualization_msgs::msg::Marker> pubs_;
7074

71-
private:
72-
inline static const auto registration_ =
73-
config::RegistrationWithConfig<MeshSegmenter::Sink, ObjectVisualizer, Config>(
74-
"ObjectVisualizer");
75+
const visualizer::CategoricalColormap colormap_;
7576
};
7677

7778
void declare_config(ObjectVisualizer::Config& conf);

hydra_ros/launch/datasets/uhumans2.launch.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,8 @@ launch:
3838
- {name: map_frame, value: map}
3939
- {name: lcd_config_path, value: $(find-pkg-share hydra)/config/lcd/uhumans2.yaml}
4040
- {name: extra_yaml, value: $(if $(var use_gt_semantics) $(var extra_yaml_gt) $(var extra_yaml_no_gt))}
41+
- node:
42+
pkg: tf2_ros
43+
name: world_to_map
44+
exec: static_transform_publisher
45+
args: --frame-id world --child-frame-id map

hydra_ros/src/frontend/object_visualizer.cpp

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,18 @@
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

4344
namespace hydra {
45+
namespace {
46+
47+
static const auto registration =
48+
config::RegistrationWithConfig<MeshSegmenter::Sink,
49+
ObjectVisualizer,
50+
ObjectVisualizer::Config>("ObjectVisualizer");
51+
52+
}
4453

4554
using 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

5667
ObjectVisualizer::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

6173
std::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+
6389
void 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

92140
void ObjectVisualizer::fillMarkerFromCloud(const kimera_pgmo::MeshDelta& delta,

0 commit comments

Comments
 (0)