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の画像が表示できなかったのだが、あっさりと表示された。
kinectview
先ほどのドキュメントの最後の方にrvizは便利だけど不安定でバギーだから気をつけろと書いてあった。うまくいかなかったのがそのせいなのかはわからないが、とりあえずKinectもちゃんと動くことを確認できて一安心。
そろそろちゃんとロボットのプログラムを書き始めよう。

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に変更

  1. System Settings
  2. Keyboard Layout
  3. Options…
  4. Ctrl key position
  5. Caps Lock as Ctrlをチェック

また、LXDEの場合などは、/etc/default/keyboardを編集して以下のように変更する。
XKBOPTIONS="ctrl:nocaps"

Alt Spaceでウィンドウメニューを出さない

  1. System Settings
  2. Keyboard
  3. Shortcuts
  4. Windows
  5. 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

TurtleBotの接続確認とトラブルシューティング

Network Configurationのページでは、設定後にTurtleBotとの接続確認について書かれている。それに従って、TurtleBot側で、
rostopic list
と入力したところ、
ERROR: Unable to communicate with master!
というエラーが表示された。この場合、rosが起動していないので起動するように書かれている。
TurtleBot BringupのページにTurtleBotのパッケージを動作させる方法が書かれている。
roslaunch turtlebot_bringup minimal.launch
具体的には上記のように、turtlebot_bringupというスクリプトをminimal.launchというローンチファイルを使って起動すれば良い。minimal.launchは turtlebot_node, laptop_battery_monitor, robot_state_publisher, diagnostic_aggregator, robot_pose_ekfというTurtleBot本体やノートPCに関するノードを提供する。
実際に上記のコードを実行するとエラーで終了してしまう。エラーを調べてみると本来 /opt/ros/groovy/share/xacro/フォルダにあるべきxacro.pyファイルがないために、そのPythonスクリプトが実行できていないのが原因である。
これはたまたま遭遇したトラブルのようで、昨日チケットが切られていた。仕方ないので、/opt/ros/groovy/bin/フォルダにあるxacro.pyを /opt/ros/groovy/share/xacro/にコピーして使ってみたら問題なく動いた。
3/14追記:上記については現時点で生じていない。偶然遭遇したもののようだ。
その状態でモニタ用のPC側で以下のコマンドを実行するとTurtleBotのダッシュボードが表示されるとあるのだが、これも動作しない。
rqt -s turtlebot_dashboard
理由は調べていないが試行錯誤の末、以下のようにすればダッシュボードが起動することがわかった。
rqt -s create
起動しても何も表示されないため、上に並んだボタンを適当に押すと、TurtleBot Bringupのページにあるような画面が表示される。
なお、この時点でTurtleBotの電源が切れてしまったため、詳しい動作確認は明日以降行う予定。

TurtleBotのセットアップ(3) – ROS

TurtleBotに積むPCのROS環境セットアップ。ROSはubuntu 12.10に対応しているので、とりあえずubuntuのサイトからubuntu Desktopの32bit版をダウンロードした。インストールの詳細については割愛する。
3/14追記 Kinectの接続でトラブルを解決できなかったため12.04LTSを用いた。
ROSのインストールを行う。ROSのサイトに従って、Ubuntu 12.10 (Quantal)用のsources.listとキーを設定して、apt-get updateを行った後、Desktop-Full Installのパッケージを取り込む。その他、書いてある通りに細かい設定を行う。
具体的な手順は以下の通り。
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu precise main" > /etc/apt/sources.list.d/ros-latest.list'
wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
sudo apt-get update
sudo apt-get install ros-groovy-desktop-full
sudo rosdep init
rosdep update

TurtleBot用のパッケージをインストールする。基本的に、TurtleBotのページの、2-1.Installation, 2-2. Post-Installation Setup, 2-3. Workstation Installation, 2-4. Network Configurationを順に行う。
まずパッケージのインストールのために、InstallationのページでInstall from Debsをクリックして手順を表示させる。なお行頭の>の文字は入力しない。
sudo apt-get install ros-groovy-turtlebot ros-groovy-turtlebot-apps ros-groovy-turtlebot-viz
上記のように3つのパッケージを導入する。今回使うのは古いタイプのTurtleBotなので、その後の「rosrun kobuki_ftdi create_udev_rules」は実行しない。
ちなみに現行のROSは新しいタイプのTurtleBot(kobukiと呼ばれるもの)がデフォルトなので、古いタイプを用いるためには別途設定を行う必要がある。
Post-Installation Setupのページでは、時刻同期の設定を行うように書いてあるのでそのようにする。続いて、Create Baseのページに進んで、Debs Installationをクリックして手順を表示させ、先ほど説明したように古いタイプのTurtleBotの設定を行う。
具体的には、~/.bashrcを開いて以下の内容を追加する。ついでにrosの設定も行うようにする。
export TURTLEBOT_BASE=create
export TURTLEBOT_STACKS=circles
export TURTLEBOT_3D_SENSOR=kinect
source /opt/ros/groovy/setup.bash

記述の順序が重要で、exportの3行は必ずsourceより前に置かなければならないようだ。
3D_SENSORのところにはkinectだけでなく、ASUS XTION PROも指定できるらしい。(asus_xtion_proと記載する)
Network Configurationでは、TurtleBotとは異なるモニタリング用のPCの設定を行う。InstallationとPost-Installation Setupを行った後で、時刻の同期をしておけばよいらしい。
sudo apt-get install chrony
sudo ntpdate ntp.ubuntu.com

Network Configurationでは、TurtleBotとモニタ用PC相互のネットワーク設定を行う。事前にifconfigなどでTurtleBotのIPアドレスを調べ、pingなどで接続の確認をすませておく必要がある。有線で接続している場合、いずれ無線接続にするので無線LAN側のIPアドレスを確定しておいた方が良い。
Turtlebot Setupの項でDebs Installationをクリックして、環境変数の設定を行う。仮にTurtleBotのIPアドレスが192.168.254.68だった場合、環境変数の設定コマンドは以下のようになる。
export ROS_MASTER_URI=http://192.168.254.68:11311
export ROS_HOSTNAME=turtlebot

先ほどと同様に、この2行を~/.bashrcの最後に追加すれば良い。
結局、~/.bashrcの最後の6行は次のようになる。
export TURTLEBOT_BASE=create
export TURTLEBOT_STACKS=circles
export TURTLEBOT_3D_SENSOR=kinect
source /opt/ros/groovy/setup.bash
export ROS_MASTER_URI=http://192.168.254.68:11311
export ROS_HOSTNAME=turtlebot

モニタ用のPCでは、上記のうち最後の3行を~/.bashrcの最後に追加すればよい。
3/6追記:ROS_HOSTNAMEはモニタ用のPCのIPアドレスにする。
3/7追記:さらにdialoutグループに自分のユーザーを加える必要がある。
基本的なセットアップは終わり、後はTurtleBotとモニタ用PCとで接続を確認するが、現時点では問題があって接続できない。(次回の記事で説明する)