rosbridgeとの接続にはWebSocketを用いるのでWebSocketをPharoにインストールする。
WebSocketはZincのパッケージにあるが、Pharo 2.0のデフォルトの配布パッケージには入っていないので別途インストールする。
Monticelloを起動して+RepositoryでHTTPを選び、以下を入力する。
MCHttpRepository
location: 'http://www.squeaksource.com/ZincHTTPComponents'
user: ''
password: ''
Openでリポジトリを開き、左側のペインからZinc-WebSocket-CoreとZinc-WebSocket-Testsを選んで最新版をLoadする。
とりあえずテストして動作確認する。
(proxy環境だと一部のテストに失敗するが気にしない)
rosbridge V2.0の導入
ROSにrosbridgeを導入する。最近はV2.0に移行しており以前のものとはプロトコルが異なるとともに、WebSocketに対応している。
2013-5-10追記
rosbridge v2.0はROSの正式なパッケージとなったようだ。
http://ros.org/wiki/rosbridge_suite
導入手順は簡単で、以下だけでOK。
sudo apt-get install ros-groovy-rosbridge-server
rosbridgeサーバーの起動は少し変わって以下のようになった。
roslaunch rosbridge_server rosbridge_websocket.launch
以下の情報は古い
ROS/groovyをインストールしたマシン上にrosbridgeをインストールする。手順は以下のサイトを参考にした。
downloading_rosbridge
あらかじめrosパッケージ用のディレクトリを作成し、パッケージのPATHも通しておく。
mkdir ~/ros
export ROS_PACKAGE_PATH=~/ros:$ROS_PACKAGE_PATH
gitで最新のソースツリーを取り込む。
git clone http://kforge.ros.org/rosbridge/git rosbridge
makeする。
rosmake rosbridge
以上でrosbridgeのパッケージが作成される。
動作確認のためにrosbridgeサーバーを起動する。
roscore &
rosrun rosbridge_server rosbridge.py
起動すると以下のようなメッセージが表示される。
[INFO] [WallTime: 1363825226.008247] Rosbridge server started on port 9090
続いてクライアント側を整備して接続を行ってみる。
Kinectの画像を得る(2)
あらためてTurtleBotに積んだKinectと格闘する。ググってみたら良さそうな例があったので試してみた。
KinectWithROSTutorial(PDF)
上記に書かれていたopenni-launchというパッケージがインストールされていなかったので、インストールする。
apt-get install ros-groovy-openni-launch
書かれているとおりにopenni_launchを起動する。
roslaunch openni_launch openni.launch
モニタ用のPCから以下を起動する。
rosrun image_view image_view image:=/camera/rgb/image_color
すると、Kinectのカメラによるカラー画像が表示された。
続いて、以下を起動する。
rosrun image_view disparity_view image:=/camera/depth_registered/disparity
今度はdepth画像が表示された。前に試したやり方ではregisteredの画像が表示できなかったのだが、あっさりと表示された。

