Skip to content

Commit 9367f47

Browse files
committed
bugfix. now correctly shrinking from the outside.
1 parent d819a6c commit 9367f47

File tree

3 files changed

+59
-18
lines changed

3 files changed

+59
-18
lines changed

src/data/VoxelGrid.cpp

+25-14
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ void VoxelGrid::clear() {
3333
voxels_[idx].labels.clear();
3434
}
3535

36-
for (auto idx : occluded_) {
37-
voxels_[idx].count = 0;
38-
voxels_[idx].labels.clear();
39-
}
36+
// for (auto idx : occluded_) {
37+
// voxels_[idx].count = 0;
38+
// voxels_[idx].labels.clear();
39+
// }
4040

4141
occupied_.clear();
42-
occluded_.clear();
42+
// occluded_.clear();
4343
}
4444

4545
void VoxelGrid::insert(const Eigen::Vector4f& p, uint32_t label) {
@@ -98,7 +98,9 @@ void VoxelGrid::updateOcclusions() {
9898
uint32_t occludedByCalls = 0;
9999

100100
// move from outer to inner voxels.
101-
for (uint32_t o = 0; o < sizex_; ++o) {
101+
uint32_t num_shells = std::min<uint32_t>(sizex_, std::ceil(0.5 * sizey_));
102+
103+
for (uint32_t o = 0; o < num_shells; ++o) {
102104
uint32_t i = sizex_ - o - 1;
103105

104106
for (uint32_t j = 0; j < sizey_; ++j) {
@@ -109,37 +111,42 @@ void VoxelGrid::updateOcclusions() {
109111
occludedBy_[idx] = occludedBy(i, j, k);
110112
}
111113
occlusions_[idx] = occludedBy_[idx];
112-
if (occlusions_[idx] != idx) occluded_.push_back(idx);
114+
// if (occlusions_[idx] != idx) occluded_.push_back(idx);
113115
}
114116
}
115117

116118
uint32_t j = o;
117-
for (uint32_t i = 0; i < sizex_ - o; ++i) {
119+
for (uint32_t i = 0; i < sizex_ - o - 1; ++i) {
118120
for (uint32_t k = 0; k < sizez_; ++k) {
119121
int32_t idx = index(i, j, k);
120122
if (occludedBy_[idx] == -2) {
121123
occludedByCalls += 1;
122124
occludedBy_[idx] = occludedBy(i, j, k);
123125
}
124126
occlusions_[idx] = occludedBy_[idx];
125-
if (occlusions_[idx] != idx) occluded_.push_back(idx);
127+
// if (occlusions_[idx] != idx) occluded_.push_back(idx);
126128
}
127129
}
128130

129131
j = sizey_ - o - 1;
130-
for (uint32_t i = 0; i < sizex_ - o; ++i) {
132+
for (uint32_t i = 0; i < sizex_ - o - 1; ++i) {
131133
for (uint32_t k = 0; k < sizez_; ++k) {
132134
int32_t idx = index(i, j, k);
133135
if (occludedBy_[idx] == -2) {
134136
occludedByCalls += 1;
135137
occludedBy_[idx] = occludedBy(i, j, k);
136138
}
137139
occlusions_[idx] = occludedBy_[idx];
138-
if (occlusions_[idx] != idx) occluded_.push_back(idx);
140+
// if (occlusions_[idx] != idx) occluded_.push_back(idx);
139141
}
140142
}
141143
}
142144

145+
// sanity check:
146+
for (uint32_t i = 0; i < occludedBy_.size(); ++i) {
147+
if (occludedBy_[i] == -2) std::cout << "occludedBy == -2" << std::endl;
148+
}
149+
143150
// for (uint32_t i = 0; i < sizex_; ++i) {
144151
// for (uint32_t j = 0; j < sizey_; ++j) {
145152
// for (uint32_t k = 0; k < sizez_; ++k) {
@@ -166,7 +173,9 @@ void VoxelGrid::updateInvalid(const Eigen::Vector3f& position) {
166173
std::fill(occludedBy_.begin(), occludedBy_.end(), -2);
167174

168175
// move from outer to inner voxels.
169-
for (uint32_t o = 0; o < sizex_; ++o) {
176+
uint32_t num_shells = std::min<uint32_t>(sizex_, std::ceil(0.5 * sizey_));
177+
178+
for (uint32_t o = 0; o < num_shells; ++o) {
170179
uint32_t i = sizex_ - o - 1;
171180

172181
for (uint32_t j = 0; j < sizey_; ++j) {
@@ -182,7 +191,7 @@ void VoxelGrid::updateInvalid(const Eigen::Vector3f& position) {
182191
}
183192

184193
uint32_t j = o;
185-
for (uint32_t i = 0; i < sizex_ - o; ++i) {
194+
for (uint32_t i = 0; i < sizex_ - o - 1; ++i) {
186195
for (uint32_t k = 0; k < sizez_; ++k) {
187196
int32_t idx = index(i, j, k);
188197
if (invalid_[idx] == -1) continue; // just skip. invalid cannot be less then -1.
@@ -195,7 +204,7 @@ void VoxelGrid::updateInvalid(const Eigen::Vector3f& position) {
195204
}
196205

197206
j = sizey_ - o - 1;
198-
for (uint32_t i = 0; i < sizex_ - o; ++i) {
207+
for (uint32_t i = 0; i < sizex_ - o - 1; ++i) {
199208
for (uint32_t k = 0; k < sizez_; ++k) {
200209
int32_t idx = index(i, j, k);
201210
if (invalid_[idx] == -1) continue; // just skip. invalid cannot be less then -1.
@@ -208,6 +217,8 @@ void VoxelGrid::updateInvalid(const Eigen::Vector3f& position) {
208217
}
209218
}
210219

220+
221+
211222
// for (uint32_t x = 0; x < sizex_; ++x) {
212223
// for (uint32_t y = 0; y < sizey_; ++y) {
213224
// for (uint32_t z = 0; z < sizez_; ++z) {

src/data/VoxelGrid.h

+18-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define SRC_DATA_VOXELGRID_H_
33

44
#include <eigen3/Eigen/Dense>
5+
#include <iostream>
56
#include <map>
67
#include <vector>
78

@@ -40,7 +41,7 @@ class VoxelGrid {
4041
uint32_t num_elements() const { return sizex_ * sizey_ * sizez_; }
4142

4243
/** \brief get size in specific dimension **/
43-
uint32_t size(uint32_t dim) const { return (&sizex_)[std::max<uint32_t>(std::min<uint32_t>(dim, 3), 0)]; }
44+
uint32_t size(uint32_t dim) const { return (&sizex_)[std::max<uint32_t>(std::min<uint32_t>(dim, 2), 0)]; }
4445

4546
/** \brief resolutions aka sidelength of a voxel **/
4647
float resolution() const { return resolution_; }
@@ -100,7 +101,21 @@ class VoxelGrid {
100101
(pos[2] - offset_[2]) / resolution_);
101102
}
102103

103-
inline int32_t index(int32_t i, int32_t j, int32_t k) const { return i + j * sizex_ + k * sizex_ * sizey_; }
104+
inline int32_t index(int32_t i, int32_t j, int32_t k) const {
105+
if (i >= sizex_ || j >= sizey_ || k >= sizez_) {
106+
std::cout << sizex_ << ", " << sizey_ << ", " << sizez_ << std::endl;
107+
std::cout << i << ", " << j << ", " << k << std::endl;
108+
109+
std::cout << "indexes to large." << std::endl;
110+
}
111+
if (i < 0 || j < 0 || k < 0) {
112+
113+
std::cout << i << ", " << j << ", " << k << std::endl;
114+
115+
std::cout << "indexes too small" << std::endl;
116+
}
117+
return i + j * sizex_ + k * sizex_ * sizey_;
118+
}
104119

105120
protected:
106121
float resolution_;
@@ -114,7 +129,7 @@ class VoxelGrid {
114129
std::vector<int32_t> occlusions_; // filled by updateOcclusions.
115130
std::vector<int32_t> invalid_;
116131
bool occlusionsValid_{false};
117-
std::vector<uint32_t> occluded_; // filled by updateOcclusions.
132+
// std::vector<uint32_t> occluded_; // filled by updateOcclusions.
118133

119134
std::vector<int32_t> occludedBy_;
120135
};

src/widget/Mainframe.cpp

+16-1
Original file line numberDiff line numberDiff line change
@@ -243,30 +243,45 @@ void Mainframe::buildVoxelGrids() {
243243
if (priorPoints_.size() > 0) {
244244
Eigen::Matrix4f anchor_pose = priorPoints_.back()->pose;
245245

246+
std::cout << "fill grids..." << std::flush;
246247
fillVoxelGrid(anchor_pose, priorPoints_, priorLabels_, priorVoxelGrid_, config);
247248

248249
fillVoxelGrid(anchor_pose, priorPoints_, priorLabels_, pastVoxelGrid_, config);
249250
fillVoxelGrid(anchor_pose, pastPoints_, pastLabels_, pastVoxelGrid_, config);
251+
std::cout << "finished." << std::endl;
250252

251253
// updating occlusions.
252-
// std::cout << "updating occlusions." << std::endl;
254+
std::cout << "updating occlusions..." << std::flush;
255+
253256
priorVoxelGrid_.updateOcclusions();
254257
pastVoxelGrid_.updateOcclusions();
258+
std::cout << "finished." << std::endl;
255259

260+
std::cout << "insert occlusion labels..." << std::flush;
256261
priorVoxelGrid_.insertOcclusionLabels();
257262
pastVoxelGrid_.insertOcclusionLabels();
263+
std::cout << std::endl;
258264

265+
std::cout << "update invalid..." << std::flush;
259266
for (uint32_t i = 0; i < pastPoints_.size(); ++i) {
260267
Eigen::Vector3f endpoint = (anchor_pose.inverse() * pastPoints_[i]->pose).col(3).head(3);
261268
pastVoxelGrid_.updateInvalid(endpoint);
262269
}
270+
std::cout << "finished." << std::endl;
263271

272+
std::cout << "Updating visualized voxels..." << std::flush;
264273
// only visualization code.
265274
priorVoxels_.clear();
266275
pastVoxels_.clear();
267276
// extract voxels and labels.
268277
extractLabeledVoxels(priorVoxelGrid_, priorVoxels_);
269278
extractLabeledVoxels(pastVoxelGrid_, pastVoxels_);
279+
std::cout << "finished." << std::endl;
280+
281+
std::cout << "Used " << (priorVoxelGrid_.voxels().size() * sizeof(LabeledVoxel)) / (1000 * 1000)
282+
<< " MB for visualization." << std::endl;
283+
std::cout << "Used " << (pastVoxelGrid_.voxels().size() * sizeof(LabeledVoxel)) / (1000 * 1000)
284+
<< " MB for visualization." << std::endl;
270285

271286
// std::cout << "end" << std::endl;
272287
}

0 commit comments

Comments
 (0)