1#define _GLIBCXX_USE_CXX11_ABI 0
10#include <fastdds/dds/domain/DomainParticipant.hpp>
11#include <fastdds/dds/publisher/Publisher.hpp>
12#include <fastdds/dds/topic/Topic.hpp>
13#include <fastdds/dds/publisher/DataWriter.hpp>
14#include <fastdds/dds/topic/TypeSupport.hpp>
16#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
17#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
18#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
19#include <fastdds/dds/topic/qos/TopicQos.hpp>
21#include <fastrtps/attributes/ParticipantAttributes.h>
22#include <fastrtps/qos/QosPolicies.h>
23#include <fastdds/dds/publisher/qos/DataWriterQos.hpp>
24#include <fastdds/dds/publisher/DataWriterListener.hpp>
29 namespace efd = eprosima::fastdds::dds;
30 using erc = eprosima::fastrtps::types::ReturnCode_t;
43 if (
_impl->_type ==
nullptr) {
44 std::cerr <<
"Invalid TypeSupport" << std::endl;
48 efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
50 auto factory = efd::DomainParticipantFactory::get_instance();
51 _impl->_participant = factory->create_participant(0, pqos);
52 if (
_impl->_participant ==
nullptr) {
53 std::cerr <<
"Failed to create DomainParticipant" << std::endl;
56 _impl->_type.register_type(
_impl->_participant);
58 efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
59 _impl->_publisher =
_impl->_participant->create_publisher(pubqos,
nullptr);
60 if (
_impl->_publisher ==
nullptr) {
61 std::cerr <<
"Failed to create Publisher" << std::endl;
65 efd::TopicQos tqos = efd::TOPIC_QOS_DEFAULT;
66 const std::string base {
"rt/carla/" };
67 std::string topic_name = base;
71 _impl->_topic =
_impl->_participant->create_topic(topic_name,
_impl->_type->getName(), tqos);
72 if (
_impl->_topic ==
nullptr) {
73 std::cerr <<
"Failed to create Topic" << std::endl;
77 efd::DataWriterQos wqos = efd::DATAWRITER_QOS_DEFAULT;
78 wqos.endpoint().history_memory_policy = eprosima::fastrtps::rtps::PREALLOCATED_WITH_REALLOC_MEMORY_MODE;
80 _impl->_datawriter =
_impl->_publisher->create_datawriter(
_impl->_topic, wqos, listener);
81 if (
_impl->_datawriter ==
nullptr) {
82 std::cerr <<
"Failed to create DataWriter" << std::endl;
90 eprosima::fastrtps::rtps::InstanceHandle_t instance_handle;
91 eprosima::fastrtps::types::ReturnCode_t rcode =
_impl->_datawriter->write(&
_impl->_lidar, instance_handle);
92 if (rcode == erc::ReturnCodeValue::RETCODE_OK) {
95 if (rcode == erc::ReturnCodeValue::RETCODE_ERROR) {
96 std::cerr <<
"RETCODE_ERROR" << std::endl;
99 if (rcode == erc::ReturnCodeValue::RETCODE_UNSUPPORTED) {
100 std::cerr <<
"RETCODE_UNSUPPORTED" << std::endl;
103 if (rcode == erc::ReturnCodeValue::RETCODE_BAD_PARAMETER) {
104 std::cerr <<
"RETCODE_BAD_PARAMETER" << std::endl;
107 if (rcode == erc::ReturnCodeValue::RETCODE_PRECONDITION_NOT_MET) {
108 std::cerr <<
"RETCODE_PRECONDITION_NOT_MET" << std::endl;
111 if (rcode == erc::ReturnCodeValue::RETCODE_OUT_OF_RESOURCES) {
112 std::cerr <<
"RETCODE_OUT_OF_RESOURCES" << std::endl;
115 if (rcode == erc::ReturnCodeValue::RETCODE_NOT_ENABLED) {
116 std::cerr <<
"RETCODE_NOT_ENABLED" << std::endl;
119 if (rcode == erc::ReturnCodeValue::RETCODE_IMMUTABLE_POLICY) {
120 std::cerr <<
"RETCODE_IMMUTABLE_POLICY" << std::endl;
123 if (rcode == erc::ReturnCodeValue::RETCODE_INCONSISTENT_POLICY) {
124 std::cerr <<
"RETCODE_INCONSISTENT_POLICY" << std::endl;
127 if (rcode == erc::ReturnCodeValue::RETCODE_ALREADY_DELETED) {
128 std::cerr <<
"RETCODE_ALREADY_DELETED" << std::endl;
131 if (rcode == erc::ReturnCodeValue::RETCODE_TIMEOUT) {
132 std::cerr <<
"RETCODE_TIMEOUT" << std::endl;
135 if (rcode == erc::ReturnCodeValue::RETCODE_NO_DATA) {
136 std::cerr <<
"RETCODE_NO_DATA" << std::endl;
139 if (rcode == erc::ReturnCodeValue::RETCODE_ILLEGAL_OPERATION) {
140 std::cerr <<
"RETCODE_ILLEGAL_OPERATION" << std::endl;
143 if (rcode == erc::ReturnCodeValue::RETCODE_NOT_ALLOWED_BY_SECURITY) {
144 std::cerr <<
"RETCODE_NOT_ALLOWED_BY_SECURITY" << std::endl;
147 std::cerr <<
"UNKNOWN" << std::endl;
154 float* end = &data[height * width];
155 for (++it; it < end; it += 4) {
158 std::vector<uint8_t> vector_data;
159 const size_t size = height * width *
sizeof(float);
160 vector_data.resize(size);
161 std::memcpy(&vector_data[0], &data[0], size);
162 SetData(seconds, nanoseconds, height, width, std::move(vector_data));
171 header.
stamp(std::move(time));
175 descriptor1.
name(
"x");
178 descriptor1.
count(1);
180 descriptor2.
name(
"y");
183 descriptor2.
count(1);
185 descriptor3.
name(
"z");
188 descriptor3.
count(1);
190 descriptor4.
name(
"intensity");
193 descriptor4.
count(1);
195 const size_t point_size = 4 *
sizeof(float);
196 _impl->_lidar.header(std::move(header));
197 _impl->_lidar.width(width / 4);
198 _impl->_lidar.height(height);
199 _impl->_lidar.is_bigendian(
false);
200 _impl->_lidar.fields({descriptor1, descriptor2, descriptor3, descriptor4});
201 _impl->_lidar.point_step(point_size);
202 _impl->_lidar.row_step(width *
sizeof(
float));
203 _impl->_lidar.is_dense(
false);
204 _impl->_lidar.data(std::move(data));
217 if (
_impl->_datawriter)
218 _impl->_publisher->delete_datawriter(
_impl->_datawriter);
220 if (
_impl->_publisher)
221 _impl->_participant->delete_publisher(
_impl->_publisher);
224 _impl->_participant->delete_topic(
_impl->_topic);
226 if (
_impl->_participant)
227 efd::DomainParticipantFactory::get_instance()->delete_participant(
_impl->_participant);
248 _name = std::move(other._name);
249 _parent = std::move(other._parent);
250 _impl = std::move(other._impl);
255 _name = std::move(other._name);
256 _parent = std::move(other._parent);
257 _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 SetData(int32_t seconds, uint32_t nanoseconds, size_t height, size_t width, float *data)
CarlaLidarPublisher & operator=(const CarlaLidarPublisher &)
std::shared_ptr< CarlaLidarPublisherImpl > _impl
CarlaLidarPublisher(const char *ros_name="", const char *parent="")
const std::string & parent() const
This class represents the TopicDataType of the type PointCloud2 defined by the user in the IDL file.
This class represents the structure PointCloud2 defined by the user in the IDL file.
This class represents the structure PointField defined by the user in the IDL file.
eProsima_user_DllExport void count(uint32_t _count)
This function sets a value in member count
eProsima_user_DllExport void offset(uint32_t _offset)
This function sets a value in member offset
eProsima_user_DllExport void name(const std::string &_name)
This function copies the value in member name
eProsima_user_DllExport void datatype(uint8_t _datatype)
This function sets a value in member datatype
eprosima::fastrtps::types::ReturnCode_t erc
This file contains definitions of common data structures used in traffic manager.
const uint8_t PointField__FLOAT32
sensor_msgs::msg::PointCloud2 _lidar
efd::Publisher * _publisher
efd::DataWriter * _datawriter
efd::DomainParticipant * _participant