「Universal Robots」のUR+でURCap開発
こんにちは。小川です。
今回はUniversal Robots社が提供するUniversal Robots+(UR+)の紹介とURCapの開発についてご紹介します。
Universal Robotsについて
#Universal Robots(ユニバーサルロボット)はデンマークに拠点を置く、協働ロボットのメーカーです。
設立は2005年で協働ロボット市場では名の知れた企業です。
ChatGPTに聞いてみましたが一番に挙げられていました。(ちょっと日本語おかしくなっていますが。)
協働ロボットは従来の産業用ロボットのように安全柵を設けることなく人と協働して作業ができます。
そのため、大きな工場を持たない中小企業でも導入のハードルが低く、幅広い分野での活躍が期待できます。
UR+とは
#UR+はURロボットと組み合わせて使える周辺機器の製品群及びその開発プラットフォームを指します。
UR社から提供されるSDKで開発し、認証を受けるとUR+製品として販売できます。(UR+製品一覧はこちら)
URCapとは
#UR+の製品はURCapと呼ばれるJavaベースのプラグインによって実現されます。
URCapはURロボットのグラフィカルプログラミングインターフェースである「PolyScope」に統合され、URロボットのティーチングペンダント[1]からその製品の機能を制御できます。
URCapの開発においてはユーザーフォーラムが用意されており、質問するとURのオペレータや有志のデベロッパーから回答が返ってきます。
※ユーザーフォーラムを利用するにはUR+への登録が必要です。
UR+への登録方法
UR+のサイトにアクセスし、"デベロッパーチームに参加"ボタンから登録します。
URCapの開発
#URCapはUbuntu上で開発します。
今回はWindows環境(ホストPC)からUbuntuの仮想マシンを立ち上げてURCapのサンプルを動作させるまでの手順を紹介します。
動作環境
#PolyScopeではロボットの3Dを描画するため、実際の開発ではWindowsが遅くならない程度にできるだけ仮想マシン側にメモリを割り当てると良いです。
よって、推奨環境ではありませんのでご留意ください。
- Windows 10(4コア,16GBメモリ)
- Virtual Box 7.0.6
- Ubuntu 16.04(2コア,8GBメモリ割当)
- URCap SDK 1.13.0
- URSim 5.11.0
- URSim 3.15.0
- openjdk 1.8.0_242
- Maven 3.3.9
- Eclipse IDE for Java Developers 2020-03(4.15.0)
Virtual Boxのダウンロード
#仮想マシンを作成するためのソフトウェアをダウンロードします。
今回はVirtual Box(Ver7.0.6 ※2023/04時点で最新)をダウンロードします。
スターターパッケージのダウンロード
#URのダウンロードセンターから「URCAP STARTER PACKAGE」(Version1.13.0 ※2023/04時点で最新)をダウンロードします。
スターターパッケージにはURCapのSDKを含め、EclipseやMavenなど必要なソフトがプリインストールされているためすぐに開発をスタートできます。
よって、動作環境で示したソフトウェアはインストール不要です。
ova形式のファイルでサイズは約10GBになります。
OVAのインポート
#ダウンロードしたスターターパッケージをVirtual Boxにインポートします。
詳細は割愛します。
URのシミュレータを起動する
#Virtual Boxからスターターパッケージを起動させるとURロボットが壁紙のデスクトップが起動します。
URロボットのシミュレータを起動するには下記いずれかのディレクトリ内にある「start-ursim.sh」を実行します。
- /home/ur/ursim/ursim-3.15.0.106151
- CBシリーズのシミュレータが起動
- /home/ur/ursim/ursim-5.11.0.108249
- eシリーズのシミュレータが起動
起動するとPolyScopeの画面が表示されます。(画像はeシリーズ起動時のもの。)
URCapサンプルのデプロイ
#前述した通りURCapはプラグインとしてPolyScopeに統合されます。
URCapのSDKにサンプルが含まれていますので、実際にデプロイしてみます。
下記ファイルを開き、赤線の内容(eシリーズのシミュレータがあるディレクトリ)を追記します。
上記の「pom.xml」があるディレクトリにて、下記コマンドを実行し、サンプルのビルドとシミュレータへのデプロイを行います。
- mvn install -P ursim
- 「pom.xml」内に"ursim"のProfileが宣言されており、シミュレータにURCapがデプロイされます。
デプロイされたURCapの確認
#URのシミュレータを起動するの通りにeシリーズのシミュレータを起動します。
「Program」タブに移動すると左のリストに「URCaps」の項目が加わっており、「Hello World」のプログラムノードが利用可能となっています。
「Hello World」のプログラムノードを選択するとプログラムツリーにコマンドを挿入できます。
プログラムを実行すると「Hello World」のポップアップが表示されます。(プログラムを実行するにはPolyScope画面左下からロボットをパワーオンする必要があります。)
また、「Installation」タブに移動すると「URCaps」の項目が加わっており、「Hello World」のインストレーションノードが利用可能となっています。
ここでは「Hello World」コマンドをプログラム実行した際のポップアップタイトルを変更できます。
URCapの実装について
#前章でURCapのサンプルを動作させるまでの手順を紹介しました。
サンプルはGitHubでも公開されています。(こちら)
今回紹介した「Hello World」サンプルのプログラムノードやインストレーションノードはサービスと呼ばれます。
これらのサービスはPolyScope起動時にアクティベータによって登録され、ユーザーに機能を提供します。[2]
「Hello World」のサンプルを例に、各サービスのインターフェースと実装について簡単に説明します。
プログラムノード
#プログラムノードはSwingProgramNodeServiceを実装することでサービスを提供可能にします。
SwingProgramNodeViewはプログラムノードのUIを提供します。
ProgramNodeContributionはプログラムノードのロジックを提供し、ユーザーが新しいプログラムノードを挿入するたびに新しいインスタンスを返します。[2:1]
「Hello World」サンプルのプログラムノードでは以下のような実装がされています。
- HelloWorldProgramNodeService
- getId()
- プログラムノードの種別を識別するためのIDを返しています。
- configureContribution()
- このプログラムノードが子ノードを持つことができるかなど、ノードの構成を設定しています。
- getTitle()
- プログラムノードの名前をシステムの言語に合わせて返しています。
- createView()
- このプログラムノードが初めて使用されるときに一度だけHelloWorldProgramNodeViewのインスタンスを作成して返しています。
- createNode()
- プログラムノードをプログラムツリーに挿入するたび、HelloWorldProgramNodeContributionのインスタンスを作成して返しています。
- getId()
- HelloWorldProgramNodeView
- buildUI()
- プログラムノードのUIを生成しています。
- buildUI()
- HelloWorldProgramNodeContribution
- openView()
- プログラムノードが選択された際に呼ばれ、プレビューの内容を更新しています。(この際にインストレーションノードの内容を参照しています。)
- closeView()
- プログラムノードのUIから離れる際に呼ばれます。
- isDefined()
- プログラムノードを実行するための事前条件を判定する処理を記述しています。
- プログラムノードへ指定されたパラメータやプログラムツリーの構成(直後に移動命令が存在するかなど)に制約がある場合にこれを判定することで、意図しないプログラムが記述されてしまうことを抑止できます。
- プログラムノードを実行するための事前条件を判定する処理を記述しています。
- getTitle()
- プログラムツリーに表示されるプログラムノードの名前を返しています。
- genarateScript()
- openView()
インストレーションノード
#インストレーションノードはSwingInstallationNodeServiceを実装することでサービスを提供可能にします。
SwingInstallationNodeViewはインストレーションノードのUIを提供し、InstallationNodeContributionはインストレーションノードのロジックを提供します。[2:2]
「Hello World」サンプルのインストレーションノードでは以下のような実装がされています。
- HelloWorldInstallationNodeService
- getTitle()
- インストレーションノードの名前を返しています。
- configureContribution()
- インストレーションノードの構成を設定します。
- createView()
- サービス登録後に一度だけHelloWorldInstallationNodeViewのインスタンスを作成して返しています。
- createInstallationNode()
- サービス登録後に一度だけHelloWorldInstallationNodeContributionのインスタンスを作成して返しています。
- getTitle()
- HelloWorldInstallationNodeView
- buildUI()
- インストレーションノードのUIを生成しています。
- buildUI()
- HelloWorldInstallationNodeContribution
まとめ
#今回はURCapの実装までをざっくりと紹介しました。
URの公式サイトではデジタルI/Oを制御するURCapをステップバイステップで作成する例が紹介されていますのでご参照ください。(こちら)
また、URCapの基本について記事では触れられていない部分もありますので、URの公式サイトをご参照ください。(こちら)
このURCapの開発を通したUR+のエコシステムはこちらにもある通り、URとそのパートナーが得意分野を活かした製品開発をできるビジネスモデルであり、これからもっと幅を広げていくことでしょう。
以上、お疲れ様でした。