アールテクニカ地下ガレージ

アールテクニカ株式会社の製品開発・研究開発・日々の活動です

RealSense D415/D435のデバイス情報を取得する

Author

中村@アールテクニカ

Intel RealSense SDK ver 2に含まれるサンプルコードにはデバイス情報の取得やパラメータの変更についてのコードはありません。
RealSense Viewerのソースコードにこれらの情報を取得している箇所がありますが、全体のコード量が大きいのでこの辺りの処理を簡潔にまとめたいと思います。

デバイスオブジェクトを取得する

まずはデバイスを取得するコードを説明します。
デバイスの取得方法は2つあります。

(1)全てのデバイスを列挙する

PCに接続されているデバイスをすべて取得します。

rs2::context context;
rs2::device_list devices = context.query_devices();
for (auto device : devices) {
}
(2)パイプラインからデバイスを取得する

パイプラインで使用しているデバイスを取得します。
パイプラインが開始されていないとデバイスは取得できません。

rs2::pipeline pipe;
pipe.start();
rs2::device device = pipe.get_active_profile().get_device();

デバイス情報を取得する

rs2::deviceのget_info()関数に取得したい情報をパラメータで渡すことでデバイス情報を取得することが出来ます。
取得可能な情報は以下の通りです。

パラメータ名 概要
RS2_CAMERA_INFO_PRODUCT_ID プロダクトID
RS2_CAMERA_INFO_NAME フレンドリーネーム
RS2_CAMERA_INFO_SERIAL_NUMBER シリアルナンバー
RS2_CAMERA_INFO_FIRMWARE_VERSION ファームウェアバージョン
RS2_CAMERA_INFO_RECOMMENDED_FIRMWARE_VERSION 推奨ファームウェアバージョン
RS2_CAMERA_INFO_ADVANCED_MODE アドバンスモード
RS2_CAMERA_INFO_USB_TYPE_DESCRIPTOR USBのバージョン
RS2_CAMERA_INFO_PHYSICAL_PORT USB物理ポート
デバイス情報を取得するコード
std::cout
<< "PRODUCT ID: " << device.get_info(RS2_CAMERA_INFO_PRODUCT_ID) << std::endl
<< "NAME      : " << device.get_info(RS2_CAMERA_INFO_NAME) << std::endl
<< "SERIAL NO.: " << device.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER) << std::endl
<< "FW VERSION: " << device.get_info(RS2_CAMERA_INFO_FIRMWARE_VERSION) << std::endl
<< "REC FW VER: " << device.get_info(RS2_CAMERA_INFO_RECOMMENDED_FIRMWARE_VERSION) << std::endl
<< "DEBUG OP CODE: " << device.get_info(RS2_CAMERA_INFO_DEBUG_OP_CODE) << std::endl
<< "ADMANCE MODE : " << device.get_info(RS2_CAMERA_INFO_ADVANCED_MODE) << std::endl
<< "USB DESCRIPTOR: " << device.get_info(RS2_CAMERA_INFO_USB_TYPE_DESCRIPTOR) << std::endl
<< "PHYSICAL PORT : " << device.get_info(RS2_CAMERA_INFO_PHYSICAL_PORT) << std::endl;
実行結果
PRODUCT ID: 0B07
NAME      : Intel RealSense D435
SERIAL NO.: 815412070071
FW VERSION: 05.09.13.00
REC FW VER: 05.09.09.02
DEBUG OP CODE: 15
ADMANCE MODE : YES
USB DESCRIPTOR: 3.2
PHYSICAL PORT : \\?\usb#vid_8086&pid_0b07&mi_03#6&c94b2f2&0&0003#{e5323777-f976-4f5b-9b55-b94699c46e44}\global

センサーのパラメータ値を取得する

デバイスオブジェクトは複数のセンサーを持っていてそれぞれのパラメータ値を取得・設定することが出来ます。
センサーは、rs2::device::query_sensors()関数で取得します。
D415/D435ではRGBカメラとステレオモジュールの2つのセンサーが取得されます。
RGBカメラ、デプスカメラで指定可能なパラメータに違いがあります。
指定可能なパラメータは以下の通りとなっています。

