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

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

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

流れとしては、

  • ボードへのOpenRTMのインストール
    (含むomniORBpy)
  • Windowsマシンへのインストール
    (基本、解説省略)
  • ボード上でのコンポーネントテスト
を行います。

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

mini2440はパワーのないマイコンボードとはいえ、ここまででXの動くLinux機になっています。 ので、OpenRTM-aistのUbuntu用パッケージをインストールします。
  • 環境のバックアップ(一応イメージを保存しておく)
  • ネットワークの確認 mini2440:~# ifconfig eth0 Link encap:Ethernet HWaddr 08:08:11:18:12:27 inet addr:192.168.1.7 Bcast:192.168.1.255 Mask:255.255.255.0 : lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 : もし、"lo"(loopback)が無い場合、動作不良につながるので(これが原因でかなり手間がかかった)、/etc/network/interfacesの記述にloがあるか確認する。
    mini2440:~# cat /etc/network/interfaces # Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or # /usr/share/doc/ifupdown/examples for more information. auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp

  • スクリプトをダウンロードする。
    (実際にはつかわ(え)ないが、中身の確認のため)
    方法1:wgetでいきなり確保
    mini2440:~# http://www.openrtm.org/OpenRTM-aist/download/(そのまま続く) install_scripts/pkg_install_python_ubuntu.sh ※URLが変わる可能性には注意
    方法2:Windowsにダウンロード後、ssh(シリアルではなく)でmini2440に繋いだTeraTermにドラッグアンドドロップすると"ファイル転送をしますか?"と聞かれるので、SCPする。と、/rootにファイルができる。
まず、オートのインストーラが動くか試します。 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 ここで、

  • 「*:2809 LISTEN」は先にapt-get installでいれたomniorbのnameserverが自動起動してサービスを開始した際に生成されるポート。 OpenRTMの各種解説にある「ネームサーバ」は手動起動する必要なく、自動起動に設定される。
  • その2809と35692(環境によるが一般に万単位の大きい数字)の間のESTABLISHEDがコンポーネント(ConsoleOut.py)とnameseverの間の連絡用の接続。
  • ※表示は「IPアドレス:ポート番号」、netstatは全接続を表示するため、同じOS上での接続は双方向に2本表示される
です。なにかがおかしい時、これらが正常にできません。
(前述の"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で確認すると
    # netstat -a | grep -v ssh ※sshの表示を削る Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:40235 *:* LISTEN tcp 0 0 *:44529 *:* 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 localhost.localdom:2809 localhost.localdo:34021 ESTABLISHED tcp 0 0 localhost.localdo:34021 localhost.localdom:2809 ESTABLISHED tcp 0 0 192.168.1.7:44529 192.168.1.7:51083 ESTABLISHED tcp 0 0 192.168.1.7:51083 192.168.1.7:44529 ESTABLISHED tcp 0 0 192.168.1.7:40235 192.168.1.7:54245 ESTABLISHED tcp 0 0 192.168.1.7:54245 192.168.1.7:40235 ESTABLISHED のような出力が得られる。解釈としては、
    1:LISTENしているのはネームサーバ(2809)と、二つのコンポーネント(個々に起動すれば簡単にどっちかはわかる)
    2:2809と3????の接続は、ネームサーバとコンポーネントの間のやりとり用
    3:コンポーネントLISTENの40235,44529と別のポートとの接続は、コンポーネント間の相互接続
    である。

  • どこか別のコンピュータでRTMのRT system editorを起動し、ネームサーバとして、このボードのアドレス(ここでは192.168.1.7)を追加すると二つのコンポーネントが見え、System diagram上に両者を引っ張り出すとアクティブの緑表示、かつ、接続の線も表示される。
というチェックもできます。
さしあたり、netstatの接続確認は、最低限の足回りの確認として便利です。
ここまできたら、なにも難しいことはありません。 OpenRTM-aistのページから、Python版(と必要ならC++やJava版)をダウンロードして、適当にインストールして下さい。
なお、事前にPythonのWindows版を入れる必要がありますが、これも何も考えずにボタンを押して入れました(mini2440はPython2.5ですが、Windows側が2.6でも全く問題なし、たぶん)。

以上(笑)。

サンプルの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で確認した状態です。

ただし、実際動かしてみると(上の改造をしても)劇重です。
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のタッチパネルの設定も、たぶん、個体依存性があります。 なお、利用については、一通りここの記述全体を確認の上、手間と時間削減の一手段とお考え下さい。 イメージが動かなかったとしてもご要望にはお応えできません。