CARLA
Loading...
Searching...
No Matches
CarlaDVSCameraPublisher.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
11
12#include <cstring>
13#include <utility>
14
15namespace carla {
16namespace ros2 {
17
19 std::int32_t seconds,
20 std::uint32_t nanoseconds,
21 std::uint32_t height,
22 std::uint32_t width,
23 const std::uint8_t *events,
24 std::size_t event_count,
25 std::size_t event_stride) {
26 auto encoded = EncodeDvsEventsToBgr(height, width, events, event_count, event_stride);
27 // CarlaCameraPublisher's public WriteImage takes a const uint8_t* and runs
28 // it through ComputeImage; the default ComputeImage just copies the bytes.
29 // For DVS we have already produced the dense BGR buffer, so route through
30 // the standard `data` pointer pathway.
31 return WriteImage(seconds, nanoseconds, height, width, encoded.data());
32}
33
35 return sizeof(sensor::data::DVSEvent);
36}
37
41
43 return kDvsFields.size();
44}
45
47 std::uint32_t height, std::uint32_t width, const std::uint8_t *data) const {
48 const std::size_t total_points =
49 static_cast<std::size_t>(height) * static_cast<std::size_t>(width);
50 // The int64 event timestamp is converted to a real double in the FLOAT64 `t`
51 // slot inside the seam (see EncodeDvsEventsToPointCloud); a raw byte copy
52 // would leave int64 bits in a field a subscriber decodes as a double.
54 data, total_points, sizeof(sensor::data::DVSEvent));
55}
56
58 std::string base_topic_name, std::string frame_id)
59 : BasePublisher(base_topic_name, frame_id),
60 _image_pub(std::make_shared<CarlaDVSImagePublisher>(base_topic_name, frame_id)),
61 _point_cloud_pub(std::make_shared<CarlaDVSPointCloudPublisher>(
62 std::move(base_topic_name), std::move(frame_id))) {}
63
65
67 const bool image_ok = _image_pub->Publish();
68 const bool pc_ok = _point_cloud_pub->Publish();
69 return image_ok && pc_ok;
70}
71
73 std::int32_t seconds,
74 std::uint32_t nanoseconds,
75 std::uint32_t x_offset,
76 std::uint32_t y_offset,
77 std::uint32_t height,
78 std::uint32_t width,
79 float fov,
80 bool do_rectify) {
81 return _image_pub->WriteCameraInfo(
82 seconds, nanoseconds, x_offset, y_offset, height, width, fov, do_rectify);
83}
84
86 std::int32_t seconds,
87 std::uint32_t nanoseconds,
88 std::uint32_t height,
89 std::uint32_t width,
90 std::size_t event_count,
91 const std::uint8_t *events,
92 std::size_t event_stride) {
93 return _image_pub->WriteImageFromEvents(
94 seconds, nanoseconds, height, width, events, event_count, event_stride);
95}
96
98 std::int32_t seconds,
99 std::uint32_t nanoseconds,
100 std::uint32_t height,
101 std::uint32_t width,
102 const std::uint8_t *data) {
103 return _point_cloud_pub->WritePointCloud(seconds, nanoseconds, height, width, data);
104}
105
106} // namespace ros2
107} // namespace carla
virtual bool Publish()=0
bool WriteImage(int32_t seconds, uint32_t nanoseconds, uint32_t height, uint32_t width, const uint8_t *data)
std::shared_ptr< CarlaDVSPointCloudPublisher > _point_cloud_pub
CarlaDVSCameraPublisher(std::string base_topic_name, std::string frame_id)
bool WriteCameraInfo(std::int32_t seconds, std::uint32_t nanoseconds, std::uint32_t x_offset, std::uint32_t y_offset, std::uint32_t height, std::uint32_t width, float fov, bool do_rectify)
bool WriteImage(std::int32_t seconds, std::uint32_t nanoseconds, std::uint32_t height, std::uint32_t width, std::size_t event_count, const std::uint8_t *events, std::size_t event_stride)
bool WritePointCloud(std::int32_t seconds, std::uint32_t nanoseconds, std::uint32_t height, std::uint32_t width, const std::uint8_t *data)
std::shared_ptr< CarlaDVSImagePublisher > _image_pub
bool WriteImageFromEvents(std::int32_t seconds, std::uint32_t nanoseconds, std::uint32_t height, std::uint32_t width, const std::uint8_t *events, std::size_t event_count, std::size_t event_stride)
std::vector< std::uint8_t > ComputePointCloud(std::uint32_t height, std::uint32_t width, const std::uint8_t *data) const override
const PointFieldDescriptor * GetFieldDescriptors() const override
std::vector< std::uint8_t > EncodeDvsEventsToBgr(std::uint32_t height, std::uint32_t width, const DvsEvent *events, std::size_t event_count)
std::vector< std::uint8_t > EncodeDvsEventsToPointCloud(const DvsEvent *events, std::size_t event_count)
constexpr std::array< PointFieldDescriptor, 4 > kDvsFields
This file contains definitions of common data structures used in traffic manager.