diff --git a/samples/tutorials/CMakeLists.txt b/samples/tutorials/CMakeLists.txt index 0f1b804..992c157 100644 --- a/samples/tutorials/CMakeLists.txt +++ b/samples/tutorials/CMakeLists.txt @@ -115,7 +115,9 @@ make_executable2(get_with_plugin SRCS data/get_with_plugin.cc WITH_OPENCV) ## control make_executable2(ctrl_framerate SRCS control/framerate.cc WITH_OPENCV) +make_executable2(ctrl_imu_low_pass_filter SRCS control/imu_low_pass_filter.cc WITH_OPENCV) make_executable2(ctrl_imu_range SRCS control/imu_range.cc WITH_OPENCV) +make_executable2(ctrl_infrared SRCS control/infrared.cc WITH_OPENCV) make_executable2(ctrl_auto_exposure SRCS control/auto_exposure.cc util/cv_painter.cc WITH_OPENCV diff --git a/samples/tutorials/control/auto_exposure.cc b/samples/tutorials/control/auto_exposure.cc index 1c768c4..72dcae6 100644 --- a/samples/tutorials/control/auto_exposure.cc +++ b/samples/tutorials/control/auto_exposure.cc @@ -29,26 +29,57 @@ int main(int argc, char *argv[]) { if (!ok) return 1; api->ConfigStreamRequest(request); - // auto-exposure: 0 - api->SetOptionValue(Option::EXPOSURE_MODE, 0); + Model model = api->GetModel(); - // max_gain: range [0,255], default 8 - api->SetOptionValue(Option::MAX_GAIN, 8); - // max_exposure_time: range [0,1000], default 333 - api->SetOptionValue(Option::MAX_EXPOSURE_TIME, 333); - // desired_brightness: range [1,255], default 122 - api->SetOptionValue(Option::DESIRED_BRIGHTNESS, 122); - // min_exposure_time: range [0,1000], default 0 - api->SetOptionValue(Option::MIN_EXPOSURE_TIME, 0); + // Set auto exposure options fo s1030 + if (model == Model::STANDARD) { + // auto-exposure: 0 + api->SetOptionValue(Option::EXPOSURE_MODE, 0); - LOG(INFO) << "Enable auto-exposure"; - LOG(INFO) << "Set MAX_GAIN to " << api->GetOptionValue(Option::MAX_GAIN); - LOG(INFO) << "Set MAX_EXPOSURE_TIME to " - << api->GetOptionValue(Option::MAX_EXPOSURE_TIME); - LOG(INFO) << "Set DESIRED_BRIGHTNESS to " - << api->GetOptionValue(Option::DESIRED_BRIGHTNESS); - LOG(INFO) << "Set MIN_EXPOSURE_TIME to " - << api->GetOptionValue(Option::MIN_EXPOSURE_TIME); + // max_gain: range [0,48], default 48 + api->SetOptionValue(Option::MAX_GAIN, 48); + // max_exposure_time: range [0,240], default 240 + api->SetOptionValue(Option::MAX_EXPOSURE_TIME, 240); + // desired_brightness: range [0,255], default 192 + api->SetOptionValue(Option::DESIRED_BRIGHTNESS, 192); + + LOG(INFO) << "Enable auto-exposure"; + LOG(INFO) << "Set EXPOSURE_MODE to " + << api->GetOptionValue(Option::EXPOSURE_MODE); + LOG(INFO) << "Set EXPOSURE_MODE to " + << api->GetOptionValue(Option::EXPOSURE_MODE); + LOG(INFO) << "Set MAX_GAIN to " << api->GetOptionValue(Option::MAX_GAIN); + LOG(INFO) << "Set MAX_EXPOSURE_TIME to " + << api->GetOptionValue(Option::MAX_EXPOSURE_TIME); + LOG(INFO) << "Set DESIRED_BRIGHTNESS to " + << api->GetOptionValue(Option::DESIRED_BRIGHTNESS); + } + + // Set auto exposure options fo s210a or s2000 + if (model == Model::STANDARD2) { + // auto-exposure: 0 + api->SetOptionValue(Option::EXPOSURE_MODE, 0); + + // max_gain: range [0,255], default 8 + api->SetOptionValue(Option::MAX_GAIN, 8); + // max_exposure_time: range [0,1000], default 333 + api->SetOptionValue(Option::MAX_EXPOSURE_TIME, 333); + // desired_brightness: range [1,255], default 122 + api->SetOptionValue(Option::DESIRED_BRIGHTNESS, 122); + // min_exposure_time: range [0,1000], default 0 + api->SetOptionValue(Option::MIN_EXPOSURE_TIME, 0); + + LOG(INFO) << "Enable auto-exposure"; + LOG(INFO) << "Set EXPOSURE_MODE to " + << api->GetOptionValue(Option::EXPOSURE_MODE); + LOG(INFO) << "Set MAX_GAIN to " << api->GetOptionValue(Option::MAX_GAIN); + LOG(INFO) << "Set MAX_EXPOSURE_TIME to " + << api->GetOptionValue(Option::MAX_EXPOSURE_TIME); + LOG(INFO) << "Set DESIRED_BRIGHTNESS to " + << api->GetOptionValue(Option::DESIRED_BRIGHTNESS); + LOG(INFO) << "Set MIN_EXPOSURE_TIME to " + << api->GetOptionValue(Option::MIN_EXPOSURE_TIME); + } api->Start(Source::VIDEO_STREAMING); diff --git a/samples/tutorials/control/framerate.cc b/samples/tutorials/control/framerate.cc index 52ca904..425647b 100644 --- a/samples/tutorials/control/framerate.cc +++ b/samples/tutorials/control/framerate.cc @@ -30,6 +30,30 @@ int main(int argc, char *argv[]) { if (!ok) return 1; api->ConfigStreamRequest(request); + Model model = api->GetModel(); + + // Set frame rate options for s1030 + if (model == Model::STANDARD) { + // Attention: must set FRAME_RATE and IMU_FREQUENCY together, + // otherwise won't. + // succeed. + + // FRAME_RATE values: 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60 + api->SetOptionValue(Option::FRAME_RATE, 25); + // IMU_FREQUENCY values: 100, 200, 250, 333, 500 + api->SetOptionValue(Option::IMU_FREQUENCY, 500); + + LOG(INFO) << "Set FRAME_RATE to " + << api->GetOptionValue(Option::FRAME_RATE); + LOG(INFO) << "Set IMU_FREQUENCY to " + << api->GetOptionValue(Option::IMU_FREQUENCY); + } + + // You should set frame rate for S210A by 'SelectStreamRequest()' + if (model == Model::STANDARD2) { + LOG(INFO) << "Please set frame rate by 'SelectStreamRequest()'"; + } + // Count img std::atomic_uint img_count(0); api->SetStreamCallback( @@ -38,6 +62,13 @@ int main(int argc, char *argv[]) { ++img_count; }); + // Count imu + std::atomic_uint imu_count(0); + api->SetMotionCallback([&imu_count](const api::MotionData &data) { + CHECK_NOTNULL(data.imu); + ++imu_count; + }); + api->Start(Source::ALL); cv::namedWindow("frame"); @@ -70,5 +101,7 @@ int main(int argc, char *argv[]) { << ", cost: " << elapsed_ms << "ms"; LOG(INFO) << "Img count: " << img_count << ", fps: " << (1000.f * img_count / elapsed_ms); + LOG(INFO) << "Imu count: " << imu_count + << ", hz: " << (1000.f * imu_count / elapsed_ms); return 0; } diff --git a/samples/tutorials/control/imu_low_pass_filter.cc b/samples/tutorials/control/imu_low_pass_filter.cc new file mode 100644 index 0000000..001c91d --- /dev/null +++ b/samples/tutorials/control/imu_low_pass_filter.cc @@ -0,0 +1,104 @@ +// 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 + +#include + +#include "mynteye/logger.h" +#include "mynteye/api/api.h" +#include "mynteye/util/times.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); + + Model model = api->GetModel(); + + // MYNTEYE-S1030 don't support this option + if (model == Model::STANDARD) { + LOG(INFO) << "Sorry,MYNTEYE-S1030 don't support imu low pass settings"; + return 0; + } + + // Set imu low pass filter for s210a + if (model == Model::STANDARD2) { + // ACCELEROMETER_RANGE values: 0, 1, 2 + api->SetOptionValue(Option::ACCELEROMETER_LOW_PASS_FILTER, 2); + // GYROSCOPE_RANGE values: 23, 64 + api->SetOptionValue(Option::GYROSCOPE_LOW_PASS_FILTER, 64); + + LOG(INFO) << "Set ACCELEROMETER_LOW_PASS_FILTER to " + << api->GetOptionValue(Option::ACCELEROMETER_LOW_PASS_FILTER); + LOG(INFO) << "Set GYROSCOPE_LOW_PASS_FILTER to " + << api->GetOptionValue(Option::GYROSCOPE_LOW_PASS_FILTER); + } + + // Count img + std::atomic_uint img_count(0); + api->SetStreamCallback( + Stream::LEFT, [&img_count](const api::StreamData &data) { + CHECK_NOTNULL(data.img); + ++img_count; + }); + + // Count imu + std::atomic_uint imu_count(0); + api->SetMotionCallback([&imu_count](const api::MotionData &data) { + CHECK_NOTNULL(data.imu); + ++imu_count; + }); + + api->Start(Source::ALL); + + cv::namedWindow("frame"); + + auto &&time_beg = times::now(); + while (true) { + api->WaitForStreams(); + + auto &&left_data = api->GetStreamData(Stream::LEFT); + auto &&right_data = api->GetStreamData(Stream::RIGHT); + + cv::Mat img; + cv::hconcat(left_data.frame, right_data.frame, img); + cv::imshow("frame", img); + + char key = static_cast(cv::waitKey(1)); + if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q + break; + } + } + auto &&time_end = times::now(); + + api->Stop(Source::ALL); + + // Calculate img fps and imu hz + float elapsed_ms = + times::count(time_end - time_beg) * 0.001f; + LOG(INFO) << "Time beg: " << times::to_local_string(time_beg) + << ", end: " << times::to_local_string(time_end) + << ", cost: " << elapsed_ms << "ms"; + LOG(INFO) << "Img count: " << img_count + << ", fps: " << (1000.f * img_count / elapsed_ms); + LOG(INFO) << "Imu count: " << imu_count + << ", hz: " << (1000.f * imu_count / elapsed_ms); + return 0; +} diff --git a/samples/tutorials/control/imu_range.cc b/samples/tutorials/control/imu_range.cc index 93f776c..e23f364 100644 --- a/samples/tutorials/control/imu_range.cc +++ b/samples/tutorials/control/imu_range.cc @@ -30,10 +30,23 @@ int main(int argc, char *argv[]) { if (!ok) return 1; api->ConfigStreamRequest(request); - // ACCELEROMETER_RANGE values: 6, 12, 24, 32 - api->SetOptionValue(Option::ACCELEROMETER_RANGE, 6); - // GYROSCOPE_RANGE values: 250, 500, 1000, 2000, 4000 - api->SetOptionValue(Option::GYROSCOPE_RANGE, 1000); + Model model = api->GetModel(); + + // Set imu range for s1030 + if (model == Model::STANDARD) { + // ACCELEROMETER_RANGE values: 4, 8, 16, 32 + api->SetOptionValue(Option::ACCELEROMETER_RANGE, 8); + // GYROSCOPE_RANGE values: 500, 1000, 2000, 4000 + api->SetOptionValue(Option::GYROSCOPE_RANGE, 1000); + } + + // Set imu range for s210a + if (model == Model::STANDARD2) { + // ACCELEROMETER_RANGE values: 6, 12, 24, 32 + api->SetOptionValue(Option::ACCELEROMETER_RANGE, 6); + // GYROSCOPE_RANGE values: 250, 500, 1000, 2000, 4000 + api->SetOptionValue(Option::GYROSCOPE_RANGE, 1000); + } LOG(INFO) << "Set ACCELEROMETER_RANGE to " << api->GetOptionValue(Option::ACCELEROMETER_RANGE); diff --git a/samples/tutorials/control/infrared.cc b/samples/tutorials/control/infrared.cc new file mode 100644 index 0000000..d04cadd --- /dev/null +++ b/samples/tutorials/control/infrared.cc @@ -0,0 +1,69 @@ +// 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 + +#include "mynteye/logger.h" +#include "mynteye/api/api.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); + + Model model = api->GetModel(); + + // Set ir low pass filter for s210a + if (model == Model::STANDARD) { + // ir control: range [0,160], default 0 + api->SetOptionValue(Option::IR_CONTROL, 80); + + LOG(INFO) << "Set IR_CONTROL to " + << api->GetOptionValue(Option::IR_CONTROL); + } + + // MYNTEYE-S210A don't support this option + if (model == Model::STANDARD2) { + LOG(INFO) << "Sorry,MYNTEYE-S210A don't support ir control"; + return 0; + } + + api->Start(Source::VIDEO_STREAMING); + + cv::namedWindow("frame"); + + while (true) { + api->WaitForStreams(); + + auto &&left_data = api->GetStreamData(Stream::LEFT); + auto &&right_data = api->GetStreamData(Stream::RIGHT); + + cv::Mat img; + cv::hconcat(left_data.frame, right_data.frame, img); + cv::imshow("frame", img); + + char key = static_cast(cv::waitKey(1)); + if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q + break; + } + } + + api->Stop(Source::VIDEO_STREAMING); + return 0; +} diff --git a/samples/tutorials/control/manual_exposure.cc b/samples/tutorials/control/manual_exposure.cc index daa6fb9..8c84deb 100644 --- a/samples/tutorials/control/manual_exposure.cc +++ b/samples/tutorials/control/manual_exposure.cc @@ -29,14 +29,42 @@ int main(int argc, char *argv[]) { if (!ok) return 1; api->ConfigStreamRequest(request); - // manual-exposure: 1 - api->SetOptionValue(Option::EXPOSURE_MODE, 1); + Model model = api->GetModel(); - // brightness/exposure_time: range [0,240], default 120 - api->SetOptionValue(Option::BRIGHTNESS, 120); + // Set manual exposure options fo s1030 + if (model == Model::STANDARD) { + // manual-exposure: 1 + api->SetOptionValue(Option::EXPOSURE_MODE, 1); + // gain: range [0,48], default 24 + api->SetOptionValue(Option::GAIN, 24); + // brightness/exposure_time: range [0,240], default 120 + api->SetOptionValue(Option::BRIGHTNESS, 120); + // contrast/black_level_calibration: range [0,255], default 127 + api->SetOptionValue(Option::CONTRAST, 127); - LOG(INFO) << "Enable manual-exposure"; - LOG(INFO) << "Set BRIGHTNESS to " << api->GetOptionValue(Option::BRIGHTNESS); + LOG(INFO) << "Enable manual-exposure"; + LOG(INFO) << "Set EXPOSURE_MODE to " + << api->GetOptionValue(Option::EXPOSURE_MODE); + LOG(INFO) << "Set GAIN to " << api->GetOptionValue(Option::GAIN); + LOG(INFO) << "Set BRIGHTNESS to " + << api->GetOptionValue(Option::BRIGHTNESS); + LOG(INFO) << "Set CONTRAST to " << api->GetOptionValue(Option::CONTRAST); + } + + // Set manual exposure options fo s210a or s2000 + if (model == Model::STANDARD2) { + // manual-exposure: 1 + api->SetOptionValue(Option::EXPOSURE_MODE, 1); + + // brightness/exposure_time: range [0,240], default 120 + api->SetOptionValue(Option::BRIGHTNESS, 120); + + LOG(INFO) << "Enable manual-exposure"; + LOG(INFO) << "Set EXPOSURE_MODE to " + << api->GetOptionValue(Option::EXPOSURE_MODE); + LOG(INFO) << "Set BRIGHTNESS to " + << api->GetOptionValue(Option::BRIGHTNESS); + } api->Start(Source::VIDEO_STREAMING);