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の値がそれぞれプロットされる。

ROS覚え書き「ROSノードの理解」

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

ROSにおけるグラフの概念

ノード(Node):ノードはROSを使う実行形式で、他のノードと互いに通信できる。

トピック(Topic):ノードはトピックに対してメッセージを配信(Publish)する。また、メッセージを受信するためにトピックを購読(Subscribe)する。

メッセージ(Message):トピックへの配信や購読の際に用いられるROSデータ型のこと。

マスター(Master):ROSのネームサービスのこと。互いにノードを見つける助けとなる。

rosout:ROS版のstdout, stderrのこと。

roscore:マスター+rosout+パラメーターサーバー

ノードはROSクライアントライブラリを使って他のノードと通信し、トピックに対して配信・購読できる。また、サービスを提供したり利用できる。

ROSクライアントライブラリは、他のプログラミング言語で書かれたノードと通信できるようにするためのライブラリである。rospyはPython用のクライアントライブラリであり、roscppはC++用のクライアントライブラリである。

roscoreは、ROSを利用する際に実行しなければならない。以下のように実行する。

roscore

roscoreが起動しない場合は、ネットワーク設定に問題のある可能性がある。なお、roscoreは多重起動はできずエラーメッセージが表示される。

rosnodeは、実行中のノードに関する情報を表示する。rosnode listで、実行中のノードの一覧が表示される。

rosoutは常に実行されているノードで、デバッグ出力を記録するためのものである。

rosnode infoは、特定のノードに関する情報を表示する。以下は使用例。

rosnode info /rosout

rosnode infoにより、ノードが配信・購読するトピックやサービスがわかる。

rosrunは、パッケージ内のノードを直接実行するコマンドである。

rosrun [パッケージ名] [ノード名]

turtlesimパッケージのturtlesim_nodeを実行するには、以下のようにする。

rosrun turtlesim turtlesim_node

ノードに別途名前を付けることもできる。

rosrun turtlesim turtlesim_node __name:=my_turtle

rosnode pingで、名前を付けたノードが起動しているか確認できる。

rosnode ping my_turtle

ROS覚え書き「パッケージのビルド」

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

システム依存物(System Dependencies)とは、パッケージが必要とする外部ライブラリやツールで、特にOSが提供するようなもののこと。デフォルトでは、システム依存物がインストールされないので、ダウンロードやインストールを行うrosdepというコマンドが用意されている。

パッケージが必要とするシステム依存物は、マニフェストに記述されている必要があるので、manifest.xmlを見れば必要なシステム依存物を確認できる。

rosdepコマンドは、パッケージに必要なシステム依存物をインストールするのに使うコマンドである。

rosdep install [パッケージ]

上記のようにすれば、パッケージに対するシステム依存物がダウンロードされる。

rosmakeは、パッケージをビルドするコマンドである。パッケージのビルドだけでなく、依存するパッケージなどのビルドも適切な順序で行う。

rosmake [パッケージ]

以下のようにして複数のパッケージを一度にビルドできる。

rosmake [パッケージ1] [パッケージ2] [パッケージ3]

ROS覚え書き「パッケージの作成」

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

roscreate-pkgは、ROSのパッケージを作成するためのコマンドである。パッケージ内のファイルは共通するものが多いため、ミスを避けるためにも直接作成するのではなくroscreate-pkgを使う。

roscreate-pkg パッケージ名

依存物(Dependencies)を指定して作成することもできる。

roscreate-pkg [パッケージ名] [依存パッケージ1] [依存パッケージ2] [依存パッケージ3]

rospackを使うと、パッケージの一次依存物を調べられる。(以下は使用例)

rospack depends1 beginner_tutorial

マニフェストファイル(manifest.xml)のdependタグ内に一次依存物が書かれている。

全ての依存パッケージを調べるにも以下のようrospackコマンドを使う。

rospack depends beginner_tutorial

ROS覚え書き「ファイルシステムの操作」

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

パッケージ(Package):最も低レベルのROSソフトウェア構成。パッケージにはライブラリ、ツール、実行形式などが含まれる。

マニフェスト(Manifest):パッケージに関する記述をマニフェストという。マニフェストの役割は、パッケージ間の依存関係を定義すること。

