Bakulog

獏の夢日記的な何か。

【ロボット】uArm SwiftをUnityで操作できるようにする【C#】

タイトル通りです。 こいついつもC#とUnityのラッパー作ってんな

 

1. 概要など

本記事は先日投稿した「【ロボット】uArm Swift Proが届きました【2台】」の続きです。前の記事でも紹介している通り、現在私の家にはuArm Swift Proというロボットがあります。

このロボットを扱うためのAPIは現在まだ整備中なのですが、私はとっととC#でグリグリしたいので、とりあえずUArmDotNetというラッパーライブラリを作り、基本機能まで使えるようにしました。もちろんC#で作ってるのでUnity対応です。

…といってもUnity 2017限定ですが。従来版のUnityが非対応なのはTaskとかasync/await使ってるせいです。

ともかく、動かすとこんな感じになります。

https://twitter.com/baku_dreameater/status/889065432501567488

 

この例ではUnity側のオブジェクトの座標をほぼそのままロボットの移動目標にすることで動かしています。 単純な例ではありますが、3D表示のハードルが無いおかげでロボットの制御と相性が良いのを示した例かなあ、と理解しています。

 

2. ソース置き場所とか使い方とか

GitHubを参照ください。

 

3. 出来ることと出来ないこと

  • できること
    • ロボットを動かす
    • グリッパーや吸着カップを使う
  • できないこと
    • 画像処理

画像処理ができないのは、uArm Swift自体では(現時点で)カメラまわりのサポートが薄いためです。 今後の展開によっては何かしらサポートできるようになるかもしれません。

 

4. Known Issue的な

GitHubでもサンプルコード上のハックとして触れている内容ですが、記載しておきます。

現在、なぜかシリアルポート接続直後の送信バッファ(uArmから見ると受信バッファ)に"????"という謎のデータが載っているように扱われてしまい、通信確立した直後ではコマンドが届きません。

この問題を回避するには、サンプルでもやっているように、ダミーのメッセージを最初で投げるだけ投げておき、バッファを掃除する、という処理をすればOKです。

static async Task MainTask()
{
    var uArm = new UArm("COM1");
    uArm.Connector.Connect();
    uArm.Connector.Post("dummy"); //このダミーメッセージを送らないとBeepAsyncがコケる

    await uArm.BeepAsync(440, 1000);

    uArm.Connector.Disconnect();
}

5. まとめと感想

若干ゲスい感想ですが、uFactory公式からPythonAPIが出る前にこちらが出せたので満足です。

…とはいえ、エラーまわりとかレーザー関連とか「グリッパー使いづらくね」とかいろいろ思う所もあるので、もうちょっと良くしたい感じではありますね。はい。

リクエストやバグ報告は本記事へのコメントとか、あるいはすぐ回答欲しい場合Twitterまでお願いします。