Go to the documentation of this file.
19 #ifndef LIDAR_UTILS__POINT_CLOUD_UTILS_HPP_
20 #define LIDAR_UTILS__POINT_CLOUD_UTILS_HPP_
26 #include <geometry_msgs/msg/transform_stamped.hpp>
28 #include <sensor_msgs/msg/point_cloud2.hpp>
29 #include <sensor_msgs/point_cloud2_iterator.hpp>
32 #include <Eigen/Geometry>
45 namespace comp = helper_functions::comparisons;
48 using sensor_msgs::msg::PointCloud2;
71 void reset(sensor_msgs::msg::PointCloud2 & cloud, uint32_t idx = 0);
74 inline sensor_msgs::PointCloud2Iterator<float32_t> &
x_it()
80 inline sensor_msgs::PointCloud2Iterator<float32_t> &
y_it()
86 inline sensor_msgs::PointCloud2Iterator<float32_t> &
z_it()
99 ::std::vector<sensor_msgs::PointCloud2Iterator<float32_t>> m_its;
125 sensor_msgs::msg::PointCloud2 & msg,
126 const std::string & frame_id,
139 template<
typename ... Fields>
141 sensor_msgs::msg::PointCloud2 & msg,
142 const std::string & frame_id,
143 const std::size_t size,
144 const uint32_t num_fields,
145 Fields
const & ... fields
149 msg.is_bigendian =
false;
150 msg.is_dense =
false;
151 msg.header.frame_id = frame_id;
153 sensor_msgs::PointCloud2Modifier modifier(msg);
154 modifier.setPointCloud2Fields(num_fields, fields ...);
156 modifier.resize(size);
166 sensor_msgs::msg::PointCloud2 & cloud,
168 uint32_t point_cloud_idx);
171 PointCloudIts & cloud_its,
173 uint32_t & point_cloud_idx);
176 sensor_msgs::msg::PointCloud2 & cloud,
178 uint32_t & point_cloud_idx);
181 sensor_msgs::msg::PointCloud2 & cloud,
183 uint32_t & point_cloud_idx);
186 sensor_msgs::msg::PointCloud2 & msg,
187 const std::size_t size,
188 uint32_t & point_cloud_idx);
191 sensor_msgs::msg::PointCloud2 & msg,
192 const std::size_t new_size);
212 static constexpr
auto DATATYPE = sensor_msgs::msg::PointField::INT8;
218 static constexpr
auto DATATYPE = sensor_msgs::msg::PointField::UINT8;
224 static constexpr
auto DATATYPE = sensor_msgs::msg::PointField::INT16;
230 static constexpr
auto DATATYPE = sensor_msgs::msg::PointField::UINT16;
236 static constexpr
auto DATATYPE = sensor_msgs::msg::PointField::INT32;
242 static constexpr
auto DATATYPE = sensor_msgs::msg::PointField::UINT32;
248 static constexpr
auto DATATYPE = sensor_msgs::msg::PointField::FLOAT32;
254 static constexpr
auto DATATYPE = sensor_msgs::msg::PointField::FLOAT64;
260 const std::vector<std::string> & field_names,
261 const uint32_t cloud_size)
263 using sensor_msgs::msg::PointCloud2;
264 PointCloud2::SharedPtr msg = std::make_shared<PointCloud2>();
265 const auto field_size = field_names.size();
267 msg->width = cloud_size;
268 msg->fields.resize(field_size);
269 for (uint32_t i = 0U; i < field_size; i++) {
270 msg->fields[i].name = field_names[i];
272 msg->point_step = 0U;
273 for (uint32_t idx = 0U; idx < field_size; ++idx) {
274 msg->fields[idx].offset =
static_cast<uint32_t
>(idx *
sizeof(
T));
276 msg->fields[idx].count = 1U;
277 msg->point_step +=
static_cast<uint32_t
>(
sizeof(
T));
279 const std::size_t capacity = msg->point_step * cloud_size;
281 msg->data.reserve(capacity);
282 for (std::size_t i = 0; i < capacity; ++i) {
283 msg->data.emplace_back(0U);
285 msg->row_step = msg->point_step * msg->width;
286 msg->is_bigendian =
false;
287 msg->is_dense =
false;
288 msg->header.frame_id =
"base_link";
300 static constexpr
auto FEPS = std::numeric_limits<float32_t>::epsilon();
311 auto pt_radius =
dot_3d(pt, pt);
343 Eigen::Matrix<float32_t, 3U, 1U> ref_mat({
x_(ref),
y_(ref),
z_(ref)});
344 Eigen::Vector3f out_mat = m_tf * ref_mat;
345 xr_(out) = out_mat(0U, 0U);
346 yr_(out) = out_mat(1U, 0U);
347 zr_(out) = out_mat(2U, 0U);
351 Eigen::Transform<float32_t, 3U, Eigen::Affine, Eigen::ColMajor> m_tf;
366 static constexpr
auto FEPS = std::numeric_limits<float32_t>::epsilon() * 1e2F;
381 const auto pt_len2 =
dot_2d(pt, pt);
382 const auto proj_on_normal =
dot_2d(pt, m_range_normal);
383 const auto proj_on_normal2 = proj_on_normal * proj_on_normal;
384 const auto is_proj_negative = (proj_on_normal + FEPS) < 0.0F;
392 if ((!m_threshold_negative) && (!is_proj_negative)) {
393 ret = (proj_on_normal2) >= (pt_len2 * (m_threshold2 - FEPS));
394 }
else if (m_threshold_negative && (!is_proj_negative)) {
396 }
else if ((!m_threshold_negative) && is_proj_negative) {
399 ret = (proj_on_normal2) <= (pt_len2 * (m_threshold2 + FEPS));
405 VectorT m_range_normal;
413 sensor_msgs::PointCloud2ConstIterator<uint8_t> m_intensity_it_uint8;
414 sensor_msgs::PointCloud2ConstIterator<float32_t> m_intensity_it_float32;
415 decltype(sensor_msgs::msg::PointField::datatype) m_intensity_datatype;
424 template<
typename Po
intFieldValueT>
427 switch (m_intensity_datatype) {
428 case sensor_msgs::msg::PointField::UINT8:
429 point_field_value = *m_intensity_it_uint8;
431 case sensor_msgs::msg::PointField::FLOAT32:
432 point_field_value = *m_intensity_it_float32;
435 throw std::runtime_error(
"Intensity type not supported: " + m_intensity_datatype);
444 #endif // LIDAR_UTILS__POINT_CLOUD_UTILS_HPP_
Definition: point_cloud_utils.hpp:410
bool8_t operator()(const T &pt) const
Check if the point is within the allowed range of the filter. Check is done in square form to avoid s...
Definition: point_cloud_utils.hpp:308
T
Definition: catr_diff.py:22
auto x_(const PointT &pt)
Gets the x value for a point.
Definition: common_2d.hpp:47
static const uint32_t MAX_SCAN_POINTS
Definition: point_cloud_utils.hpp:56
Definition: point_cloud_utils.hpp:108
This file includes common type definition.
bool abs_lte(const T &a, const T &b, const T &eps)
Check for approximate less than or equal in absolute terms.
Definition: float_comparisons.hpp:69
sensor_msgs::PointCloud2Iterator< float32_t > & x_it()
Returns iterator for the "x" field.
Definition: point_cloud_utils.hpp:74
sensor_msgs::PointCloud2Iterator< float32_t > & y_it()
Returns iterator for the "y" field.
Definition: point_cloud_utils.hpp:80
Definition: point_cloud_utils.hpp:61
void get_current_value(PointFieldValueT &point_field_value)
Definition: point_cloud_utils.hpp:425
auto dot_2d(const T1 &pt, const T2 &q)
compute p * q = p1 * q1 + p2 * q2
Definition: common_2d.hpp:147
Filter class to check if a point's azimuth lies within a range defined by a start and end angles....
Definition: point_cloud_utils.hpp:356
bool8_t operator()(const T &pt) const
Check if a point's azimuth lies in the range [start, end] in counter-clock-wise-direction....
Definition: point_cloud_utils.hpp:375
Filter class to check if a point lies within a range defined by a min and max radius.
Definition: point_cloud_utils.hpp:293
bool bool8_t
Definition: types.hpp:39
auto dot_3d(const T1 &pt, const T2 &q)
compute p * q = p1 * q1 + p2 * q2 + p3 * 13
Definition: common_3d.hpp:37
This file defines the lanelet2_map_provider_node class.
Definition: quick_sort.hpp:24
This file includes common functionality for 3D geometry, such as dot products.
SerializedNDTMapPoint next(std::array< T, 9U > &pc_its)
Get the next voxel representation from the iterators of a serialized ndt map.
Definition: ndt_map.hpp:263
Definition: point_cloud_utils.hpp:207
LIDAR_UTILS_PUBLIC bool8_t has_intensity_and_throw_if_no_xyz(const PointCloud2::SharedPtr &cloud)
Definition: point_cloud_utils.cpp:44
LIDAR_UTILS_PUBLIC void reset_pcl_msg(sensor_msgs::msg::PointCloud2 &msg, const std::size_t size, uint32_t &point_cloud_idx)
Definition: point_cloud_utils.cpp:308
auto & yr_(PointT &pt)
Gets a reference to the y value for a point.
Definition: common_2d.hpp:83
LIDAR_UTILS_PUBLIC void init_pcl_msg(sensor_msgs::msg::PointCloud2 &msg, const std::string &frame_id, const std::size_t size=static_cast< std::size_t >(MAX_SCAN_POINTS))
initializes header information for point cloud for x, y, z and intensity
Definition: point_cloud_utils.cpp:141
sensor_msgs::PointCloud2Iterator< float32_t > & z_it()
Returns iterator for the "z" field.
Definition: point_cloud_utils.hpp:86
LIDAR_UTILS_PUBLIC std::size_t index_after_last_safe_byte_index(const sensor_msgs::msg::PointCloud2 &msg) noexcept
Compute minimum safe length of point cloud access.
Definition: point_cloud_utils.cpp:114
geometry_msgs::msg::TransformStamped Transform
Definition: recordreplay_planner_node.hpp:56
LIDAR_UTILS_PUBLIC bool8_t add_point_to_cloud(PointCloudIts &cloud_its, const autoware::common::types::PointXYZIF &pt, uint32_t &point_cloud_idx)
Definition: point_cloud_utils.cpp:187
Definition: bool_comparisons.hpp:32
LIDAR_UTILS_PUBLIC void resize_pcl_msg(sensor_msgs::msg::PointCloud2 &msg, const std::size_t new_size)
Definition: point_cloud_utils.cpp:321
float float32_t
Definition: types.hpp:45
LIDAR_UTILS_PUBLIC sensor_msgs::msg::PointCloud2::SharedPtr create_custom_pcl(const std::vector< std::string > &field_names, const uint32_t cloud_size)
Definition: point_cloud_utils.hpp:259
auto & xr_(PointT &pt)
Gets a reference to the x value for a point.
Definition: common_2d.hpp:74
LIDAR_UTILS_PUBLIC SafeCloudIndices sanitize_point_cloud(const sensor_msgs::msg::PointCloud2 &msg)
Definition: point_cloud_utils.cpp:131
sensor_msgs::PointCloud2Iterator< float32_t > & intensity_it()
Returns iterator for the "intensity" field.
Definition: point_cloud_utils.hpp:92
bool abs_gte(const T &a, const T &b, const T &eps)
Check for approximate greater than or equal in absolute terms.
Definition: float_comparisons.hpp:80
std::size_t point_step
Definition: point_cloud_utils.hpp:110
auto y_(const PointT &pt)
Gets the y value for a point.
Definition: common_2d.hpp:56
std::size_t data_length
Definition: point_cloud_utils.hpp:111
double float64_t
Definition: types.hpp:47
auto z_(const PointT &pt)
Gets the z value for a point.
Definition: common_2d.hpp:65
auto & zr_(PointT &pt)
Gets a reference to the z value for a point.
Definition: common_2d.hpp:92
LIDAR_UTILS_PUBLIC bool8_t add_point_to_cloud_raw(sensor_msgs::msg::PointCloud2 &cloud, const autoware::common::types::PointXYZIF &pt, uint32_t point_cloud_idx)
add a point in the cloud by memcpy instead of using iterators This version prioritize speed and ease ...
Definition: point_cloud_utils.cpp:154
constexpr float32_t PI
pi = tau / 2
Definition: types.hpp:50