feat(api): add timestamp correspondence
This commit is contained in:
parent
c6aa8d93ca
commit
73cca48f57
|
@ -219,6 +219,7 @@ if(WITH_API)
|
||||||
src/mynteye/api/processor/depth_processor_ocv.cc
|
src/mynteye/api/processor/depth_processor_ocv.cc
|
||||||
src/mynteye/api/processor/rectify_processor_ocv.cc
|
src/mynteye/api/processor/rectify_processor_ocv.cc
|
||||||
src/mynteye/api/config.cc
|
src/mynteye/api/config.cc
|
||||||
|
src/mynteye/api/correspondence.cc
|
||||||
)
|
)
|
||||||
if(WITH_CAM_MODELS)
|
if(WITH_CAM_MODELS)
|
||||||
list(APPEND MYNTEYE_SRCS
|
list(APPEND MYNTEYE_SRCS
|
||||||
|
|
|
@ -30,6 +30,7 @@ MYNTEYE_BEGIN_NAMESPACE
|
||||||
|
|
||||||
struct DeviceInfo;
|
struct DeviceInfo;
|
||||||
|
|
||||||
|
class Correspondence;
|
||||||
class Device;
|
class Device;
|
||||||
class Synthetic;
|
class Synthetic;
|
||||||
|
|
||||||
|
@ -305,6 +306,11 @@ class MYNTEYE_API API {
|
||||||
*/
|
*/
|
||||||
std::vector<api::MotionData> GetMotionDatas();
|
std::vector<api::MotionData> GetMotionDatas();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable motion datas with timestamp correspondence of some stream.
|
||||||
|
*/
|
||||||
|
void EnableTimestampCorrespondence(const Stream &stream);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable the plugin.
|
* Enable the plugin.
|
||||||
*/
|
*/
|
||||||
|
@ -317,6 +323,10 @@ class MYNTEYE_API API {
|
||||||
|
|
||||||
std::unique_ptr<Synthetic> synthetic_;
|
std::unique_ptr<Synthetic> synthetic_;
|
||||||
|
|
||||||
|
std::unique_ptr<Correspondence> correspondence_;
|
||||||
|
|
||||||
|
motion_callback_t callback_;
|
||||||
|
|
||||||
void CheckImageParams();
|
void CheckImageParams();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,10 @@ if(PCL_FOUND)
|
||||||
WITH_OPENCV WITH_PCL
|
WITH_OPENCV WITH_PCL
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
make_executable2(get_imu_correspondence
|
||||||
|
SRCS data/get_imu_correspondence.cc util/cv_painter.cc
|
||||||
|
WITH_OPENCV
|
||||||
|
)
|
||||||
make_executable2(get_imu SRCS data/get_imu.cc util/cv_painter.cc WITH_OPENCV)
|
make_executable2(get_imu SRCS data/get_imu.cc util/cv_painter.cc WITH_OPENCV)
|
||||||
make_executable2(get_from_callbacks
|
make_executable2(get_from_callbacks
|
||||||
SRCS data/get_from_callbacks.cc util/cv_painter.cc
|
SRCS data/get_from_callbacks.cc util/cv_painter.cc
|
||||||
|
|
77
samples/tutorials/data/get_imu_correspondence.cc
Normal file
77
samples/tutorials/data/get_imu_correspondence.cc
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
// 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.
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
|
||||||
|
#include "mynteye/logger.h"
|
||||||
|
#include "mynteye/api/api.h"
|
||||||
|
|
||||||
|
#include "util/cv_painter.h"
|
||||||
|
|
||||||
|
MYNTEYE_USE_NAMESPACE
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
auto &&api = API::Create(argc, argv);
|
||||||
|
if (!api) return 1;
|
||||||
|
|
||||||
|
bool ok;
|
||||||
|
auto &&request = api->SelectStreamRequest(&ok);
|
||||||
|
if (!ok) return 1;
|
||||||
|
api->ConfigStreamRequest(request);
|
||||||
|
|
||||||
|
// Enable motion datas with timestamp correspondence of some stream
|
||||||
|
api->EnableTimestampCorrespondence(Stream::LEFT);
|
||||||
|
|
||||||
|
api->Start(Source::ALL);
|
||||||
|
|
||||||
|
CVPainter painter;
|
||||||
|
|
||||||
|
cv::namedWindow("frame");
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
api->WaitForStreams();
|
||||||
|
|
||||||
|
auto &&left_data = api->GetStreamData(Stream::LEFT);
|
||||||
|
auto &&right_data = api->GetStreamData(Stream::RIGHT);
|
||||||
|
|
||||||
|
LOG(INFO) << "Img frame_id: " << left_data.img->frame_id
|
||||||
|
<< ", timestamp: " << left_data.img->timestamp;
|
||||||
|
|
||||||
|
cv::Mat img;
|
||||||
|
cv::hconcat(left_data.frame, right_data.frame, img);
|
||||||
|
|
||||||
|
auto &&motion_datas = api->GetMotionDatas();
|
||||||
|
for (auto &&data : motion_datas) {
|
||||||
|
LOG(INFO) << "Imu frame_id: " << data.imu->frame_id
|
||||||
|
<< ", timestamp: " << data.imu->timestamp;
|
||||||
|
}
|
||||||
|
LOG(INFO);
|
||||||
|
|
||||||
|
/*
|
||||||
|
painter.DrawImgData(img, *left_data.img);
|
||||||
|
if (!motion_datas.empty()) {
|
||||||
|
painter.DrawImuData(img, *motion_datas[0].imu);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
cv::imshow("frame", img);
|
||||||
|
|
||||||
|
char key = static_cast<char>(cv::waitKey(1));
|
||||||
|
if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
api->Stop(Source::ALL);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -22,6 +22,7 @@
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
#include "mynteye/logger.h"
|
#include "mynteye/logger.h"
|
||||||
|
#include "mynteye/api/correspondence.h"
|
||||||
#include "mynteye/api/dl.h"
|
#include "mynteye/api/dl.h"
|
||||||
#include "mynteye/api/plugin.h"
|
#include "mynteye/api/plugin.h"
|
||||||
#include "mynteye/api/synthetic.h"
|
#include "mynteye/api/synthetic.h"
|
||||||
|
@ -208,7 +209,7 @@ std::vector<std::string> get_plugin_paths() {
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
API::API(std::shared_ptr<Device> device, CalibrationModel calib_model)
|
API::API(std::shared_ptr<Device> device, CalibrationModel calib_model)
|
||||||
: device_(device) {
|
: device_(device), correspondence_(nullptr) {
|
||||||
VLOG(2) << __func__;
|
VLOG(2) << __func__;
|
||||||
// std::dynamic_pointer_cast<StandardDevice>(device_);
|
// std::dynamic_pointer_cast<StandardDevice>(device_);
|
||||||
synthetic_.reset(new Synthetic(this, calib_model));
|
synthetic_.reset(new Synthetic(this, calib_model));
|
||||||
|
@ -377,10 +378,15 @@ void API::SetStreamCallback(const Stream &stream, stream_callback_t callback) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void API::SetMotionCallback(motion_callback_t callback) {
|
void API::SetMotionCallback(motion_callback_t callback) {
|
||||||
static auto callback_ = callback;
|
if (correspondence_) {
|
||||||
|
correspondence_->SetMotionCallback(callback);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
callback_ = callback;
|
||||||
if (callback_) {
|
if (callback_) {
|
||||||
device_->SetMotionCallback(
|
device_->SetMotionCallback([this](const device::MotionData &data) {
|
||||||
[](const device::MotionData &data) { callback_({data.imu}); }, true);
|
callback_({data.imu});
|
||||||
|
}, true);
|
||||||
} else {
|
} else {
|
||||||
device_->SetMotionCallback(nullptr);
|
device_->SetMotionCallback(nullptr);
|
||||||
}
|
}
|
||||||
|
@ -455,15 +461,41 @@ std::vector<api::StreamData> API::GetStreamDatas(const Stream &stream) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void API::EnableMotionDatas(std::size_t max_size) {
|
void API::EnableMotionDatas(std::size_t max_size) {
|
||||||
|
if (correspondence_) return; // not cache them
|
||||||
device_->EnableMotionDatas(max_size);
|
device_->EnableMotionDatas(max_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<api::MotionData> API::GetMotionDatas() {
|
std::vector<api::MotionData> API::GetMotionDatas() {
|
||||||
|
if (correspondence_) {
|
||||||
|
return correspondence_->GetMotionDatas();
|
||||||
|
} else {
|
||||||
std::vector<api::MotionData> datas;
|
std::vector<api::MotionData> datas;
|
||||||
for (auto &&data : device_->GetMotionDatas()) {
|
for (auto &&data : device_->GetMotionDatas()) {
|
||||||
datas.push_back({data.imu});
|
datas.push_back({data.imu});
|
||||||
}
|
}
|
||||||
return datas;
|
return datas;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void API::EnableTimestampCorrespondence(const Stream &stream) {
|
||||||
|
if (correspondence_ == nullptr) {
|
||||||
|
correspondence_.reset(new Correspondence(device_, stream));
|
||||||
|
{
|
||||||
|
device_->DisableMotionDatas();
|
||||||
|
if (callback_) {
|
||||||
|
correspondence_->SetMotionCallback(callback_);
|
||||||
|
callback_ = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
using namespace std::placeholders; // NOLINT
|
||||||
|
device_->SetMotionCallback(
|
||||||
|
std::bind(&Correspondence::OnMotionDataCallback,
|
||||||
|
correspondence_.get(), _1),
|
||||||
|
true);
|
||||||
|
synthetic_->SetStreamDataListener(
|
||||||
|
std::bind(&Correspondence::OnStreamDataCallback,
|
||||||
|
correspondence_.get(), _1, _2));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void API::EnablePlugin(const std::string &path) {
|
void API::EnablePlugin(const std::string &path) {
|
||||||
|
|
64
src/mynteye/api/correspondence.cc
Normal file
64
src/mynteye/api/correspondence.cc
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
// 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.
|
||||||
|
#include "mynteye/api/correspondence.h"
|
||||||
|
|
||||||
|
#include "mynteye/device/device.h"
|
||||||
|
#include "mynteye/logger.h"
|
||||||
|
|
||||||
|
MYNTEYE_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
Correspondence::Correspondence(const std::shared_ptr<Device> &device,
|
||||||
|
const Stream &stream)
|
||||||
|
: device_(device), stream_(stream) {
|
||||||
|
VLOG(2) << __func__;
|
||||||
|
}
|
||||||
|
|
||||||
|
Correspondence::~Correspondence() {
|
||||||
|
VLOG(2) << __func__;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Correspondence::OnStreamDataCallback(
|
||||||
|
const Stream &stream, const api::StreamData &data) {
|
||||||
|
// LOG(INFO) << __func__ << ", " << stream
|
||||||
|
// << ", id: " << data.frame_id << ", stamp: " << data.img->timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Correspondence::OnMotionDataCallback(const device::MotionData &data) {
|
||||||
|
// LOG(INFO) << __func__ << ", id: " << data.imu->frame_id
|
||||||
|
// << ", stamp: " << data.imu->timestamp;
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> _(mtx_motion_datas_);
|
||||||
|
motion_datas_.push_back(data);
|
||||||
|
}
|
||||||
|
if (motion_callback_) {
|
||||||
|
motion_callback_({data.imu});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Correspondence::SetMotionCallback(API::motion_callback_t callback) {
|
||||||
|
// LOG(INFO) << __func__;
|
||||||
|
motion_callback_ = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<api::MotionData> Correspondence::GetMotionDatas() {
|
||||||
|
std::lock_guard<std::mutex> _(mtx_motion_datas_);
|
||||||
|
std::vector<api::MotionData> datas;
|
||||||
|
for (auto &&data : motion_datas_) {
|
||||||
|
datas.push_back({data.imu});
|
||||||
|
}
|
||||||
|
motion_datas_.clear();
|
||||||
|
return datas;
|
||||||
|
}
|
||||||
|
|
||||||
|
MYNTEYE_END_NAMESPACE
|
49
src/mynteye/api/correspondence.h
Normal file
49
src/mynteye/api/correspondence.h
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
// 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.
|
||||||
|
#ifndef MYNTEYE_API_CONFIG_H_
|
||||||
|
#define MYNTEYE_API_CONFIG_H_
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "mynteye/api.h"
|
||||||
|
#include "mynteye/device/callbacks.h"
|
||||||
|
|
||||||
|
MYNTEYE_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
class Correspondence {
|
||||||
|
public:
|
||||||
|
Correspondence(const std::shared_ptr<Device> &device, const Stream &stream);
|
||||||
|
~Correspondence();
|
||||||
|
|
||||||
|
void OnStreamDataCallback(const Stream &stream, const api::StreamData &data);
|
||||||
|
void OnMotionDataCallback(const device::MotionData &data);
|
||||||
|
|
||||||
|
void SetMotionCallback(API::motion_callback_t callback);
|
||||||
|
|
||||||
|
std::vector<api::MotionData> GetMotionDatas();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<Device> device_;
|
||||||
|
Stream stream_;
|
||||||
|
API::motion_callback_t motion_callback_;
|
||||||
|
std::vector<device::MotionData> motion_datas_;
|
||||||
|
std::mutex mtx_motion_datas_;
|
||||||
|
};
|
||||||
|
|
||||||
|
MYNTEYE_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // MYNTEYE_API_CONFIG_H_
|
Loading…
Reference in New Issue
Block a user