パラメータ名 概要 RGB デプス
RS2_OPTION_BACKLIGHT_COMPENSATION 逆光補正 -
RS2_OPTION_BRIGHTNESS 輝度 -
RS2_OPTION_CONTRAST コントラスト -
RS2_OPTION_EXPOSURE 露出
RS2_OPTION_GAIN ゲイン
RS2_OPTION_GAMMA ガンマ -
RS2_OPTION_HUE 色相 -
RS2_OPTION_SATURATION 彩度 -
RS2_OPTION_SHARPNESS シャープネス -
RS2_OPTION_WHITE_BALANCE ホワイトバランス -
RS2_OPTION_ENABLE_AUTO_EXPOSURE 自動露出ON/OFF
RS2_OPTION_ENABLE_AUTO_WHITE_BALANCE 自動ホワイトバランスON/OFF -
RS2_OPTION_VISUAL_PRESET 可視化プリセット -
RS2_OPTION_LASER_POWER レーザー出力 -
RS2_OPTION_EMITTER_ENABLED レーザー出力ON/OFF -
RS2_OPTION_FRAMES_QUEUE_SIZE フレームキューサイズ
RS2_OPTION_POWER_LINE_FREQUENCY 電源周波数 -
RS2_OPTION_ASIC_TEMPERATURE ASIC温度*1 -
RS2_OPTION_ERROR_POLLING_ENABLED エラーポーリングON/OFF -
RS2_OPTION_PROJECTOR_TEMPERATURE プロジェクター温度*1 -
RS2_OPTION_OUTPUT_TRIGGER_ENABLED 出力トリガーON/OFF -
RS2_OPTION_DEPTH_UNITS デプス単位 -
RS2_OPTION_AUTO_EXPOSURE_PRIORITY 自動露出優先ON/OFF -
RS2_OPTION_STEREO_BASELINE デプスカメラ間の距離(mm) -

*1 パイプライン開始後のみ対応

センサー情報を取得するコード
// センサーのオプションの現在値、最小値、最大値を出力する関数
void print_sensor_info(rs2::sensor sensor)
{
   // センサー名を出力する
    std::string sensor_name = sensor.get_info(RS2_CAMERA_INFO_NAME);
    std::cout << "Sensor Name: " << sensor_name << std::endl;

    // 全パラメータをループで回し対応しているオプションのみ出力する
    for (int i = 0; i < RS2_OPTION_COUNT; i++) {
        rs2_option opt = (rs2_option)i;
        if (sensor.supports(opt)) {
            sensor.get_option(opt);
            auto range = sensor.get_option_range(opt);
            std::cout
                << rs2_option_to_string(opt) << ": "
                << sensor.get_option(opt)
                << " (" << range.min << " - " << range.max << ") "
                << std::endl;
        }
    }
}

// パイプラインからセンサーを取得し情報を出力する
auto device = pipe.get_active_profile().get_device();
print_device_info(device);
auto sensors = device.query_sensors();
for (auto sensor : sensors) {
    print_sensor_info(sensor);
    std::cout << std::endl;
}
実行結果

最初のブロックがデプスカメラ、次がRGBカメラになります。

Sensor Name: Stereo Module
Exposure: 8500 (20 - 166000)
Gain: 16 (16 - 248)
Enable Auto Exposure: 1 (0 - 1)
Visual Preset: 0 (0 - 6)
Laser Power: 150 (0 - 360)
Emitter Enabled: 1 (0 - 1)
Frames Queue Size: 16 (0 - 32)
Asic Temperature: 43 (-40 - 125)
Error Polling Enabled: 1 (0 - 1)
Projector Temperature: 42 (-40 - 125)
Output Trigger Enabled: 0 (0 - 1)
Depth Units: 0.001 (0.0001 - 0.01)
Stereo Baseline: 49.9766 (49.9766 - 49.9766)

Sensor Name: RGB Camera
Backlight Compensation: 0 (0 - 1)
Brightness: 0 (-64 - 64)
Contrast: 50 (0 - 100)
Exposure: 156 (39 - 10000)
Gain: 64 (0 - 128)
Gamma: 300 (100 - 500)
Hue: 0 (-180 - 180)
Saturation: 64 (0 - 100)
Sharpness: 50 (0 - 100)
White Balance: 4600 (2800 - 6500)
Enable Auto Exposure: 1 (0 - 1)
Enable Auto White Balance: 1 (0 - 1)
Frames Queue Size: 16 (0 - 32)
Power Line Frequency: 3 (0 - 3)
Auto Exposure Priority: 1 (0 - 1)

センサーのパラメータ値変更

パラメータ値の変更は、センサオブジェクトのset_option()関数に変更したいパラメータと値をセットすれば可能です。

sensor.set_option(RS2_OPTION_GAIN, 100.0f);

intel RealSense™ Depth Camera D435

intel RealSense™ Depth Camera D435

Intel Realsense Depth Camera D415 [並行輸入品]

Intel Realsense Depth Camera D415 [並行輸入品]

最後に

RealSense Viewerでは今回解説した以外にも設定可能なパラメータがあるので、次回はこれらについて解説したいと思います。

Author

中村@アールテクニカ

アールテクニカのSE兼プログラマ。Web系のサーバサイド・フロントエンドからスマホ・PCのネイティブアプリまでソフトウェア開発全般が守備範囲。最近はハードウェア開発にも興味あり。

スポンサーリンク