1#define _GLIBCXX_USE_CXX11_ABI 0
11#include <fastdds/dds/domain/DomainParticipant.hpp>
12#include <fastdds/dds/publisher/Publisher.hpp>
13#include <fastdds/dds/topic/Topic.hpp>
14#include <fastdds/dds/publisher/DataWriter.hpp>
15#include <fastdds/dds/topic/TypeSupport.hpp>
17#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
18#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
19#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
20#include <fastdds/dds/topic/qos/TopicQos.hpp>
22#include <fastrtps/attributes/ParticipantAttributes.h>
23#include <fastrtps/qos/QosPolicies.h>
24#include <fastdds/dds/publisher/qos/DataWriterQos.hpp>
25#include <fastdds/dds/publisher/DataWriterListener.hpp>
31 namespace efd = eprosima::fastdds::dds;
32 using erc = eprosima::fastrtps::types::ReturnCode_t;
44 struct CarlaCameraInfoPublisherImpl {
47 efd::Topic*
_topic {
nullptr };
70 if (
_impl->_type ==
nullptr) {
71 std::cerr <<
"Invalid TypeSupport" << std::endl;
75 efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
77 auto factory = efd::DomainParticipantFactory::get_instance();
78 _impl->_participant = factory->create_participant(0, pqos);
79 if (
_impl->_participant ==
nullptr) {
80 std::cerr <<
"Failed to create DomainParticipant" << std::endl;
83 _impl->_type.register_type(
_impl->_participant);
85 efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
86 _impl->_publisher =
_impl->_participant->create_publisher(pubqos,
nullptr);
87 if (
_impl->_publisher ==
nullptr) {
88 std::cerr <<
"Failed to create Publisher" << std::endl;
92 efd::TopicQos tqos = efd::TOPIC_QOS_DEFAULT;
93 const std::string publisher_type {
"/image"};
94 const std::string base {
"rt/carla/" };
95 std::string topic_name = base;
99 topic_name += publisher_type;
100 _impl->_topic =
_impl->_participant->create_topic(topic_name,
_impl->_type->getName(), tqos);
101 if (
_impl->_topic ==
nullptr) {
102 std::cerr <<
"Failed to create Topic" << std::endl;
106 efd::DataWriterQos wqos = efd::DATAWRITER_QOS_DEFAULT;
107 wqos.endpoint().history_memory_policy = eprosima::fastrtps::rtps::PREALLOCATED_WITH_REALLOC_MEMORY_MODE;
109 _impl->_datawriter =
_impl->_publisher->create_datawriter(
_impl->_topic, wqos, listener);
110 if (
_impl->_datawriter ==
nullptr) {
111 std::cerr <<
"Failed to create DataWriter" << std::endl;
120 std::cerr <<
"Invalid TypeSupport" << std::endl;
124 efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
126 auto factory = efd::DomainParticipantFactory::get_instance();
127 _impl_info->_participant = factory->create_participant(0, pqos);
129 std::cerr <<
"Failed to create DomainParticipant" << std::endl;
134 efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
137 std::cerr <<
"Failed to create Publisher" << std::endl;
141 efd::TopicQos tqos = efd::TOPIC_QOS_DEFAULT;
142 const std::string publisher_type {
"/camera_info"};
143 const std::string base {
"rt/carla/" };
144 std::string topic_name = base;
148 topic_name += publisher_type;
151 std::cerr <<
"Failed to create Topic" << std::endl;
154 efd::DataWriterQos wqos = efd::DATAWRITER_QOS_DEFAULT;
158 std::cerr <<
"Failed to create DataWriter" << std::endl;
171 eprosima::fastrtps::rtps::InstanceHandle_t instance_handle;
172 eprosima::fastrtps::types::ReturnCode_t rcode =
_impl->_datawriter->write(&
_impl->_image, instance_handle);
173 if (rcode == erc::ReturnCodeValue::RETCODE_OK) {
176 if (rcode == erc::ReturnCodeValue::RETCODE_ERROR) {
177 std::cerr <<
"RETCODE_ERROR" << std::endl;
180 if (rcode == erc::ReturnCodeValue::RETCODE_UNSUPPORTED) {
181 std::cerr <<
"RETCODE_UNSUPPORTED" << std::endl;
184 if (rcode == erc::ReturnCodeValue::RETCODE_BAD_PARAMETER) {
185 std::cerr <<
"RETCODE_BAD_PARAMETER" << std::endl;
188 if (rcode == erc::ReturnCodeValue::RETCODE_PRECONDITION_NOT_MET) {
189 std::cerr <<
"RETCODE_PRECONDITION_NOT_MET" << std::endl;
192 if (rcode == erc::ReturnCodeValue::RETCODE_OUT_OF_RESOURCES) {
193 std::cerr <<
"RETCODE_OUT_OF_RESOURCES" << std::endl;
196 if (rcode == erc::ReturnCodeValue::RETCODE_NOT_ENABLED) {
197 std::cerr <<
"RETCODE_NOT_ENABLED" << std::endl;
200 if (rcode == erc::ReturnCodeValue::RETCODE_IMMUTABLE_POLICY) {
201 std::cerr <<
"RETCODE_IMMUTABLE_POLICY" << std::endl;
204 if (rcode == erc::ReturnCodeValue::RETCODE_INCONSISTENT_POLICY) {
205 std::cerr <<
"RETCODE_INCONSISTENT_POLICY" << std::endl;
208 if (rcode == erc::ReturnCodeValue::RETCODE_ALREADY_DELETED) {
209 std::cerr <<
"RETCODE_ALREADY_DELETED" << std::endl;
212 if (rcode == erc::ReturnCodeValue::RETCODE_TIMEOUT) {
213 std::cerr <<
"RETCODE_TIMEOUT" << std::endl;
216 if (rcode == erc::ReturnCodeValue::RETCODE_NO_DATA) {
217 std::cerr <<
"RETCODE_NO_DATA" << std::endl;
220 if (rcode == erc::ReturnCodeValue::RETCODE_ILLEGAL_OPERATION) {
221 std::cerr <<
"RETCODE_ILLEGAL_OPERATION" << std::endl;
224 if (rcode == erc::ReturnCodeValue::RETCODE_NOT_ALLOWED_BY_SECURITY) {
225 std::cerr <<
"RETCODE_NOT_ALLOWED_BY_SECURITY" << std::endl;
228 std::cerr <<
"UNKNOWN" << std::endl;
233 eprosima::fastrtps::rtps::InstanceHandle_t instance_handle;
234 eprosima::fastrtps::types::ReturnCode_t rcode =
_impl_info->_datawriter->write(&
_impl_info->_info, instance_handle);
235 if (rcode == erc::ReturnCodeValue::RETCODE_OK) {
238 if (rcode == erc::ReturnCodeValue::RETCODE_ERROR) {
239 std::cerr <<
"RETCODE_ERROR" << std::endl;
242 if (rcode == erc::ReturnCodeValue::RETCODE_UNSUPPORTED) {
243 std::cerr <<
"RETCODE_UNSUPPORTED" << std::endl;
246 if (rcode == erc::ReturnCodeValue::RETCODE_BAD_PARAMETER) {
247 std::cerr <<
"RETCODE_BAD_PARAMETER" << std::endl;
250 if (rcode == erc::ReturnCodeValue::RETCODE_PRECONDITION_NOT_MET) {
251 std::cerr <<
"RETCODE_PRECONDITION_NOT_MET" << std::endl;
254 if (rcode == erc::ReturnCodeValue::RETCODE_OUT_OF_RESOURCES) {
255 std::cerr <<
"RETCODE_OUT_OF_RESOURCES" << std::endl;
258 if (rcode == erc::ReturnCodeValue::RETCODE_NOT_ENABLED) {
259 std::cerr <<
"RETCODE_NOT_ENABLED" << std::endl;
262 if (rcode == erc::ReturnCodeValue::RETCODE_IMMUTABLE_POLICY) {
263 std::cerr <<
"RETCODE_IMMUTABLE_POLICY" << std::endl;
266 if (rcode == erc::ReturnCodeValue::RETCODE_INCONSISTENT_POLICY) {
267 std::cerr <<
"RETCODE_INCONSISTENT_POLICY" << std::endl;
270 if (rcode == erc::ReturnCodeValue::RETCODE_ALREADY_DELETED) {
271 std::cerr <<
"RETCODE_ALREADY_DELETED" << std::endl;
274 if (rcode == erc::ReturnCodeValue::RETCODE_TIMEOUT) {
275 std::cerr <<
"RETCODE_TIMEOUT" << std::endl;
278 if (rcode == erc::ReturnCodeValue::RETCODE_NO_DATA) {
279 std::cerr <<
"RETCODE_NO_DATA" << std::endl;
282 if (rcode == erc::ReturnCodeValue::RETCODE_ILLEGAL_OPERATION) {
283 std::cerr <<
"RETCODE_ILLEGAL_OPERATION" << std::endl;
286 if (rcode == erc::ReturnCodeValue::RETCODE_NOT_ALLOWED_BY_SECURITY) {
287 std::cerr <<
"RETCODE_NOT_ALLOWED_BY_SECURITY" << std::endl;
290 std::cerr <<
"UNKNOWN" << std::endl;
295 const size_t size = height * width * 4;
296 vector_data.resize(size);
297 std::memcpy(&vector_data[0], &data[0], size);
298 SetData(seconds, nanoseconds,height, width, std::move(vector_data));
317 header.
stamp(std::move(time));
320 _impl->_image.header(std::move(header));
321 _impl->_image.width(width);
322 _impl->_image.height(height);
323 _impl->_image.encoding(
"bgra8");
324 _impl->_image.is_bigendian(0);
325 _impl->_image.step(
_impl->_image.width() *
sizeof(uint8_t) * 4);
326 _impl->_image.data(std::move(data));
335 header.
stamp(std::move(time));
351 if (
_impl->_datawriter)
352 _impl->_publisher->delete_datawriter(
_impl->_datawriter);
354 if (
_impl->_publisher)
355 _impl->_participant->delete_publisher(
_impl->_publisher);
358 _impl->_participant->delete_topic(
_impl->_topic);
360 if (
_impl->_participant)
361 efd::DomainParticipantFactory::get_instance()->delete_participant(
_impl->_participant);
376 efd::DomainParticipantFactory::get_instance()->delete_participant(
_impl_info->_participant);
399 _name = std::move(other._name);
400 _parent = std::move(other._parent);
401 _impl = std::move(other._impl);
408 _name = std::move(other._name);
409 _parent = std::move(other._parent);
410 _impl = std::move(other._impl);
This class represents the structure Time defined by the user in the IDL file.
eProsima_user_DllExport void nanosec(uint32_t _nanosec)
This function sets a value in member nanosec
eProsima_user_DllExport void sec(int32_t _sec)
This function sets a value in member sec
void InitInfoData(uint32_t x_offset, uint32_t y_offset, uint32_t height, uint32_t width, float fov, bool do_rectify)
void SetImageData(int32_t seconds, uint32_t nanoseconds, size_t height, size_t width, const uint8_t *data)
CarlaNormalsCameraPublisher(const char *ros_name="", const char *parent="")
void SetInfoRegionOfInterest(uint32_t x_offset, uint32_t y_offset, uint32_t height, uint32_t width, bool do_rectify)
bool HasBeenInitialized() const
CarlaNormalsCameraPublisher & operator=(const CarlaNormalsCameraPublisher &)
void SetCameraInfoData(int32_t seconds, uint32_t nanoseconds)
void SetData(int32_t seconds, uint32_t nanoseconds, size_t height, size_t width, std::vector< uint8_t > &&data)
std::shared_ptr< CarlaNormalsCameraPublisherImpl > _impl
~CarlaNormalsCameraPublisher()
std::shared_ptr< CarlaCameraInfoPublisherImpl > _impl_info
const std::string & parent() const
This class represents the TopicDataType of the type CameraInfo defined by the user in the IDL file.
This class represents the structure CameraInfo defined by the user in the IDL file.
This class represents the TopicDataType of the type Image defined by the user in the IDL file.
This class represents the structure Image defined by the user in the IDL file.
This class represents the structure RegionOfInterest defined by the user in the IDL file.
eProsima_user_DllExport void y_offset(uint32_t _y_offset)
This function sets a value in member y_offset
eProsima_user_DllExport void width(uint32_t _width)
This function sets a value in member width
eProsima_user_DllExport void height(uint32_t _height)
This function sets a value in member height
eProsima_user_DllExport void x_offset(uint32_t _x_offset)
This function sets a value in member x_offset
eProsima_user_DllExport void do_rectify(bool _do_rectify)
This function sets a value in member do_rectify
eprosima::fastrtps::types::ReturnCode_t erc
This file contains definitions of common data structures used in traffic manager.
sensor_msgs::msg::CameraInfo _info
efd::DomainParticipant * _participant
efd::DataWriter * _datawriter
efd::Publisher * _publisher
efd::DataWriter * _datawriter
sensor_msgs::msg::Image _image
efd::Publisher * _publisher
efd::DomainParticipant * _participant