utilities.hh
Go to the documentation of this file.
1 
37 #pragma once
38 
39 #include <utility/Exception.hh>
40 #include <wire/Protocol.hh>
41 #include <utility/BufferStream.hh>
42 #include <wire/AckMessage.hh>
43 #include <wire/ImuDataMessage.hh>
44 #include <wire/ImuInfoMessage.hh>
45 
47 #include "details/legacy/udp.hh"
48 
49 #include "MultiSense/MultiSenseTypes.hh"
50 
51 namespace multisense{
52 namespace legacy{
53 
75 };
76 
82 {
86  double accelerometer_scale = 1.0;
87 
91  double gyroscope_scale = 1.0;
92 
96  double magnetometer_scale = 1.0;
97 };
98 
102 bool is_image_source(const DataSource &source);
103 
108 
113 
118 
122 std::vector<DataSource> convert_sources(const crl::multisense::details::wire::SourceType &source);
123 
127 crl::multisense::details::wire::SourceType convert_sources(const std::vector<DataSource> &sources);
128 
132 std::vector<DataSource> expand_source(const DataSource &source);
133 
139  const ImuSampleScalars &scalars);
140 
144 uint32_t get_rate_index(const std::vector<ImuRate> &rates, const ImuRate &rate);
145 
149 uint32_t get_range_index(const std::vector<ImuRange> &ranges, const ImuRange &range);
150 
154 double get_acceleration_scale(const std::string &units);
155 
159 double get_gyroscope_scale(const std::string &units);
160 
164 double get_magnetometer_scale(const std::string &units);
165 
170 
175 template <typename QueryMessage, class Rep, class Period>
176 std::optional<crl::multisense::details::wire::Ack> wait_for_ack(MessageAssembler &assembler,
177  const NetworkSocket &socket,
178  const QueryMessage &query,
179  uint16_t sequence_id,
180  uint16_t mtu,
181  const std::optional<std::chrono::duration<Rep, Period>>& wait_time,
182  size_t attempts = 1)
183 {
184  using namespace crl::multisense::details;
185 
186  std::optional<wire::Ack> output = std::nullopt;
187 
188  auto ack_waiter = assembler.register_message(MSG_ID(QueryMessage::ID));
189 
190  for (size_t i = 0 ; i < attempts ; ++i)
191  {
192  if(publish_data(socket, serialize(query, sequence_id, mtu)) < 0)
193  {
194  continue;
195  }
196 
197  if (auto ack = ack_waiter->wait<wire::Ack>(wait_time); ack)
198  {
199  output = std::move(ack);
200  break;
201  }
202  }
203 
204  assembler.remove_registration(MSG_ID(QueryMessage::ID));
205 
206  return output;
207 }
208 
209 
214 template <typename OutputMessage, typename QueryMessage, class Rep, class Period>
215 std::optional<OutputMessage> wait_for_data(MessageAssembler &assembler,
216  const NetworkSocket &socket,
217  const QueryMessage &query,
218  uint16_t sequence_id,
219  uint16_t mtu,
220  const std::optional<std::chrono::duration<Rep, Period>>& wait_time,
221  size_t attempts = 1)
222 {
223  using namespace crl::multisense::details;
224 
225  std::optional<OutputMessage> output = std::nullopt;
226 
227  auto ack_waiter = assembler.register_message(MSG_ID(QueryMessage::ID));
228  auto response_waiter = assembler.register_message(MSG_ID(OutputMessage::ID));
229 
230  for (size_t i = 0 ; i < attempts ; ++i)
231  {
232  if(publish_data(socket, serialize(query, sequence_id, mtu)) < 0)
233  {
234  continue;
235  }
236 
237  if (auto ack = ack_waiter->wait<wire::Ack>(wait_time); ack)
238  {
239  if (ack->status != wire::Ack::Status_Ok)
240  {
241  continue;
242  }
243 
244  if (auto response = response_waiter->wait<OutputMessage>(wait_time); response)
245  {
246  output = std::move(response);
247  break;
248  }
249  }
250  }
251 
252  assembler.remove_registration(MSG_ID(QueryMessage::ID));
253  assembler.remove_registration(MSG_ID(OutputMessage::ID));
254 
255  return output;
256 }
257 
258 template <typename T>
260 {
264  std::chrono::nanoseconds host_start_transmit_time{0};
265 
269  std::chrono::nanoseconds host_transmit_receive_roundtrip{0};
270 
274  T message{};
275 };
276 
281 template <typename OutputMessage, typename QueryMessage, class Rep, class Period>
282 std::optional<TimedResponse<OutputMessage>> wait_for_data_timed(MessageAssembler &assembler,
283  const NetworkSocket &socket,
284  const QueryMessage &query,
285  uint16_t sequence_id,
286  uint16_t mtu,
287  const std::optional<std::chrono::duration<Rep, Period>>& wait_time,
288  size_t attempts = 1)
289 {
290  using namespace crl::multisense::details;
291 
292  std::optional<TimedResponse<OutputMessage>> output = std::nullopt;
293 
294  auto ack_waiter = assembler.register_message(MSG_ID(QueryMessage::ID));
295  auto response_waiter = assembler.register_message(MSG_ID(OutputMessage::ID));
296 
297  for (size_t i = 0 ; i < attempts ; ++i)
298  {
299  const auto serialized_data = serialize(query, sequence_id, mtu);
300 
301  const auto send = std::chrono::system_clock::now().time_since_epoch();
302  const auto start = std::chrono::high_resolution_clock::now();
303 
304  if(publish_data(socket, serialized_data) < 0)
305  {
306  continue;
307  }
308 
309  if (auto ack = ack_waiter->wait<wire::Ack>(wait_time); ack)
310  {
311  const auto end = std::chrono::high_resolution_clock::now();
312 
313  if (ack->status != wire::Ack::Status_Ok)
314  {
315  continue;
316  }
317 
318  if (auto response = response_waiter->wait<OutputMessage>(wait_time); response)
319  {
320  output = TimedResponse<OutputMessage>{send, end - start, response.value()};
321  break;
322  }
323  }
324  }
325 
326  assembler.remove_registration(MSG_ID(QueryMessage::ID));
327  assembler.remove_registration(MSG_ID(OutputMessage::ID));
328 
329  return output;
330 }
331 
332 }
333 }
multisense::legacy::ImuSampleScalars::gyroscope_scale
double gyroscope_scale
Scale for the gyroscope_scale to convert wire samples into degrees/sec.
Definition: utilities.hh:91
crl::multisense::Status_Ok
static CRL_CONSTEXPR Status Status_Ok
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:99
crl::multisense::details
Definition: Legacy/details/channel.cc:63
multisense::legacy::wait_for_data
std::optional< OutputMessage > wait_for_data(MessageAssembler &assembler, const NetworkSocket &socket, const QueryMessage &query, uint16_t sequence_id, uint16_t mtu, const std::optional< std::chrono::duration< Rep, Period >> &wait_time, size_t attempts=1)
Helper to wait for data from the camera from a given query command. Once a query command is sent to t...
Definition: utilities.hh:215
multisense::legacy::TimedResponse::host_transmit_receive_roundtrip
std::chrono::nanoseconds host_transmit_receive_roundtrip
The time between when the status request was sent and when the camera ack'd the response.
Definition: utilities.hh:269
multisense::legacy::MessageAssembler
Process incoming network data, and try the data into valid MultiSense Wire messages.
Definition: message.hh:224
multisense::legacy::get_disparities
MultiSenseConfig::MaxDisparities get_disparities(size_t disparity)
Convert a disparity integer to a fixed disparity setting.
Definition: legacy/utilities.cc:94
Exception.hh
multisense::Status
Status
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:67
crl::multisense::details::wire::SOURCE_CHROMA_AUX
static CRL_CONSTEXPR SourceType SOURCE_CHROMA_AUX
Definition: Protocol.hh:278
crl::multisense::details::wire::SOURCE_LUMA_AUX
static CRL_CONSTEXPR SourceType SOURCE_LUMA_AUX
Definition: Protocol.hh:276
multisense::legacy::TimedResponse::message
T message
The response message.
Definition: utilities.hh:274
BufferStream.hh
crl::multisense::details::wire::Ack::AckStatus
int32_t AckStatus
Definition: AckMessage.hh:52
message.hh
multisense::MultiSenseConfig::MaxDisparities
MaxDisparities
Predefined disparity pixel search windows. Larger values allows the camera to see objects closer to t...
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:776
multisense::legacy::get_imu_scalars
ImuSampleScalars get_imu_scalars(const crl::multisense::details::wire::ImuInfo &info)
Get IMU scalars from the cameras's reported IMU info.
Definition: legacy/utilities.cc:316
AckMessage.hh
crl::multisense::details::wire::SOURCE_COMPRESSED_RECTIFIED_AUX
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RECTIFIED_AUX
Definition: Protocol.hh:285
multisense::ImuRange
The range for each sensor along with the corresponding sampling resolution.
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:453
multisense::legacy::get_rate_index
uint32_t get_rate_index(const std::vector< ImuRate > &rates, const ImuRate &rate)
Get the index of the rate in a vector of rates.
Definition: legacy/utilities.cc:227
crl::multisense::details::wire::SOURCE_COMPRESSED_RIGHT
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RIGHT
Definition: Protocol.hh:281
multisense::legacy::add_wire_sample
ImuSample add_wire_sample(ImuSample sample, const crl::multisense::details::wire::ImuSample &wire, const ImuSampleScalars &scalars)
Add a wire sample to a ImuSample.
Definition: legacy/utilities.cc:188
multisense::legacy::all_sources
constexpr crl::multisense::details::wire::SourceType all_sources
All the supported wire source types created for convenience.
Definition: utilities.hh:57
multisense::DataSource
DataSource
Identifies which camera or data source the image is from.
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:83
crl::multisense::details::wire::SOURCE_LUMA_RECT_AUX
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RECT_AUX
Definition: Protocol.hh:277
udp.hh
crl::multisense::details::wire::SOURCE_DISPARITY
static CRL_CONSTEXPR SourceType SOURCE_DISPARITY
Definition: Protocol.hh:262
multisense::legacy::serialize
std::vector< uint8_t > serialize(const T &message, uint16_t sequence_id, size_t mtu)
Serialize a MultiSense Wire message for transmission. This adds the wire header to the message for tr...
Definition: message.hh:103
multisense::legacy::get_gyroscope_scale
double get_gyroscope_scale(const std::string &units)
Get a scale for the gyroscope value based on a units string.
Definition: legacy/utilities.cc:272
crl::multisense::details::wire::SourceType
uint64_t SourceType
Definition: Protocol.hh:250
multisense::legacy::TimedResponse
Definition: utilities.hh:259
multisense::ImuSample
A single IMU sample from the camera.
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:365
multisense::legacy::publish_data
int64_t publish_data(const NetworkSocket &socket, const std::vector< uint8_t > &data)
Convenience function used to user specified data out on the host's UDP socket.
Definition: udp.cc:137
crl::multisense::details::wire::SOURCE_LUMA_RECT_LEFT
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RECT_LEFT
Definition: Protocol.hh:257
multisense::legacy::get_status
Status get_status(const crl::multisense::details::wire::Ack::AckStatus &status)
Definition: legacy/utilities.cc:72
multisense::legacy::NetworkSocket
Convenience network socket object which contains the data corresponding to our connection.
Definition: udp.hh:51
multisense::legacy::MessageAssembler::register_message
std::shared_ptr< MessageCondition > register_message(const crl::multisense::details::wire::IdType &message_id)
Register to be notified when a message of a given id arrives. Note this registration will only receiv...
Definition: message.cc:292
crl::multisense::details::wire::VersionType
uint16_t VersionType
Definition: Protocol.hh:137
multisense::legacy::MessageAssembler::remove_registration
void remove_registration(const crl::multisense::details::wire::IdType &message_id)
Remove a registration for a specific message type.
Definition: message.cc:313
crl::multisense::details::wire::Ack
Definition: AckMessage.hh:47
MSG_ID
#define MSG_ID(x)
Definition: Protocol.hh:344
multisense::legacy::convert_sources
std::vector< DataSource > convert_sources(const crl::multisense::details::wire::SourceType &source)
Convert wire sources to a vector of DataSources.
Definition: legacy/utilities.cc:108
multisense::legacy::wait_for_ack
std::optional< crl::multisense::details::wire::Ack > wait_for_ack(MessageAssembler &assembler, const NetworkSocket &socket, const QueryMessage &query, uint16_t sequence_id, uint16_t mtu, const std::optional< std::chrono::duration< Rep, Period >> &wait_time, size_t attempts=1)
Helper to wait for ack from the camera from a given query command. Once a query command is sent to th...
Definition: utilities.hh:176
multisense::legacy::ImuSampleScalars::magnetometer_scale
double magnetometer_scale
Scale for the magnetometer to convert wire samples into milligauss.
Definition: utilities.hh:96
crl::multisense::details::wire::SOURCE_COMPRESSED_LEFT
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_LEFT
Definition: Protocol.hh:280
crl::multisense::details::wire::SOURCE_LUMA_RIGHT
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RIGHT
Definition: Protocol.hh:256
crl::multisense::details::wire::SOURCE_LUMA_RECT_RIGHT
static CRL_CONSTEXPR SourceType SOURCE_LUMA_RECT_RIGHT
Definition: Protocol.hh:258
Protocol.hh
multisense::ImuRate
A sample rate, and what impact it has on bandwidth.
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:429
multisense::legacy::ImuSampleScalars::accelerometer_scale
double accelerometer_scale
Scale for the accelerometer to convert wire samples into G's.
Definition: utilities.hh:86
multisense::legacy::ImuSampleScalars
Values to scale IMU samples from the MultiSense camera into standard units LibMultiSense expects.
Definition: utilities.hh:81
ImuInfoMessage.hh
crl::multisense::details::wire::SOURCE_COMPRESSED_AUX
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_AUX
Definition: Protocol.hh:282
multisense
Definition: factory.cc:39
crl::multisense::details::wire::SOURCE_IMU
static CRL_CONSTEXPR SourceType SOURCE_IMU
Definition: Protocol.hh:273
multisense::legacy::get_version
MultiSenseInfo::Version get_version(const crl::multisense::details::wire::VersionType &version)
Convert a wire version to a API Version.
Definition: legacy/utilities.cc:89
multisense::legacy::is_image_source
bool is_image_source(const DataSource &source)
Determine if a datasource is a image source.
Definition: legacy/utilities.cc:45
crl::multisense::details::wire::SOURCE_LUMA_LEFT
static CRL_CONSTEXPR SourceType SOURCE_LUMA_LEFT
Definition: Protocol.hh:255
multisense::legacy::get_acceleration_scale
double get_acceleration_scale(const std::string &units)
Get a scale for the acceleration value based on a units string.
Definition: legacy/utilities.cc:249
crl::multisense::details::wire::SOURCE_COMPRESSED_RECTIFIED_LEFT
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RECTIFIED_LEFT
Definition: Protocol.hh:283
multisense::legacy::TimedResponse::host_start_transmit_time
std::chrono::nanoseconds host_start_transmit_time
The host system time the request which triggered the response message was sent.
Definition: utilities.hh:264
multisense::legacy::get_range_index
uint32_t get_range_index(const std::vector< ImuRange > &ranges, const ImuRange &range)
Get the index of the range in a vector of ranges.
Definition: legacy/utilities.cc:238
crl::multisense::details::wire::SOURCE_DISPARITY_COST
static CRL_CONSTEXPR SourceType SOURCE_DISPARITY_COST
Definition: Protocol.hh:265
multisense::legacy::expand_source
std::vector< DataSource > expand_source(const DataSource &source)
Expand sources since some sources may represent multiple sources on the wire.
Definition: legacy/utilities.cc:172
ImuDataMessage.hh
multisense::MultiSenseInfo::Version
Convenience wrapper for a version number See https://semver.org/.
Definition: LibMultiSense/include/MultiSense/MultiSenseTypes.hh:1507
multisense::legacy::get_magnetometer_scale
double get_magnetometer_scale(const std::string &units)
Get a scale for the magnetometer value based on a units string.
Definition: legacy/utilities.cc:294
crl::multisense::details::wire::ImuSample
Definition: ImuDataMessage.hh:49
crl::multisense::details::wire::SOURCE_COMPRESSED_RECTIFIED_RIGHT
static CRL_CONSTEXPR SourceType SOURCE_COMPRESSED_RECTIFIED_RIGHT
Definition: Protocol.hh:284
multisense::legacy::wait_for_data_timed
std::optional< TimedResponse< OutputMessage > > wait_for_data_timed(MessageAssembler &assembler, const NetworkSocket &socket, const QueryMessage &query, uint16_t sequence_id, uint16_t mtu, const std::optional< std::chrono::duration< Rep, Period >> &wait_time, size_t attempts=1)
Helper to wait for data from the camera from a given query command. Once a query command is sent to t...
Definition: utilities.hh:282
crl::multisense::details::wire::ImuInfo
Definition: ImuInfoMessage.hh:109
crl::multisense::details::wire::SOURCE_CHROMA_RECT_AUX
static CRL_CONSTEXPR SourceType SOURCE_CHROMA_RECT_AUX
Definition: Protocol.hh:261


multisense_lib
Author(s):
autogenerated on Thu Apr 17 2025 02:49:09