mini2440にOpenRTMをインストール

[| ]  最終更新: 2011/02/10 20:08:33

はじめに

RTComponents with Tkinter, python このページではmini2440ボードにOpenRTMをインストールします。

すでに基本的なインストールX window systemまでのインストールが終わっているところに、OpenRTMをインストールします。

OpenRTMにはC++版、Java版、Python版がありますが、機種依存性が少なく、手頃な Python版を入れます。
C++版は apt-get install g++ で、Javaもパッケージがあるので動くことが期待できますが、未確認です。
(基本的にクロス開発でなく、直接ターゲット上で開発できるのがこの環境の便利なところです)

流れとしては、

を行います。

なお、恐らく、初OpenRTMがこのボードということはないと思いますので、最低限のOpenRTMの体験がある(2,3のサンプルコンポーネントを動かし、繋いで見たことがある、程度)ことを想定しています。
操作方法などは、本家、およびぐぐって調べて下さい。


mini2440へのOpenRTMインストールと確認

mini2440はパワーのないマイコンボードとはいえ、ここまででXの動くLinux機になっています。 ので、OpenRTM-aistのUbuntu用パッケージをインストールします。

インストール前の準備


OpenRTM-aist、python版のインストール

まず、オートのインストーラが動くか試します。

mini2440:~# ls
pkg_install_python_ubuntu.sh
mini2440:~# chmod +x pkg_install_python_ubuntu.sh
mini2440:~# ./pkg_install_python_ubuntu.sh
sed: can't read /etc/lsb-release: No such file or directory
This OS is not supported.
mini2440:~#
だめなようです。

なので、スクリプトの中身を確認し、逐一手動で入れます。
スクリプトをみるとどうも、

  1. パッケージのソースリスト /etc/apt/sources.list にURLを追加する
  2. パッケージ:
    omnipy: python python-omniorb2-omg omniidl4-python omniorb4-nameserver
    openrtm: openrtm-aist-python openrtm-aist-python-example
    をインストールする
だけのようです。以下、行います。

最初に、OmniORBpyをインストールします。

mini2440:~# apt-get install python ※終わってるはず
mini2440:~# apt-get install python-omniorb2 python-omniorb2-omg
mini2440:~# apt-get install omniidl4-python omniorb4-nameserver

つぎに、OpenRTM-aistをインストールします。
Download→Python→ OpenRTM-aist-Python-1.0.0-RELEASEから、
Python版ソースコード:OpenRTM-aist-Python-1.0.0-RELEASE.tar.gz
を取得し、展開します。

mini2440:~# wget http://www.openrtm.org/pub/OpenRTM-aist/python/(そのまま続けて)
1.0.0/OpenRTM-aist-Python-1.0.0-RELEASE.tar.gz
mini2440:~# tar xvzof OpenRTM-aist-Python-1.0.0-RELEASE.tar.gz
つぎに、インストール作業を行います。
mini2440:~# apt-get install doxygen  (ないとbuild中にエラーが見える) 
mini2440:~# cd OpenRTM-aist-Python-1.0.0
mini2440:~/OpenRTM-aist-Python-1.0.0# python setup.py build
※かなりwarningでるけど、とりあえずおわる
mini2440:~/OpenRTM-aist-Python-1.0.0# python setup.py install
なお、pythonなので?i386用のpython用の.debをダウンロードして、
dpkg --force-architecture -i openrtm-aist-python_1.0.0-release0_i386.deb
dpkg --force-architecture -i openrtm-aist-python-example_1.0.0-release0_i386.deb
/usr/lib/python2.6/dist-packages/ 以下の OpenRTM*を
  /usr/lib/python2.5/site-packages/ にコピー。
でも動くことを確認しました。楽ですが非推奨です。

最後に、サンプルコンポーネントを取得し、動くかどうかを確認します。
表のリンクで見あたらないので、適当なところから拾います。

