Adapter 生成器ガイド
Adapter生成ツールは、Adapterプログラムをすばやく生成するためのツールです。グラフィカルな設定画面でパラメータを簡単に設定するだけで、対応するAdapterプログラムをすばやく作成でき、その上で二次開発を行うことで、標準インターフェースでは実現できない複雑な機能を実装できます。
Adapterプロジェクトを生成する
メニューバーで ロボットと通信 > Adapter生成ツール を選択し、Adapter生成ツール画面を開きます。
注意
Adapter生成ツール 画面で設定する際は、ソリューションを開いたままにしてください。Adapterプロジェクトを正常に保存できます。
「基本設定」を構成する
基本設定 画面で、以下の設定を行います。
設定項目
説明
Adapterプロジェクト名
Adapterプロジェクト名を指定します。プロジェクト名は英字、数字、またはアンダースコアで構成される文字列です(数字で始めることはできません)。
通信対象
RVS-Vision。RVS-Vision入力と出力のみ設定すればよいです。
通信プロトコル
TCP/IP
通信形式
通信で伝送するデータ形式を指定します。現在は ASCII テキストのみをサポートしています。HEXバイナリ形式が必要な場合は、バックエンドのAdapterコードで通信モードを
hexに設定します(例:バイナリプロトコルを参照)。サービス種類
AdapterプロジェクトがTCP/IP通信のサーバーまたはクライアントとして動作するかを指定します。
サーバーは外部接続を待ち受け、クライアントは外部デバイスに能動的に接続します。デフォルトはサーバーです。平行移動単位
mm(ミリメートル、デフォルト)と m(メートル)
回転単位
°(度、デフォルト)と rad(ラジアン)
回転方式
回転方式は通常 オイラー角 を選択します。オイラー角を使用する場合、ロボットコントローラーの回転順序と一致させる必要があります。ロボットの種類に応じて、対応する形式を選択します:
Z-Y'-X''(ZYX_ROTATED):ABB / EPSON / ESTUN / KUKA / NACHIX-Y-Z(XYZ_STATIC):AUBO / DENSO / DOBOT / DELTA / EFORT / ELITE / FANUC / FLEXIV / FR / HANS / HYUNDAI / JAKA / MELFA / ROKAE / SIASUN / STEP / TM / YASKAWAZ-Y'-Z''(ZYZ_ROTATED):COMAU / DOOSAN / KAWASAKI / QJARX-Y'-Z''(XYZ_ROTATED):STAUBLI / TURINur_rot:UR
浮動小数点の小数桁数
データの小数桁数を指定します。デフォルトは 4、選択可能範囲は 1〜20 です。
文字列区切り文字
データ間の区切り文字を指定します。デフォルトは英語のカンマです。よく使われる区切り文字は英語のカンマ、セミコロン、スペースです。
文字列終端文字
コマンドの終了文字を指定します。デフォルトは \r です。よく使われる終端文字は \n、\r、\r\n です。
前後文字を追加
コマンド全体の先頭文字と末尾文字を指定します。チェック後、先頭文字と末尾文字を入力する必要があります。デフォルトは空文字です。たとえば、コマンドが "p,1\r" の場合、先頭文字に "<"、末尾文字に ">" を使用すると、コマンド全体は "<p,1>\r" になります。具体的な使い方は例:フレーム前後文字付きASCIIプロトコルを参照してください。
注釈
オイラー角形式の設定を誤ると、姿勢の方向が正しくなくなります。設定前に、ロボットコントローラーが固定軸か回転軸か、および具体的な軸の順序を確認してください。
上記の設定が完了したら、次へ をクリックして RVS-Vision入力 画面に入ります。
「RVS-Vision入力」を構成する
RVS-Vision入力 画面で、ロボットまたは上位装置が RVS-Vision に送信するコマンド形式を設定します。具体的な設定項目には、撮像トリガー指令、RVS-Visionステップパラメータの設定、RVS-Visionからロボット名を取得 が含まれます。
撮像トリガー指令
RVS-Vision の撮像トリガー指令を設定します。
注釈
この指令は主に RVS-Vision プロジェクトの実行をトリガーするために使用します。このほか、必要に応じて以下の機能を設定できます。
RVS-Vision プロジェクトにパラメータレシピがある場合、この指令はパラメータレシピの切り替えをサポートします。
カメラの取り付け方式が Eye In Hand の場合、または RVS-Vision プロジェクトに「パスプランニング」ステップがある場合、この指令はロボットの撮像姿勢を RVS-Vision プロジェクトに入力することをサポートします。
以下の説明に従って 撮像トリガー指令 を設定します。
表の説明
名前:コマンド全体における各部分の名前。
パラメータ値:各部分の名前に対応する具体的な値。
位置:各部分がコマンド全体で占める開始位置。1 から番号を付けます。区切り文字 1 つで 1 つの位置が終了します。
長さ:各部分が占めるフィールド数(フィールドとは 文字列区切り文字 で区切られたデータを指します)。
位置と長さの関係:次のパラメータの開始位置 = 前のパラメータの開始位置 + 前のパラメータの長さ。
名前
パラメータ値
位置
長さ
指令コード
RVS-Vision プロジェクトの実行をトリガーする指令コード。デフォルトは p で、変更可能です。
固定 1
固定 1
プロジェクト番号
RVS-Vision プロジェクト番号。正の整数です。
固定 2
固定 1
レシピ番号(オプション)
RVS-Vision プロジェクトのパラメータレシピの番号。正の整数です。
設定可能
固定 1
ロボット撮像姿勢(オプション)
カメラの取り付け方式が Eye In Hand の場合、この指令はロボットの撮像姿勢を RVS-Vision プロジェクトに入力します。このパラメータは JPs または「JPs+フランジ姿勢」に設定できます。
設定可能
回転方式で オイラー角 を選択した場合:
- 姿勢形式が JPs の場合、固定 6
- 姿勢形式が「JPs+フランジ姿勢」の場合、固定 12
- 姿勢形式が JPs の場合、固定 6
- 姿勢形式が「JPs+フランジ姿勢」の場合、固定 13
注釈
各フィールドには位置と長さがあります。位置は 1 から始まり、指令コードは通常 1 番目のフィールドにあります。各フィールドが占める範囲は重なってはなりません。プロトコル要件に応じて空き位置を確保できます。
ASCII の例:
p,1,2,0.0,10.0,20.0,30.0,40.0,50.0\r
この例は次のように解釈できます。
p:指令コード1:プロジェクト番号2:レシピ番号後続の 6 つの数:ロボットの関節角。
「JPs+フランジ姿勢」を選択した場合、姿勢フィールドには少なくとも 12 個の数が含まれます。最初の 6 個は関節角、後続のデータはフランジの位置と回転です。具体的な長さは選択した回転方式によって決まります。
パラメータ値、位置、長さ の各列でハイライトされたセルをクリックすると、必要に応じて値を変更できます。
注意
変更する際は、以下の点に注意してください。
異なるコマンドでは、指令コードを一意にする必要があります。
異なるパラメータが占めるフィールド位置は重なってはなりません。たとえば、ロボット撮像姿勢の位置が 3、長さが 12 の場合、レシピ番号の位置を 4、長さを 1 にすると、ロボット撮像姿勢の 2 番目のフィールド位置がレシピ番号の位置と重なります。レシピ番号の位置が 15 以上であれば、ロボット撮像姿勢とレシピ番号の位置は重なりません。
パラメータの位置間に空きがある場合、デフォルトで 0 が埋められます。プレビュー時、この空き位置は 予約位置 として表示され、対応する値は 0 です。たとえば、レシピ番号の位置が 3、長さが 1、ロボット撮像姿勢の位置が 6、長さが 12 の場合、位置 4 と 5 が空きます。ロボット撮像姿勢の位置を 4 に変更すると、空き位置を解消できます。位置を変更して不要な空き位置を解消することをお勧めします。
上記の設定が完了したら、プレビュー をクリックすると、設定項目に基づいて対応する指令例が生成されます。
Tip
指令プレビュー 画面で、マウスカーソルをフィールド名に重ねると、フィールド名と対応するデータがハイライト表示されます。
RVS-Visionステップパラメータの設定(オプション)
パラメータレシピでステップパラメータを事前設定できない場合、または外部情報に基づいてステップパラメータを設定する必要がある場合は、RVS-Visionステップパラメータの設定 をチェックして、「RVS-Visionステップパラメータの設定」指令を構成します。
設定前に以下を確認してください。
ワークフローとステップが正しく選択されていること。
プロパティパスが対象パラメータと一致していること。
フィールド位置とフィールド長が外部プロトコルに適合していること。
外部値のデータ型が対象プロパティの型に変換できること。
パラメータの変更がワークフローの実行前に行われること。
撮像指令と統合 をチェックするかどうかを選択します。
注釈
撮像指令と統合 とは、RVS-Vision ステップパラメータを設定する指令を撮像指令に統合すること、つまり撮像指令にステップパラメータのフィールドを追加することを指します。
RVS-Visionステップパラメータの設定 指令は、撮像指令と統合して 1 つの指令にすることも、単独の指令として使用することもできます(この場合、撮像指令の前に呼び出す必要があります)。2 つの方式の適用シーンは次のとおりです。
独立指令は、複数のパラメータを先に設定し、その後撮影をトリガーする制御フローに適しています。
統合指令は、1 つのメッセージでパラメータ更新と撮影トリガーを完了するのに適しています。
チェックした場合:次の表の設定項目は撮像指令の設定を再利用するため、手順 2 に直接進みます。
チェックしない場合:次の表に従って「RVS-Visionステップパラメータの設定」指令を個別に設定します。
名前
パラメータ値
位置
長さ
指令コード
RVS-Vision ステップパラメータを設定する指令コード。デフォルトは s で、変更可能です。
固定 1
固定 1
プロジェクト番号
RVS-Vision プロジェクト番号。正の整数です。
固定 2
固定 1
レシピ番号(オプション)
RVS-Vision プロジェクトのパラメータレシピの番号。正の整数です。
設定可能
固定 1
ステップパラメータを選択します。
ステップパラメータの選択 をクリックし、ポップアップ画面で以下の操作に従ってステップパラメータを選択します。
a. ソリューション内のプロジェクトを選択し、設定するステップと対応するパラメータ名を表示します。
b. ステップの選択 オプションで、設定するステップを選択します。
c. ステップパラメータ オプションで、ステップのパラメータ名を展開してチェックします。
d. OK をクリックします。
注釈
RVS-Visionステップパラメータの設定 をチェックした場合、ステップパラメータを選択する必要があります。選択しないとエラーメッセージが表示されます。
ステップとパラメータは複数選択できます。
ステップパラメータ値のデータ型がブール型の場合、1 は true、0 は false を表します。
パラメータ値、位置、長さ の各列でハイライトされたセルをクリックすると、必要に応じて値を変更できます。
注意
変更する際は、以下の点に注意してください。
異なるパラメータが占めるフィールド位置は重なってはなりません。
パラメータの位置間に空きがある場合、デフォルトで 0 が埋められます。位置を変更して不要な空き位置を解消することをお勧めします。
上記の設定が完了したら、プレビュー をクリックすると、設定項目に基づいて対応する指令例が生成されます。
参考
独立指令と統合指令の完全な設定は、例:ビジョンステップパラメータを個別に設定するを参照してください。
RVS-Visionからロボット名を取得する(オプション)
取得 をクリックすると、ロボット通信設定 で選択したロボット名が入力ボックスに表示されます。
取得したロボット名はロボットサービスの登録に使用されます。ロボット通信設定 画面で選択するロボットオプションが異なると、ここで取得するロボット名も異なります。
ロボットオプション
ロボット名
ブランドロボット
具体的なロボット名と型式
その他のロボット
RobotType1
ロボットを使用しない
ロボットが見つかりません
上記の設定が完了したら、次へ をクリックして RVS-Vision出力 画面に入ります。
「RVS-Vision出力」を構成する
RVS-Vision出力 画面で、RVS-Vision がロボットまたは上位装置に返すデータ形式を設定します。具体的な設定項目には、姿勢データ、物体ラベル、その他の出力 が含まれます。
RVS-Vision プロジェクトの「ビジョン出力」ステップに従って、対応する設定項目を決定します。
「出力」ステップのポート型
ポート名
設定項目
適用シーン
プリセット(ビジョン結果)
poses
姿勢データ(ビジョンポイントデータ)
対象物の姿勢を取得
プリセット(ビジョン結果)
poses、labels
姿勢データ(ビジョンポイントデータ)、物体ラベル
対象物の姿勢とラベルを取得
カスタム
カスタムポート名
その他の出力
OCRテキスト、VINコード、測定結果などのカスタムデータを取得
姿勢データ をチェックするかどうかを選択します(デフォルト:チェック済み)。
ビジョンポイントデータ の設定を選択した場合、次の表を参照して設定します。
注意
基本設定 で回転方式に四元数を選択した場合、出力される各姿勢は 7 フィールドを占めます。
設定項目
説明
数量
設定可能項目:1個、固定値(手入力)、すべて。
- 1:RVS-Vision が N 個のビジョンポイントを出力するが、Adapter は最初のビジョンポイントのみを返します。
- 固定値M:RVS-Vision が N 個のビジョンポイントを出力するが、Adapter は最初の M 個のビジョンポイントのみを返します。
- すべて:RVS-Vision が N 個のビジョンポイントを出力し、Adapter は N 個のビジョンポイントを返します。
送信する姿勢数を返す
RVS-Vision が返すデータには、今回返す姿勢数が含まれ、姿勢数は姿勢データの前に位置します。
物体姿勢をロボット姿勢に変換
RVS-Vision の認識結果の姿勢を自動的に X 軸周りに 180° 回転させ(Z 軸が下を向くように)、ロボットが直接この姿勢に移動して掴み取りできるようにします。
物体ラベル をチェックするかどうかを選択します。物体ラベルは「ビジョン出力」ステップの labels ポートのデータです。
その他の出力 を設定するかどうかを選択します。+ をクリックすると複数のポートを設定できます。
注意
カスタムポートデータのリストサイズは、ラベルまたは姿勢のリストサイズと一致している必要があります。
設定項目
説明
ポート名
「ビジョン出力」ステップのカスタムポート名。
データ型
設定可能項目:Stringlist、Numberlist、Size3DList。
上記の設定が完了したら、プレビュー をクリックすると、設定項目に基づいて対応する指令例が生成されます。確認後、次へ をクリックして次の設定画面に入ります。
注釈
典型的な ASCII の成功応答は次のとおりです。
1,2,100.0000,20.0000,500.0000,180.0000,0.0000,90.0000,...\r
最初のフィールドは外部状態コード、2 番目のフィールドは姿勢数、後続のフィールドは設定した形式に従って展開された姿勢データです。実際のフィールド順は生成ツールの指令プレビューに準拠します。
「状態コードの設定」を構成する
状態コードの設定 画面で、コマンドの各種処理結果に対応する状態コードを設定します。
Adapter生成ツールは、デフォルトで以下の状態コードをサポートしています。
状態
デフォルト外部状態コード
成功
1
不正指令
2
プロジェクト未ロード
3
点群なし
4
結果なし
5
パスプランニング失敗
6
ステップパラメータ無効
7
タイムアウト
8
その他のエラー
9
Tip
必要に応じて状態コードを追加または削除できます。
状態コードを減らす:異なる状態コードに対応する値を同じ数値に設定します。たとえば、「不正指令」「プロジェクト未ロード」を両方 2 に設定します。
状態コードを増やす:Adapter コードの状態コードマッピング(
status_code_map.pyまたはカスタム Assembler)を変更します。具体的な方法はAdapter プログラミングガイド:内部エラーコードを参照してください。
上記の設定が完了したら、保存して生成 をクリックします。ポップアップした確認画面で、はい をクリックしてすべての設定を保存します。
注意
保存する前に、入力と出力のプレビューを項目ごとに確認してください。
フィールドの順序、位置、長さが正しいかどうか;
指令コードが外部プログラムと一致しているかどうか;
ASCII 区切り文字、終端文字、前後文字が正しいかどうか;
長さの単位、回転の単位、オイラー角形式が正しいかどうか;
状態コードが外部プログラムと一致しているかどうか。
設定を保存すると、システムは Adapter 設定を書き込み、Python コードを生成します。生成ディレクトリには主に以下が含まれます。
<Adapter設定ディレクトリ>/ ├── configurational_adapter.json ├── generated/ │ ├── __init__.py │ ├── header_parser.py │ ├── parser_trigger.py │ ├── parser_setprop.py # 独立ステップパラメータ指令を設定した場合に生成 │ ├── assembler.py │ ├── status_code_map.py │ └── register.py └── .vscode/ └── launch.json
注釈
generated/内のファイルは設定を再保存すると上書きされるため、直接変更しないでください。通常のフィールドを変更する場合は、生成ツールの設定を変更して再生成してください。生成ロジックを本当に拡張する必要がある場合は、生成ツールのテンプレートを変更するか、独立したカスタムプロトコルパッケージを作成してください。参考
完全な設定と連携調整のフローは、例:ロボットがビジョンを起動してピック姿勢を取得するを参照してください。
Adapterプロジェクトを配置する
Adapter生成ツールの設定が完了したら、以下の手順に従って Adapterプロジェクトを配置します。
RVS 2.0 のメニューバーで、ロボットと通信 > ロボット通信設定 をクリックします。
ロボット通信設定 画面で、以下の設定を行います。
a. ロボットを選択し、次へ をクリックします。
b. インターフェースサービス種類 で Adapter を選択します。
c. Adapterプロジェクトフォルダー で
をクリックします。ポップアップしたファイルブラウザで、Adapterプロジェクトフォルダーを選択します。d. ホストIPアドレス を設定します。デフォルト値は 0.0.0.0 で、すべての IP アドレスを監視することを意味します。
e. 適用 をクリックします。
RVS 2.0 のメイン画面で、ツールバーのインターフェースサービスが有効になっていることを確認します。
これで、Adapterプロジェクトの配置が成功しました。
Adapterプロジェクトを連携調整する
ネットワークを設定する
Adapter が TCP サーバーとして動作する場合:
監視アドレスをローカルの NIC アドレスに設定するか、
0.0.0.0を使用してすべての NIC を監視します;ポートは他のプログラムに占有されてはいけません;
外部デバイスは Adapter が動作する工場PCの IP とポートに能動的に接続する必要があります。
Adapter が TCP クライアントとして動作する場合:
ホストアドレスを外部デバイスの IP に設定します;
外部デバイスが TCP サービスを開始していることを確認します;
接続が切断された後、Adapter は設定した再接続間隔に従って再接続を試みます。
テスト指令を送信する
ロボットまたは PLC に接続する前に、ネットワークデバッグツールでプロトコルを検証することをお勧めします。
テストの順序は次のとおりです。
実行するビジョンプロジェクトを起動してロードします;
Adapter を起動します;
TCP 接続を確立します;
フィールドが最も少ない有効な指令を送信します;
Adapter のログが正しい指令コードを認識したことを確認します;
ビジョンワークフローが実行されたことを確認します;
応答プレビューと照合して状態コードとデータフィールドを確認します;
その後、レシピ、ロボット姿勢、ステップパラメータなどのオプションフィールドを追加します。
TCP はバイトストリームプロトコルです。現在の通信層は、各
read()で取得したデータをそのままプロトコル層に渡し、終端文字による自動バッファリングとフレーム分割は行いません。そのため、連携調整時は外部デバイスが一度に 1 つの完全なリクエストを送信し、応答を待ってから次のリクエストを送信してください。パケット分割、パケット粘着、受信バッファを超える単一フレーム、または高頻度の連続送信が発生する可能性のある本番プロトコルでは、通信層に固定長、長さフィールド、または終端文字によるバッファリングとフレーム分割を実装してから、現場での使用に投入してください。
例:ロボットがビジョンを起動してピック姿勢を取得する
この節では、完全なサンプルを通して、要件定義と生成ツールの設定からメッセージ連携調整までを説明します。サンプルの目標は次のとおりです。
Adapter は TCP サーバーとしてポート
50000を監視します;ロボットは ASCII 指令を送信します;
1 つの指令にプロジェクト番号、レシピ番号、6 つの関節角が含まれます;
Adapter はレシピを切り替え、ロボット姿勢を書き込み、ビジョンワークフローを実行します;
Adapter は状態コード、姿勢数、ピック姿勢、物体ラベルを返します;
フィールドはカンマで区切り、メッセージは
\rで終わります;長さの単位はミリメートル、回転の単位は度、出力姿勢は
ZYX_STATICオイラー角です;浮動小数点数は小数 3 桁を保持します。
先に通信プロトコルを定義する
生成ツールを開く前に、ロボットプログラム開発者とプロトコルフィールドを確認してください。設定しながらフィールドをその場で決めないでください。そうしないと、ロボット側と Adapter 側で位置が一致しなくなりやすくなります。
撮像トリガーリクエストのフィールド表:
位置 |
フィールド |
型 |
長さ |
例 |
説明 |
|---|---|---|---|---|---|
1 |
|
文字列 |
1 |
|
撮像トリガー指令コード。 |
2 |
|
符号なし整数 |
1 |
|
ビジョンプロジェクト番号。 |
3 |
|
符号なし整数 |
1 |
|
切り替えるレシピ番号。 |
4〜9 |
|
浮動小数点数配列 |
6 |
|
ロボットの 6 軸関節角。 |
完全なリクエスト:
P,1,2,0,10,20,30,40,50\r
フィールドごとの分解:
P , 1 , 2 , 0 , 10 , 20 , 30 , 40 , 50 \r
│ │ │ └──────────────┬──────────────┘ │
│ │ │ │ └─ メッセージ終端文字
│ │ │ └─ J1〜J6
│ │ └─ レシピ番号
│ └─ プロジェクト番号
└─ 指令コード
成功応答のフィールド表:
順序 |
フィールド |
型 |
例 |
説明 |
|---|---|---|---|---|
1 |
|
整数 |
|
成功状態コード。 |
2 |
|
符号なし整数 |
|
今回 2 つの姿勢を返します。 |
3〜8 |
|
6 個の浮動小数点数 |
|
1 番目の姿勢の X、Y、Z、Rx、Ry、Rz。 |
9 |
|
文字列 |
|
1 番目の物体ラベル。 |
10〜15 |
|
6 個の浮動小数点数 |
|
2 番目の姿勢。 |
16 |
|
文字列 |
|
2 番目の物体ラベル。 |
完全な成功応答:
1,2,100.000,20.000,500.000,180.000,0.000,90.000,box_A,120.000,25.000,498.000,180.000,0.000,88.000,box_B\r
ビジョン結果がない場合の応答:
5\r
不正指令の応答:
2\r
失敗応答に状態コードのみを含めるかどうかは、プロトコル設計段階で固定しておく必要があります。ロボット側は失敗状態で姿勢数と姿勢フィールドを読み続けてはいけません。
ビジョンプロジェクトを作成して準備する
RVS 2.0 で抛み取り位置決め用のビジョンプロジェクトを作成または開きます。
プロジェクトに実行可能なワークフローがあることを確認します。
ワークフローの出力にピック姿勢が含まれていることを確認します。
ラベルを返す必要がある場合、ビジョン結果に各姿勢に対応するラベルが含まれていることを確認します。
レシピ切り替えを検証するために、少なくとも 2 つのレシピを作成します。
ワークフローを手動で実行し、Adapter を通さなくても安定した結果が得られることを確認します。
基本設定を構成する
Adapter生成ツールで以下を入力します。
設定項目 |
サンプル値 |
|---|---|
プロジェクト名 |
|
プロトコル |
|
データ形式 |
|
サービス種類 |
|
ポート |
|
長さの単位 |
|
回転の単位 |
|
回転方式 |
|
オイラー角形式 |
|
小数桁数 |
|
フィールド区切り文字 |
|
終端文字 |
|
フレーム前後文字 |
無効 |
入力指令を構成する
撮像トリガー指令コードを
Pに設定します。プロジェクト番号を有効にし、位置を 2 に設定します。
レシピ番号を有効にし、位置を 3 に設定します。
ロボット撮像姿勢を有効にします。
姿勢タイプで
JPsを選択します。姿勢の位置を 4、長さを 6 に設定します。
指令プレビューで最後の関節角が位置 9 にあることを確認します。
設定完了後の論理フィールドは次のとおりです。
1:P | 2:project_id | 3:recipe_id | 4〜9:joint_angles
出力を構成する
「姿勢データを返す」を有効にします。
データ型で「ビジョンポイントデータ」を選択します。
返す数量で「すべて」を選択します。
「姿勢数を返す」を有効にします。
現場の座標定義に応じて「ロボット姿勢に変換」を有効にするかどうかを決定します。
「物体ラベルを返す」を有効にします。
その他の出力ポートは追加しません。
状態コードを設定して保存する
このサンプルはデフォルトの状態コード 1〜9 を使用します。保存後、以下を確認します。
robot_pick_demo/
├── configurational_adapter.json
└── generated/
├── header_parser.py
├── parser_trigger.py
├── assembler.py
├── status_code_map.py
└── register.py
生成ツールがこのサンプルに対して生成するコア実行順序は以下と等価です。
workflow = await get_workflow_id.submit(
exec_ctx,
params={"project_id": project_id},
)
await switch_recipe.submit(
exec_ctx,
params={"project_id": project_id, "recipe_id": recipe_id},
)
await set_robot_pose.submit(
exec_ctx,
params={"project_id": project_id, "joint_angles": joint_angles},
)
await execute_workflow.submit(
exec_ctx,
params={"flow_id": workflow.data["workflow_id"]},
)
result = await get_vision_result.submit(
exec_ctx,
params={"flow_id": workflow.data["workflow_id"], "timeout": 30000},
)
このコードは実行順序の理解用であり、生成ファイルにコピーする必要はありません。
Python でロボットをシミュレーションする
次のスクリプトで Adapter に接続し、リクエストを送信できます。
import socket
HOST = "127.0.0.1"
PORT = 50000
REQUEST = b"P,1,2,0,10,20,30,40,50\r"
with socket.create_connection((HOST, PORT), timeout=5) as client:
client.sendall(REQUEST)
client.settimeout(35)
response = bytearray()
while not response.endswith(b"\r"):
chunk = client.recv(4096)
if not chunk:
raise ConnectionError("Adapter closed the connection")
response.extend(chunk)
print("raw:", bytes(response))
print("text:", response.decode("utf-8").rstrip("\r"))
Adapter が別の工場PCで動作している場合は、HOST をその工場PCの実際の NIC IP に変更します。
応答を解析する
ロボット側は次のロジックで応答を処理できます。
def parse_response(message: str):
fields = message.rstrip("\r").split(",")
status = int(fields[0])
if status != 1:
return {"status": status, "poses": []}
count = int(fields[1])
cursor = 2
poses = []
for _ in range(count):
pose = [float(value) for value in fields[cursor:cursor + 6]]
cursor += 6
label = fields[cursor]
cursor += 1
poses.append({"pose": pose, "label": label})
if cursor != len(fields):
raise ValueError("Response contains unexpected trailing fields")
return {"status": status, "poses": poses}
連携調整時は、少なくとも以下のテストを実行します。
番号 |
リクエストまたは現場条件 |
期待結果 |
|---|---|---|
1 |
有効なプロジェクト、レシピ、関節角 |
状態コード 1 と姿勢を返します。 |
2 |
不明な指令コード |
不正指令状態コード 2 を返します。 |
3 |
存在しないプロジェクト番号 |
プロジェクト未ロード状態コード 3 を返します。 |
4 |
シーンに対象物がない |
結果なし状態コード 5 を返します。 |
5 |
関節角が 1 つ欠けている |
エラー状態を返し、Adapter はワークフローを実行すべきではありません。 |
6 |
レシピが存在しない |
失敗状態を返し、ワークフローを続行すべきではありません。 |
7 |
ビジョン実行がタイムアウトを超えた |
タイムアウト状態コード 8 を返します。 |
8 |
処理中に TCP が切断された |
Adapter は利用可能なまま維持され、再接続を許可します。 |
例:ビジョンステップパラメータを個別に設定する
このサンプルでは、撮影前に個別の指令を使用してビジョンステップパラメータを変更します。「マッチングモード」と「最小信頼度」を変更する必要があると仮定します。
指令を定義する
ステップパラメータ指令:
S,1,0,0.850\r
位置 |
フィールド |
例 |
説明 |
|---|---|---|---|
1 |
指令コード |
|
パラメータを設定します。 |
2 |
プロジェクト番号 |
|
対象のビジョンプロジェクト。 |
3 |
マッチングモード |
|
例では |
4 |
最小信頼度 |
|
浮動小数点パラメータ。 |
撮像指令:
P,1\r
推奨する制御シーケンス:
ロボット Adapter ビジョンシステム
│ S,1,0,0.850\r │ │
├────────────────────────►│ ステッププロパティを更新 │
│ ├─────────────────────────►│
│ 1\r │ │
│◄────────────────────────┤ │
│ P,1\r │ │
├────────────────────────►│ ワークフローを実行して結果を取得 │
│ ├─────────────────────────►│
│ 1,1,...\r │ │
│◄────────────────────────┤ │
ロボットは、パラメータ設定指令が成功を返すまで待ってから撮像指令を送信する必要があります。そうしないと、撮影がまだ古いパラメータを使用する可能性があります。
生成ツールでプロパティを選択する
「ビジョンステップパラメータの設定」を有効にします。
「撮像指令と統合」を有効にしません。
ステップパラメータの指令コードを
Sに設定します。ビジョンプロジェクトから「マッチングモード」を選択します。
次に「最小信頼度」を選択します。
位置 3 と位置 4 をそれぞれ設定し、長さは両方とも 1 にします。
保存後、
parser_setprop.pyが生成されたことを確認します。
生成コードは、各プロパティのワークフロー ID、ステップ ID、プロパティパス、プロパティ型を保存します。プロトコル入力値はプロパティ型に応じてビジョンシステムが必要とする JSON データに変換されます。
一般的なプロパティのメッセージ内での展開方法:
プロパティ型 |
ASCII 入力例 |
フィールド数 |
|---|---|---|
|
|
1 |
|
|
1 |
|
|
1 |
列挙型 |
|
1 |
|
|
2 |
|
|
3 |
四元数姿勢 |
|
7 |
プロパティ型と長さは、生成ツールのプレビューと一致している必要があります。設定した長さが対象プロパティに必要な長さより短い場合、解析やプロパティ更新が失敗する可能性があります。長すぎる場合、余分なフィールドが後続のフィールドをずらします。
ステップパラメータと撮像指令を統合する
「撮像指令と統合」を有効にした場合、次を使用できます。
P,1,0,0.850\r
Adapter は同じリクエスト内で以下の順序で実行します。
ワークフロー ID を取得します;
マッチングモードを更新します;
最小信頼度を更新します;
ワークフローを実行します;
ビジョン結果を取得して返します。
いずれかのプロパティ更新が失敗した場合、ワークフローを実行すべきではありません。
例:フレーム前後文字付きASCIIプロトコル
一部のロボットプロトコルは、フレームが固定文字列で開始および終了することを要求します。たとえば:
<STX>P,1<ETX>
生成ツールで設定します。
設定項目 |
値 |
|---|---|
前後文字を有効にする |
はい |
前文字 |
|
後文字 |
|
区切り文字 |
|
解析規則は次のとおりです。
入力は前文字で開始する必要があります;
入力は後文字で終了する必要があります;
前後文字はコマンドフィールドとして Payload Parser に渡されません;
出力の状態コードと業務データも同じ前後文字で囲まれます;
前後文字と業務フィールドの間には区切り文字は自動的に挿入されません。
成功応答の例:
<STX>1,1,100.000,20.000,500.000,180.000,0.000,90.000<ETX>
以下の入力はすべて不正と判定されます。
P,1<ETX> # 前文字がない
<STX>P,1 # 後文字がない
<STX>,P,1<ETX> # 前文字の後に余分な区切り文字がある
例:バイナリプロトコル
バイナリモードは、フィールド幅が固定されたデバイスプロトコルに適しています。現在の TCP サーバーの hex モードでは、送信側が ASCII 16進数テキスト を送信する必要があります。通信層はテキストを受信した後、スペースを除去し、bytes.fromhex() で生バイトに変換してから、プロトコルパーサーに渡します。現在の生成ツールでは、指令コードは変換後の最初の 4 バイトで認識され、数値フィールドは設定したエンディアンに従って読み取られます。
プロトコルがリトルエンディアンを採用し、リクエスト構造が次のとおりであると仮定します。
バイトオフセット |
長さ |
フィールド |
型 |
例 |
|---|---|---|---|---|
0 |
4 |
指令コード |
4 バイト |
|
4 |
4 |
プロジェクト番号 |
|
|
8 |
24 |
6 軸関節角 |
6 × |
IEEE 754 リトルエンディアンでエンコード |
Python でリクエストを構築します。
import socket
import struct
command = b"\x01\x00\x00\x00"
project_id = struct.pack("<I", 6)
joints = struct.pack("<6f", 0.0, 10.0, 20.0, 30.0, 40.0, 50.0)
request = command + project_id + joints
# TCPServer の hex モードは、request の生バイトではなく、ASCII 16進テキストを受信します。
wire_data = request.hex().encode("ascii")
with socket.create_connection(("127.0.0.1", 50000), timeout=5) as client:
client.sendall(wire_data)
response = client.recv(4096)
print(response.hex(" "))
たとえば、指令コードとプロジェクト番号の生バイトは次のとおりです。
01 00 00 00 06 00 00 00
実際に線上で送信される最初の 16 文字の ASCII 文字は次のとおりです。
0100000006000000
Adapter のバイナリ応答は Assembler が直接バイトとして組み立てます。外部デバイスは、双方で合意した応答構造とエンディアンに従って解析する必要があります。カスタム Assembler が明示的にそのようなエンコードを行わない限り、応答を ASCII 16進数文字列として扱ってはいけません。
バイナリ連携調整では、以下を明確にする必要があります。
指令コードの 4 バイトが数値エンコードなのか、生バイト列なのか;
リトルエンディアンかビッグエンディアンか;
整数に符号があるかどうか;
浮動小数点数が 32 ビットか 64 ビットか;
メッセージの総長さをどのように決定するか;
長さフィールド、チェックサム、またはエスケープが必要かどうか;
1 回の TCP 受信が 1 フレームに満たない場合、どのようにバッファリングするか。
プロトコルに CRC、動的長さ、エスケープ、または複数の異なるフレームヘッダーが含まれる場合は、固定フィールド生成ツールを無理に適用せず、カスタム Header Parser を使用することをお勧めします。




