Skip to content

Latest commit

 

History

History
293 lines (221 loc) · 20.2 KB

README-ja.md

File metadata and controls

293 lines (221 loc) · 20.2 KB

OMRON SENTECHカメラ用ROS2ノード

1. 概要

stcamera_ros2パッケージはオムロン センテック株式会社が提供するパッケージで、SentechSDKに対応しているカメラをROS2で使用するためのものです。 ROS2のトピックやサービスを使用して、カメラから画像の取得やカメラの設定、トリガー生成等を行うことができます。 GenICam GenApiノードとROSにあるノードとは全く別の物であることにご注意下さい。 各GenICamGenApiノードは、汎用的なインターフェースを使用して、カメラの情報取得や設定に使用されます。GenICam GenApiの詳細はGenICam GenApiドキュメント(英語)をご参照下さい。

2. インストール

本パッケージはUbuntu 22.04 64ビット上のROS2-Humble Hawksbillで動作確認を行っております。 本パッケージはSentechSDK(v1.2.1以降)を利用するため、本パッケージをインストールする前に、予めSentechSDKをインストールしてください。SetenchSDKを初めて使用される場合は、SentechSDK付属のドキュメントをご覧の上、SentechSDKのViewer(StViewer)でカメラからの画像が取得できることを確認しておくと、後の作業がスムーズに行えます。また、StViewerを使用して予めカメラの設定を変更し、UserSetSave/UserSetDefaultを使用してカメラにその設定を保存しておくことで、ROS2でのカメラ設定が不要になる場合があります。SentechSDKは、下記のURLからダウンロード可能です。

SentechSDKダウンロードサイト

SentechSDKのインストール方法や使用方法の詳細については、SentechSDKに付属の資料をご参照ください。 SentechSDKを使用するための環境変数が未設定の場合は、下記のようなコマンドを実行して下さい(SentechSDKを/opt/sentechにインストールした場合)。

source /opt/sentech/.stprofile

ROS2の環境設定が行われていない場合は、下記のコマンドを実行してください。

source /opt/ros/humble/setup.bash

ワークスペース(例:~/dev_ws)を作成し、カレントディレクトリを移動します。

mkdir -p ~/dev_ws/src
cd ~/dev_ws/src

stcamera_ros2プロジェクトをクローンします。

git clone https://github.com/ose-support-ros/stcamera_ros2.git -b humble

依存関係をチェックし、必要なパッケージをインストールします。

cd ~/dev_ws
rosdep install -i --from-path src --rosdistro humble -y

ビルドします。

 colcon build

3. StCameraNode

パッケージにあるStCameraNodeを生成すると、パラメータcamera_to_connectに応じて指定されたカメラからの画像取得が開始されます。 StCameraNodeは、下記のいずれかのコマンドで生成できます。

source install/setup.bash
ros2 launch stcamera_launch stcamera_launch.py

又は

source install/setup.bash
ros2 component standalone --node-name 'stcameras' --node-namespace '/stcamera_launch' stcamera_components stcamera::StCameraNode

又は

source install/setup.bash
ros2 run rclcpp_components component_container

でコンテナを起動した後、別のコンソールから

source install/setup.bash
ros2 component load /ComponentManager  -n 'stcameras' --node-namespace '/stcamera_launch' stcamera_components stcamera::StCameraNode

2番目、3番目の方法で記載されているノード名やネームスペースの指定はオプションですが、上記のように指定しておくことで、サンプルプログラムを動作させることができるようになります。 StCameraNodeをstcamera_launchファイルスクリプトで起動するとカメラ接続パラメータがdefault.yaml(./install/stcamera_launch/share/stcamera_launch/config/)で簡単に設定できます。 パラメータ設定の詳細は次の章を参照下さい。

3.1. ノードパラメータ

