小型ロボットアームDOBOT MagicianをJetson Nanoからコントロールしてみよう!

小型ロボットアームDOBOT Magicianは、USB接続によりPCからもSBCからもコントロールできます。ロボットアームを制御するためのAPIは、共有ライブラリ(DLLもしくはshared object)として用意されているため、プログラミング言語はC++でもPythonでも選択でき、利用の幅が広がります。

ただし、DOBOT社から提供されている共有ライブラリは、Intel系のCPUのもののみです。SBCに多いARM系のCPUでDOBOT Magicianを制御するためには、ソースコードからコンパイルする必要があります。

ここでは、Jetson Nanoを例にとり、DOBOT MagicianをPythonから制御するための環境の整備方法をまとめます。

なお、以降の説明では、執筆時点で最新であるr32.3.1版のOSを前提としています。

1. 必要なパッケージのインストール

DOBOT API共有ライブラリをビルドするために必要な最小限のパッケージをインストールします。

$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install -y libqt5serialport5 libqt5serialport5-dev \
  python3-serial
$ sudo apt-get install -y qt5-default qt4-dev-tools

※ 必要なパッケージはSBCやOSにより異なります。

2. DOBOT APIのソースコードの入手

DOBOT APIのソースコードは、DOBOT社のダウンロードページで公開されているDobotDemo V2.0に含まれています。

DobotDemo V2.0は、DOBOT Magicianを各種言語や各種プロセッサ/マイコンから制御する簡単な例を集めたサンプル集で、コンパイル済みのDOBOT API共有ライブラリとソースコードが含まれています。なお、コンパイル済み共有ライブラリは、Intel系のCPUのもののみです。

ARMプロセッサ向けにコンパイルするために、ターゲットのJetson Nano上に作業用のディレクトリを作成し、DobotDemo v2.0をダウンロードして展開しましょう。

$ mkdir dobot
$ cd dobot
$ wget https://download.dobot.cc/development-protocol/dobot-magician/win7-win10/Demo/DobotDemoV2.0/EN/DobotDemoV2.0.zip
$ unzip DobotDemoV2.0.zip

ソースコードの存在する階層までディレクトリを移動します。ソースコードのあるディレクトリは、ディレクトリ名にスペースが含まれておりLinuxでは扱いづらい名前となっているため、srcというディレクトリ名に変更しましょう。

$ cd DobotDemoV2.0/DobotDll/
$ mv DobotDll\ source\ code src
$ cd src

3. DOBOT API共有ライブラリの作成

ソースコードのあるディレクトリには、makefileを生成する雛形となるファイル(.proファイル)が置かれています。qmakeを使ってmakefileを生成した上でmakeします。

$ qmake -o makefile DobotDll.pro
$ make

すると、DobotDemo V2.0を展開したディレクトリの横に、DobotDllOutputというディレクトリが作られます。makeした共有ライブラリは、その中にlibDobotDll.soという名前で格納されます。

$ cd ~/dobot/DobotDllOutput/
$ ls
libDobotDll.so libDobotDll.so.1 libDobotDll.so.1.0 libDobotDll.so.1.0.0
$

4. PythonからAPIを呼び出すためのwrapper関数

共有ライブラリのDOBOT APIはC++の関数であるため、Pythonからの呼び出し方法は少し煩雑となります。Pythonの関数として呼び出しやすくするためのwrapperが、DobotDemo V2.0に用意されていますので、簡単にimportできるよう、共有ライブラリと同じディレクトリにコピーしておきましょう。

