76 double scale,
double padding)
80 ss.
body = bodies::createEmptyBodyFromShapeType(shape->type);
83 ss.
body->setDimensionsDirty(shape.get());
84 ss.
body->setScaleDirty(scale);
85 ss.
body->setPaddingDirty(padding);
86 ss.
body->updateInternalData();
89 std::pair<std::set<SeeShape, SortBodies>::iterator,
bool> insert_op =
bodies_.insert(ss);
90 if (!insert_op.second)
92 RCLCPP_ERROR(
getLogger(),
"Internal error in management of bodies in ShapeMask. This is a serious error.");
94 used_handles_[next_handle_] = insert_op.first;
102 const std::size_t sz = min_handle_ +
bodies_.size() + 1;
103 for (std::size_t i = min_handle_; i < sz; ++i)
105 if (used_handles_.find(i) == used_handles_.end())
111 min_handle_ = next_handle_;
134 const Eigen::Vector3d& ,
135 const double min_sensor_dist,
const double max_sensor_dist,
136 std::vector<int>& mask)
139 const unsigned int np = data_in.data.size() / data_in.point_step;
144 std::fill(mask.begin(), mask.end(),
static_cast<int>(
OUTSIDE));
148 Eigen::Isometry3d tmp;
151 for (std::set<SeeShape>::const_iterator it =
bodies_.begin(); it !=
bodies_.end(); ++it)
158 "Missing transform for shape with handle " << it->handle <<
" without a body");
163 "Missing transform for shape " << it->body->getType() <<
" with handle " << it->handle);
168 it->body->setPose(tmp);
169 it->body->computeBoundingSphere(
bspheres_[j++]);
174 bodies::BoundingSphere bound;
175 bodies::mergeBoundingSpheres(
bspheres_, bound);
176 const double radius_squared = bound.radius * bound.radius;
179 sensor_msgs::PointCloud2ConstIterator<float> iter_x(data_in,
"x");
180 sensor_msgs::PointCloud2ConstIterator<float> iter_y(data_in,
"y");
181 sensor_msgs::PointCloud2ConstIterator<float> iter_z(data_in,
"z");
186 for (
int i = 0; i < static_cast<int>(np); ++i)
188 Eigen::Vector3d pt = Eigen::Vector3d(*(iter_x + i), *(iter_y + i), *(iter_z + i));
189 double d = pt.norm();
191 if (d < min_sensor_dist || d > max_sensor_dist)
195 else if ((bound.center - pt).squaredNorm() < radius_squared)
197 for (std::set<SeeShape>::const_iterator it =
bodies_.begin(); it !=
bodies_.end() && out ==
OUTSIDE; ++it)
199 if (it->body->containsPoint(pt))
void maskContainment(const sensor_msgs::msg::PointCloud2 &data_in, const Eigen::Vector3d &sensor_pos, const double min_sensor_dist, const double max_sensor_dist, std::vector< int > &mask)
Compute the containment mask (INSIDE or OUTSIDE) for a given pointcloud. If a mask element is INSIDE,...