なんとか# cd 
mini2440:~# wget http://www.openrtm.org/pub/Linux/ubuntu/dists/hardy/main/binary-i386/open
rtm-aist-python-example_1.0.0-release0.tar.gz
mini2440:~# tar xvzof openrtm-aist-python-example_1.0.0-release0.tar.gz
mini2440:~# cd openrtm-aist-python-example-1.0.0/OpenRTM_aist/examples/SimpleIO/
mini2440:----# python ConsoleOut.py
comp_args: ConsoleOut
エラーも出ず、見た目なにもしていない感じになったらとりあえずOKの可能性大です。
別の端末で接続状況を確認します。
mini2440:~# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:44529                 *:*                     LISTEN
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp        0      0 *:2809                  *:*                     LISTEN
tcp        0      0 localhost.localdom:2809 localhost.localdo:35692 ESTABLISHED
tcp        0      0 localhost.localdo:35692 localhost.localdom:2809 ESTABLISHED
tcp        0      0 192.168.1.7:ssh         192.168.1.3:2719        ESTABLISHED
ここで、 です。なにかがおかしい時、これらが正常にできません。
(前述の"lo"がないと、nameserverも起動しないし、コンポーネントもエラーが出て止まるので、もっと自明ですが)

簡単なコンポーネント接続試験

まず、sshを3つ接続します(シリアルも含めると4端末)。

その上で、各端末で以下の操作をします。
(本来は、run.pyが同じようなことをしてくれるのですが、mini2440には端末を開く能力が無いので、手動です)

端末1:出力担当(上の続きのままで可)

# cd openrtm-aist-python-example-1.0.0/OpenRTM_aist/examples/SimpleIO
# python ConsoleOut.py
端末2:入力担当
# cd openrtm-aist-python-example-1.0.0/OpenRTM_aist/examples/SimpleIO
# python ConsoleIn.py
端末3:接続制御
# cd openrtm-aist-python-example-1.0.0/OpenRTM_aist/examples/SimpleIO
# python Connector.py
(すこし間がある)
Subscription Type:  flush
Period:  1.0  [Hz]
push policy:  new
skip count:  0
# 

最後の手順をおえると、端末2が

comp_args: ConsoleIn
------------------------------
Listener:        ON_CONNECT
Profile::name:   connector0
Profile::id:     3183fd56-976f-11df-b4ec-080811181227
------------------------------
Please input number:
のような感じになっているので、ここで、「12345」などと数字を入れます。すると、そこに
Sending to subscriber:  12345
------------------------------
Listener:        ON_SEND
Profile::name:   connector0
Profile::id:     3183fd56-976f-11df-b4ec-080811181227
Data:            12345
------------------------------
------------------------------
Listener:        ON_RECEIVED
Profile::name:   connector0
Profile::id:     3183fd56-976f-11df-b4ec-080811181227
Data:            12345
------------------------------
のような表示がでるとともに、ConsoleOut.pyを動かした、端末1に
------------------------------
Listener:        ON_RECEIVED
Profile::name:   connector0
Profile::id:     3183fd56-976f-11df-b4ec-080811181227
Data:            12345
------------------------------
------------------------------
Listener:        ON_BUFFER_WRITE
Profile::name:   connector0
Profile::id:     3183fd56-976f-11df-b4ec-080811181227
Data:            12345
------------------------------
Received:  RTC.TimedLong(tm=RTC.Time(sec=1280009439L, nsec=810384000L), data=12345)
Received:  12345
TimeStamp:  1280009439 [s]  810384000 [ns]
のような、「12345」を受信した状況が表示されます。
これで、1:コンポーネントの起動確認 2:コンポーネントの接続とそれぞれの通信確認、ができました。
(終了はCtrl-CでOK、たぶん)

この動作中に、

というチェックもできます。
さしあたり、netstatの接続確認は、最低限の足回りの確認として便利です。

WindowsへのOpenRTMインストール

ここまできたら、なにも難しいことはありません。 OpenRTM-aistのページから、Python版(と必要ならC++やJava版)をダウンロードして、適当にインストールして下さい。
なお、事前にPythonのWindows版を入れる必要がありますが、これも何も考えずにボタンを押して入れました(mini2440はPython2.5ですが、Windows側が2.6でも全く問題なし、たぶん)。

