rospharoのクリーンインストール

なんだかイメージの調子が悪いので最初からインストールしてみた。きちんと手順を踏まないとならないので、備忘のために記録しておく。

1. XMLRPCのインストール

1-1. まずWorkspaceを開いて以下を入力し、XMLRPCのコンフィグレーションを読み込む。(以下、同様)

(Smalltalk at: #Gofer) new
squeaksource: 'MetacelloRepository';
package: 'ConfigurationOfXMLRPC';
load.

1-2. テスト付きクライアントパッケージをインストールする。

ConfigurationOfXMLRPC project latestVersion load: 'Client with Tests'.

1-3. テスト付きサーバーパッケージをインストールする。

ConfigurationOfXMLRPC project latestVersion load: 'Server with Tests'.

インストール中にエラー(Error: nil cannot be found in the list)が発生する。これは、XMLRPCHttpModuleのクラスメソッドinitializeで、Pharo 1.3に存在しないAutoStartを参照しているために起こる。

Debugボタンを押してデバッグウィンドウを出し、一覧からXMLRPCHttpModule class>>initializeをクリック。赤く表示されているAutoStartをClipboardに変更して、Alt-sでAcceptする。

途中でAuthor identificationが出たら自分のフルネームを入力する。スペースやクオーテーション、ハイフンなどは使えないので注意する。AcceptしたらProceedボタンを押して続行する。

1-4. 次に、XMLRPCのパッケージを修正するパッチを適用する。パッチファイル(xmlrpc-bugfix-struct.1.cs)は以前のエントリ d:id:nqthm:20110909 で公開しているので予めダウンロードしておく。

具体的な手順としてはメニューからTools-File Browserでファイルブラウザを開き、パッチファイル(xmlrpc-bugfix-struct.1.cs)を選んで、Fileinを押せばよい。

この時点で、XMLRPC-Client-TestsおよびXMLRPC-Server-Testsのテストが全て合格するはずである。

2. rospharoのインストール

2-1. 続いてrospharoをインストールする。Monticello Browserを開いて、+Repositoryボタンを押し、一覧からHTTPを選ぶ。

Information Requiredの画面で以下をカット&ペーストで入力してOKを押す。

MCHttpRepository
location: 'http://www.squeaksource.com/rospharo'
user: ''
password: ''

2-2. http://www.squeaksource.com/rospharo が選択されている状態でOpenボタンを押し、右側のペインの最上位のパッケージを選んでLoadする。

以上でインストールは完了する(はずである)。

rospharoのユニットテストはRos-Testsにある。またroscoreを起動した状態での通信テストはRos-Examplesにある。使い方の参考になるだろう。

pharo-xmlrpcのバグ

Rosでノード間通信するのに必要なので、Pharo上にXMLRPCを実現するpharo-xmlrpcというパッケージを利用している。

http://code.google.com/p/pharo-xmlrpc/

ベータ公開中のようであるが、テストはオールグリーンということで導入すると痛い目にあう。実際のところ、1.3RCはおろか1.2.1であってもテストの実行に失敗する。

問題は2点あり、ひとつはstructノードの生成に関すること、もう一つはネットワークポートに関することである。

以前このブログで、デコード時の問題を解決するパッチを公開した。このパッチでは、decodeStruct:というstructのデコード時にノードを深くたどりすぎるバグに対処するものだった。

http://d.hatena.ne.jp/nqthm/20110822/p1

実はこのパッチを当てると今まで動いていたテストが失敗するようになる。というのも実はエンコード時に以下のような結果を生成するようになっていたからである。

<struct><struct>....</struct></struct>

要するにstructノードを二重に生成してしまっているのだ。このためにパッチ前のデコード処理とうまく整合するようになっている。

structノードの生成は、encode:内でwrapVal:type:とencodeStruct:内の二カ所で連続して行っている。

本来こういった問題を回避するためのテストコードが必要で、実際そのためのテストコードもXMLRPCEncoderTest>>testEncoderにあるのだが、そもそもencodeStruct:でstructを生成することを前提にチェックしており問題は露見しない。不思議なのは、同じテストの別の箇所は全てencode:を用いてチェックしているのに、この部分だけはencodeStruct:を用いている。

以上のバグについては、XMLRPCDecoder>>decodeStruct:,

XMLRPCEncoder>>encodeStruct:, XMLRPCEncoderTest>>testEncoderを修正すれば良い。

もう一つのバグは、XMLRPCHttpModuleに関するものである。具体的な現象としては、テストを一度実行するとそれ以降、ネットワークポートが既にアサイン済みである旨のメッセージが出て、テストに失敗するというもの。どうもテスト終了時にネットワークポートの解放ができていないようである。

これはXMLRPCHttpModule class>>pauseでservice unassignPortを実行することで回避した。本来、ここに置くべきなのか不明なのだが、とりあえずの対処として行った。

近日公開予定と思われるPharo-1.3では、pharo-xmlrpcのインストール中にエラーが発生する。この理由は、XMLRPCHttpModule class>>initializeがStartUpListへの登録に、1.3では存在しない(らしい)AutoStartクラスへの参照を含んでいるからである。initializeの実行に失敗しただけなので、手動で実行すれば良いだろう。

なお、パッチは以下に置いてある。

http://itolab.com/software/pharo/xmlrpc-bugfix-struct.1.cs

Asus eeePCのブートメニュー

Asus eeePCにもubuntuを入れようと思ったけど、USBブートできなくて困った。

いや、当然できるんだろうけど起動時にホットキーの表示がなくいきなりWindowsが立ち上がるのでブートメニューが出せない。

電源オンですかさずF2を連打し(押しっぱなしは駄目みたい)BIOSメニューを出して、BOOTセクションでBoost BootをDisabledにして保存する。

再起動時にESCを連打するとブートメニューが出た。

慣れてないマシンだとこんなことでも戸惑ってしまう。

Pharo 1.3RCの日本語表示と日本語入力

Windowsでの日本語表示については、以下の手順でOK。

  1. FT2Plugin.dllをCog.exeのあるフォルダにコピー
  2. Pharoを起動
  3. World-System-SettingsでSettings browserを開く
  4. Appearance-Standard fontsでDefaultのフォント変更ボタンを押す
  5. Font fot defaultFontで、右下のUpdateボタンを押す。
  6. 適当なフォントを選んで Apply, OKボタンを押す。
  7. Settings browserでReset all to defaultボタンを押す。
  8. Settings browserを閉じる。
  9. イメージを保存しておく。

入力については一部文字の入力ができない。原因は1.2.1の時と同様。ただし、TextEditor>>dispathOn:は複数のメソッドに分割されたため、以前のパッチを当てるのは不適当である。

TextEditor>>dispatchCommandOn:return:メソッドで以下の部分を変更すれば良い。

- asciiValue := aKeyboardEvent keyValue.
+ asciiValue := aKeyboardEvent keyCharacter.

なお、全ての入力に対して適切に動作するかどうかは未確認であるので変更には注意されたい。

※追記(2011/10/5):上記のTextEditorに対するパッチは問題が生じることが判明した。正しくは、 id:nqthm:20111004:p1 を参照してほしい。

Pharo1.3RC

Pharoの1.3もRelease Candidateになったので、そろそろ出そうな感じである。

日本語の表示と入力を試してみたところ、SnowLeopardについてはFT2Plugin.bundleをコピーすれば問題なさそう。

Windowsについてはまだ試していないが、前回パッチをあてたTextEditor>>dispathOn:の中身が大幅に変わっているようなので、イヤな予感がする。

とりあえず1.3では、このブログに書いてある1.2.1のパッチ当て方では駄目なようなので注意!

ROSでkinectを動かす。

いろいろやったけど、準備として必要なのは以下の通り。(だと思う)

sudo apt-get install ros-diamondback-openni-kinect
sudo chmod -R a+rw /dev/bus/usb/*

kinectカメラを使うには、以下のようにする。

まず端末を立ち上げて、最初の画面でroscoreを起動する。

roscore

新しいタブを開いて、openni_cameraを起動する。

roslaunch openni_camera openni_node.launch

以上でOK。カメラ画像を見るには以下のようなコマンドを使う。

rosrun image_view image_view image:=/camera/rgb/image_color
rosrun image_view image_view image:=/camera/rgb/image_raw
rosrun image_view image_view image:=/camera/depth/image_raw

元情報はこちら。

http://www.ros.org/wiki/openni_kinect

ROSとPharoを結ぶ。

何がやりたいかというとROSをPharoで制御したいということ。ROSはXMLRPCで通信しているようなので、これを試してみた。結果は成功。

url := Url
absoluteFromText: 'http://192.168.254.72:11311/’.
proxy := XMLRPCProxy withUrl: url.
result := proxy
invokeMethod: 'getSystemState'
withArgs: #('/script').

上記のようにしてgetSystemStateを呼び出してみたら、ちゃんと結果が返ってきた。

#(1 'current system state' #(#(#('/rosout_agg' #('/rosout'))) #(#('/rosout' #('/rosout'))) #(#('/rosout/set_logger_level' #('/rosout')) #('/rosout/get_loggers' #('/rosout')))))

細かく制御できるのかこれから試す予定。

PharoでXMLRPCを使う。

来るべき日に備えてPharoにXMLRPCを導入する。

http://code.google.com/p/pharo-xmlrpc/ より)

まずは、Configurationを取得する。

(Smalltalk at: #Gofer) new
squeaksource: 'MetacelloRepository';
package: 'ConfigurationOfXMLRPC';
load.

Configurationを使っていろんなタイプ(クライアントのみとかサーバー付きとか)が選べる。以下のうち1つを選んでワークスペースに入力し、評価すれば後は勝手にインストールされる。

クライアントのみの場合

ConfigurationOfXMLRPC project latestVersion load: 'Client'.

テスト付きのクライアントの場合

ConfigurationOfXMLRPC project latestVersion load: 'Client with Tests'.

クライアント+サーバの場合

ConfigurationOfXMLRPC project latestVersion load: 'Server'.

テスト付きのクライアント+サーバの場合

ConfigurationOfXMLRPC project latestVersion load: 'Server with Tests'.

とりあえず全部?の場合

ConfigurationOfXMLRPC project latestVersion load: 'All'.

当面の目的においてはクライアントのみでOKなので、テスト付きクライアントを取得した。

ところが、wikiにあるサンプル( http://code.google.com/p/pharo-xmlrpc/wiki/Samples )を実行しようとするとエラーになる。XMLRPCDecoderがおかしいらしい。

XMLRPCDecoder>>decodeStruct:を以下のようにすると、うまくいった。

decodeStruct: xml
"Decode the Struct."
| rv |
rv := Dictionary new.
xml elements
do: [:eachNode | rv
at: (eachNode elementAt: 'name') contentString
put: (self
decode: (eachNode elementAt: 'value'))].
^ rv

要はノードの分解を余計にやってしまったことがエラーの原因らしい。これでサンプルもちゃんと動くようになると思ったけど、認証の関係でエラーが返ってきた。でもやりとりは成功しているらしいので良しとする。

ROS覚え書き「トピックの理解」

http://www.ros.org/wiki/ROS/Tutorials/UnderstandingTopics より

ノードは互いに通信する際、トピック(Topic)を通じて行う。例えばturtle_teleop_keyノードは、キー入力をトピック上に配信する。他方で、turtlesimノードはそのトピックを購読することでキー入力を受信する。

rxgraphは、実行中のノードとトピックからなる有向グラフを表示するツールである。このツールを使えば、ROSで何が行われているか視覚的に見ることができる。

rxgraph

turtle_teleop_keyノードは、/turtle1/command_velocityトピックを通じて、turtlesimノードと通信する。また、turtlesimノードは、/rosoutトピックを通じてrosoutノードと通信する。

rostopicは、トピックに関する情報を得るためのコマンドである。rostopic -hを実行すると利用可能なサブコマンドが表示される。

rostopic bw:トピックによって使われるバンド幅(bandwidth)を表示する。

rostopic echo:画面にメッセージを表示する。

rostopic hz:トピックの配信レート(publishing rate)を表示する。

rostopic list:有効なトピックに関する情報を表示する。

rostopic pub:トピックにデータを配信する。

rostopic type:トピックの型を表示する。

rostopic echoはトピック上に配信されたデータを表示する。使い方は以下の通り。

rostopic echo [トピック]

turtle_teleop_keyノードによって/turtle1/command_velocityトピック上に配信されたデータを見るには以下のようにする。

rostopic echo /turtle1/command_velocity

rostopic listは、現在配信・購読されている全てのトピックの一覧を表示する。rostopic list -hで、必要とされる引数についての説明が表示される。rostopic list -vで、配信・購読されるトピックのリストが表示される。

ノード間でメッセージ(Message)を送ることにより、トピック上で通信が行われる。配信者(turtle_teleop_key)と購読者(turtlesim_node)が通信するとき、配信者と購読者は同じ型(type)のメッセージを送受信する必要がある。トピック上で配信されるメッセージの型によってトピックの型が決まる。トピック上のメッセージの型は、rostopic typeを使って知ることができる。rostopic typeの使い方は以下の通り。

rostopic type [トピック]

rostpic type /turtle1/command_velocityを実行すると、turtlesim/Velocityを得る。

rosmsgを使って、メッセージの詳細を見ることができる。

rosmsg show turtlesim/Velocity

rostopic pubは、トピック上にデータを配信する。使い方は以下の通り。

rostopic pub [トピック] [メッセージ型] [引数]

使用例

rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity  -- 2.0  1.8

これはturtlesimに対して、線速度2.0、角速度1.8で動作するようにメッセージを送っている。

パラメータの-1は、メッセージを1つだけ送って終了することを示す。

/turtle1/command_velocityは、配信するトピックの名前を表す。

turtlesim/Velocityは、トピックへ配信するときに使うメッセージの型を表す。

  • は、サブコマンドのオプションがこれ以上ないことをパーサに伝えるものである。マイナス記号で始まる引数を使うような場合(たとえば負の数など)に用いる必要がある。

2.0 1.8は、turtlesim/Velocityメッセージの2個の小数点数linear, angularにそれぞれ対応する。これらの引数はYAML文法に従う。YAML文法についてはこちら: http://www.ros.org/wiki/ROS/YAMLCommandLine

メッセージを連続して配信するためには、pub -r コマンドを用いる。

rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0  -1.8

上の例では、1ヘルツの間隔でメッセージを配信している。

rostopic hzは、データが配信される速度を調べるのに使う。

rostopic hz [トピック]

turtlesim_nodeが/turtle1/poseトピックを配信する速度を調べるには、以下のようにする。

rostopic hz /turtle1/pose

rxplotは、トピックに対して配信されるデータを時系列的にプロットするコマンドである。/turtle1/poseトピックに対して配信されるデータをプロットする例は以下のとおり。

rxplot /turtle1/pose/x,/turtle1/pose/y /turtle1/pose/theta

この例では2つのグラフが表示され、上のグラフにはx,yの値が、下のグラフにはthetaの値がそれぞれプロットされる。