先ほどのドキュメントの最後の方にrvizは便利だけど不安定でバギーだから気をつけろと書いてあった。うまくいかなかったのがそのせいなのかはわからないが、とりあえずKinectもちゃんと動くことを確認できて一安心。
そろそろちゃんとロボットのプログラムを書き始めよう。
SimpleGraphのチュートリアル(2)を公開しました
SimpleGraphのチュートリアル(2)として「有向グラフの作り方」の説明を公開しました。
ご意見、ご要望、ご質問などはtwitter(razdan3)にてお願いいたします。
SimpleGraphのチュートリアル(1)を公開しました
SimpleGraphのチュートリアル(1)として「グラフの作り方」を説明するものを公開しました。
ご意見、ご要望、ご質問などはtwitter(razdan3)にてお願いいたします。
SimpleGraphと簡単なドキュメントを公開しました
SmalltalkHubにSimpleGraphの最初のリリースを公開しました。
http://smalltalkhub.com/#!/~EiichiroIto/SimpleGraph
また、公開にあわせてインストール方法と簡単な使い方について説明したドキュメントも公開しました。
ご意見、ご要望、ご質問などはtwitter(razdan3)にてお願いいたします。
Kinectの情報を得る
TurtleBotにはKinectが接続されている。本体の動作に成功してからずっと、Kinectの画像を表示させようと試みていたが、全てうまくいかなかった。ASUS Xtion Proでも試してみても同じ。トラブルシューティングをググってもほとんど似たケースはなかった。そこで、思い切ってubuntuのバージョンを12.10から12.04LTSに落としてみたら、うまくRGB画像が表示されるようになった。
12.10のときはlsusbでKinectのMotorしか認識されなかったのだが、12.04LTSに変更したら3つのデバイスが表示されるようになった。おそらくOSが原因でKinectの認識に失敗していたのだろう。当面、12.04LTSを使うことにする。
Kinectを動作させるには、3D Visualizationのページを参考にコマンドを入力すればよい。表示されるrVizの画面でImageにチェックを入れたらRGB画像が表示される。ただし、Laser ScanやDepthCloudにチェックを入れても何も表示されない。まだどこかおかしいようだ。先は長い。
ubuntuインストール後の設定
ubuntuインストール後にやるべきことをまとめておく。
Proxyの設定
(研究室で使う場合に設定する)
パッケージのアップグレード
sudo apt-get update
apt-get dist-upgrade
Caps LockをControlに変更
- System Settings
- Keyboard Layout
- Options…
- Ctrl key position
- Caps Lock as Ctrlをチェック
また、LXDEの場合などは、/etc/default/keyboardを編集して以下のように変更する。
XKBOPTIONS="ctrl:nocaps"
Alt Spaceでウィンドウメニューを出さない
- System Settings
- Keyboard
- Shortcuts
- Windows
- Activate the window menuを選んでDELキーを押す
LXDEを使っている場合は、~/.config/openbox/lxde-rc.xmlを編集し、A-spaceを含む以下のような部分を見つける。
<keybind key="A-space">
...
</keybind>
見つけたらその部分を削除する。
ssh serverのインストール
sudo apt-get install openssh-server
Emacs 23のインストール
sudo apt-get install emacs23
キーボード・レイアウト
キーボードを後から変えた場合、コンソールのキーマップを変更する必要がある。
sudo apt-get install console-data
sudo dpkg-reconfigure keyboard-configuration
ナチュラルスクロール
スクロール方向を逆にする。
echo pointer = 1 2 3 5 4 6 7 8 9 10 11 12 >>.Xmodmap
xmodmap .Xmodmap
TurtleBotを動かす
前回の記事ではTurtleBotの状態を調べて通信がうまくいっているか確認するだけだったが、いよいよTurtleBotを動かしてみる。
TurtleBotを動かすのに一番簡単なのはキーボードから操縦することであり、そのためのturtlebot_teleopパッケージが用意されている。turtlebot_teleopには、キーボード操作用のローンチファイルの他、ジョイスティックやPS3、XBOX360のコントローラ用のローンチファイルがある。
turtlebot_teleopを動作させるには、minimal.launchが起動している状態で、別のshellやPCから以下のコマンドを入力する。
roslaunch turtlebot_teleop keyboard_teleop.launch
起動してしばらくするとキーボードレイアウトが表示され、表示されたキーを押すことでTurtleBotが動き出す。
キーボードではなくコマンドでTurtleBotを動かしたい場合には、rostopicを使う方法がある。TurtleBotは /cmd_vel_mux/input/teleop というトピックをSubscribeしており、そのデータに従って動くようになっている。そこで、rostopicで/cmd_vel_mux/input/teleopにデータをPublishしてやれば、TurtleBotを動かすことができる。
まず、/cmd_vel_mux/input/teleopがどんなトピックなのかを調べる。
rostopic type /cmd_vel_mux/input/teleop
すると以下のような結果が返される。
geometry_msgs/Twist
これは、/cmd_vel_mux/input/teleopがgeometry_msgs/Twistというメッセージをやり取りすることを表している。では、geometry_msgs/Twistが具体的にどんなメッセージかを調べるには、以下のようにする。
rosmsg show geometry_msgs/Twist
今度は以下のような結果が表示される。
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
これは、geometry_msgs/Twistがlinearとangularという2種類のデータを持ち、ともにgeometry_msgs/Vector3型であり、それぞれx, y, zの3つのfloat64型の数値からなっていることを示している。
そこで、このデータをコマンドラインから直接Publishする。
rostopic pub -1 /cmd_vel_mux/input/teleop geometry_msgs/Twist -- '[1, 0, 0]' '[0, 0, 0]'
コマンドのうち「–」以降が実際にPublishするデータを表す。シングルクオートで囲まれた最初のデータがlinearを、後のデータがangularを表す。linearのxに直進する量を指定し、angularのzに回転する量を指定することでTurtleBotが動く。上の例であれば一定量TurtleBotが前進する。回転させたければ以下のようにする。
rostopic pub -1 /cmd_vel_mux/input/teleop geometry_msgs/Twist -- '[0, 0, 0]' '[0, 0, 1]'
なお、正の値なら左回転、負の値なら右回転する。
TurtleBotの状態を調べる
ロボットが動かない間はとても不安なものだが、一度動作させられると途端に楽しく夢が広がる。
ROSはwikiのドキュメントシステムが充実していて素晴らしいのだが、現状とあっていない場合もしばしばあるので、あまり鵜呑みにするのは怖い。あれだけの情報量だから仕方ないところもあるが。流れているメッセージをうまく捉えれば、それが解決の端緒となることも多い。
前回の記事では何とか接続ができているような様子だったが、TurtleBotを文字通り動かすことができていないので、何となく不安が残る。今日はそれを解消するためにいろいろ実験を行ってみた。
まずは、USBなど接続を確認した後でTurtleBot本体だけを動かすシステムを起動する。
roslaunch tutlebot_bringuup minimal.launch
さまざまなプロセスが起動したというメッセージの中でいくつかの警告が現れる。
[WARN] [WallTime: 1352644359.480259] Create : robot not connected yet, sci not available
TurtleBotの接続がされていても2、3回は上記メッセージが表示される。いずれ消えるのでこれは無視してよいようだ。
[WARN] [WallTime: 1352644359.951470] Battery : unable to check laptop battery state [[Errno 2] No such file or directory: '/proc/acpi/battery/BAT0']
ノートPCのバッテリー状態を監視するために、/proc/acpi/battery/BAT0 を参照するが、ubuntu 12.10で/sys/class/power_supply/BAT0に変わったらしい。しかし内部の形式も異なるのでどうにもならないようだ。とりあえず無視する。
[ERROR] [WallTime: 1352644430.487165] Faild to cotact device with error: [Error reading from SCI port. No Data.]. Please check that the Create is powered on and that the connector is plugged into the Create.
USBケーブルが外れていたりTurtleBot本体の電源が入っていないときに生じるエラーで、状態が改善しなければ繰り返し表示される。接続して電源を入れればいずれ出なくなる。
何も新たなメッセージが出なくなれば一応接続は問題ない。ただしちゃんと動いているのかわからないので、ROSのメッセージを受信してみてきちんと動作していることを確かめる。
別にshellを開くかモニタ用のPCで以下のコマンドを入力する。
rostopic list
おそらく以下のような30行ほどの出力が得られるはずで、これがminimal.systemで利用できるさまざまなトピック(Topic)の一覧である。トピックはROSのノード間でやりとりされるデータのチャネルのようなもので、トピックごとに流れるデータの種類や頻度が異なる。
/cmd_vel_mux/active
/cmd_vel_mux/input/navi
/cmd_vel_mux/input/safety_controller
/cmd_vel_mux/input/teleop
/cmd_vel_mux/parameter_descriptions
/cmd_vel_mux/parameter_updates
/diagnostics
/diagnostics_agg
/diagnostics_toplevel_state
/joint_states
...
上のリストのうち、/diagnostics_aggは、diagnostic_aggregatorスタックのaggregator_nodeノードがPublishするトピックで、ロボットのさまざまな状態を1秒ごとに発信する。
rostopic echo /diagnostics_agg
TurtleBotとの接続を確認するために、上記のコマンドを入力してこのトピックをSubscribeし、ロボットの状態を調べることができる。表示される情報は膨大だが1秒ごとにデータが更新されるならロボットとの通信はうまく機能していることがわかる。
以下は一部のデータだが、ロボットのバッテリー状態がわかる。
level: 0
name: /Power System/Battery
message: OK
hardware_id: ''
values:
-
key: Voltage (V)
value: 15.251
-
key: Current (A)
value: -0.111
-
key: Temperature (C)
value: 31
-
key: Charge (Ah)
value: 1.985
-
key: Capacity (Ah)
value: 2.702