以上(笑)。


mini2440でのグラフィカルなコンポーネントの動作試験

サンプルのSlider and Motorをつかって、Xまで含めたトータルの試験をします。

まず、分かりやすく動くようにするため、若干改造します。 openrtm-aist-python-example-1.0.0/OpenRTM_aist/examples/Slider_and_Motor/において、
TkMotorPosComp.py:

50行目と68行目(2箇所同じ):
     time.sleep(0.01)
を
     time.sleep(0.1)
に。※サイクルを減らす
63行目:
           self._v[i] = val[i] * 10
を
           self._v[i] = val[i] * 1
に。※表示の感度が高すぎるので落とす
SliderComp.py:
60行目:
     time.sleep(0.01)
を
     time.sleep(0.1)
に。※サイクルを減らす
slider.py:
13行目付近:
class SliderMulti(Frame):
        def __init__(self, channels, master=None):
                Frame.__init__(self, master)
                self.init(channels)
この行追加      self.master.geometry('+0+180')
                self.pack()
※表示位置の固定のため

Connector.py:

28行目:
     tkm.setObject(naming.resolve("TkMotorComp0.rtc"))
を
     tkm.setObject(naming.resolve("TkMotorPosComp0.rtc"))
に変更。
※Connector.pyはTkMotorCompをつなぐ仕様になっているため。
※TkMotorCompは速度制御型なので動作がわかりにくい。

端末を三つ用意します。各端末で、

# cd openrtm-aist-python-example-1.0.0/OpenRTM_aist/examples/Slider_and_Motor
# export DISPLAY=:0.0
# python TkMotorPosComp.py
comp_args: TkMotorPosComp
Componet created
# cd openrtm-aist-python-example-1.0.0/OpenRTM_aist/examples/Slider_and_Motor
# export DISPLAY=:0.0
# python SliderComp.py
comp_args: SliderComp
Componet created
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
画面にダイアルが並びます。
画面上にスライダが6本表示されます。
両者表示後、
# cd openrtm-aist-python-example-1.0.0/OpenRTM_aist/examples/Slider_and_Motor
# python Connector.py
を実行すると、コンポーネントがつながります。
以下、画面の様子と、別PCのSystemEditorで確認した状態です。
RTComponents with Tkinter, python Slider and Motor component

ただし、実際動かしてみると(上の改造をしても)劇重です。
topコマンドで状況を確認すると、pythonが大半のCPUパワーを食っています。 コンポーネント部分の仕様か、Tkの問題か、要確認です。おおざっぱに、tkmotor.pyの中は比較的軽く、slider.pyでsliderを操作するとCPUを50%近く食うほど重いこと、また、ConsoleInをただ起動しただけで65%くらいのCPUを食うことは確認しているので、どこかに、非アクティブでも重たい部分があるようです。
もう少し実用的には、別のPCなどでコンポーネントを動かして、PC側コンポーネントと接続するとましに動きます。

ちなみに、これらのコンポーネントはCtrl-Cで止まりません。 強制終了はCtrl-Zして、「[3]+ Stopped 」などと数字付きの表示がでるので、そうしたら、「kill %3」として止めます。


以上、パフォーマンスについては要チェックですが、mini2440ボードで、GUIとRTミドルウエアのコンポーネントが動くらしい、というところまでインストールと確認ができました。

イメージ

ここまでやったSDカードのイメージファイルをバックアップ代わりに置いておきます。 書き込みはSDカードのバックアップを参考にして下さい。そのほか、U-bootの書き込みと、その起動の設定は必要です。
また、Xのタッチパネルの設定も、たぶん、個体依存性があります。

なお、利用については、一通りここの記述全体を確認の上、手間と時間削減の一手段とお考え下さい。 イメージが動かなかったとしてもご要望にはお応えできません。


熊谷正朗 [→連絡]
東北学院大学 工学部 機械知能工学科 RDE
[| ]