You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
5.5 KiB
138 lines
5.5 KiB
// License: Apache 2.0. See LICENSE file in root directory.
|
|
// Copyright(c) 2017 Intel Corporation. All Rights Reserved.
|
|
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
#include <map>
|
|
#include <utility>
|
|
#include <vector>
|
|
#include <librealsense2/rs.hpp>
|
|
#include <algorithm>
|
|
#include "../example.hpp"
|
|
#include "api_how_to.h"
|
|
#include "helper.h"
|
|
|
|
// Forward declaration of the create_sensor_actions which returns a collection of functions
|
|
// and their description that operate on a device or sensor
|
|
using sensor_action = std::pair<std::function<void(rs2::device, rs2::sensor)>, std::string>;
|
|
std::vector<sensor_action> create_sensor_actions();
|
|
|
|
int main(int argc, char * argv[]) try
|
|
{
|
|
//In this example we will go through a flow of selecting a device, then selecting one of its sensors,
|
|
// and finally run some operations on that sensor
|
|
|
|
//We will use the "how_to" class to make the code clear, expressive and encapsulate common actions inside a function
|
|
|
|
std::vector<sensor_action> sensor_actions = create_sensor_actions();
|
|
|
|
bool choose_a_device = true;
|
|
while (choose_a_device)
|
|
{
|
|
print_separator();
|
|
//First thing, let's choose a device:
|
|
rs2::device dev = how_to::get_a_realsense_device();
|
|
|
|
//Print the device's information
|
|
how_to::print_device_information(dev);
|
|
|
|
bool choose_a_sensor = true;
|
|
while (choose_a_sensor)
|
|
{
|
|
print_separator();
|
|
//Next, choose one of the device's sensors
|
|
rs2::sensor sensor = how_to::get_a_sensor_from_a_device(dev);
|
|
|
|
bool control_sensor = true;
|
|
while (control_sensor)
|
|
{
|
|
print_separator();
|
|
std::cout << "What would you like to do with the sensor?\n" << std::endl;
|
|
int i = 0;
|
|
for (auto&& action : sensor_actions)
|
|
{
|
|
std::cout << i++ << " : " << action.second << std::endl;
|
|
}
|
|
uint32_t selected_action_index = helper::get_user_selection("Select an action: ");
|
|
if (selected_action_index >= sensor_actions.size())
|
|
{
|
|
throw std::out_of_range("Selected action index is out of range");
|
|
}
|
|
|
|
auto selected_action = sensor_actions[selected_action_index].first;
|
|
|
|
bool repeat = true;
|
|
while (repeat)
|
|
{
|
|
print_separator();
|
|
selected_action(dev, sensor);
|
|
repeat = prompt_yes_no(sensor_actions[selected_action_index].second + " again?");
|
|
}
|
|
control_sensor = prompt_yes_no("Choose another action for this sensor?");
|
|
}
|
|
|
|
choose_a_sensor = prompt_yes_no("Choose another sensor?");
|
|
}
|
|
|
|
choose_a_device = prompt_yes_no("Choose another device?");
|
|
}
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|
|
catch (const rs2::error & e)
|
|
{
|
|
std::cerr << "RealSense error calling " << e.get_failed_function() << "(" << e.get_failed_args() << "):\n " << e.what() << std::endl;
|
|
return EXIT_FAILURE;
|
|
}
|
|
catch (const std::exception & e)
|
|
{
|
|
std::cerr << e.what() << std::endl;
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
void control_sensor_options(rs2::device device, rs2::sensor sensor)
|
|
{
|
|
// The rs2::sensor allows you to control its properties such as Exposure, Brightness etc.
|
|
rs2_option sensor_option = how_to::get_sensor_option(sensor);
|
|
how_to::change_sensor_option(sensor, sensor_option);
|
|
}
|
|
void display_live_stream(rs2::device device, rs2::sensor sensor)
|
|
{
|
|
// The rs2::sensor allows you to control its streams
|
|
// We will first choose a single stream profile from the available profiles of the sensor
|
|
rs2::stream_profile selected_profile = how_to::choose_a_streaming_profile(sensor);
|
|
|
|
// Next, we will display the stream in a window
|
|
how_to::start_streaming_a_profile(sensor, selected_profile);
|
|
}
|
|
void show_stream_intrinsics(rs2::device device, rs2::sensor sensor)
|
|
{
|
|
// Each stream has its own intrinsic information, first choose a stream, then display its intrinsics
|
|
rs2::stream_profile selected_profile = how_to::choose_a_streaming_profile(sensor);
|
|
how_to::get_field_of_view(selected_profile);
|
|
}
|
|
void show_extrinsics_between_streams(rs2::device device, rs2::sensor sensor)
|
|
{
|
|
// A rs2::device can have its sensors and streams calibrated and provide the extrinsics between 2 streams.
|
|
std::cout << "Please choose a sensor and then a stream that will be used as the origin of extrinsic transformation:\n" << std::endl;
|
|
rs2::sensor from_sensor = how_to::get_a_sensor_from_a_device(device);
|
|
rs2::stream_profile from = how_to::choose_a_streaming_profile(from_sensor);
|
|
|
|
std::cout << "Please choose a sensor and then a stream that will be used as the target of extrinsic transformation::\n" << std::endl;
|
|
rs2::sensor to_sensor = how_to::get_a_sensor_from_a_device(device);
|
|
rs2::stream_profile to = how_to::choose_a_streaming_profile(to_sensor);
|
|
|
|
how_to::get_extrinsics(from, to);
|
|
}
|
|
std::vector<sensor_action> create_sensor_actions()
|
|
{
|
|
//This function creates several functions ("sensor_action") that takes a device and a sensor,
|
|
// and perform some specific action
|
|
return std::vector<sensor_action> {
|
|
std::make_pair(&control_sensor_options, "Control sensor's options"),
|
|
std::make_pair(&display_live_stream, "Control sensor's streams"),
|
|
std::make_pair(&show_stream_intrinsics, "Show stream intrinsics"),
|
|
std::make_pair(&show_extrinsics_between_streams, "Display extrinsics")
|
|
};
|
|
}
|