Skip to content

Commit a42546b

Browse files
committed
EnvironmentalPreload visualise static environments
- Add ignore_time element to example. - Always display if ignore_time is true. - Enforce const-ness - Fix seg fault caused by copying frame when using auto. Signed-off-by: Rhys Mainwaring <[email protected]>
1 parent 0680524 commit a42546b

File tree

3 files changed

+48
-42
lines changed

3 files changed

+48
-42
lines changed

examples/worlds/environmental_sensor.sdf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
name="gz::sim::systems::EnvironmentPreload">
3737
<data>environmental_data.csv</data>
3838
<dimensions>
39+
<ignore_time>0</ignore_time>
3940
<time>timestamp</time>
4041
<space>
4142
<x>x</x>

src/systems/environment_preload/EnvironmentPreload.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ void EnvironmentPreload::PreUpdate(
349349
if (this->dataPtr->visualize)
350350
{
351351
std::lock_guard<std::mutex> lock(this->dataPtr->mtx);
352-
auto samples = this->dataPtr->samples;
352+
const auto &samples = this->dataPtr->samples;
353353
this->dataPtr->visualizationPtr->Step(_info, _ecm, this->dataPtr->envData,
354354
samples.X(), samples.Y(), samples.Z());
355355
}

src/systems/environment_preload/VisualizationTool.cc

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,11 @@ void EnvironmentVisualizationTool::CreatePointCloudTopics(
3737
this->pubs.emplace(key, node.Advertise<gz::msgs::Float_V>(key));
3838
gz::msgs::Float_V msg;
3939
this->floatFields.emplace(key, msg);
40+
4041
const double time = std::chrono::duration<double>(_info.simTime).count();
41-
auto sess = _data->frame[key].CreateSession(time);
42+
const auto sess = _data->staticTime ?
43+
_data->frame[key].CreateSession(0.0) :
44+
_data->frame[key].CreateSession(time);
4245
if (!_data->frame[key].IsValid(sess))
4346
{
4447
gzerr << key << "data is out of time bounds. Nothing will be published"
@@ -76,7 +79,7 @@ void EnvironmentVisualizationTool::Step(
7679
{
7780
return;
7881
}
79-
auto now = std::chrono::steady_clock::now();
82+
const auto now = std::chrono::steady_clock::now();
8083
std::chrono::duration<double> dt(now - this->lastTick);
8184

8285
if (this->resample)
@@ -91,23 +94,25 @@ void EnvironmentVisualizationTool::Step(
9194
this->lastTick = now;
9295
}
9396

94-
// Progress session pointers to next time stamp
95-
for (auto &it : this->sessions)
97+
if (!_data->staticTime)
9698
{
97-
auto res =
98-
_data->frame[it.first].StepTo(it.second,
99-
std::chrono::duration<double>(_info.simTime).count());
100-
if (res.has_value())
101-
{
102-
it.second = res.value();
103-
}
104-
else
99+
// Progress session pointers to next time stamp
100+
for (auto &it : this->sessions)
105101
{
106-
gzerr << "Data does not exist beyond this time."
107-
<< " Not publishing new environment visualization data."
108-
<< std::endl;
109-
this->finishedTime = true;
110-
return;
102+
const auto time = std::chrono::duration<double>(_info.simTime).count();
103+
const auto res = _data->frame[it.first].StepTo(it.second, time);
104+
if (res.has_value())
105+
{
106+
it.second = res.value();
107+
}
108+
else
109+
{
110+
gzerr << "Data does not exist beyond this time (t = " << time << ")."
111+
<< " Not publishing new environment visualization data."
112+
<< std::endl;
113+
this->finishedTime = true;
114+
return;
115+
}
111116
}
112117
}
113118

@@ -127,24 +132,24 @@ void EnvironmentVisualizationTool::Visualize(
127132
{
128133
for (auto key : _data->frame.Keys())
129134
{
130-
const auto session = this->sessions[key];
131-
auto frame = _data->frame[key];
132-
auto [lower_bound, upper_bound] = frame.Bounds(session);
133-
auto step = upper_bound - lower_bound;
134-
auto dx = step.X() / _xSamples;
135-
auto dy = step.Y() / _ySamples;
136-
auto dz = step.Z() / _zSamples;
135+
const auto &session = this->sessions[key];
136+
const auto &frame = _data->frame[key];
137+
const auto [lower_bound, upper_bound] = frame.Bounds(session);
138+
const auto step = upper_bound - lower_bound;
139+
const auto dx = step.X() / _xSamples;
140+
const auto dy = step.Y() / _ySamples;
141+
const auto dz = step.Z() / _zSamples;
137142
std::size_t idx = 0;
138143
for (std::size_t x_steps = 0; x_steps < _xSamples; x_steps++)
139144
{
140-
auto x = lower_bound.X() + x_steps * dx;
145+
const auto x = lower_bound.X() + x_steps * dx;
141146
for (std::size_t y_steps = 0; y_steps < _ySamples; y_steps++)
142147
{
143-
auto y = lower_bound.Y() + y_steps * dy;
148+
const auto y = lower_bound.Y() + y_steps * dy;
144149
for (std::size_t z_steps = 0; z_steps < _zSamples; z_steps++)
145150
{
146-
auto z = lower_bound.Z() + z_steps * dz;
147-
auto res = frame.LookUp(session, math::Vector3d(x, y, z));
151+
const auto z = lower_bound.Z() + z_steps * dz;
152+
const auto res = frame.LookUp(session, math::Vector3d(x, y, z));
148153

149154
if (res.has_value())
150155
{
@@ -185,21 +190,21 @@ void EnvironmentVisualizationTool::ResizeCloud(
185190
// Assume all data have same point cloud.
186191
gz::msgs::InitPointCloudPacked(pcMsg, "some_frame", true,
187192
{{"xyz", gz::msgs::PointCloudPacked::Field::FLOAT32}});
188-
auto numberOfPoints = _numXSamples * _numYSamples * _numZSamples;
193+
const auto numberOfPoints = _numXSamples * _numYSamples * _numZSamples;
189194
std::size_t dataSize{
190195
static_cast<std::size_t>(numberOfPoints * pcMsg.point_step())};
191196
pcMsg.mutable_data()->resize(dataSize);
192197
pcMsg.set_height(1);
193198
pcMsg.set_width(numberOfPoints);
194199

195-
auto session = this->sessions[this->pubs.begin()->first];
196-
auto frame = _data->frame[this->pubs.begin()->first];
197-
auto [lower_bound, upper_bound] = frame.Bounds(session);
200+
const auto &session = this->sessions[this->pubs.begin()->first];
201+
const auto &frame = _data->frame[this->pubs.begin()->first];
202+
const auto [lower_bound, upper_bound] = frame.Bounds(session);
198203

199-
auto step = upper_bound - lower_bound;
200-
auto dx = step.X() / _numXSamples;
201-
auto dy = step.Y() / _numYSamples;
202-
auto dz = step.Z() / _numZSamples;
204+
const auto step = upper_bound - lower_bound;
205+
const auto dx = step.X() / _numXSamples;
206+
const auto dy = step.Y() / _numYSamples;
207+
const auto dz = step.Z() / _numZSamples;
203208

204209
// Populate point cloud
205210
gz::msgs::PointCloudPackedIterator<float> xIter(pcMsg, "x");
@@ -208,22 +213,22 @@ void EnvironmentVisualizationTool::ResizeCloud(
208213

209214
for (std::size_t x_steps = 0; x_steps < _numXSamples; x_steps++)
210215
{
211-
auto x = lower_bound.X() + x_steps * dx;
216+
const auto x = lower_bound.X() + x_steps * dx;
212217
for (std::size_t y_steps = 0; y_steps < _numYSamples; y_steps++)
213218
{
214-
auto y = lower_bound.Y() + y_steps * dy;
219+
const auto y = lower_bound.Y() + y_steps * dy;
215220
for (std::size_t z_steps = 0; z_steps < _numZSamples; z_steps++)
216221
{
217-
auto z = lower_bound.Z() + z_steps * dz;
218-
auto coords = getGridFieldCoordinates(_ecm, math::Vector3d{x, y, z},
222+
const auto z = lower_bound.Z() + z_steps * dz;
223+
const auto coords = getGridFieldCoordinates(_ecm, math::Vector3d{x, y, z},
219224
_data);
220225

221226
if (!coords.has_value())
222227
{
223228
continue;
224229
}
225230

226-
auto pos = coords.value();
231+
const auto pos = coords.value();
227232
*xIter = pos.X();
228233
*yIter = pos.Y();
229234
*zIter = pos.Z();

0 commit comments

Comments
 (0)