SOCKET通信やPCカメラからの座標取得方法について説明します。 カメラから取得した座標データをロボットに送信し、その座標へロボットを移動させるプログラミング方法をご紹介します。
SOCKET通信やPCカメラからの座標取得方法について説明します。 カメラから取得した座標データをロボットに送信し、その座標へロボットを移動させるプログラミング方法をご紹介します。

SOCKET通信やPCカメラからの座標取得方法について説明します。
カメラから取得した座標データをロボットに送信し、その座標へロボットを移動させるプログラミング方法をご紹介します。イメージとしては、上記図のような流れになります。
まず、一般的な産業用カメラの座標は、各カメラメーカーがPCへ送るための手順を用意しています。次に、PCからロボットへデータを送る方法について説明します。
手順は以下の通りです:
本記事では、カメラの設定はテストツールで代用し、ロボット側の設定にフォーカスします。
1.PC のIPアドレス設定 Windowsでは、設定画面でIPアドレスを 192.168.0.179、サブネットマスクを 255.255.255.0 に設定します。

2.カメラの設定 カメラの設定はテストツールを使用し、ロボットからデータ要求を送信し、カメラがデータを返す流れにします。 ソケット通信に使用するポート番号は、他のプロトコルと重ならないよう50,000番を指定します。
このツールでは「送信するTEXT」に送りたいデータを入力します。
今回の場合は[x座標, y座標, rz座標]のデータを送ります。
(rzはワークの向きです)

ロボット側の設定として、まずタッチペンダントを操作し、通信設定を行います。
ティーチペンダントの右上の三本線(ハンバーガーメニューと呼んでいます)をクリックし、

「ロボットの設定」を選択

「システム」→「ネットワーク」を選択し、固定アドレスを選択します。

固定IPアドレスの設定
・IPアドレスを 192.168.0.177 に設定(177の所はPCと異なるように設定)
・サブネットマスクを 255.255.255.0 に設定
・デフォルトゲートウェイやDNSサーバーは使用しない(PC・カメラ・ロボットの直結環境を想定)
設定完了後、「適用」をクリックして設定を反映させます。
サンプルプログラムはダウンロード可能ですので、ぜひ試してみてください。
(サンプルプログラム:socket_test_local.urp)

大きく分けて2つのステップに分かれています。
1.開始前シーケンス
ロボットプログラム(メインプログラム)に入る前の事前準備をするところ
・変数の初期設定(通信確立用のフラグ、受信データ格納用の変数)
・SOCKET通信の確立(PCのIPアドレスとポート番号を指定)


Initialize data → フォルダ。以下、2つの変数設定を格納しています。
Connection: = False
ロボットとPCの接続が確立できたかを示すフラグ(False=まだ繋がっていない)
Camera_data:=[0,0,0,0]
ロボット側の受け皿。PCから送られてくるデータを受け取る為に用意
今回はx,y,rzの3つを送ります。

ユニバーサルロボットのここで使用するスクリプトでは、もう1つの箱が必要になります。
4つ用意をしています。
今ロボットがいくつのデータを受け取ったか、というのを入れておくスペースが必要となり、カメラデータは4つの配列を用意しています。
これで変数の準備は完了です。
次に、接続の設定を行います。

socket_open(“PC 側のIPアドレス”, ポート番号)
スクリプトの詳細に関しては、技術サポートサイトにありますスクリプトマニュアルをご参照ください。
この接続がFalseの場合はループし続けて、接続が確立されるとConnection:=Trueの状態に変わり、このループを抜け出してロボットプログラムへ進みます。
2.ロボットプログラム
データの受信処理
ロボットからPCへデータ要求を送信
socket_send_stringというスクリプトで”Ready!”という文字列を送信します。

PCからのデータをASCIIフロート形式で受信(XYZおよびRZの座標)
socket_read_ascii_float(3) 3つのデータを受け取るというスクリプトです。

順番にcamera_data[1]にxを代入、camera_data[2]にyを代入、camera_data[3]にrzを代入し、camera_data[0]というのは受け取ったデータの数が入りますので、もし仮にx,y,rzの3つを取得できた場合はcamera_data[3]となり、このループから抜けるという流れになります。
受信したデータを変数に格納し、データが揃うまでループ処理
例えば、取得できたデータがx,yのみの場合は、camera_data[2]となり再び3つのデータを取得できるまでループし続けます。
3つすべてのデータを取得した場合は、**socket_close()**として通信は完了となります。
ロボットの移動処理
現在のロボット座標を取得します。

get_actual_tcp_pose() 現在のTCP(ロボットの先端の座標)データ取得のスクリプト
それを頭文字を取ったGATPという変数に代入します。
この変数の中身は、[x,r,z,rx,ry,rz]の6つのデータが入っていますが、今回のカメラからはx,y,rzの3つだけが送られてくるので、z,rx,ryはそのままの座標を使用します。
このカメラポーズには、以下のように代入します。

ユニバーサルロボットでは、ポーズデータの位置座標の記述の方法は、p[x,y,z,rx,ry,rz]となりますので、p[受け取ったx,受け取ったy, GATP[2], GATP[3], GATP[4], 受け取ったrz]としてカメラポーズのデータを生成します。
受信したデータを適用し、目的の座標に移動

最後にロボットが現在の位置から、camera_posに移動します。

Camera_posは変数ウェイポイントで、さきほど生成されたcamera_posを使用しています。
最後に、ロボットのプログラムを実行して実際に動作を確認します。
1.ロボットを初期位置へ移動させる

2.プログラムを開始し、接続が確立するまで待機

3.PCカメラから座標データを取得し、ロボットを移動

PC側から「接続」を実行すると、接続が完了し、文字列“Ready!”がロボットから送信されたことが確認できます。

ロボットはカメラからのデータを待っている状態となりますので、文字列を送ります。

xに-0.5m, yに-0.005m, rzに0(ラジアン)というデータを送信します。このデータを「TEXT送信」すると、ロボットが動き始めます。こうしてロボットに対してカメラからの座標データを送ることができます。
これで、カメラから取得した座標データを基にロボットを移動させる一連の流れが完了します。今回はロボット環境からの座標ということでキャリブレーションのご説明はしておりませんので、少なくともロボットとカメラ側での位置合わせをすることは必要です。
以上が、SOCKET通信を用いたPCカメラからの座標取得方法とロボットの動作プロセスの解説です。
