omronsentech_cameraパッケージはオムロン センテック株式会社が提供するパッケージです。 本パッケージ対応カメラはLinux版のSentechSDK対応カメラと同様です。 カメラの機能や*GenICam GenApi*ノードのアクセスはSentechSDKのカメラ制御機能(Transport Layer) モジュール経由で行います。 *GenICam GenApi*ノードとROSにあるノードとは全く別の物であることを注意下さい。 各GenICam GenApiノードは、汎用インタフェースを介してアクセス可能なカメラデバイスの機能またはレジスタに対応しています。GenICam GenApiの詳細はGenICam GenApiドキュメント(英語)を参照下さい。
本パッケージはUbuntu 16.04 64ビット上のROS-KineticとUbuntu 18.04 64ビット上のROS-Melodicで動作確認済みです。 SentechSDKのカメラ制御機能(Transport Layer) モジュールを利用するため、本パッケージをインストールする際は事前にSentechSDKをインストールする必要があります。下記のURLでSentechSDK (USB3VisionとGigEVision)がダウンロードできます: https://sentech.co.jp/products/USB/software.html.
本パッケージは下記のROSパッケージが必要となります:
インストール手順として、catkinのワークスペースにomronsentech_camera.gitをクローンするかこのレポジトリに全ファイルをコピーして下さい。 通常のROSパッケージとしてパッケージをビルドする前にSentechSDKの環境変数の設定を確認して下さい:
$ echo $STAPI_ROOT_PATH
環境変数が未設定の場合は、下記のコマンドを実行して下さい(SentechSDKを/opt/sentechにインストールした場合):
$ source /opt/sentech/.stprofile
omronsentech_cameraの内部構成は以下のとおりです。
/ |-./README.md |-./README-ja.md |-./CMakeLists.txt |-./nodelet_plugins.xml |-./package.xml |-./rosdoc.yaml |-./doc/ | |-./html/ | |-./mainpage-en.md | |-./mainpage-ja.md | |-./manifest.yaml | |-./examples/ | |-./cpp/grabber.cpp | |-./python/grabber.py | |-./include/ | |-./omronsentech_camera/*.h | |-./launch/ | |-./*.launch | |-./*.yaml | |-./msg/ | |-./*.msg | |-./src/ | |-./omronsentech_camera/*.cpp | |-./srv/ |-./*.srv
docフォルダにあるドキュメントを生成する場合、omronsentech_cameraフォルダで下記のコマンドを実行下さい:
$ rosdoc_lite -o doc
注意:Doxygenとrosdoc_liteパッケージが必要となります。
パッケージにあるstcamera_nodeはパラメータ**camera_to_connect**により自動的に最初見つけたカメラ、指定したカメラや全カメラと接続し、画像を取得します。
stcamera_nodeノードの実行は次のコマンドのいずれかを実行下さい:
$ rosrun omronsentech_camera stcamera_node
又は
$ roslaunch omronsentech_camera stcamera_node.launch
ノードをstcamera_node.launchファイルスクリプトで起動するとカメラ接続パラメータがstcamera_node.yamlで簡単に設定できます。 パラメータ設定の詳細は次の章を参照下さい。
パラメータの値は大文字と小文字を区別します。設定できるパラメータは下記の通りです:
camera_to_connect:[]
: 最初に見つけたカメラを接続します。camera_to_connect:["all"]
: 見つけた全てのカメラを接続します。キーワード「all」が提示された場合、見つけた全てのカメラを接続しようとします。camera_to_connect:["00:11:1c:f6:yy:xx","STC-MCS510U3V(00XXYY0)"]
: MACアドレス「00:11:1c:f6:yy:xx」のGigEVisionカメラとシリアル番号「00XXYY0」のUSB3Visionカメラ(STC-MCS510U3V)のみ接続します。camera_to_connect:["14210003XXYY"]
: ID「14210003XXYY」のカメラのみ接続します.stcamera_nodeはカメラと接続する際にカメラに対するトピックとサービスを宣言します。接続されたカメラを区別するために、各カメラには独自の名前空間(ネームスペース)があります。カメラのネームスペースは下記のルールで自動的に生成します:
*{dev_CAMERA-NS}*の値はサービスコール**get_device_list**また**device_connection**トピックでも得られます。
stcamera_nodeが発行するトピックは下記の通りです:
No. | トピック | 説明 |
---|---|---|
1 | device_connection | 接続または切断したときに発行されます。 |
2 | *{dev_CAMERA-NS}*/**camera_info** | ROSのimage_transport基準です。 |
3 | *{dev_CAMERA-NS}*/**chunk** | チャンクデータを取得したときに発行されます。 |
4 | *{dev_CAMERA-NS}*/**event** | カメライベントを登録し、登録されたイベントが発生したときに発行されます。 |
5 | *{dev_CAMERA-NS}*/**image_raw*** | 画像データを取得したときに発行されます(ROSのimage_transport基準)。 |
stcamera_nodeが提供するサービスは下記の通りです:
(下記に記載するGenICamノードはROSのノードとは全く別の物です)
注意:
$ rosservice call /stcamera_node/dev_CAMERA-NS/enable_image_acquisition false
$ rosservice call /stcamera_node/dev_CAMERA-NS/get_genicam_node_info RemoteDevice Width
name: "Width" description: "Width of the image provided by the device (in pixels)." name_space: "Standard" interface_type: "IInteger" access_mode: "Read Only" is_cachable: "Yes" visibility: "Beginner" caching_mode: "Write to register, write to cache on read" is_streamable: True enum_value_str_list: [] enum_value_int_list: [] current_value: "2448" min_value: "64" max_value: "2448" increment: "16" unit: '' child_node_list: []
コード | 説明 |
---|---|
< 0 | GenTLエラーコード。GenICam GenTLドキュメント(英語)をご参照下さい。 |
0 | エラー無. |
30000 | GenICamのジェネリック例外が発生しました。 |
30001 | モジュール名が無効です。 |
30002 | (GenICam) ノードが無効またはアクセス不能です。 |
30003 | イベントがすでに有効です。 |
30004 | イベントがすでに無効です。 |
30005 | 画像取得がすでに有効です。 |
30006 | 画像取得がすでに無効です。 |
30007 | チャンクがサポートされていません。 |
30008 | チャンク名が無効です。 |
30009 | トリガがサポートされていません。 |
30010 | トリガ名が無効です。 |
30011 | イベントがサポートされていません。 |
30012 | イベント名が無効です。 |
シンプルな操作と画像表示は下記の通りの流れを参照下さい。
$ roslaunch omronsentech_camera stcamera_node.launch
$ rosservice call /stcamera_node/get_device_list
device_list:
image_viewを実行します:
$ rosrun image_view image_view image:=/stcamera_node/dev_14210XXYYYZZ/image_raw
、dev_14210XXYYYZZは接続されているカメラのネームスペースです。
カメラのGain(IFloatタイプ)を100.0に変更する場合は、次のようにGenicam書き込みノード・サービスを使用します:
$ rosservice call /stcamera_node/dev_14210XXYYYZZ/write_node_float RemoteDevice Gain 100.0
又は
$ rosservice call /stcamera_node/dev_14210XXYYYZZ/write_node RemoteDevice Gain "'100.0'"
現在のGain値を読み取るには、次のようにGenICam読み取りノードサービスを使用します:
$ rosservice call /stcamera_node/dev_14210XXYYYZZ/read_node_float RemoteDevice
又は
$ rosservice call /stcamera_node/dev_14210XXYYYZZ/read_node RemoteDevice Gain
get_genicam_node_info でGainノード情報を確認する場合は:
$ rosservice call /stcamera_node/dev_14210XXYYYZZ/get_genicam_node_info RemoteDevice Gain
name: "Gain" description: "Controls the selected gain as an absolute physical value. This is an amplification\ \ factor applied to the video signal." name_space: "Standard" interface_type: "IFloat" access_mode: "Read and Write" is_cachable: "Yes" visibility: "Beginner" caching_mode: "Write to register, write to cache on read" is_streamable: True enum_value_str_list: [] enum_value_int_list: [] current_value: "100" min_value: "0.000000" max_value: "192.000000" increment: '' unit: '' child_node_list: []
4.2. Launchファイルスクリプトの事例
Launchファイルスクリプトの例とそのパラメータはパッケージに含まれています。 それらを使用するには、次の手順を参照下さい。
<arg name="camera_namespace" default="dev_CAMERA-NS" />
camera_to_connect: ["CAMERA_ID or CAMERA_MODEL(SERIAL)"]
default_calibration_file: file:///home/mydata/calibration.xml
4.3. ROSノードクライアント事例
exampleフォルダにあるノード「grabber」はシンプルなROSノードクライアント(両方C++とPythonベースがあります)事例として提供します。Grabberは下記の処理を行います:
- サービス「**get_sdk_info**」を呼び出して、SentechSDKとGenTL情報を取得し、画面に表示します。
- サービス「**get_device_list**」を呼び出して、接続済みのカメラを検出し、カメラのネームスペースを取得します。
- サービス「**get_genicam_node_info**」と「**write_node_float**」を呼び出して、カメラのGain値を読み取りと書き込みます。
- トピック「image_raw」を参照して、十枚まで画像を取得し、画像サイズとエンコード情報を画面に表示します。
- サービス「**enable_trigger**」を呼び出して、トリガモードを有効にして、十回まで一秒間ごとにサービス「**send_soft_trigger**」を呼び出して、画像を取得します。トリガモードを有効にする際、セレクタはFrameStartを指定し、ソースはSoftwareを指定します。
GigEVisionカメラを利用する場合は、カメラに有効なIPアドレスがあることを確認して下さい。IPアドレスは、サービス「**get_device_list**」または「**get_gige_ip**」を呼び出すことで確認できます。静的IPアドレスは、サービス「**set_gige_ip**」で設定できます。例:
$ rosservice call /stcamera_node/get_gige_ip "00:11:1c:xx:xx:xx"
(MACアドレス「00:11:1c:xx:xx:xx」を持っているGigEVisionカメラのIPアドレスを取得する場合)、及び
$ rosservice call /stcamera_node/set_gige_ip "00:11:1c:xx:xx:xx" 192.168.y.z 255.255.255.0 0.0.0.0
(MACアドレス「00:11:1c:xx:xx:xx」を持っているGigEVisionカメラの静的IPアドレスを設定する場合)
5. カスタマイズ
stcamera_nodeは、OMRON SENTECHカメラを制御するために、一般的な機能を提供します。特定のカメラに対応するためのカスタマイズが必要な場合は、StCameraInterfaceクラスを継承し、別途のROSノードを作成するか既存のstcamera_node(StCameraNodeクラス)を編集する必要があります。stcamera_node(StCameraNodeクラス)を編集する場合、StCameraNodeクラスのinitializeCamera()関数にあるカメラインターフェイス初期化プロセスを編集する必要があります。 StCameraInterfaceやStCameraNodeクラスの構造については、doxygenドキュメントを参照下さい。
6. API ドキュメント
コードのAPIやMsg/Srv APIのドキュメントは下記のURLでアクセスできます:https://wiki.ros.org/omronsentech_camera.
7. 質問・フィードバックや不具合の報告
質問・フィードバックやバグが見つかった場合は、support-ros AT sentech.co DOT jpにお問い合わせ下さい。