スタック(Stack):スタックはパッケージの集まりで、より高レベルのライブラリを形成する。

スタックマニフェスト(Stack manifest):通常のマニフェストと同様でスタックに関するものである。

ファイルシステム上でパッケージとスタックを識別することは容易で、manifest.xmlファイルを持つディレクトリならパッケージ、stack.xmlファイルを持つディレクトリならスタックである。

パッケージに関する情報を得るにはrospackを用い、スタックについてはrosstackを用いる。

rospack find パッケージ名
rosstack find スタック名

とすると、環境変数ROS_PACKAGE_PATH上にあるパッケージやスタックの場所を知ることができる。

roscdは、パッケージやスタックのあるディレクトリに移動(cd)するコマンドである。

roscd [パッケージ名(またはスタック名)[/サブディレクトリ

パラメータなしでroscdを実行すると、環境変数ROS_ROOTで示されたディレクトリに移動する。

roslsは、指定されたパッケージやスタックのディレクトリ内容を表示するコマンドである。パラメータ形式はroscdと同じである。

roscdやroslsのパラメータはTABキー入力で補完される。

Installing and Configuring Your ROS Environment

よくわからないのでチュートリアルを片っ端からやる。

http://www.ros.org/wiki/ROS/Tutorials

http://www.ros.org/wiki/ROS/Tutorials/InstallingandConfiguringROSEnvironment

このチュートリアルは単に作業用ディレクトリを作るのと、それを環境変数にセットすることだけのようだ。

実質的に端末でやった作業は以下の通り。

mkdir ~/ros_workspace
echo "export ROS_PACKAGE_PATH=~/ros_workspace:/opt/ros/diamondback/stacks" > setup.sh

これで次回以降、以下のように入力すれば全ての環境が整えられるみたい。

. setup.sh

ROSのインストール

まずはROSがサポートしているubuntu 11.04をインストールしておく。(省略)

http://www.ros.org/wiki/diamondback/Installation/Ubuntu

上記ページに従ってROSのインストールを進める。

1.インストール

1-1. ubuntuのリポジトリを設定する。

 特に何もしなかった。

1-2. sources.listを編集する。

端末を起動して以下を実行すればよい。

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu natty main" > /etc/apt/sources.list.d/ros-latest.list'

1-3. キーを設定する。

以下を実行する。

wget http://packages.ros.org/ros.key -O - | sudo apt-key add -

1-4. インストール

あらかじめ、updateしておく。

sudo apt-get update

とりあえず「Desktop-Full Install」をインストールしてみる。以下を実行する。

sudo apt-get install ros-diamondback-desktop-full

1-5. 環境設定

以下を実行して環境設定を行う。

echo "source /opt/ros/diamondback/setup.bash" >> ~/.bashrc
. ~/.bashrc

とりあえず以上まですんなり進んだ。

MSI U135でubuntuがシャットダウンできない

MSI U135にubuntu 11.04をインストールしてみた。

基本的に問題がないと思ったところでシャットダウンしてみたら、背景画面が表示された状態でハングしてしまう。リブートも同様。

ググってみたら解決方法は簡単だった。

/etc/modprobe.d/blacklist.conf

rootになって上記のファイルをviで開き、以下の1行を最後に加えるというもの。

blacklist rt2800pci

どうやらwifiドライバが悪さをするようなので、読み込まないようにすればいいらしい。

元ネタはこちら。MSIのノートブックに共通する問題らしい。

http://askubuntu.com/questions/21749/msi-u130-freezes-on-shutdown

MacPortsのselfupdate失敗

久しぶりにselfupdateしたら失敗した。新しいバージョンになってイロイロ変わったらしい。

$ sudo port selfupdate
port registry doesn't exist at "/opt/local/var/macports/registry/registry.db" and couldn't write to this location
... 省略 ...

http://logrepo.blogspot.com/2010/08/macports-18x-19x.html

上のサイトのように、/opt/local/etc/macports/ のmacports.conf.defaultをmacports.confに上書きして、sudo port installedを実行したらデータベースが作成された。

余談だが、「はてな記法」って何年使ってもしっくりこないな。