CARLA
 
载入中...
搜索中...
未找到
CarlaIMUPublisher.cpp
浏览该文件的文档.
1#define _GLIBCXX_USE_CXX11_ABI 0
2
3#include "CarlaIMUPublisher.h"
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::ImuPubSubType() };
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->_imu, 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 CarlaIMUPublisher::SetData(int32_t seconds, uint32_t nanoseconds, float* pAccelerometer, float* pGyroscope, float compass) {
153 geometry_msgs::msg::Vector3 linear_acceleration;
154 const float ax = *pAccelerometer++;
155 const float ay = *pAccelerometer++;
156 const float az = *pAccelerometer++;
157 linear_acceleration.x(ax);
158 linear_acceleration.y(ay);
159 linear_acceleration.z(az);
160 const float gx = *pGyroscope++;
161 const float gy = *pGyroscope++;
162 const float gz = *pGyroscope++;
163 gyroscope.x(gx);
164 gyroscope.y(gy);
165 gyroscope.z(gz);
166
168 time.sec(seconds);
169 time.nanosec(nanoseconds);
170
172 header.stamp(std::move(time));
173 header.frame_id(_frame_id);
174
176
177 const float rx = 0.0f; // pitch
178 const float ry = (M_PIf32 / 2.0f) - compass; // yaw
179 const float rz = 0.0f; // roll
180
181 const float cr = cosf(rz * 0.5f);
182 const float sr = sinf(rz * 0.5f);
183 const float cp = cosf(rx * 0.5f);
184 const float sp = sinf(rx * 0.5f);
185 const float cy = cosf(ry * 0.5f);
186 const float sy = sinf(ry * 0.5f);
187
188 orientation.w(cr * cp * cy + sr * sp * sy);
189 orientation.x(sr * cp * cy - cr * sp * sy);
190 orientation.y(cr * sp * cy + sr * cp * sy);
191 orientation.z(cr * cp * sy - sr * sp * cy);
192
193 _impl->_imu.header(std::move(header));
194 _impl->_imu.orientation(orientation);
195 _impl->_imu.angular_velocity(gyroscope);
196 _impl->_imu.linear_acceleration(linear_acceleration);
197 }
198
199 CarlaIMUPublisher::CarlaIMUPublisher(const char* ros_name, const char* parent) :
200 _impl(std::make_shared<CarlaIMUPublisherImpl>()) {
201 _name = ros_name;
202 _parent = parent;
203 }
204
206 if (!_impl)
207 return;
208
209 if (_impl->_datawriter)
210 _impl->_publisher->delete_datawriter(_impl->_datawriter);
211
212 if (_impl->_publisher)
213 _impl->_participant->delete_publisher(_impl->_publisher);
214
215 if (_impl->_topic)
216 _impl->_participant->delete_topic(_impl->_topic);
217
218 if (_impl->_participant)
219 efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
220 }
221
223 _frame_id = other._frame_id;
224 _name = other._name;
225 _parent = other._parent;
226 _impl = other._impl;
227 }
228
230 _frame_id = other._frame_id;
231 _name = other._name;
232 _parent = other._parent;
233 _impl = other._impl;
234
235 return *this;
236 }
237
239 _frame_id = std::move(other._frame_id);
240 _name = std::move(other._name);
241 _parent = std::move(other._parent);
242 _impl = std::move(other._impl);
243 }
244
246 _frame_id = std::move(other._frame_id);
247 _name = std::move(other._name);
248 _parent = std::move(other._parent);
249 _impl = std::move(other._impl);
250
251 return *this;
252 }
253}
254}
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
CarlaIMUPublisher(const char *ros_name="", const char *parent="")
std::shared_ptr< CarlaIMUPublisherImpl > _impl
void SetData(int32_t seconds, uint32_t nanoseconds, float *accelerometer, float *gyroscope, float compass)
CarlaIMUPublisher & operator=(const CarlaIMUPublisher &)
const std::string & parent() const
This class represents the structure Quaternion defined by the user in the IDL file.
Definition Quaternion.h:71
eProsima_user_DllExport void x(double _x)
This function sets a value in member x
eProsima_user_DllExport void y(double _y)
This function sets a value in member y
eProsima_user_DllExport void z(double _z)
This function sets a value in member z
eProsima_user_DllExport void w(double _w)
This function sets a value in member w
This class represents the structure Vector3 defined by the user in the IDL file.
Definition Vector3.h:72
eProsima_user_DllExport void x(double _x)
This function sets a value in member x
Definition Vector3.cpp:143
eProsima_user_DllExport void z(double _z)
This function sets a value in member z
Definition Vector3.cpp:199
eProsima_user_DllExport void y(double _y)
This function sets a value in member y
Definition Vector3.cpp:171
This class represents the TopicDataType of the type Imu defined by the user in the IDL file.
This class represents the structure Imu defined by the user in the IDL file.
Definition Imu.h:76
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
efd::DomainParticipant * _participant