$ cp ../DobotDemoV2.0/DobotDemoForPython/*.py  ./

上記では、wrapperファイルDobotDllType.pyとともに、動作確認用のサンプルプログラムDobotControl.pyもコピーしています。

このwrapperファイルにコーディングされている共有ファイルのロード関数は、ARM系のLinuxではうまく動きません。下記の赤字箇所のように編集が必要です。

2022年1月24日現在はこの変更を行うことによってx86_64環境でも動作することを確認しております。

変更前:

456 ################## API func ##################
457
458 def load():
459     if platform.system() == "Windows":
460         return CDLL("DobotDll.dll", RTLD_GLOBAL)
461     elif platform.system() == "Darwin" :
462         return CDLL("libDobotDll.dylib", RTLD_GLOBAL)
463     else:
464         return cdll.loadLibrary("libDobotDll.so")
465

変更後:

456 ################## API func ##################
457
458 def load():
459     if platform.system() == "Windows":
460         return CDLL("DobotDll.dll", RTLD_GLOBAL)
461     elif platform.system() == "Darwin" :
462         return CDLL("libDobotDll.dylib", RTLD_GLOBAL)
463     else:
464         return CDLL("./libDobotDll.so")
465

5. DOBOT Magician通信ポートのアクセス権の変更

DOBOT Magicianは、SBCからシリアルポートを介して通信します。シリアルポートは、Linux/Unixの初期の頃には、ログインする経路として使われてきました。現在でも、ディスプレイを接続せずに使うヘッドレスなどの特別な使い方をする場合には、シリアル通信でログインすることがあります。

Linux系のOSでは、セキュリティ確保のため、外部からログインできる経路を、デフォルトでは制限するようにしています。この影響で、DOBOT Magicianとシリアルポートを介して通信するには、root権限が必要となります。すなわち、sudo python3 xxx.pyといったようにsudoを付けてPythonを実行する必要が生じます。

これでは使い勝手が悪いので、udevというプラグアンドプレイの仕組みを利用して、シリアルポートを一般ユーザ権限でアクセスできるような設定変更を自動化しましょう。

そのためには、udev向けのルールファイルを作成します。

/etc/udev/rules.d/ の下に、50-udev-default.rulesというファイル名で、次の1行からなるルールファイルを作成します。

KERNEL=="ttyUSB[0-9]*", GROUP="$USER", MODE="0666"

もちろん、/etc/の下のファイルはrootでなければ編集できません。テキストエディタを起動する際には、sudoを付けて起動しましょう。

$ sudo  vi  /etc/udev/rules.d/50-udev-default.rules

あるいは

$ sudo  gedit  /etc/udev/rules.d/50-udev-default.rules

テキストエディタに慣れていない人は、例えば、こんな感じで実行すると良いでしょう。

$ echo 'KERNEL=="ttyUSB[0-9]*", GROUP="$USER", MODE="0666"' > 50-udev-default.rules
$ sudo mv 50-udev-default.rules /etc/udev/rules.d/
$ sudo chown root /etc/udev/rules.d/50-udev-default.rules
$ sudo chgrp root /etc/udev/rules.d/50-udev-default.rules

6. 環境変数の設定

Pythonプログラムを実行する際、DOBOT APIの共有ライブラリがどこに置かれているか(どこを探せば見つかるか)を教えてあげるための環境変数の設定が必要です。

$ export LD_LIBRARY_PATH="."
$ sudo ldconfig

7. サンプルプログラムを実行してみよう!

ここまでの準備が整ったら、4.でコピーしておいたサンプルプログラムを動かしてみましょう。

DOBOT Magicianは、Jetson NanoとUSBで接続し、DOBOT Magicianの電源SWをONにしておいてください。

次の1行で、ロボットアームが上下に何度が動く動作を繰り返し、停止してプログラムも終了します。

$ python3 DobotControl.py

うまく動きましたでしょうか?

8. 最後に

ここまでの手順のどこかでつまづいてしまった場合には、下記のメールアドレスまでお問い合わせください。

問い合わせ先: dobot@techshare.co.jp

9. おまけ

今回はJetson Nanoでコンパイルしましたが、コンパイルした共有ライブラリファイルを他のSBC (Raspberry PiやTinker Board) にコピーして、5.のudevの設定や6.の環境変数の設定を行ったとしても動きません。

理由は2つあります。

    1. Jetson NanoのOSは64bitであるのに対し、Raspberry PiやTinker Boardは32bitのOSであるため。
    2. 作成した共有ライブラリ内で、さらに別の共有ライブラリを呼び出しており、それらが存在しなかったり、存在していても版数が違う場合には、動かないため。

同じSBCでも、OSのバージョンが変わると、2つめの問題は発生する可能性があります。今まで動いていた共有ライブラリを、別のOS環境にコピーして動かなかったときには、1.のパッケージのインストールを実行してみて、それでもダメなら、再度、新しいOS環境で、今回の手順に従って共有ライブラリを作成し直しましょう。