すでに基本的なインストールとX window systemまでのインストールが終わっているところに、OpenRTMをインストールします。
OpenRTMにはC++版、Java版、Python版がありますが、機種依存性が少なく、手頃な Python版を入れます。
C++版は apt-get install g++ で、Javaもパッケージがあるので動くことが期待できますが、未確認です。
(基本的にクロス開発でなく、直接ターゲット上で開発できるのがこの環境の便利なところです)
流れとしては、
なお、恐らく、初OpenRTMがこのボードということはないと思いますので、最低限のOpenRTMの体験がある(2,3のサンプルコンポーネントを動かし、繋いで見たことがある、程度)ことを想定しています。
操作方法などは、本家、およびぐぐって調べて下さい。
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
mini2440:~# http://www.openrtm.org/OpenRTM-aist/download/(そのまま続く) install_scripts/pkg_install_python_ubuntu.sh※URLが変わる可能性には注意
まず、オートのインストーラが動くか試します。
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:~#だめなようです。
なので、スクリプトの中身を確認し、逐一手動で入れます。
スクリプトをみるとどうも、
最初に、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ここで、
まず、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」を受信した状況が表示されます。
この動作中に、
# 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のような出力が得られる。解釈としては、
以上(笑)。
まず、分かりやすく動くようにするため、若干改造します。
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]画面にダイアルが並びます。
# cd openrtm-aist-python-example-1.0.0/OpenRTM_aist/examples/Slider_and_Motor # python Connector.pyを実行すると、コンポーネントがつながります。
ただし、実際動かしてみると(上の改造をしても)劇重です。
topコマンドで状況を確認すると、pythonが大半のCPUパワーを食っています。
コンポーネント部分の仕様か、Tkの問題か、要確認です。おおざっぱに、tkmotor.pyの中は比較的軽く、slider.pyでsliderを操作するとCPUを50%近く食うほど重いこと、また、ConsoleInをただ起動しただけで65%くらいのCPUを食うことは確認しているので、どこかに、非アクティブでも重たい部分があるようです。
もう少し実用的には、別のPCなどでコンポーネントを動かして、PC側コンポーネントと接続するとましに動きます。
ちなみに、これらのコンポーネントはCtrl-Cで止まりません。 強制終了はCtrl-Zして、「[3]+ Stopped 」などと数字付きの表示がでるので、そうしたら、「kill %3」として止めます。
ここまでやったSDカードのイメージファイルをバックアップ代わりに置いておきます。
書き込みはSDカードのバックアップを参考にして下さい。そのほか、U-bootの書き込みと、その起動の設定は必要です。
また、Xのタッチパネルの設定も、たぶん、個体依存性があります。