ArVizDrawer.cpp
Go to the documentation of this file.
1#include "ArVizDrawer.h"
2// #include "RobotComponents/components/CartographerMapRegistration/ArVizDrawer.h"
3
4#include <algorithm>
5#include <string>
6
13
14#include "RobotComponents/libraries/cartographer/map_registration/wykobi_types.h"
15
17{
18 namespace detail
19 {
20 inline Eigen::Vector3f
21 toEigen(const pcl::PointXYZ& pt)
22 {
23 return Eigen::Vector3f{pt.x, pt.y, pt.z};
24 }
25 } // namespace detail
26
27 ArVizDrawer::ArVizDrawer(armarx::viz::Client& arviz) : ArVizDrawerBase(arviz)
28 {
29 // clear(); boom...
30 }
31
36
37 void
39 {
40 const auto clearLayer = [&](const std::string& layerName)
41 {
42 auto layer = arviz().layer(layerName);
44 };
45
46 clearLayer(layers.mapBoundaries);
47 clearLayer(layers.modelSceneAssociations);
48 clearLayer(layers.sceneModels);
49 clearLayer(layers.robotPoses);
50 clearLayer(layers.selectedBoundingBoxCorner);
51 clearLayer(layers.clusters);
52 clearLayer(layers.pointCloud);
53 clearLayer(layers.frames);
54 }
55
56 void
57 ArVizDrawer::drawFrames(const Eigen::Affine3f& world_T_map)
58 {
59 auto framesLayer = arviz().layer(layers.frames);
60
61 const auto mapPose =
62 viz::Pose(MapFrame).pose(world_T_map.translation(), world_T_map.linear()).scale(5.F);
63 const auto worldPose = viz::Pose(GlobalFrame).scale(5.F);
64
65 const auto arr = viz::Arrow(GlobalFrame + "/" + MapFrame)
66 .fromTo(Eigen::Vector3f::Zero(), world_T_map.translation());
67
68 framesLayer.add(worldPose, mapPose, arr);
69 commit(framesLayer);
70 }
71
72 void
73 ArVizDrawer::drawCluster(const MapRegistration::Cluster& cluster,
74 const Eigen::Affine3f& world_T_map,
75 viz::Layer& layer) const
76 {
77 const size_t id = layer.size();
78
79 // cluster: point cloud
80 const std::string clusterPointsName = "cluster_points_" + std::to_string(id);
81
82 auto pc = viz::PointCloud(clusterPointsName)
83 .pose(world_T_map.translation(), world_T_map.linear());
84 pc.pointSizeInPixels(10).pointCloud(*cluster.points, viz::Color::gray(200));
85
86 layer.add(pc);
87
88 // cluster: centroid
89 const std::string clusterCentroidName = "centroid_" + std::to_string(id);
90
91 Eigen::Vector3f world_P_cluster = world_T_map * detail::toEigen(cluster.centroid);
92
93 auto pose = viz::Pose(clusterCentroidName).position(world_P_cluster);
94 layer.add(pose);
95 }
96
97 void
98 ArVizDrawer::drawPointCloud(const MapRegistration::PointCloud& cloud,
99 const Eigen::Affine3f& world_T_map)
100 {
101 auto layer = arviz().layer(layers.pointCloud);
102
103 // cluster: point cloud
104 const std::string clusterPointsName = "point_cloud";
105
106 auto pc = viz::PointCloud(clusterPointsName)
107 .pose(world_T_map.translation(), world_T_map.linear());
108 pc.pointSizeInPixels(5).pointCloud(cloud.points, viz::Color::gray(100));
109
110 layer.add(pc);
111
112 commit(layer);
113 }
114
115 void
116 ArVizDrawer::drawClusters(const MapRegistration::Clusters& clusters,
117 const Eigen::Affine3f& world_T_map)
118 {
119 auto layer = arviz().layer(layers.clusters);
120
121 std::for_each(clusters.begin(),
122 clusters.end(),
123 [&](const auto& cluster) { drawCluster(cluster, world_T_map, layer); });
124
125 commit(layer);
126 }
127
128 void
129 ArVizDrawer::drawSelectedBoundingBoxCorner(const Eigen::Affine3f& boundingBoxCornerPose,
130 const Eigen::Affine3f& world_T_map)
131 {
132 auto layer = arviz().layer(layers.selectedBoundingBoxCorner);
133
134 const Eigen::Affine3f world_T_corner = world_T_map * boundingBoxCornerPose;
135 auto pose = viz::Pose("box_corner")
136 .pose(world_T_corner.translation(), world_T_corner.linear())
137 .scale(3.F);
138
139 layer.add(pose);
140
141 commit(layer);
142 }
143
144 void
145 ArVizDrawer::drawRobotPose(const Eigen::Affine3f& robotPose,
146 const Eigen::Affine3f& world_T_map,
147 viz::Layer& layer) const
148 {
149 const size_t id = layer.size();
150
151 // cluster: point cloud
152 const std::string robotPoseName = "robot_pose_" + std::to_string(id);
153
154 const Eigen::Affine3f world_T_robot = world_T_map * robotPose; // TODO
155
156 auto pose =
157 viz::Pose(robotPoseName).pose(world_T_robot.translation(), world_T_robot.linear());
158 layer.add(pose);
159 }
160
161 void
162 ArVizDrawer::drawRobotPoses(const std::vector<Eigen::Affine3f>& robotPoses,
163 const Eigen::Affine3f& world_T_map)
164 {
165 auto layer = arviz().layer(layers.robotPoses);
166
167 std::for_each(robotPoses.begin(),
168 robotPoses.end(),
169 [&](const auto& robotPose) { drawRobotPose(robotPose, world_T_map, layer); });
170
171 commit(layer);
172 }
173
174 void
176 {
177 const size_t id = layer.size();
178 const std::string polygonModelName = "model_polygon_" + std::to_string(id);
179
180 auto py = viz::Polygon(polygonModelName).color(viz::Color::azure());
181
182 std::for_each(model.polygon.begin(),
183 model.polygon.end(),
184 [&py](const wykobi::Point& point) {
185 py.addPoint(Eigen::Vector3f{point.x, point.y, -4.F});
186 });
187
188 layer.add(py);
189 }
190
191 void
192 ArVizDrawer::drawModels(const std::vector<wykobi::Model>& models)
193 {
194 auto layer = arviz().layer(layers.sceneModels);
195
196 std::for_each(
197 models.begin(), models.end(), [&](const auto& model) { drawModel(model, layer); });
198
199 commit(layer);
200 }
201
202 void
203 ArVizDrawer::drawModelAssociation(const MapRegistration::Association& association,
204 const Eigen::Affine3f& world_T_map,
205 viz::Layer& layer) const
206 {
207 const size_t id = layer.size();
208 const std::string associationName = "association_" + std::to_string(id);
209
210 const Eigen::Vector3f from = world_T_map * detail::toEigen(association.cluster.centroid);
211 const Eigen::Vector3f to = association.model.center;
212
213 const auto arr = viz::Arrow(associationName).fromTo(from, to);
214
215 layer.add(arr);
216
217 // TODO(fabian.reister): draw clusters e.g. in yellow
218 }
219
220 void
222 const std::vector<MapRegistration::Association>& associations,
223 const Eigen::Affine3f& world_T_map)
224 {
225 auto layer = arviz().layer(layers.modelSceneAssociations);
226
227 std::for_each(associations.begin(),
228 associations.end(),
229 [&](const auto& association)
230 { drawModelAssociation(association, world_T_map, layer); });
231
232 commit(layer);
233 }
234
235 void
236 ArVizDrawer::drawMapBoundaries(const RotatedRect& boundingRect,
237 const Eigen::Affine3f& world_T_map)
238 {
239 auto layer = arviz().layer(layers.mapBoundaries);
240
241 auto ply = viz::Polygon("map_boundaries");
242
243 const auto boundingPts = boundingRect.boundary();
244
245 const auto toEigen = [](const Eigen::Vector2f& pt) -> Eigen::Vector3f {
246 return Eigen::Vector3f{pt.x(), pt.y(), -10.F};
247 };
248
249 for (const auto& pt : boundingPts)
250 {
251 const Eigen::Vector3f world_P_pt = world_T_map * toEigen(pt);
252 ply.addPoint(world_P_pt);
253 }
254
255 layer.add(ply);
256
257 commit(layer);
258 }
259
260
261} // namespace armarx::cartographer
void drawModelAssociations(const std::vector< MapRegistration::Association > &associations, const Eigen::Affine3f &world_T_map)
void drawCluster(const MapRegistration::Cluster &cluster, const Eigen::Affine3f &world_T_map, viz::Layer &layer) const
void drawClusters(const MapRegistration::Clusters &clusters, const Eigen::Affine3f &world_T_map)
void drawMapBoundaries(const RotatedRect &boundingRect, const Eigen::Affine3f &world_T_map)
void drawPointCloud(const MapRegistration::PointCloud &cloud, const Eigen::Affine3f &world_T_map)
void drawSelectedBoundingBoxCorner(const Eigen::Affine3f &boundingBoxCornerPose, const Eigen::Affine3f &world_T_map)
void drawModel(const wykobi::Model &model, viz::Layer &layer) const
void drawFrames(const Eigen::Affine3f &world_T_map)
ArVizDrawer(armarx::viz::Client &arviz)
void drawRobotPose(const Eigen::Affine3f &robotPose, const Eigen::Affine3f &world_T_map, viz::Layer &layer) const
void drawModelAssociation(const MapRegistration::Association &association, const Eigen::Affine3f &world_T_map, viz::Layer &layer) const
void drawRobotPoses(const std::vector< Eigen::Affine3f > &robotPoses, const Eigen::Affine3f &world_T_map)
void drawModels(const std::vector< wykobi::Model > &models)
CommitResult commit(StagedCommit const &commit)
Definition Client.cpp:89
DerivedT & pose(Eigen::Matrix4f const &pose)
Definition ElementOps.h:176
DerivedT & color(Color color)
Definition ElementOps.h:218
DerivedT & position(float x, float y, float z)
Definition ElementOps.h:136
DerivedT & scale(Eigen::Vector3f scale)
Definition ElementOps.h:254
PointCloud & pointSizeInPixels(float s)
Definition PointCloud.h:53
PointCloud & pointCloud(const PointCloudT &cloud)
Draw a point cloud.
Definition PointCloud.h:206
Layer layer(std::string const &name) const override
std::string const GlobalFrame
Variable of the global coordinate system.
Definition FramedPose.h:65
Eigen::Vector3f toEigen(const pcl::PointXYZ &pt)
Eigen::Vector2f toEigen(const cv::Point2f &pt)
::wykobi::point2d< float > Point
std::string const MapFrame
Definition FramedPose.h:67
Eigen::Vector3f toEigen(const pcl::PointXYZ &pt)
Arrow & fromTo(const Eigen::Vector3f &from, const Eigen::Vector3f &to)
Definition Elements.h:219
wykobi::Polygon polygon
Definition models.h:35