中村@アールテクニカ
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
- 出版社/メーカー: インテル
- 発売日: 2018/01/18
- メディア: Personal Computers
- この商品を含むブログを見る
Intel Realsense Depth Camera D415 [並行輸入品]
- 出版社/メーカー: Intel
- メディア: エレクトロニクス
- この商品を含むブログを見る
最後に
RealSense Viewerでは今回解説した以外にも設定可能なパラメータがあるので、次回はこれらについて解説したいと思います。
中村@アールテクニカ
アールテクニカのSE兼プログラマ。Web系のサーバサイド・フロントエンドからスマホ・PCのネイティブアプリまでソフトウェア開発全般が守備範囲。最近はハードウェア開発にも興味あり。