CARLA
 
载入中...
搜索中...
未找到
CarlaGNSSPublisher.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
26
27namespace carla {
28namespace 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 };
37 efd::TypeSupport _type { new sensor_msgs::msg::NavSatFixPubSubType() };
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->_nav, 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 return code: " << rcode() << std::endl;
148 return false;
149 }
150
151 void CarlaGNSSPublisher::SetData(int32_t seconds, uint32_t nanoseconds, const double* data) {
153 time.sec(seconds);
154 time.nanosec(nanoseconds);
155
157 header.stamp(std::move(time));
158 header.frame_id(_frame_id);
159
160 _impl->_nav.header(std::move(header));
161 _impl->_nav.latitude(*data++);
162 _impl->_nav.longitude(*data++);
163 _impl->_nav.altitude(*data++);
164 }
165
166 CarlaGNSSPublisher::CarlaGNSSPublisher(const char* ros_name, const char* parent) :
167 _impl(std::make_shared<CarlaGNSSPublisherImpl>()) {
168 _name = ros_name;
169 _parent = parent;
170 }
171
173 if (!_impl)
174 return;
175
176 if (_impl->_datawriter)
177 _impl->_publisher->delete_datawriter(_impl->_datawriter);
178
179 if (_impl->_publisher)
180 _impl->_participant->delete_publisher(_impl->_publisher);
181
182 if (_impl->_topic)
183 _impl->_participant->delete_topic(_impl->_topic);
184
185 if (_impl->_participant)
186 efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
187 }
188
190 _frame_id = other._frame_id;
191 _name = other._name;
192 _parent = other._parent;
193 _impl = other._impl;
194 }
195
197 _frame_id = other._frame_id;
198 _name = other._name;
199 _parent = other._parent;
200 _impl = other._impl;
201
202 return *this;
203 }
204
206 _frame_id = std::move(other._frame_id);
207 _name = std::move(other._name);
208 _parent = std::move(other._parent);
209 _impl = std::move(other._impl);
210 }
211
213 _frame_id = std::move(other._frame_id);
214 _name = std::move(other._name);
215 _parent = std::move(other._parent);
216 _impl = std::move(other._impl);
217
218 return *this;
219 }
220}
221}
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, const double *data)
std::shared_ptr< CarlaGNSSPublisherImpl > _impl
CarlaGNSSPublisher(const char *ros_name="", const char *parent="")
CarlaGNSSPublisher & operator=(const CarlaGNSSPublisher &)
const std::string & parent() const
This class represents the TopicDataType of the type NavSatFix defined by the user in the IDL file.
This class represents the structure NavSatFix defined by the user in the IDL file.
Definition NavSatFix.h:79
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