45 const double& background_value, \
47 const double& voxel_decay,
const bool& pub_voxels) :
48 _background_value(background_value), \
49 _voxel_size(voxel_size), \
50 _decay_model(decay_model), \
51 _voxel_decay(voxel_decay), \
52 _pub_voxels(pub_voxels), \
76 openvdb::initialize();
82 openvdb::Mat4d m = openvdb::Mat4d::identity();
84 m.preTranslate(openvdb::Vec3d(0, 0, 0));
85 m.preRotate(openvdb::math::Z_AXIS, 0);
88 _grid->setTransform(openvdb::math::Transform::createLinearTransform( m ));
89 _grid->setName(
"SpatioTemporalVoxelLayer");
91 _grid->setGridClass(openvdb::GRID_LEVEL_SET);
97 std::vector<observation::MeasurementReading>& clearing_readings)
100 boost::unique_lock<boost::mutex> lock(
_grid_lock);
111 std::vector<frustum_model> obs_frustums;
113 if(clearing_readings.size() == 0)
119 obs_frustums.reserve(clearing_readings.size());
121 std::vector<observation::MeasurementReading>::const_iterator it = \
122 clearing_readings.begin();
123 for (it; it != clearing_readings.end(); ++it)
129 it->_horizontal_fov_in_rad,
136 it->_vertical_fov_in_rad,
137 it->_vertical_fov_padding_in_m,
138 it->_horizontal_fov_in_rad,
152 obs_frustums.emplace_back(frustum, it->_decay_acceleration);
160 std::vector<frustum_model>& frustums)
167 openvdb::DoubleGrid::ValueOnCIter cit_grid =
_grid->cbeginValueOn();
168 for (cit_grid; cit_grid.test(); ++cit_grid)
170 const openvdb::Coord pt_index(cit_grid.getCoord());
172 std::vector<frustum_model>::iterator frustum_it = frustums.begin();
173 bool frustum_cycle =
false;
175 const double time_since_marking = cur_time - cit_grid.getValue();
179 for(frustum_it; frustum_it != frustums.end(); ++frustum_it)
181 if (!frustum_it->frustum)
186 if ( frustum_it->frustum->IsInside(this->IndexToWorld(pt_index)) )
188 frustum_cycle =
true;
191 time_since_marking, frustum_it->accel_factor);
193 const double time_until_decay = base_duration_to_decay - \
194 frustum_acceleration;
195 if (time_until_decay < 0.)
200 std::cout <<
"Failed to clear point." << std::endl;
205 const double updated_mark = cit_grid.getValue() -
206 frustum_acceleration;
209 std::cout <<
"Failed to update mark." << std::endl;
219 if (base_duration_to_decay < 0.)
224 std::cout <<
"Failed to clear point." << std::endl;
240 openvdb::Vec3d pose_world =
_grid->indexToWorld(pt);
244 _pc->push_back(pcl::PointXYZ(pose_world[0], pose_world[1], \
248 std::unordered_map<occupany_cell, uint>::iterator cell;
263 std::vector<observation::MeasurementReading>& marking_readings)
266 boost::unique_lock<boost::mutex> lock(
_grid_lock);
269 if (marking_readings.size() > 0)
272 for (
int i=0; i!= marking_readings.size(); i++)
274 (*this)(marking_readings.at(i));
287 float mark_range_2 = obs._obstacle_range_in_m * obs._obstacle_range_in_m;
290 pcl::PointCloud<pcl::PointXYZ>::const_iterator it;
291 for (it = obs._cloud->points.begin(); it < obs._cloud->points.end(); ++it)
293 float distance_2 = (it->x - obs._origin.x) * (it->x - obs._origin.x) \
294 + (it->y - obs._origin.y) * (it->y - obs._origin.y) \
295 + (it->z - obs._origin.z) * (it->z - obs._origin.z);
296 if (distance_2 > mark_range_2 || distance_2 < 0.0001)
301 openvdb::Vec3d(it->x, it->y, it->z)));
303 if(!this->
MarkGridPoint(openvdb::Coord(mark_grid[0], mark_grid[1], \
304 mark_grid[2]), cur_time))
306 std::cout <<
"Failed to mark point." << std::endl;
314 std::unordered_map<occupany_cell, uint>*
339 const double& time_delta, \
340 const double& acceleration_factor)
343 const double acceleration = 1. / 6. * acceleration_factor * \
344 (time_delta * time_delta * time_delta);
350 pcl::PointCloud<pcl::PointXYZ>::Ptr& pc)
362 boost::unique_lock<boost::mutex> lock(
_grid_lock);
375 std::cout <<
"Failed to reset costmap, please try again." << std::endl;
382 const double& value)
const 386 openvdb::DoubleGrid::Accessor accessor =
_grid->getAccessor();
388 accessor.setValueOn(pt, value);
389 return accessor.getValue(pt) == value;
397 openvdb::DoubleGrid::Accessor accessor =
_grid->getAccessor();
399 if (accessor.isValueOn(pt))
403 return !accessor.isValueOn(pt);
408 openvdb::Coord& coord)
const 412 return _grid->indexToWorld(coord);
417 openvdb::Vec3d& vec)
const 421 return _grid->worldToIndex(vec);
429 return _grid->empty();
434 double& map_size_bytes)
439 openvdb::io::File file(file_name +
".vdb");
440 openvdb::GridPtrVec grids = {
_grid };
443 map_size_bytes =
_grid->memUsage();
openvdb::Vec3d IndexToWorld(const openvdb::Coord &coord) const
bool SaveGrid(const std::string &file_name, double &map_size_bytes)
void TemporalClearAndGenerateCostmap(std::vector< frustum_model > &frustums)
pcl::PointCloud< pcl::PointXYZ >::Ptr _pc
bool IsGridEmpty(void) const
virtual void SetPosition(const geometry_msgs::Point &origin)=0
sensor_msgs::PointCloud2 PointCloud
GlobalDecayModel _decay_model
std::unordered_map< occupany_cell, uint > * _cost_map
~SpatioTemporalVoxelGrid(void)
openvdb::DoubleGrid::Ptr _grid
double GetTemporalClearingDuration(const double &time_delta)
virtual void TransformModel(void)=0
void InitializeGrid(void)
void ClearFrustums(const std::vector< observation::MeasurementReading > &clearing_observations)
double GetFrustumAcceleration(const double &time_delta, const double &acceleration_factor)
bool ClearGridPoint(const openvdb::Coord &pt) const
std::unordered_map< occupany_cell, uint > * GetFlattenedCostmap()
void Mark(const std::vector< observation::MeasurementReading > &marking_observations)
SpatioTemporalVoxelGrid(const float &voxel_size, const double &background_value, const GlobalDecayModel &decay_model, const double &voxel_decay, const bool &pub_voxels)
openvdb::Vec3d WorldToIndex(const openvdb::Vec3d &coord) const
void GetOccupancyPointCloud(pcl::PointCloud< pcl::PointXYZ >::Ptr &pc)
void PopulateCostmapAndPointcloud(const openvdb::Coord &pt)
void operator()(const observation::MeasurementReading &obs) const
virtual void SetOrientation(const geometry_msgs::Quaternion &quat)=0
bool MarkGridPoint(const openvdb::Coord &pt, const double &value) const