「Universal Robots」のUR+でURCap開発

| 6 min read
Author: kazuki-ogawa kazuki-ogawaの画像

こんにちは。小川です。
今回は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+への登録が必要です。

Information

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シリーズのシミュレータがあるディレクトリ)を追記します。

  • /home/ur/sdk/sdk-1.13.0/samples/html/com.ur.urcap.examples.helloworld/pom.xml

上記の「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のインスタンスを作成して返しています。
  • HelloWorldProgramNodeView
    • buildUI()
      • プログラムノードのUIを生成しています。
  • HelloWorldProgramNodeContribution
    • openView()
      • プログラムノードが選択された際に呼ばれ、プレビューの内容を更新しています。(この際にインストレーションノードの内容を参照しています。)
    • closeView()
      • プログラムノードのUIから離れる際に呼ばれます。
    • isDefined()
      • プログラムノードを実行するための事前条件を判定する処理を記述しています。
        • プログラムノードへ指定されたパラメータやプログラムツリーの構成(直後に移動命令が存在するかなど)に制約がある場合にこれを判定することで、意図しないプログラムが記述されてしまうことを抑止できます。
    • getTitle()
      • プログラムツリーに表示されるプログラムノードの名前を返しています。
    • genarateScript()
      • プログラム実行時の命令をURScript[3]で記述しています。サンプルでは入力内容に応じたポップアップを表示しています。

インストレーションノード

#

インストレーションノードはSwingInstallationNodeServiceを実装することでサービスを提供可能にします。
SwingInstallationNodeViewはインストレーションノードのUIを提供し、InstallationNodeContributionはインストレーションノードのロジックを提供します。[2:2]

「Hello World」サンプルのインストレーションノードでは以下のような実装がされています。

  • HelloWorldInstallationNodeService
    • getTitle()
      • インストレーションノードの名前を返しています。
    • configureContribution()
      • インストレーションノードの構成を設定します。
    • createView()
      • サービス登録後に一度だけHelloWorldInstallationNodeViewのインスタンスを作成して返しています。
    • createInstallationNode()
      • サービス登録後に一度だけHelloWorldInstallationNodeContributionのインスタンスを作成して返しています。
  • HelloWorldInstallationNodeView
    • buildUI()
      • インストレーションノードのUIを生成しています。
  • HelloWorldInstallationNodeContribution
    • openView()
      • インストレーションノードが選択された際に呼ばれ、ポップアップのタイトルを設定しています。
    • closeView()
      • インストレーションノードのUIから離れる際に呼ばれます。
    • genarateScript()
      • プログラム開始時または保存時に呼ばれ、URScript[3:1]で記述した命令を実行します。サンプルでは入力内容に応じたポップアップタイトルをグローバル変数に保存してプログラムノードから参照できるようにしています。

まとめ

#

今回はURCapの実装までをざっくりと紹介しました。
URの公式サイトではデジタルI/Oを制御するURCapをステップバイステップで作成する例が紹介されていますのでご参照ください。(こちら)
また、URCapの基本について記事では触れられていない部分もありますので、URの公式サイトをご参照ください。(こちら)

このURCapの開発を通したUR+のエコシステムはこちらにもある通り、URとそのパートナーが得意分野を活かした製品開発をできるビジネスモデルであり、これからもっと幅を広げていくことでしょう。

以上、お疲れ様でした。


  1. ロボットの位置姿勢や動き方を教示するための外部装置のことで、ティーチペンダントまたは教示ペンダントとも呼ぶ。 ↩︎

  2. URCAP - PRINCIPLE OF URCAPS IN POLYSCOPEより画像を参照。 ↩︎ ↩︎ ↩︎

  3. URロボットを制御するUR独自のスクリプト言語。 ↩︎ ↩︎

豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. 基本から理解するJWTとJWT認証の仕組み(2022-12-08)
  2. 直感が理性に大反抗!「モンティ・ホール問題」(2022-07-04)
  3. Nuxt3入門(第4回) - Nuxtのルーティングを理解する(2022-10-09)
  4. Nuxt3入門(第8回) - Nuxt3のuseStateでコンポーネント間で状態を共有する(2022-10-28)
  5. Podman Desktopがv1.0になったのでwindows版を試してみたところ、気付いたらv1.1に上がるくらいに機能豊富だった話(2023-06-09)
  6. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する(2022-09-25)
  7. VS Code で .NET MAUI の開発環境を構築する(macOS/iOS)(2023-08-14)
  8. Pytestを使ってみる(その2:VSCode拡張機能編)(2023-03-05)
  9. GitHub Actions - 構成変数(環境変数)が外部設定できるようになったので用途を整理する(2023-01-16)
  10. 統計学で避けて通れない自由度の話(2022-06-20)