CARLA
CarlaLineInvasionPublisher.cpp
Go to the documentation of this file.
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 
26 
27 namespace carla {
28 namespace ros2 {
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  }
85  _frame_id = _name;
86  return true;
87  }
88 
91  eprosima::fastrtps::types::ReturnCode_t rcode = _impl->_datawriter->write(&_impl->_event, 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  void CarlaLineInvasionPublisher::SetData(int32_t seconds, uint32_t nanoseconds, const int32_t* data) {
153  time.sec(seconds);
154  time.nanosec(nanoseconds);
155 
156  std_msgs::msg::Header header;
157  header.stamp(std::move(time));
158  header.frame_id(_frame_id);
159 
160  _impl->_event.header(std::move(header));
161  _impl->_event.crossed_lane_markings({data[0], data[1], data[2]});
162  }
163 
164  CarlaLineInvasionPublisher::CarlaLineInvasionPublisher(const char* ros_name, const char* parent) :
165  _impl(std::make_shared<CarlaLineInvasionPublisherImpl>()) {
166  _name = ros_name;
167  _parent = parent;
168  }
169 
171  if (!_impl)
172  return;
173 
174  if (_impl->_datawriter)
175  _impl->_publisher->delete_datawriter(_impl->_datawriter);
176 
177  if (_impl->_publisher)
178  _impl->_participant->delete_publisher(_impl->_publisher);
179 
180  if (_impl->_topic)
181  _impl->_participant->delete_topic(_impl->_topic);
182 
183  if (_impl->_participant)
184  efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
185  }
186 
188  _frame_id = other._frame_id;
189  _name = other._name;
190  _parent = other._parent;
191  _impl = other._impl;
192  }
193 
195  _frame_id = other._frame_id;
196  _name = other._name;
197  _parent = other._parent;
198  _impl = other._impl;
199 
200  return *this;
201  }
202 
204  _frame_id = std::move(other._frame_id);
205  _name = std::move(other._name);
206  _parent = std::move(other._parent);
207  _impl = std::move(other._impl);
208  }
209 
211  _frame_id = std::move(other._frame_id);
212  _name = std::move(other._name);
213  _parent = std::move(other._parent);
214  _impl = std::move(other._impl);
215 
216  return *this;
217  }
218 }
219 }
This class represents the structure LaneInvasionEvent defined by the user in the IDL file...
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::types::ReturnCode_t erc
This class represents the TopicDataType of the type LaneInvasionEvent defined by the user in the IDL ...
This file contains definitions of common data structures used in traffic manager. ...
Definition: Carla.cpp:133
This class represents the structure Header defined by the user in the IDL file.
Definition: Header.h:72
void SetData(int32_t seconds, uint32_t nanoseconds, const int32_t *data)
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 sec(int32_t _sec)
This function sets a value in member sec.
Definition: Time.cpp:133
eProsima_user_DllExport void nanosec(uint32_t _nanosec)
This function sets a value in member nanosec.
Definition: Time.cpp:161
CarlaLineInvasionPublisher & operator=(const CarlaLineInvasionPublisher &)
const std::string & parent() const
This class represents the structure Time defined by the user in the IDL file.
eProsima_user_DllExport void frame_id(const std::string &_frame_id)
This function copies the value in member frame_id.
Definition: Header.cpp:168
std::shared_ptr< CarlaLineInvasionPublisherImpl > _impl
CarlaLineInvasionPublisher(const char *ros_name="", const char *parent="")