CARLA
 
载入中...
搜索中...
未找到
CarlaLidarPublisher.cpp
浏览该文件的文档.
1#define _GLIBCXX_USE_CXX11_ABI 0
2
4
5#include <string>
6
9
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>
15
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>
20
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>
25
26namespace carla {
27namespace ros2 {
28
29 namespace efd = eprosima::fastdds::dds;
30 using erc = eprosima::fastrtps::types::ReturnCode_t;
31
33 efd::DomainParticipant* _participant { nullptr };
34 efd::Publisher* _publisher { nullptr };
35 efd::Topic* _topic { nullptr };
36 efd::DataWriter* _datawriter { nullptr };
40 };
41
43 if (_impl->_type == nullptr) {
44 std::cerr << "Invalid TypeSupport" << std::endl;
45 return false;
46 }
47
48 efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
49 pqos.name(_name);
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;
54 return false;
55 }
56 _impl->_type.register_type(_impl->_participant);
57
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;
62 return false;
63 }
64
65 efd::TopicQos tqos = efd::TOPIC_QOS_DEFAULT;
66 const std::string base { "rt/carla/" };
67 std::string topic_name = base;
68 if (!_parent.empty())
69 topic_name += _parent + "/";
70 topic_name += _name;
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;
74 return false;
75 }
76
77 efd::DataWriterQos wqos = efd::DATAWRITER_QOS_DEFAULT;
78 wqos.endpoint().history_memory_policy = eprosima::fastrtps::rtps::PREALLOCATED_WITH_REALLOC_MEMORY_MODE;
79 efd::DataWriterListener* listener = (efd::DataWriterListener*)_impl->_listener._impl.get();
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;
83 return false;
84 }
86 return true;
87 }
88
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) {
93 return true;
94 }
95 if (rcode == erc::ReturnCodeValue::RETCODE_ERROR) {
96 std::cerr << "RETCODE_ERROR" << std::endl;
97 return false;
98 }
99 if (rcode == erc::ReturnCodeValue::RETCODE_UNSUPPORTED) {
100 std::cerr << "RETCODE_UNSUPPORTED" << std::endl;
101 return false;
102 }
103 if (rcode == erc::ReturnCodeValue::RETCODE_BAD_PARAMETER) {
104 std::cerr << "RETCODE_BAD_PARAMETER" << std::endl;
105 return false;
106 }
107 if (rcode == erc::ReturnCodeValue::RETCODE_PRECONDITION_NOT_MET) {
108 std::cerr << "RETCODE_PRECONDITION_NOT_MET" << std::endl;
109 return false;
110 }
111 if (rcode == erc::ReturnCodeValue::RETCODE_OUT_OF_RESOURCES) {
112 std::cerr << "RETCODE_OUT_OF_RESOURCES" << std::endl;
113 return false;
114 }
115 if (rcode == erc::ReturnCodeValue::RETCODE_NOT_ENABLED) {
116 std::cerr << "RETCODE_NOT_ENABLED" << std::endl;
117 return false;
118 }
119 if (rcode == erc::ReturnCodeValue::RETCODE_IMMUTABLE_POLICY) {
120 std::cerr << "RETCODE_IMMUTABLE_POLICY" << std::endl;
121 return false;
122 }
123 if (rcode == erc::ReturnCodeValue::RETCODE_INCONSISTENT_POLICY) {
124 std::cerr << "RETCODE_INCONSISTENT_POLICY" << std::endl;
125 return false;
126 }
127 if (rcode == erc::ReturnCodeValue::RETCODE_ALREADY_DELETED) {
128 std::cerr << "RETCODE_ALREADY_DELETED" << std::endl;
129 return false;
130 }
131 if (rcode == erc::ReturnCodeValue::RETCODE_TIMEOUT) {
132 std::cerr << "RETCODE_TIMEOUT" << std::endl;
133 return false;
134 }
135 if (rcode == erc::ReturnCodeValue::RETCODE_NO_DATA) {
136 std::cerr << "RETCODE_NO_DATA" << std::endl;
137 return false;
138 }
139 if (rcode == erc::ReturnCodeValue::RETCODE_ILLEGAL_OPERATION) {
140 std::cerr << "RETCODE_ILLEGAL_OPERATION" << std::endl;
141 return false;
142 }
143 if (rcode == erc::ReturnCodeValue::RETCODE_NOT_ALLOWED_BY_SECURITY) {
144 std::cerr << "RETCODE_NOT_ALLOWED_BY_SECURITY" << std::endl;
145 return false;
146 }
147 std::cerr << "UNKNOWN" << std::endl;
148 return false;
149 }
150
151
152void CarlaLidarPublisher::SetData(int32_t seconds, uint32_t nanoseconds, size_t height, size_t width, float* data) {
153 float* it = data;
154 float* end = &data[height * width];
155 for (++it; it < end; it += 4) {
156 *it *= -1.0f;
157 }
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));
163 }
164
165 void CarlaLidarPublisher::SetData(int32_t seconds, uint32_t nanoseconds, size_t height, size_t width, std::vector<uint8_t>&& data) {
167 time.sec(seconds);
168 time.nanosec(nanoseconds);
169
171 header.stamp(std::move(time));
172 header.frame_id(_frame_id);
173
175 descriptor1.name("x");
176 descriptor1.offset(0);
178 descriptor1.count(1);
180 descriptor2.name("y");
181 descriptor2.offset(4);
183 descriptor2.count(1);
185 descriptor3.name("z");
186 descriptor3.offset(8);
188 descriptor3.count(1);
190 descriptor4.name("intensity");
191 descriptor4.offset(12);
193 descriptor4.count(1);
194
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); //True if there are not invalid points
204 _impl->_lidar.data(std::move(data));
205 }
206
207 CarlaLidarPublisher::CarlaLidarPublisher(const char* ros_name, const char* parent) :
208 _impl(std::make_shared<CarlaLidarPublisherImpl>()) {
209 _name = ros_name;
210 _parent = parent;
211 }
212
214 if (!_impl)
215 return;
216
217 if (_impl->_datawriter)
218 _impl->_publisher->delete_datawriter(_impl->_datawriter);
219
220 if (_impl->_publisher)
221 _impl->_participant->delete_publisher(_impl->_publisher);
222
223 if (_impl->_topic)
224 _impl->_participant->delete_topic(_impl->_topic);
225
226 if (_impl->_participant)
227 efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
228 }
229
231 _frame_id = other._frame_id;
232 _name = other._name;
233 _parent = other._parent;
234 _impl = other._impl;
235 }
236
238 _frame_id = other._frame_id;
239 _name = other._name;
240 _parent = other._parent;
241 _impl = other._impl;
242
243 return *this;
244 }
245
247 _frame_id = std::move(other._frame_id);
248 _name = std::move(other._name);
249 _parent = std::move(other._parent);
250 _impl = std::move(other._impl);
251 }
252
254 _frame_id = std::move(other._frame_id);
255 _name = std::move(other._name);
256 _parent = std::move(other._parent);
257 _impl = std::move(other._impl);
258
259 return *this;
260 }
261}
262}
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
Definition Time.cpp:161
eProsima_user_DllExport void sec(int32_t _sec)
This function sets a value in member sec
Definition Time.cpp:133
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.
Definition PointCloud2.h:74
This class represents the structure PointField defined by the user in the IDL file.
Definition PointField.h:80
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
This class represents the structure Header defined by the user in the IDL file.
Definition Header.h:73
eProsima_user_DllExport void stamp(const builtin_interfaces::msg::Time &_stamp)
This function copies the value in member stamp
Definition Header.cpp:131
eProsima_user_DllExport void frame_id(const std::string &_frame_id)
This function copies the value in member frame_id
Definition Header.cpp:168
eprosima::fastrtps::types::ReturnCode_t erc
This file contains definitions of common data structures used in traffic manager.
Definition Carla.cpp:133
const uint8_t PointField__FLOAT32
Definition PointField.h:72
sensor_msgs::msg::PointCloud2 _lidar