MYNT-EYE-S-SDK/include/mynteye/api/api.h

368 lines
8.9 KiB
C
Raw Normal View History

2018-05-10 09:46:34 +03:00
// Copyright 2018 Slightech Co., Ltd. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
2018-10-27 16:24:04 +03:00
#ifndef MYNTEYE_API_API_H_
#define MYNTEYE_API_API_H_
2018-04-25 11:06:38 +03:00
#pragma once
2018-12-16 13:53:27 +02:00
#include <functional>
2018-04-26 09:44:47 +03:00
#include <limits>
2018-04-26 04:22:29 +03:00
#include <memory>
2018-04-26 05:33:37 +03:00
#include <string>
#include <vector>
2018-04-26 04:22:29 +03:00
2018-10-27 16:24:04 +03:00
#include <opencv2/core/core.hpp>
2018-04-25 11:06:38 +03:00
#include "mynteye/mynteye.h"
2018-04-26 05:33:37 +03:00
#include "mynteye/types.h"
2018-04-25 11:06:38 +03:00
MYNTEYE_BEGIN_NAMESPACE
struct DeviceInfo;
class Correspondence;
2018-04-26 04:22:29 +03:00
class Device;
2018-04-26 05:33:37 +03:00
class Synthetic;
2018-04-26 04:22:29 +03:00
2018-06-07 12:39:51 +03:00
namespace device {
class Frame;
} // namespace device
2018-04-26 09:44:47 +03:00
namespace api {
2018-05-16 05:31:31 +03:00
/**
* @ingroup datatypes
* API stream data.
*/
2018-04-26 09:44:47 +03:00
struct MYNTEYE_API StreamData {
2018-05-16 05:31:31 +03:00
/** ImgData. */
2018-04-26 09:44:47 +03:00
std::shared_ptr<ImgData> img;
2018-05-16 05:31:31 +03:00
/** Frame. */
2018-04-26 09:44:47 +03:00
cv::Mat frame;
2018-06-07 12:39:51 +03:00
/** Raw frame. */
std::shared_ptr<device::Frame> frame_raw;
2018-10-26 10:39:34 +03:00
/** Frame ID. */
std::uint16_t frame_id;
2018-05-20 04:25:30 +03:00
bool operator==(const StreamData &other) const {
if (img && other.img) {
return img->frame_id == other.img->frame_id &&
img->timestamp == other.img->timestamp;
}
return false;
}
2018-04-26 09:44:47 +03:00
};
2018-05-16 05:31:31 +03:00
/**
* @ingroup datatypes
* API motion data.
*/
2018-04-26 09:44:47 +03:00
struct MYNTEYE_API MotionData {
2018-05-16 05:31:31 +03:00
/** ImuData. */
2018-04-26 09:44:47 +03:00
std::shared_ptr<ImuData> imu;
2018-05-20 04:25:30 +03:00
bool operator==(const MotionData &other) const {
if (imu && other.imu) {
return imu->timestamp == other.imu->timestamp;
2018-05-20 04:25:30 +03:00
}
return false;
}
2018-04-26 09:44:47 +03:00
};
} // namespace api
2018-05-16 05:31:31 +03:00
/**
* The API class to communicate with MYNT® EYE device.
*/
2018-04-25 11:06:38 +03:00
class MYNTEYE_API API {
public:
2018-05-16 05:31:31 +03:00
/** The api::StreamData callback. */
2018-04-26 09:44:47 +03:00
using stream_callback_t = std::function<void(const api::StreamData &data)>;
2018-05-16 05:31:31 +03:00
/** The api::MotionData callback. */
2018-04-26 09:44:47 +03:00
using motion_callback_t = std::function<void(const api::MotionData &data)>;
2019-02-22 12:20:47 +02:00
/** The enable/disable switch callback. */
using stream_switch_callback_t = std::function<void(const Stream &stream)>;
2018-04-26 09:44:47 +03:00
explicit API(std::shared_ptr<Device> device, CalibrationModel calib_model);
2018-05-20 04:25:30 +03:00
virtual ~API();
2018-04-26 04:22:29 +03:00
2018-05-15 17:01:15 +03:00
/**
* Create the API instance.
* @param argc the arg count.
* @param argv the arg values.
* @return the API instance.
* @note This will init glog with args and call device::select() to select a
* device.
*/
2018-05-03 11:33:27 +03:00
static std::shared_ptr<API> Create(int argc, char *argv[]);
2018-05-15 17:01:15 +03:00
/**
* Create the API instance.
* @param argc the arg count.
* @param argv the arg values.
* @param device the selected device.
* @return the API instance.
* @note This will init glog with args.
*/
2018-05-03 11:33:27 +03:00
static std::shared_ptr<API> Create(
int argc, char *argv[], const std::shared_ptr<Device> &device);
2018-12-20 14:45:11 +02:00
/**
* Create the API instance.
* @param device the selected device.
* @return the API instance.
*/
static std::shared_ptr<API> Create(const std::shared_ptr<Device> &device);
2018-04-26 04:22:29 +03:00
2018-05-16 05:31:31 +03:00
/**
* Get the model.
*/
2018-04-26 05:33:37 +03:00
Model GetModel() const;
2018-05-16 05:31:31 +03:00
/**
* Supports the stream or not.
*/
2018-04-26 05:33:37 +03:00
bool Supports(const Stream &stream) const;
2018-05-16 05:31:31 +03:00
/**
* Supports the capability or not.
*/
2018-04-26 05:33:37 +03:00
bool Supports(const Capabilities &capability) const;
2018-05-16 05:31:31 +03:00
/**
* Supports the option or not.
*/
2018-04-26 05:33:37 +03:00
bool Supports(const Option &option) const;
2018-05-16 05:31:31 +03:00
/**
* Supports the addon or not.
*/
bool Supports(const AddOns &addon) const;
2018-04-26 05:33:37 +03:00
/**
* Log all stream requests and prompt user to select one.
*/
StreamRequest SelectStreamRequest(bool *ok) const;
2018-05-16 05:31:31 +03:00
/**
* Get all stream requests of the capability.
*/
2018-04-26 05:33:37 +03:00
const std::vector<StreamRequest> &GetStreamRequests(
const Capabilities &capability) const;
2018-05-16 05:31:31 +03:00
/**
* Config the stream request to the capability.
*/
2018-04-26 05:33:37 +03:00
void ConfigStreamRequest(
const Capabilities &capability, const StreamRequest &request);
/**
* Get the config stream requests of the capability.
*/
const StreamRequest &GetStreamRequest(const Capabilities &capability) const;
/**
* Get all stream requests of the key stream capability.
*/
const std::vector<StreamRequest> &GetStreamRequests() const;
/**
* Config the stream request to the key stream capability.
*/
void ConfigStreamRequest(const StreamRequest &request);
/**
* Get the config stream requests of the key stream capability.
*/
const StreamRequest &GetStreamRequest() const;
2018-04-26 05:33:37 +03:00
/**
* Get the device info.
*/
std::shared_ptr<DeviceInfo> GetInfo() const;
2018-05-16 05:31:31 +03:00
/**
* Get the device info.
*/
2018-04-26 05:33:37 +03:00
std::string GetInfo(const Info &info) const;
2019-03-01 10:25:59 +02:00
/**
* Get the sdk version.
*/
std::string GetSDKVersion() const;
2018-05-16 05:31:31 +03:00
/**
* @deprecated Get the intrinsics (pinhole) of stream.
2018-05-16 05:31:31 +03:00
*/
IntrinsicsPinhole GetIntrinsics(const Stream &stream) const;
/**
* Get the intrinsics of stream.
*/
template <typename T>
T GetIntrinsics(const Stream &stream) const;
/**
* Get the intrinsics base of stream.
*/
std::shared_ptr<IntrinsicsBase> GetIntrinsicsBase(const Stream &stream) const;
2018-05-16 05:31:31 +03:00
/**
* Get the extrinsics from one stream to another.
*/
2018-04-26 05:33:37 +03:00
Extrinsics GetExtrinsics(const Stream &from, const Stream &to) const;
2018-05-16 05:31:31 +03:00
/**
* Get the intrinsics of motion.
*/
2018-04-26 05:33:37 +03:00
MotionIntrinsics GetMotionIntrinsics() const;
2018-05-16 05:31:31 +03:00
/**
* Get the extrinsics from one stream to motion.
*/
2018-04-26 05:33:37 +03:00
Extrinsics GetMotionExtrinsics(const Stream &from) const;
2018-05-16 05:31:31 +03:00
/**
* Log all option infos.
*/
2018-04-26 05:33:37 +03:00
void LogOptionInfos() const;
2018-05-16 05:31:31 +03:00
/**
* Get the option info.
*/
2018-04-26 05:33:37 +03:00
OptionInfo GetOptionInfo(const Option &option) const;
2018-05-16 05:31:31 +03:00
/**
* Get the option value.
*/
2018-04-26 05:33:37 +03:00
std::int32_t GetOptionValue(const Option &option) const;
/**
* Set the disparity computing method.
*/
void SetDisparityComputingMethodType(
const DisparityComputingMethod &MethodType);
2018-05-16 05:31:31 +03:00
/**
* Set the option value.
*/
2018-04-26 05:33:37 +03:00
void SetOptionValue(const Option &option, std::int32_t value);
2018-05-16 05:31:31 +03:00
/**
* Run the option action.
*/
2018-04-26 05:33:37 +03:00
bool RunOptionAction(const Option &option) const;
2018-05-16 05:31:31 +03:00
/**
* Set the callback of stream.
*/
2018-04-26 09:44:47 +03:00
void SetStreamCallback(const Stream &stream, stream_callback_t callback);
2018-05-16 05:31:31 +03:00
/**
* Set the callback of motion.
*/
2018-04-26 09:44:47 +03:00
void SetMotionCallback(motion_callback_t callback);
2018-05-16 05:31:31 +03:00
/**
* Has the callback of stream.
*/
2018-04-26 09:44:47 +03:00
bool HasStreamCallback(const Stream &stream) const;
2018-05-16 05:31:31 +03:00
/**
* Has the callback of motion.
*/
2018-04-26 09:44:47 +03:00
bool HasMotionCallback() const;
2018-05-16 05:31:31 +03:00
/**
* Start capturing the source.
*/
2018-04-26 09:44:47 +03:00
void Start(const Source &source);
2018-05-16 05:31:31 +03:00
/**
* Stop capturing the source.
*/
2018-04-26 09:44:47 +03:00
void Stop(const Source &source);
2018-05-16 05:31:31 +03:00
/**
* Wait the streams are ready.
*/
2018-04-26 09:44:47 +03:00
void WaitForStreams();
2018-05-16 05:31:31 +03:00
/**
* Enable the data of stream.
* @note must enable the stream if it's a synthetic one. This means the stream
* in not native, the device has the capability to provide this stream, but
* still support this stream.
*/
2018-04-27 04:58:53 +03:00
void EnableStreamData(const Stream &stream);
2019-02-22 12:20:47 +02:00
/**
* Enable the data of stream.
* callback function will call before the father processor enable.
* when try_tag is true, the function will do nothing except callback.
2019-02-22 12:20:47 +02:00
*/
void EnableStreamData(
const Stream &stream,
stream_switch_callback_t callback,
bool try_tag = false);
2018-05-16 05:31:31 +03:00
/**
* Disable the data of stream.
*/
void DisableStreamData(const Stream &stream);
2019-02-22 12:20:47 +02:00
/**
* Disable the data of stream.
* callback function will call before the children processor disable.
* when try_tag is true, the function will do nothing except callback.
2019-02-22 12:20:47 +02:00
*/
void DisableStreamData(
const Stream &stream,
stream_switch_callback_t callback,
bool try_tag = false);
2018-05-16 05:31:31 +03:00
/**
2018-06-12 05:46:39 +03:00
* Get the latest data of stream.
2018-05-16 05:31:31 +03:00
*/
2018-04-26 09:44:47 +03:00
api::StreamData GetStreamData(const Stream &stream);
2018-05-16 05:31:31 +03:00
/**
2018-06-12 05:46:39 +03:00
* Get the datas of stream.
* @note default cache 4 datas at most.
2018-05-16 05:31:31 +03:00
*/
2018-04-26 09:44:47 +03:00
std::vector<api::StreamData> GetStreamDatas(const Stream &stream);
2018-05-16 05:31:31 +03:00
/**
* Enable cache motion datas.
*/
2018-04-26 09:44:47 +03:00
void EnableMotionDatas(
std::size_t max_size = std::numeric_limits<std::size_t>::max());
2018-05-16 05:31:31 +03:00
/**
* Get the motion datas.
*/
2018-04-26 09:44:47 +03:00
std::vector<api::MotionData> GetMotionDatas();
/**
* Enable motion datas with timestamp correspondence of some stream.
*/
void EnableTimestampCorrespondence(const Stream &stream,
bool keep_accel_then_gyro = true);
2018-05-16 05:31:31 +03:00
/**
* Enable the plugin.
*/
2018-05-08 06:12:45 +03:00
void EnablePlugin(const std::string &path);
2018-04-26 05:33:37 +03:00
std::shared_ptr<Device> device();
2018-04-26 04:22:29 +03:00
private:
std::shared_ptr<Device> device_;
2018-04-26 05:33:37 +03:00
std::unique_ptr<Synthetic> synthetic_;
2018-09-14 15:00:28 +03:00
std::unique_ptr<Correspondence> correspondence_;
motion_callback_t callback_;
2018-09-14 15:00:28 +03:00
void CheckImageParams();
2018-04-25 11:06:38 +03:00
};
2019-01-04 03:55:30 +02:00
template <typename T>
T API::GetIntrinsics(const Stream &stream) const {
auto in = GetIntrinsicsBase(stream);
return *std::dynamic_pointer_cast<T>(in);
2019-01-04 03:55:30 +02:00
}
2018-04-25 11:06:38 +03:00
MYNTEYE_END_NAMESPACE
2018-10-27 16:24:04 +03:00
#endif // MYNTEYE_API_API_H_