CARLA
 
载入中...
搜索中...
未找到
CarlaMapSensorPublisher.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 std_msgs::msg::StringPubSubType() };
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->_string, 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 CarlaMapSensorPublisher::SetData(const char* data) {
152 _impl->_string.data(data);
153 }
154
155 CarlaMapSensorPublisher::CarlaMapSensorPublisher(const char* ros_name, const char* parent) :
156 _impl(std::make_shared<CarlaMapSensorPublisherImpl>()) {
157 _name = ros_name;
158 _parent = parent;
159 }
160
162 if (!_impl)
163 return;
164
165 if (_impl->_datawriter)
166 _impl->_publisher->delete_datawriter(_impl->_datawriter);
167
168 if (_impl->_publisher)
169 _impl->_participant->delete_publisher(_impl->_publisher);
170
171 if (_impl->_topic)
172 _impl->_participant->delete_topic(_impl->_topic);
173
174 if (_impl->_participant)
175 efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
176 }
177
179 _frame_id = other._frame_id;
180 _name = other._name;
181 _parent = other._parent;
182 _impl = other._impl;
183 }
184
186 _frame_id = other._frame_id;
187 _name = other._name;
188 _parent = other._parent;
189 _impl = other._impl;
190
191 return *this;
192 }
193
195 _frame_id = std::move(other._frame_id);
196 _name = std::move(other._name);
197 _parent = std::move(other._parent);
198 _impl = std::move(other._impl);
199 }
200
202 _frame_id = std::move(other._frame_id);
203 _name = std::move(other._name);
204 _parent = std::move(other._parent);
205 _impl = std::move(other._impl);
206
207 return *this;
208 }
209}
210}
CarlaMapSensorPublisher & operator=(const CarlaMapSensorPublisher &)
CarlaMapSensorPublisher(const char *ros_name="", const char *parent="")
std::shared_ptr< CarlaMapSensorPublisherImpl > _impl
const std::string & parent() const
This class represents the TopicDataType of the type String defined by the user in the IDL file.
This class represents the structure String defined by the user in the IDL file.
eprosima::fastrtps::types::ReturnCode_t erc
This file contains definitions of common data structures used in traffic manager.
Definition Carla.cpp:133