34 #ifndef MULTISENSE_ROS_POINT_CLOUD_UTILITY_H
35 #define MULTISENSE_ROS_POINT_CLOUD_UTILITY_H
37 #include <type_traits>
39 #include <arpa/inet.h>
40 #include <Eigen/Geometry>
42 #include <sensor_msgs/PointCloud2.h>
49 template <
typename ColorT>
50 typename std::enable_if<!std::is_same<ColorT, void>::value,
void>::type
53 const std::string& color_channel)
55 assert(point_cloud.fields.size() >= 4);
57 const auto color_datatype = messageFormat<ColorT>();
59 point_cloud.fields[3].name = color_channel;
60 point_cloud.fields[3].offset = offset;
61 point_cloud.fields[3].count = 1;
62 point_cloud.fields[3].datatype = color_datatype;
64 point_cloud.point_step +=
sizeof(ColorT);
67 template <
typename ColorT>
68 typename std::enable_if<std::is_same<ColorT, void>::value,
void>::type
71 const std::string& color_channel)
79 template <
typename Po
intT,
typename ColorT>
85 const std::string& frame_id,
86 const std::string& color_channel)
88 const auto point_datatype = messageFormat<PointT>();
90 const bool has_color = not std::is_same<ColorT, void>::value;
92 point_cloud.is_bigendian = (htonl(1) == 1);
93 point_cloud.is_dense = dense;
94 point_cloud.point_step = 0;
95 point_cloud.header.frame_id = frame_id;
96 point_cloud.header.stamp = stamp;
97 point_cloud.width = width;
98 point_cloud.height = height;
102 point_cloud.fields.resize(4);
106 point_cloud.fields.resize(3);
109 point_cloud.fields[0].name =
"x";
110 point_cloud.fields[0].offset = point_cloud.point_step;
111 point_cloud.fields[0].count = 1;
112 point_cloud.fields[0].datatype = point_datatype;
113 point_cloud.point_step +=
sizeof(PointT);
115 point_cloud.fields[1].name =
"y";
116 point_cloud.fields[1].offset = point_cloud.point_step;
117 point_cloud.fields[1].count = 1;
118 point_cloud.fields[1].datatype = point_datatype;
119 point_cloud.point_step +=
sizeof(PointT);
121 point_cloud.fields[2].name =
"z";
122 point_cloud.fields[2].offset = point_cloud.point_step;
123 point_cloud.fields[2].count = 1;
124 point_cloud.fields[2].datatype = point_datatype;
125 point_cloud.point_step +=
sizeof(PointT);
129 initPointcloudColorChannel<ColorT>(point_cloud,
130 point_cloud.point_step,
134 point_cloud.row_step = width * point_cloud.point_step;
135 point_cloud.data.resize(width * height * point_cloud.point_step);
138 template <
typename Po
intT,
typename ColorT>
143 const std::string& frame_id,
144 const std::string& color_channel)
146 sensor_msgs::PointCloud2 point_cloud;
148 initializePointcloud<PointT, ColorT>(point_cloud,
159 void writePoint(sensor_msgs::PointCloud2 &pointcloud,
const size_t index,
const Eigen::Vector3f &point);
161 template <
typename ColorT>
162 void writePoint(sensor_msgs::PointCloud2 &pointcloud,
const size_t index,
const Eigen::Vector3f &point,
const ColorT &color)
166 assert(pointcloud.fields.size() == 4);
167 assert(pointcloud.fields[3].datatype == messageFormat<ColorT>());
169 ColorT* colorP =
reinterpret_cast<ColorT*
>(&(pointcloud.data[index * pointcloud.point_step + pointcloud.fields[3].offset]));
173 void writePoint(sensor_msgs::PointCloud2 &pointcloud,
174 const size_t pointcloud_index,
175 const Eigen::Vector3f &point,
176 const size_t image_index,
177 const uint32_t bitsPerPixel,
178 const void* imageDataP);