CARLA
Loading...
Searching...
No Matches
CarlaPointCloudPublisher.cpp
Go to the documentation of this file.
1// Copyright (c) 2026 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
8
9#include "carla/Logging.h"
13
14#include <string>
15#include <utility>
16#include <vector>
17
18namespace carla {
19namespace ros2 {
20
24
25namespace {
26
27// Translates the FastDDS-free PointFieldDataType enum (defined in
28// PointCloudFieldsLayout.h) to the carla::ros2::msg::PointField::* numeric
29// constants the message struct expects on the wire.
30std::uint8_t ToPointFieldDatatype(PointFieldDataType datatype) noexcept {
31 switch (datatype) {
40 }
42}
43
44std::vector<msg::PointField> BuildPointFields(
45 const PointFieldDescriptor *descriptors, std::size_t count) {
46 std::vector<msg::PointField> fields;
47 fields.reserve(count);
48 for (std::size_t i = 0; i < count; ++i) {
49 const auto &descriptor = descriptors[i];
50 msg::PointField field{};
51 field.name = std::string{descriptor.name};
52 field.offset = descriptor.offset;
53 field.datatype = ToPointFieldDatatype(descriptor.datatype);
54 field.count = descriptor.count;
55 fields.push_back(std::move(field));
56 }
57 return fields;
58}
59
60} // namespace
61
63 std::string base_topic_name, std::string frame_id, bool exact_topic)
64 : BasePublisher(std::move(base_topic_name), std::move(frame_id)),
65 _impl(std::make_shared<PublisherImpl<CarlaPointCloudMsgTraits>>()) {
66 if (!_impl->Init(exact_topic ? GetBaseTopicName() : GetBaseTopicName() + "/point_cloud")) {
67 log_error("CarlaPointCloudPublisher: failed to initialise writer for", GetBaseTopicName());
68 }
69}
70
72
74 return _impl->Publish();
75}
76
78 std::int32_t seconds,
79 std::uint32_t nanoseconds,
80 std::uint32_t height,
81 std::uint32_t width,
82 const std::uint8_t *data) {
83 return WritePointCloud(
84 seconds, nanoseconds, height, width,
85 ComputePointCloud(height, width, data));
86}
87
89 std::int32_t seconds,
90 std::uint32_t nanoseconds,
91 std::uint32_t height,
92 std::uint32_t width,
93 std::vector<std::uint8_t> data) {
94 auto *message = _impl->GetMessage();
95 message->header.stamp.sec = seconds;
96 message->header.stamp.nanosec = nanoseconds;
97 message->header.frame_id = GetFrameId();
98
99 const std::size_t point_size = GetPointSize();
100
101 message->width = width;
102 message->height = height;
103 message->is_bigendian = false;
104 message->fields = BuildPointFields(GetFieldDescriptors(), GetFieldDescriptorCount());
105 message->point_step = static_cast<std::uint32_t>(point_size);
106 message->row_step = static_cast<std::uint32_t>(width * point_size);
107 // CARLA's point-cloud sensors emit one point per actual return and never
108 // NaN/Inf placeholders, so every published cloud is dense.
109 message->is_dense = true;
110 message->data = std::move(data);
111
112 return true;
113}
114
115} // namespace ros2
116} // namespace carla
const std::string & GetBaseTopicName() const noexcept
const std::string & GetFrameId() const noexcept
virtual std::size_t GetPointSize() const =0
virtual std::size_t GetFieldDescriptorCount() const =0
CarlaPointCloudPublisher(std::string base_topic_name, std::string frame_id, bool exact_topic=false)
bool WritePointCloud(std::int32_t seconds, std::uint32_t nanoseconds, std::uint32_t height, std::uint32_t width, const std::uint8_t *data)
virtual std::vector< std::uint8_t > ComputePointCloud(std::uint32_t height, std::uint32_t width, const std::uint8_t *data) const =0
virtual const PointFieldDescriptor * GetFieldDescriptors() const =0
std::shared_ptr< PublisherImpl< CarlaPointCloudMsgTraits > > _impl
This file contains definitions of common data structures used in traffic manager.
static void log_error(Args &&... args)
Definition Logging.h:110
static const uint8_t INT32
Definition PointField.h:18
static const uint8_t INT16
Definition PointField.h:16
static const uint8_t UINT8
Definition PointField.h:15
static const uint8_t FLOAT64
Definition PointField.h:21
static const uint8_t UINT32
Definition PointField.h:19
static const uint8_t FLOAT32
Definition PointField.h:20
static const uint8_t UINT16
Definition PointField.h:17
static const uint8_t INT8
Definition PointField.h:14