はじめに
世界で多くのシェアを誇る協働ロボットであるユニバーサルロボットは、ロボットの座標値やスピードスライダ値などの取得、または設定できるデータ通信機能を実装しております。
Real-Time Data Exchange(RTDE)通信と呼ばれるもので、ポート30004番にアクセスすることでリアルタイムのデータの取得・設定を可能とします。内容についてはEtherNet/IPの内容と同等なのでPLCがあればこの通信を使うことは不要ですが、ラズパイや外部パソコンからデータ通信を行うときに非常に役立ちます。
RTDE通信の仕組みは次の投稿で詳細にご説明しますが、まずここではどういうことができるのかを知っていただくために、JAVAで通信できるライブラリをOSSでGithubに公開しておりますので、それを使用した例を示します。
RTDE通信のプログラム例
Githubの公開アドレス
App.javaのファイルを開いていただけると、今回作成したライブラリの使い方の例が載っております。
RTDESocketClient client= new RTDESocketClient("192.168.83.129", 20, "myApp") {
@Override
public void onReceive(Object[] values) throws IOException {
double[] pos = (double[])values[0];
System.out.println(pos[0]*180/Math.PI);
}
@Override
public Object[] onSend() throws IOException {
return null;
}
};
client.addOutput(RTDEOutput.actual_q);
client.start();
RTDESocketClient
クラスのコンストラクタに、ロボット(ここではオフラインシミュレータ)のIPアドレスと、送受信の1秒間当たりの回数、通信ヘッダを設定します。通信ヘッダはログ用なので空欄でも構いません。
今回はロボットのジョイント角度の取得を行ってみます。そのため、末尾にaddOutput
メソッドでRTDEOutput.actual_q
というのを指定しています。これはユニバーサルロボットの資料を見ればわかりますが、actual_q
というのはジョイント6軸すべての値を示します。
実際に取得できたかどうかを確認するために、onReceive
という抽象メソッドを明確に定義することでデータ受信直後の処理を書きます。ここではvalues[0]をdouble配列にキャストして、ロボットのベース軸の角度を表示するコードを書いています。
これを実行すると、下図のようにロボットのベース座標と、取得した値が合致することがわかります。