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:~#
だめなようです。
なので、スクリプトの中身を確認し、逐一手動で入れます。
スクリプトをみるとどうも、
パッケージのソースリスト /etc/apt/sources.list にURLを追加する
パッケージ:
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の接続確認は、最低限の足回りの確認として便利です。
サンプルの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のタッチパネルの設定も、たぶん、個体依存性があります。
なお、利用については、一通りここの記述全体 を確認の上、手間と時間削減の一手段とお考え下さい。
イメージが動かなかったとしてもご要望にはお応えできません。