32 sizeof(LidarPoint) == 16u,
33 "LidarPoint must be tightly packed (4 float32s) for the wire layout");
53 sizeof(LidarPointEx) == 32u,
54 "LidarPointEx must match the kLidarFieldsEx wire layout (32 B stride)");
59 return _extended ?
sizeof(LidarPointEx) :
sizeof(LidarPoint);
72 std::uint32_t nanoseconds,
75 const std::uint8_t *data,
76 const std::uint32_t *channel_point_counts,
77 std::size_t channel_count,
78 const std::vector<float> &vertical_angles) {
81 channel_point_counts, channel_point_counts + channel_count);
84 seconds, nanoseconds, height, width, data);
88 std::uint32_t height, std::uint32_t width,
const std::uint8_t *data)
const {
89 const std::size_t total_points =
90 static_cast<std::size_t
>(height) *
static_cast<std::size_t
>(width);
93 const std::size_t total_bytes = total_points *
sizeof(LidarPoint);
95 std::vector<std::uint8_t> bytes(total_bytes);
96 std::memcpy(bytes.data(), data, total_bytes);
101 auto *points =
reinterpret_cast<LidarPoint *
>(bytes.data());
102 for (std::size_t i = 0; i < total_points; ++i) {
103 points[i].y *= -1.0f;
110 const auto *input =
reinterpret_cast<const LidarPoint *
>(data);
112 std::vector<std::uint8_t> bytes(total_points *
sizeof(LidarPointEx));
113 auto *points =
reinterpret_cast<LidarPointEx *
>(bytes.data());
115 for (std::size_t i = 0; i < total_points; ++i) {
116 auto &
point = points[i];
117 point = LidarPointEx{};
118 point.x = input[i].x;
119 point.y = -input[i].y;
122 point.intensity =
static_cast<std::uint8_t
>(input[i].intensity);
123 point.z = input[i].z;
132 point.time_stamp = 0u;
138 std::size_t accumulated = 0u;
143 for (std::size_t i = 0; i < count && accumulated + i < total_points; ++i) {
144 points[accumulated + i].channel =
static_cast<std::uint16_t
>(
channel);
145 points[accumulated + i].elevation =
elevation;
147 accumulated += count;
std::vector< std::uint8_t > ComputePointCloud(std::uint32_t height, std::uint32_t width, const std::uint8_t *data) const override
std::vector< std::uint32_t > _channel_point_counts
std::vector< float > _vertical_angles
std::size_t GetFieldDescriptorCount() const override
const PointFieldDescriptor * GetFieldDescriptors() const override
bool WriteExtendedPointCloud(std::int32_t seconds, std::uint32_t nanoseconds, std::uint32_t height, std::uint32_t width, const std::uint8_t *data, const std::uint32_t *channel_point_counts, std::size_t channel_count, const std::vector< float > &vertical_angles)
std::size_t GetPointSize() const override
bool WritePointCloud(std::int32_t seconds, std::uint32_t nanoseconds, std::uint32_t height, std::uint32_t width, const std::uint8_t *data)
constexpr std::array< PointFieldDescriptor, 4 > kLidarFields
constexpr std::array< PointFieldDescriptor, 10 > kLidarFieldsEx
This file contains definitions of common data structures used in traffic manager.