Open3D (C++ API)  0.17.0
Messages.h
Go to the documentation of this file.
1// ----------------------------------------------------------------------------
2// - Open3D: www.open3d.org -
3// ----------------------------------------------------------------------------
4// Copyright (c) 2018-2023 www.open3d.org
5// SPDX-License-Identifier: MIT
6// ----------------------------------------------------------------------------
7
8#pragma once
9
10#include <array>
11#include <cstring>
12#include <map>
13#include <msgpack.hpp>
14#include <string>
15#include <vector>
16
17#include "open3d/core/Tensor.h"
18
19namespace open3d {
20namespace io {
21namespace rpc {
22namespace messages {
23
24inline std::string EndiannessStr() {
25 auto IsLittleEndian = []() -> bool {
26 uint32_t a = 1;
27 uint8_t b;
28 // Use memcpy as a reliable way to access a single byte.
29 // Other approaches, e.g. union, often rely on undefined behaviour.
30 std::memcpy(&b, &a, sizeof(uint8_t));
31 return b == 1;
32 };
33
34 return IsLittleEndian() ? "<" : ">";
35}
36
39template <class T>
40inline std::string TypeStr() {
41 return "";
42}
43template <>
44inline std::string TypeStr<float>() {
45 return EndiannessStr() + "f4";
46}
47template <>
48inline std::string TypeStr<double>() {
49 return EndiannessStr() + "f8";
50}
51template <>
52inline std::string TypeStr<int8_t>() {
53 return "|i1";
54}
55template <>
56inline std::string TypeStr<int16_t>() {
57 return EndiannessStr() + "i2";
58}
59template <>
60inline std::string TypeStr<int32_t>() {
61 return EndiannessStr() + "i4";
62}
63template <>
64inline std::string TypeStr<int64_t>() {
65 return EndiannessStr() + "i8";
66}
67template <>
68inline std::string TypeStr<uint8_t>() {
69 return "|u1";
70}
71template <>
72inline std::string TypeStr<uint16_t>() {
73 return EndiannessStr() + "u2";
74}
75template <>
76inline std::string TypeStr<uint32_t>() {
77 return EndiannessStr() + "u4";
78}
79template <>
80inline std::string TypeStr<uint64_t>() {
81 return EndiannessStr() + "u8";
82}
83
104struct Array {
105 static std::string MsgId() { return "array"; }
106
109 template <class T>
110 static Array FromPtr(const T* const ptr,
111 const std::vector<int64_t>& shape) {
112 Array arr;
113 arr.type = TypeStr<T>();
114 arr.shape = shape;
115 arr.data.ptr = (const char*)ptr;
116 int64_t num = 1;
117 for (int64_t n : shape) num *= n;
118 arr.data.size = uint32_t(sizeof(T) * num);
119 return arr;
120 }
121
125 static Array FromTensor(const core::Tensor& tensor) {
126 // We require the tensor to be contiguous and to use the CPU.
127 auto t = tensor.To(core::Device("CPU:0")).Contiguous();
128 auto a = DISPATCH_DTYPE_TO_TEMPLATE(t.GetDtype(), [&]() {
129 auto arr = messages::Array::FromPtr(
130 (scalar_t*)t.GetDataPtr(),
131 static_cast<std::vector<int64_t>>(t.GetShape()));
132 arr.tensor_ = t;
133 return arr;
134 });
135 return a;
136 }
137
138 // Object for keeping a reference to the tensor. not meant to be serialized.
140
141 std::string type;
142 std::vector<int64_t> shape;
143 msgpack::type::raw_ref data;
144
145 template <class T>
146 const T* Ptr() const {
147 return (T*)data.ptr;
148 }
149
152 bool CheckRank(const std::vector<int>& expected_ranks,
153 std::string& errstr) const {
154 for (auto rank : expected_ranks) {
155 if (shape.size() == size_t(rank)) return true;
156 }
157 errstr += " expected rank to be in (";
158 for (auto rank : expected_ranks) {
159 errstr += std::to_string(rank) + ", ";
160 }
161 errstr += std::string(")") + " but got shape [";
162 for (auto d : shape) {
163 errstr += std::to_string(d) + ", ";
164 }
165 errstr += "]";
166 return false;
167 }
168 bool CheckRank(const std::vector<int>& expected_ranks) const {
169 std::string _;
170 return CheckRank(expected_ranks, _);
171 }
172
176 bool CheckShape(const std::vector<int64_t>& expected_shape,
177 std::string& errstr) const {
178 if (!CheckRank({int(expected_shape.size())}, errstr)) {
179 return false;
180 }
181
182 for (size_t i = 0; i < expected_shape.size(); ++i) {
183 int64_t d_expected = expected_shape[i];
184 int64_t d = shape[i];
185 if ((d_expected != -1 && d_expected != d) || d < 0) {
186 errstr += " expected shape [";
187 for (auto d : expected_shape) {
188 if (d != -1) {
189 errstr += "?, ";
190 } else {
191 errstr += std::to_string(d) + ", ";
192 }
193 }
194 errstr += "] but got [";
195 for (auto d : shape) {
196 errstr += std::to_string(d) + ", ";
197 }
198 errstr += "]";
199 return false;
200 }
201 }
202 return true;
203 }
204 bool CheckShape(const std::vector<int64_t>& expected_shape) const {
205 std::string _;
206 return CheckShape(expected_shape, _);
207 }
208
212 bool CheckNonEmpty(std::string& errstr) const {
213 int64_t n = 1;
214 for (auto d : shape) n *= d;
215 if (0 == n || shape.empty()) {
216 errstr += " expected non empty array but got array with shape [";
217 for (auto d : shape) {
218 errstr += std::to_string(d) + ", ";
219 }
220 errstr += "]";
221 return false;
222 }
223 return true;
224 }
225 bool CheckNonEmpty() const {
226 std::string _;
227 return CheckNonEmpty(_);
228 }
229
233 bool CheckType(const std::vector<std::string>& expected_types,
234 std::string& errstr) const {
235 for (const auto& t : expected_types) {
236 if (t == type) return true;
237 }
238 errstr += " expected array type to be one of (";
239 for (const auto& t : expected_types) {
240 errstr += t + ", ";
241 }
242 errstr += ") but got " + type;
243 return false;
244 }
245 bool CheckType(const std::vector<std::string>& expected_types) const {
246 std::string _;
247 return CheckType(expected_types, _);
248 }
249
250 // macro for creating the serialization/deserialization code
252};
253
255struct MeshData {
256 static std::string MsgId() { return "mesh_data"; }
257
262 std::string o3d_type;
263
268 std::map<std::string, Array> vertex_attributes;
269
278 std::map<std::string, Array> face_attributes;
279
289 std::map<std::string, Array> line_attributes;
290
292 std::string material = "";
294 std::map<std::string, float> material_scalar_attributes;
296 std::map<std::string, std::array<float, 4>> material_vector_attributes;
298 std::map<std::string, Array> texture_maps;
299
300 void SetO3DTypeToPointCloud() { o3d_type = "PointCloud"; }
301 void SetO3DTypeToLineSet() { o3d_type = "LineSet"; }
302 void SetO3DTypeToTriangleMesh() { o3d_type = "TriangleMesh"; }
303
304 bool O3DTypeIsPointCloud() const { return o3d_type == "PointCloud"; }
305 bool O3DTypeIsLineSet() const { return o3d_type == "LineSet"; }
306 bool O3DTypeIsTriangleMesh() const { return o3d_type == "TriangleMesh"; }
307
308 bool CheckVertices(std::string& errstr) const {
309 if (vertices.shape.empty()) return true;
310 std::string tmp = "invalid vertices array:";
311 bool status = vertices.CheckNonEmpty(tmp) &&
312 vertices.CheckShape({-1, 3}, tmp);
313 if (!status) errstr += tmp;
314 return status;
315 }
316
317 bool CheckFaces(std::string& errstr) const {
318 if (faces.shape.empty()) return true;
319
320 std::string tmp = "invalid faces array:";
321
322 bool status = faces.CheckRank({1, 2}, tmp);
323 if (!status) {
324 errstr += tmp;
325 return false;
326 }
327
328 status = faces.CheckType({TypeStr<int32_t>(), TypeStr<int64_t>()}, tmp);
329 if (!status) {
330 errstr += tmp;
331 return false;
332 }
333
334 if (faces.CheckRank({1, 2})) {
335 status = faces.CheckNonEmpty(tmp);
336 if (!status) {
337 errstr += tmp;
338 return false;
339 }
340 }
341
342 if (faces.CheckRank({2})) {
343 status = faces.shape[1] > 2;
344 tmp += " expected shape [?, >2] but got [" +
345 std::to_string(faces.shape[0]) + ", " +
346 std::to_string(faces.shape[1]) + "]";
347 if (!status) {
348 errstr += tmp;
349 return false;
350 }
351 }
352 return status;
353 }
354
355 bool CheckO3DType(std::string& errstr) const {
356 if (o3d_type.empty() || O3DTypeIsPointCloud() || O3DTypeIsLineSet() ||
358 return true;
359 } else {
360 errstr +=
361 " invalid o3d_type. Expected 'PointCloud', 'TriangleMesh', "
362 "or 'LineSet' but got '" +
363 o3d_type + "'.";
364 return false;
365 }
366 }
367
368 bool CheckMessage(std::string& errstr) const {
369 std::string tmp = "invalid mesh_data message:";
370 bool status =
371 CheckO3DType(tmp) && CheckVertices(tmp) && CheckFaces(tmp);
372 if (!status) errstr += tmp;
373 return status;
374 }
375
377 vertices,
379 faces,
381 lines,
383 material,
387};
388
392 static std::string MsgId() { return "set_mesh_data"; }
393
395
397 std::string path;
401 std::string layer;
402
405
407};
408
411 static std::string MsgId() { return "get_mesh_data"; }
412
414
416 std::string path;
420 std::string layer;
421
423};
424
427 static std::string MsgId() { return "camera_data"; }
428
429 CameraData() : width(0), height(0) {}
430
431 // extrinsic parameters defining the world to camera transform, i.e.,
432 // X_cam = X_world * R + t
433
435 std::array<double, 4> R;
437 std::array<double, 3> t;
438
442 std::string intrinsic_model;
443 std::vector<double> intrinsic_parameters;
444
446 int width;
448
450 std::map<std::string, Array> images;
451
454};
455
459 static std::string MsgId() { return "set_camera_data"; }
460
462
464 std::string path;
468 std::string layer;
469
472
474};
475
478struct SetTime {
479 static std::string MsgId() { return "set_time"; }
480 SetTime() : time(0) {}
482
484};
485
489 static std::string MsgId() { return "set_active_camera"; }
490 std::string path;
491
493};
494
498 static std::string MsgId() { return "set_properties"; }
499 std::string path;
500
501 // application specific members go here.
502
504};
505
508struct Request {
509 std::string msg_id;
511};
512
515struct Reply {
516 std::string msg_id;
518};
519
522struct Status {
523 static std::string MsgId() { return "status"; }
524
525 Status() : code(0) {}
526 Status(int code, const std::string& str) : code(code), str(str) {}
527 static Status OK() { return Status(); }
529 return Status(1, "unsupported msg_id");
530 }
532 return Status(2, "error during unpacking");
533 }
535 return Status(3, "error while processing message");
536 }
537
541 std::string str;
542
544};
545
546} // namespace messages
547} // namespace rpc
548} // namespace io
549} // namespace open3d
#define DISPATCH_DTYPE_TO_TEMPLATE(DTYPE,...)
Definition: Dispatch.h:30
Definition: Device.h:18
Definition: Tensor.h:32
Tensor Contiguous() const
Definition: Tensor.cpp:739
Tensor To(Dtype dtype, bool copy=false) const
Definition: Tensor.cpp:706
const char const char value recording_handle imu_sample recording_handle uint8_t size_t data_size k4a_record_configuration_t config target_format k4a_capture_t capture_handle k4a_imu_sample_t imu_sample playback_handle k4a_logging_message_cb_t void min_level device_handle k4a_imu_sample_t timeout_in_ms capture_handle capture_handle capture_handle image_handle temperature_c k4a_image_t image_handle uint8_t image_handle image_handle image_handle image_handle uint32_t
Definition: K4aPlugin.cpp:548
const char const char value recording_handle imu_sample recording_handle uint8_t size_t data_size k4a_record_configuration_t config target_format k4a_capture_t capture_handle k4a_imu_sample_t imu_sample playback_handle k4a_logging_message_cb_t void min_level device_handle k4a_imu_sample_t timeout_in_ms capture_handle capture_handle capture_handle image_handle temperature_c int
Definition: K4aPlugin.cpp:474
const char const char value recording_handle imu_sample recording_handle uint8_t size_t data_size k4a_record_configuration_t config target_format k4a_capture_t capture_handle k4a_imu_sample_t imu_sample playback_handle k4a_logging_message_cb_t void min_level device_handle k4a_imu_sample_t int32_t
Definition: K4aPlugin.cpp:395
std::string TypeStr()
Definition: Messages.h:40
std::string TypeStr< int8_t >()
Definition: Messages.h:52
std::string TypeStr< uint64_t >()
Definition: Messages.h:80
std::string TypeStr< int16_t >()
Definition: Messages.h:56
std::string EndiannessStr()
Definition: Messages.h:24
std::string TypeStr< float >()
Definition: Messages.h:44
std::string TypeStr< double >()
Definition: Messages.h:48
std::string TypeStr< uint8_t >()
Definition: Messages.h:68
std::string TypeStr< int32_t >()
Definition: Messages.h:60
std::string TypeStr< int64_t >()
Definition: Messages.h:64
std::string TypeStr< uint32_t >()
Definition: Messages.h:76
std::string TypeStr< uint16_t >()
Definition: Messages.h:72
Definition: PinholeCameraIntrinsic.cpp:16
Definition: Messages.h:104
bool CheckNonEmpty() const
Definition: Messages.h:225
bool CheckRank(const std::vector< int > &expected_ranks, std::string &errstr) const
Definition: Messages.h:152
MSGPACK_DEFINE_MAP(type, shape, data)
static Array FromTensor(const core::Tensor &tensor)
Definition: Messages.h:125
bool CheckNonEmpty(std::string &errstr) const
Definition: Messages.h:212
bool CheckType(const std::vector< std::string > &expected_types) const
Definition: Messages.h:245
std::string type
Definition: Messages.h:141
static Array FromPtr(const T *const ptr, const std::vector< int64_t > &shape)
Definition: Messages.h:110
const T * Ptr() const
Definition: Messages.h:146
bool CheckShape(const std::vector< int64_t > &expected_shape, std::string &errstr) const
Definition: Messages.h:176
static std::string MsgId()
Definition: Messages.h:105
bool CheckRank(const std::vector< int > &expected_ranks) const
Definition: Messages.h:168
msgpack::type::raw_ref data
Definition: Messages.h:143
bool CheckType(const std::vector< std::string > &expected_types, std::string &errstr) const
Definition: Messages.h:233
bool CheckShape(const std::vector< int64_t > &expected_shape) const
Definition: Messages.h:204
core::Tensor tensor_
Definition: Messages.h:139
std::vector< int64_t > shape
Definition: Messages.h:142
struct for storing camera data
Definition: Messages.h:426
std::array< double, 4 > R
rotation R as quaternion [x,y,z,w]
Definition: Messages.h:435
std::vector< double > intrinsic_parameters
Definition: Messages.h:443
int height
Definition: Messages.h:447
MSGPACK_DEFINE_MAP(R, t, intrinsic_model, intrinsic_parameters, width, height, images)
static std::string MsgId()
Definition: Messages.h:427
std::array< double, 3 > t
translation
Definition: Messages.h:437
int width
image dimensions in pixels
Definition: Messages.h:446
std::map< std::string, Array > images
map of arrays that can be interpreted as camera images
Definition: Messages.h:450
std::string intrinsic_model
Definition: Messages.h:442
CameraData()
Definition: Messages.h:429
struct for defining a "get_mesh_data" message, which requests mesh data.
Definition: Messages.h:410
std::string path
Path defining the location in the scene tree.
Definition: Messages.h:416
static std::string MsgId()
Definition: Messages.h:411
int32_t time
The time for which to return the data.
Definition: Messages.h:418
GetMeshData()
Definition: Messages.h:413
std::string layer
The layer for which to return the data.
Definition: Messages.h:420
struct for storing MeshData, e.g., PointClouds, TriangleMesh, ..
Definition: Messages.h:255
std::map< std::string, Array > face_attributes
stores arbitrary attributes for each face
Definition: Messages.h:278
std::map< std::string, Array > line_attributes
stores arbitrary attributes for each line
Definition: Messages.h:289
std::string material
Material for DrawableGeometry.
Definition: Messages.h:292
void SetO3DTypeToLineSet()
Definition: Messages.h:301
std::string o3d_type
Definition: Messages.h:262
Array faces
Definition: Messages.h:276
bool CheckO3DType(std::string &errstr) const
Definition: Messages.h:355
Array lines
Definition: Messages.h:287
bool CheckMessage(std::string &errstr) const
Definition: Messages.h:368
void SetO3DTypeToTriangleMesh()
Definition: Messages.h:302
std::map< std::string, Array > texture_maps
map of arrays that can be interpreted as textures
Definition: Messages.h:298
std::map< std::string, float > material_scalar_attributes
Material scalar properties.
Definition: Messages.h:294
bool CheckVertices(std::string &errstr) const
Definition: Messages.h:308
Array vertices
shape must be [num_verts,3]
Definition: Messages.h:265
MSGPACK_DEFINE_MAP(o3d_type, vertices, vertex_attributes, faces, face_attributes, lines, line_attributes, material, material_scalar_attributes, material_vector_attributes, texture_maps)
static std::string MsgId()
Definition: Messages.h:256
std::map< std::string, Array > vertex_attributes
Definition: Messages.h:268
bool O3DTypeIsPointCloud() const
Definition: Messages.h:304
std::map< std::string, std::array< float, 4 > > material_vector_attributes
Material vector[4] properties.
Definition: Messages.h:296
void SetO3DTypeToPointCloud()
Definition: Messages.h:300
bool CheckFaces(std::string &errstr) const
Definition: Messages.h:317
bool O3DTypeIsTriangleMesh() const
Definition: Messages.h:306
bool O3DTypeIsLineSet() const
Definition: Messages.h:305
Definition: Messages.h:515
std::string msg_id
Definition: Messages.h:516
Definition: Messages.h:508
std::string msg_id
Definition: Messages.h:509
static std::string MsgId()
Definition: Messages.h:489
std::string path
Definition: Messages.h:490
int32_t time
The time for which to return the data.
Definition: Messages.h:466
static std::string MsgId()
Definition: Messages.h:459
CameraData data
The data to be set.
Definition: Messages.h:471
std::string layer
The layer for which to return the data.
Definition: Messages.h:468
MSGPACK_DEFINE_MAP(path, time, layer, data)
SetCameraData()
Definition: Messages.h:461
std::string path
Path defining the location in the scene tree.
Definition: Messages.h:464
Definition: Messages.h:391
SetMeshData()
Definition: Messages.h:394
std::string layer
The layer for this data.
Definition: Messages.h:401
MSGPACK_DEFINE_MAP(path, time, layer, data)
std::string path
Path defining the location in the scene tree.
Definition: Messages.h:397
int32_t time
The time associated with this data.
Definition: Messages.h:399
static std::string MsgId()
Definition: Messages.h:392
MeshData data
The data to be set.
Definition: Messages.h:404
static std::string MsgId()
Definition: Messages.h:498
std::string path
Definition: Messages.h:499
Definition: Messages.h:478
int32_t time
Definition: Messages.h:481
SetTime()
Definition: Messages.h:480
static std::string MsgId()
Definition: Messages.h:479
Definition: Messages.h:522
Status()
Definition: Messages.h:525
static Status ErrorUnsupportedMsgId()
Definition: Messages.h:528
static Status ErrorProcessingMessage()
Definition: Messages.h:534
std::string str
string representation of the code
Definition: Messages.h:541
static std::string MsgId()
Definition: Messages.h:523
static Status ErrorUnpackingFailed()
Definition: Messages.h:531
int32_t code
return code. 0 means everything is OK.
Definition: Messages.h:539
static Status OK()
Definition: Messages.h:527
Status(int code, const std::string &str)
Definition: Messages.h:526