パラメータの値は大文字と小文字を区別します。設定できるパラメータは下記の通りです。

  • camera_to_connect : ROS2で使用するカメラを指定します。このパラメーターは、StCameraNodeが実行される前に設定する必要があります。 実行中にこのパラメーターを変更しても、その変更は反映されません。設定が空の場合、最初に検出されたカメラが使用されます。"all"が指定されている場合は、検出された全てのカメラが使用されます。CAMERA_ID又はCAMERA_MODEL(SERIAL)が指定されている場合、指定したカメラのみ使用されます。

  • camera_to_connect: []: 最初に検出されたカメラが使用されます。
  • camera_to_connect: ["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」のカメラが使用されます。

3.2. カメラの名前空間(ネームスペース)

StCameraNodeはカメラごとにトピックとサービスを宣言します。個々のカメラのトピックおよびサービスへアクセスする際に使用される各カメラのネームスペースは、下記のルールで自動的に生成されます。

  • camera_to_connectが空または["all"]の場合、ネームスペースの形式は dev_{CAMERA_ID}になります。{CAMERA_ID} はカメラのID。接続されたカメラIDが「14210003xxYY」の場合、ネームスペースは「dev_14210003xxYY」になります. GigEVisionのMACアドレスなどのカメラIDの英数字以外の文字は、アンダースコアに置き換えられます。
  • camera_to_connectがCAMERA_MODEL(SERIAL)またはCAMERA_IDの場合、ネームスペースの形式はdev_{CAMERA_MODEL_SERIAL_}または dev_{CAMERA_ID}になります。{CAMERA_MODEL_SERIAL_}はCAMERA_MODEL(SERIAL)からの書き換えられた文字列です. {CAMERA_ID} はカメラIDです。英数字以外の文字は、アンダースコアに置き換えられます。

3.3. トピック

StCameraNodeにより発行されるトピックは下記の通りです。

トピック 説明
device_connection 接続または切断したときに発行されます。
{dev_CAMERA-NS}/event カメライベントを登録し、登録されたイベントが発生したときに発行されます。
{dev_CAMERA-NS}/chunk チャンクデータを取得したときに発行されます。
{dev_CAMERA-NS}/image_raw* 画像データを取得したときに発行されます(ROSのimage_transportに基づくトピックです)。
{dev_CAMERA-NS}/camera_info ROSのimage_transportに基づくトピックです。

3.4. サービス

StCameraNodeが提供するサービスは下記の通りです。

(下記に記載するGenICamノードはROSのノードとは全く別の物です)

サービス 説明
get_sdk_info SentechSDKバージョンとGenTLプロデューサの情報を取得します。
get_module_list GenTLモジュール名のリストを取得します(SystemInterfaceLocalDeviceRemoteDeviceDataStream)。 モジュール名は特定のGenICamノードにアクセスする際に引数として渡す必要があります。例えば、read_nodeまたはwrite_nodeサービス経由でカメラのGainにアクセスするには、モジュール名にRemoteDeviceを、GenICamノード名にGainを指定する必要があります。
get_device_list 検出されたデバイスのリストを取得します。
{dev_CAMERA-NS}/get_image_acquisition_status 画像取得のステータスを取得します。
{dev_CAMERA-NS}/enable_image_acquisition 画像取得を開始(有効)または停止(無効)します(StCameraNode生成時またはカメラ接続時に、自動で有効になります)。
{dev_CAMERA-NS}/get_event_acquisition_status_list 全GenTLモジュールのイベント取得のステータスを取得します。
{dev_CAMERA-NS}/enable_event_acquisition 指定されたGenTLモジュールのイベント取得を開始(有効)または停止(無効)します。
{dev_CAMERA-NS}/get_event_node_status_list 指定されたGenTLモジュールのGenICamノードイベント取得のステータスを取得します。
{dev_CAMERA-NS}/enable_event_node 指定されたGenTLモジュールのGenICamノードのイベントコールバックを有効または無効にします。
{dev_CAMERA-NS}/get_chunk_list カメラがサポートするチャンクのリストとステータスを取得します。利用する前に、画像取り込みを停止させる必要があります。
{dev_CAMERA-NS}/enable_chunk カメラのチャンク出力を有効または無効に設定します。
{dev_CAMERA-NS}/get_trigger_list カメラがサポートしているトリガーのリストを取得します。
{dev_CAMERA-NS}/enable_trigger 指定されたトリガのOn/Offやトリガー源などの設定を行います。
{dev_CAMERA-NS}/send_soft_trigger カメラへソフトウェアトリガーを送信します。
{dev_CAMERA-NS}/execute_node 指定されたGenICamノード(ICommandインターフェースタイプ)を実行します。
{dev_CAMERA-NS}/get_genicam_node_info 指定されたGenICamノードの情報を取得します。
{dev_CAMERA-NS}/read_node 指定されたGenICamノードの値を文字列として読み取ります。GenICamノードのインターフェースタイプがIInteger, IFloat, IBoolean, IString, IEnumerationの時のみ使用可能です。
{dev_CAMERA-NS}/write_node 指定されたGenICamノードの値を指定した文字列で更新します。GenICamノードのインターフェースタイプがIInteger, IFloat, IBoolean, IString, IEnumerationの時のみ使用可能です。
{dev_CAMERA-NS}/read_node_bool 指定されたGenICamノード(IBooleanインターフェースタイプ)の値を読み取ります。
{dev_CAMERA-NS}/write_node_bool 指定されたGenICamノード(IBooleanインターフェースタイプ)に値を書き込みます。
{dev_CAMERA-NS}/get_enum_list 指定されたGenICamノード(IEnumerationインターフェースタイプ)の列挙子のリストを取得します。
{dev_CAMERA-NS}/read_node_enum 指定されたGenICamノード(IEnumerationインターフェースタイプ)の値を読み込みます。
{dev_CAMERA-NS}/write_node_enum_int 指定されたGenICamノード(IEnumerationインターフェースタイプ)に列挙子の整数値を書き込みます。
{dev_CAMERA-NS}/write_node_enum_str 指定されたGenICamノード(IEnumerationインターフェースタイプ)に列挙子の文字列を書き込みます。
{dev_CAMERA-NS}/read_node_int 指定されたGenICamノード(IIntegerインターフェースタイプ)の値を読み取ります。
{dev_CAMERA-NS}/write_node_int 指定されたGenICamノード(IIntegerインターフェースタイプ)に値を書き込みます。
{dev_CAMERA-NS}/read_node_float 指定されたGenICamノード(IFloatインターフェースタイプ)の値を読み取ります。
{dev_CAMERA-NS}/write_node_float 指定されたGenICamノード(IFloatインターフェースタイプ)に値を書き込みます。
{dev_CAMERA-NS}/read_node_string 指定されたGenICamノード(IStringインターフェースタイプ)の値を読み取ります。
{dev_CAMERA-NS}/write_node_string 指定されたGenICamノード(IStringインターフェースタイプ)に値を書き込みます。
{dev_CAMERA-NS}/read_node_port 指定されたGenICamノード(IPortインターフェースタイプ)を使用して指定したアドレスの値を読み取ります。
{dev_CAMERA-NS}/write_node_port 指定されたGenICamノード(IPortインターフェースタイプ)を使用して指定したアドレスに値を書き込みます。
{dev_CAMERA-NS}/read_node_register_info 指定されたGenICamノード(IRegisterインターフェースタイプ)の情報を読み取ります。
{dev_CAMERA-NS}/read_node_register 指定されたGenICamノード(IRegisterインターフェースタイプ)の値を読み取ります。
{dev_CAMERA-NS}/write_node_register 指定されたGenICamノード(IRegisterインターフェースタイプ)に値を書き込みます。
{dev_CAMERA-NS}/set_camera_info ROSのimage_transportに基づくサービスです。

注意

  • 画像取得中にはアクセスできないGenICamノードがあります(エラー発生)。その際には画像の取得を停止にしてから再度アクセスして下さい。サービスコールenable_image_acquisitionで画像取得停止ができます。
ros2 service call /stcamera_launch/dev_CAMERA-NS/enable_image_acquisition stcamera_msgs/srv/EnableImageAcquisition "{value: false}"
waiting for service to become available...
requester: making request: stcamera_msgs.srv.EnableImageAcquisition_Request(value=False)

response:
stcamera_msgs.srv.EnableImageAcquisition_Response()
  • IntegerタイプのGenICamノードは設定できる値に制限がある場合があります。下記の設定値ではincrementが16になっているため、増減させる際の値がその倍数になっていない場合にはエラーが発生します。
ros2 service call /stcamera_launch/dev_CAMERA-NS/get_genicam_node_info stcamera_msgs/srv/GetGenICamNodeInfo "{genicam_module: 'RemoteDevice', genicam_node: 'Width'}"
requester: making request: stcamera_msgs.srv.GetGenICamNodeInfo_Request(genicam_module='RemoteDevice', genicam_node='Width')

response:
stcamera_msgs.srv.GetGenICamNodeInfo_Response(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=[])
  • 使用中に変更する必要のないカメラ設定については、予めSentechSDK付属のStViewerで設定を行い、カメラへ保存(UserSetSave)し、カメラの電源投入時に反映されるように設定(UserSetDefault)しておくことで、毎回設定する手間を省くことができます。

3.5. エラーコード

コード 説明
< 0 GenTLエラーコード。GenICam GenTLドキュメント(英語)をご参照下さい。
0 エラー無.
30000 GenICamのジェネリック例外が発生しました。
30001 GenICamモジュール名が無効です。
30002 GenICamノードが無効またはアクセス不能です。
30003 イベントがすでに有効です。
30004 イベントがすでに無効です。
30005 画像取得がすでに有効です。
30006 画像取得がすでに無効です。
30007 チャンクがサポートされていません。
30008 チャンク名が無効です。
30009 トリガーがサポートされていません。
30010 トリガー名が無効です。
30011 イベントがサポートされていません。
30012 イベント名が無効です。

4. 使用法

4.1. rqt_image_viewで取得画像を表示し、コマンドラインからカメラのGain設定を変更する

  • StCameraNodeを生成します。
cd ~/dev_ws
source install/setup.bash
ros2 launch stcamera_launch stcamera_launch.py
  • 現在発行されているトピックの名前を確認します。
ros2 topic list
  • rqt_image_viewを実行し、「/xxxx/xxxx/image_raw」を選択して映像を確認します。
ros2 run rqt_image_view rqt_image_view

カメラがトリガーモードになっていると、トリガーが生成されるまで画像が取得できません。一旦ノードを破棄し、StViewer等でフリーランモードへ切り替えてから再度ご確認ください。

  • 現在発行されているサービスおよびその型は、下記のようなコマンドで確認できます。
ros2 service list -t
  • 型の詳細については、下記のようなコマンドで確認できます。
ros2 interface show stcamera_msgs/srv/GetGenICamNodeInfo
  • GenICamノード”Gain”の情報を取得します。
ros2 service call /stcamera_launch/dev_142100000000/get_genicam_node_info stcamera_msgs/srv/GetGenICamNodeInfo '{genicam_module: "RemoteDevice", genicam_node: "Gain"}'
waiting for service to become available...
requester: making request: stcamera_msgs.srv.GetGenICamNodeInfo_Request(genicam_module='RemoteDevice', genicam_node='Gain')

response:
stcamera_msgs.srv.GetGenICamNodeInfo_Response(error_info=stcamera_msgs.msg.ErrorInfo(error_code=0, description=''), name='Gain', description='Controls the selected gain as an absolute physical value. This is an amplification factor applied to the video signal.', tool_tip='Controls the selected gain as an absolute physical value.', display_name='Gain', name_space='Standard', interface_type='IFloat', access_mode='Read and Write', is_cachable='Yes', visibility='Beginner', caching_mode='Does not use cache', polling_time=-1, is_streamable=True, is_implemented=True, is_available=True, is_readable=True, is_writable=True, is_feature=True, enum_value_str_list=[], enum_value_int_list=[], current_value='0', min_value='0.000000', max_value='192.000000', increment='', unit='', child_node_list=[])
  • GenICamノード”Gain”(IFloat型)の値を読み込みます。
ros2 service call /stcamera_launch/dev_142100000000/read_node_float stcamera_msgs/srv/ReadNodeFloat '{genicam_module: "RemoteDevice", genicam_node: "Gain"}'
waiting for service to become available...
requester: making request: stcamera_msgs.srv.ReadNodeFloat_Request(genicam_module='RemoteDevice', genicam_node='Gain')

response:
stcamera_msgs.srv.ReadNodeFloat_Response(error_info=stcamera_msgs.msg.ErrorInfo(error_code=0, description=''), value=0.0)
  • GenICamノード”Gain”(IFloat型)を100に設定します。
ros2 service call /stcamera_launch/dev_142100000000/write_node_float stcamera_msgs/srv/WriteNodeFloat '{genicam_module: "RemoteDevice", genicam_node: "Gain", value: 100}'
requester: making request: stcamera_msgs.srv.WriteNodeFloat_Request(genicam_module='RemoteDevice', genicam_node='Gain', value=100.0)

response:
stcamera_msgs.srv.WriteNodeFloat_Response(error_info=stcamera_msgs.msg.ErrorInfo(error_code=0, description=''))

4.2. フリーランまたはトリガーモードで画像を取得する

stcamera_demosフォルダにあるノード「grabber」はStCameraNodeを使用して、画像データを取得します。C++版とPython版があり、C++版はサービスやトピックの動作確認を兼ねたコードになっており、様々なサービスやトピックに対応しています。

5. サポートについて

オムロンセンテック株式会社では本パッケージに関する直接的なサポートは行っておりません。ご質問や不具合等に付きましては、GitHubのisuuesを活用してください。