2023年4月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

カテゴリー

ブログパーツ

無料ブログはココログ

« 2013年9月 | トップページ | 2013年11月 »

2013年10月

2013年10月30日 (水)

roombaの走行性能を改善する

ROSさんお手やわらかに:ROS奮闘編

roombaは「掃除機」なので、ゴム製の吸い込み口が床に接触するように作られている。しかしカーペットの上では、これが抵抗になり、オドメトリが狂う大きな要因になっている。今回はこの辺を改善してみる。

この写真が、現在使っているroombaの裏側。回転ブラシはすでに取り外し済み。

Dscn2673

緑色の部品とダストボックスの間の黒い部分が、ゴム製の吸い込み口。これが接地して、抵抗になっている。ダストボックスを外しただけだと、今度は緑色の部品の一部が接地してしまうので、これも外す必要がある。

電池交換の要領で底板を外し、緑色の部品を止めている4本のビスを緩めて、緑色の部品を外す。

Dscn2672

あとは元通り底板を取り付け、ダストボックスを外して運用する。

Dscn2674

これで駆動輪2個と前輪キャスターで、きちんと3点接地になる。roomba単体だと駆動輪のテンションスプリングで、車体が持ち上がってしまうが、ラップトップを乗せれば問題は無い。

2013年10月24日 (木)

roombaプラットフォームとgmappingでマップを作る

ROSさんお手やわらかに:ROS奮闘編

今回は、実際にroombaプラットフォームをリモコンして、室内のマップを作ってみる。
まず、rosbagでセンサやオドメトリのトピックを記録しながらroombaで室内を一周、その後、その記録を再生してgmappingに入力し、マップを作る。
実際の手順は下記のとおり。操作はすべてT61で行う。

roombaを部屋の真ん中あたりに置き、搭載したX61を起動。レーザー測域センサとroombaの電源を入れる。

端末を開き、roombaプラットフォームを起動
$ source ~/catkin_ws/devel/rbsetup.bash
$ roslaunch ~/rb_base.launch

新たに端末を開き、レーザーデータの確認のためrvizを起動
$ source ~/catkin_ws/devel/rbsetup.bash
$ rosrun rviz rviz
各座標系、レーザーデータが表示されることを確認。確認後は終了しても構わない。

新たに端末を開き、rosbagでトピックの記録開始
$ source ~/catkin_ws/devel/rbsetup.bash
$ rosbag record -O mylaserdata /scan /tf
mylaserdata.bagというファイル(homeに生成)を作り、トピックscanとtfを記録する

roombaをゲームパッドで操縦し、壁にそって室内をゆっくり一巡りさせる。

rosbagを起動している端末をcrtl+Cでブレークし、記録を終了する。

(重要) roslaunchを起動している端末をcrtl+Cでブレークし、roombaプラットフォームを終了する。
起動したままだと、scanトピックがパブリッシュされつづけるので、rosbag playを実行したときに、データがコンフリクトしてしまう。

新たに端末を開き、gmappingを起動
$ source ~/catkin_ws/devel/rbsetup.bash
$ rosparam set use_sim_time true
$ rosrun gmapping slam_gmapping scan:=scan ←scanトピック名を指定

rosbagをブレークした端末で(新たな端末でも構わない)、記録したデータを再生
$ rosbag play mylaserdata.bag

終了後、同じ端末でmap_serverを起動し、mapデータを可視化
$ rosrun map_server map_saver

以上の手順でhomeにマップイメージ、map.pgmができる。

Dscn2671  Screenshot_from_20131024_181316

マップの右側に、とても深い隙間ができているが、これは誤認識だ。隙間はあるが、そんなに深いものではない。隙間でレーザーが反射を繰り返し、距離を誤認識したのだろうか。

以前、SRIのShakeyを模型化した「シェーキー」で、同様のマップ作成をしてみたが、それに比べて実にスピーディで正確だ。まあ、60年代の技術と21世紀の技術の差といえばそれまでだが。

次はマップデータの中身を見てみたい。

2013年10月21日 (月)

gmappingを使う準備をする

ROSさんお手やわらかに:ROS奮闘編

マップ作成実験の前に、roombaプラットフォームの構成をgmappingのチュートリアルに近い形に整理する。原因不明のトラブルを回避したいからだ。


まずは座標系。現在、自作のrbjoyとlaseroffsetで定義している座標系はworld→roomba→laserだが、これをチュートリアルにどおりのodom→base_link→base_scanに変更。
もともとroomba500_light_nodeがodomとbaseはブロードキャストしているので、laseroffset.pyを修正し、その座標系にセンサの座標系をリンクするだけ。ただ、worldとroombaの座標系を外したい(余計なので)ので、rbjoy.pyも差し替えた。ついでに、ゆっくり走らせやすいよう、ジョイスティックの係数を調整した。
laseroffset.pyを見る
rbjoy.pyを見る

次はレーザー測域センサの座標系をデフォルトのlaserからbase_scanに変更する。hokuyo_nodeの設定だ。今回、これに気づかなくて、相当苦労した。
hokuyo_nodeのパラメータframe_idに"base_scan"をセットすればいいので、ローンチファイルを修正する。rb_base.launchに下記を追加するだけだ。
<param name="hokuyo_node/frame_id" value="base_scan"/>
rb_base.launchを見る

これで修正は終わり。テストした時は気づかなかったが、レーザースキャンのトピック名もbase_scanに変更すればチュートリアルどおり。これを変更するにはローンチファイルに下記を追加すればいいはず。
<remap from="scan" to="base_scan" />

テスト中気がついたのは、ラップトップを立ち上げたとき、レーザー測域センサのポートが、ACM0になったりACM1になったりと、一つのポートに固定されないことだ。USBシリアル変換器などは、結構同じポートに割り当てられるのだが、これはちょっと勝手が違う。ローンチファイルで起動していると、ポートがオープンできなくともエラーにならないが、データは入ってこないので、原因不明のトラブルになりがちだ。
ローンチが成功したかどうは、測域センサのアタマの小さなLEDの点灯状態でわかる。点いたままならOKだが、点滅しているならポート違いの可能性がある。
【後日追加】残念ながら、LEDの点滅は必ずしもそうならないようだ。最初に起動したときに、rvizでレーザーが見えるかどうか、確認する必要がある。

Dscn2668

次回は実際にマップを作ってみる。

2013年10月20日 (日)

gmappingに入門する

ROSさんお手やわらかに:ROS奮闘編

roombaプラットフォームがテレオペレーションで動くようになったので、いよいよgmappingでマップの作成をやってみる。
gmappingは、ロボットのレーザー測域センサのトピックと、オドメトリのトピックから、マップを作成するためのパッケージだ。リアルタイムにマップを作成することもできるが、ロボットを一度動かして、トピックのログを取り、これからマップを作成することもできる。


まずはチュートリアルでサンプルデータをマップ化してみる。

・gmappingはインストール済みなので、インストールの必要はない。

・サンプルデータをダウンロード(homeに置いた)
$ wget http://pr.willowgarage.com/data/gmapping/basic_localization_stage.bag

・新たに端末を開いてroscoreを起動

・新たに端末を開いて初期化後、gmappingを起動
$ source ~/catkin_ws/devel/setup.bash
$ rosparam set use_sim_time true
$ rosrun gmapping slam_gmapping scan:=base_scan

・新たに端末を開いて初期化後、rosbagでサンプルデータを再生
$ rosbag play basic_localization_stage.bag
これを実行すると、gmappingを起動している端末に、レスポンスがある。黄色い文字でワーニング(よく出るのは"TF_OLD_DATA")が出ているとダメ。白文字でのメッセージならうまくいっている。
なお、サンプルデータをすべて再生するには結構時間がかかる。このへんでいいやと思ったらCtrl+cでrosbagを終了しても構わない。データ数が多ければそれだけ精度の高い地図ができるが、途中でやめてもそれなりの地図にはなる。

・同じ端末で今のデータをマップデータに変換
$ rosrun map_server map_saver
homeにmap.pgmというファイルができているので、これをダブルクリックで開く(画像ビューアが立ち上がる)

流れはこんな感じ。rosbagの代わりにrqt_bag(groovyではこっちと他のページにあったので)を使ったおかげでうまくいかず、少々てこずったが、チュートリアルどおりにrosbagを使うことで問題なく終了。次はroombaでマップ作成の下準備をする。

2013年10月12日 (土)

roombaプラットフォームのまとめ(おしまい)

ROSさんお手やわらかに:ROS奮闘編

roombaプラットフォームの動きをrvizで視覚化するとこんな風になる。

とりあえずシステムとしてはなんとか動いている。ちなみに、最後の方、roombaの右前方あたりに見える小さな動くものは、ウチの飼い猫だ。

以前、シリアルケーブルを引きずりながらテストしたときは、なかなか好成績だったroombaだが、ラップトップやセンサを乗せて改めてテストしてみると、いろいろと問題があるようだ。

まず、カーペットの上ではオドメトリが大きく狂う。roombaは掃除ブラシを外してあるが、ゴミの吸い口のゴムはそのままなので、これが結構大きな抵抗になっている。オドメトリを重視するならフローリングやリノリウムの床専用と考えた方がいい。

次に、操縦の際、いきなりスティックを大きく倒すと、オドメトリの誤差の原因となる。重量が2倍近くになっているので、急な加減速でスリップするためか? それとも、指定の速度になるまでにより時間がかかるせいなのか? 理由は不明だが、注意した方がいいことだけは確かだ。roombaはもともと何かを積載するようには作られていないことを、心しておくべきだろう。

ともあれ、プラットフォームは一段落。次のステップはマップ作成のテストだ。

roombaプラットフォームのまとめ(その4)

ROSさんお手やわらかに:ROS奮闘編

毎回手動で起動していては大変なので、roslaunchを使って自動化する。

その前に、ネットワークで分散させたロボットシステムを使うための、setup.bashに代わるセットアップファイルrbsetup.bash作っておく。

roslaunchなどが使えるように初期化するには、下記手順が必要。
$ source ~/catkin_ws/devel/setup.bash
$ export ROS_MASTER_URI=http://T61:11311
$ export ROSLAUNCH_SSH_UNKNOWN=1

これが、この1行で済む。
$ source ~/catkin_ws/devel/rbsetup.bash

詳しくはここの最初の方を参照。

次にroslaunchのファイル(launch XML)を作る。作り方はここの後半を参照。
今回はhokuyo_nodeでパラメータの設定が必要なので、paramタグを追加している。
それと、X61にログインするための情報を定義するmachineタグは、userをrootである"hanaokacyn"にしてある。センサなどへのアクセス権の問題があるからだ。

こうして作ったlaunch XML、rb_base.launchは、T61のhomeに置いた。

これを使ってシステムを起動するには、roombaとレーザー測域センサの電源を入れてから、T61で端末を開き、下記コマンドを実行。

$ source ~/catkin_ws/devel/rbsetup.bash
$ roslaunch ~/rb_base.launch

これだけだ。ただ、起動には少々時間がかかる。

次回はrvizなどの動画を。

2013年10月10日 (木)

roombaプラットフォームのまとめ(その3)

ROSさんお手やわらかに:ROS奮闘編

システムのローンチ。まずは手動で。作業はすべてT61で行う。roscoreを起動した後の手順は、これが安全な順番だと思うが、とりあえずすべてのノードが起動できれば、あまり順番に気を使わなくても良いようだ。例えば、あるノードを起動した時点で、サブスクライブするトピックがなくとも、クラッシュすることはない。

端末を開いて、roscoreを起動。
$ roscore

新たに端末を開いて、ジョイスティックのノードを起動。
$ source ~/catkin_ws/devel/setup.bash
$ export ROS_MASTER_URI=http://T61:11311
$ rosrun joy joy_node

新たに端末を開いて、X61にログイン、roombaとの通信ノードを起動。
作業前に、roombaの電源を入れること。
$ ssh X61
$ source ~/catkin_ws/devel/setup.bash
$ export ROS_MASTER_URI=http://T61:11311
$ rosrun roomba_500_series roomba500_light_node

新たに端末を開いて、X61にログイン、レーザー測域センサURG04-LXのドライバノードを起動。
作業前に、レーザー測域センサの電源を入れること。
$ ssh X61
$ source ~/catkin_ws/devel/setup.bash
$ export ROS_MASTER_URI=http://T61:11311
$ rosparam set hokuyo_node/calibrate_time false
$ rosparam set hokuyo_node/port /dev/ttyACM1 (センサのポートを指定)
$ rosrun hokuyo_node hokuyo_node

新たに端末を開いて、X61にログイン、T61からのjoy topicを受信してroombaに渡す、rbjoy.pyノードを起動。
$ ssh X61
$ source ~/catkin_ws/devel/setup.bash
$ export ROS_MASTER_URI=http://T61:11311
$ rosrun roomba_work rbjoy.py

新たに端末を開いて、X61にログイン、roomba_workパッケージに追加したlaseroffsetノードを起動。
$ ssh X61
$ source ~/catkin_ws/devel/setup.bash
$ export ROS_MASTER_URI=http://T61:11311
$ rosrun roomba_work laseroffset.py

ようやくこれで起動完了。次の操作でrvizを起動すると、前の投稿にあるように、座標系やセンサの読み取り値を確認することができる。

新たに端末を開いて
$ source ~/catkin_ws/devel/setup.bash
$ export ROS_MASTER_URI=http://T61:11311
$ rosrun rviz rviz

次回はroslaunchで。

2013年10月 9日 (水)

roombaプラットフォームのまとめ(その2)

ROSさんお手やわらかに:ROS奮闘編

実行時のノードとトピックをrqt_graphで表示したものがこれ。丸がノードで四角がトピックだ。

Roombarobotrqt

自作ノードrbjoyは、joy_nodeがトピックjoyにパブリッシュするゲームパッドの入力情報を、サブスクライブして直線速度と旋回速度に変換、cmd_velというトピックにパブリッシュする。roombaを動かすroomba500_light_nodeがこれをサブスクライブして、roombaにコマンドを送るわけだ。
同時に、トピックtfにworld、roombaの座標系をブロードキャストする。マップ生成やナビゲーションで利用するためだ。(うわー、なんかカタカナばっかりで、アタマ悪そうな文章だなこりゃ)
また、同じく自作ノードlaseroffsetはtfからroomba座標系をリスンして、前に書いたとおり、レーザー測域センサの座標系laserをtfにブロードキャストする。これで、センサが読み取った障害物をworld座標系のマップに記録することなどが可能だ。

これだけのことが、数学を少しも使わないで実現できるのはありがたい。シェーキーでマップ作成の実験をしたときには、座標変換行列の実装にずいぶん苦労したものだ。

T61でrvizを起動し、これらをモニターしたのがこれ。tfとLaserScanをDisplaysウィンドウにAddしている。それぞれの設定は画面を参考に。

Rviz

この画面はworld座標系から見ているので、ゲームパッドでroombaを動かすと、画面のroombaとlaser座標系が動く。白く見えているのは、レーザーで感知した障害物。これがロボットから見えている周囲のイメージだ。慣れれば、画面だけを見ながら操縦することもできる。ゲームみたいでなかなか楽しい。

続きは次回。


2013年10月 8日 (火)

roombaプラットフォームのまとめ(その1)

ROSさんお手やわらかに:ROS奮闘編

roombaを利用した、ロボット実験プラットフォームの内容をまとめておく。まず、システムの構成はこうなっている。
Roomba_3

それぞれのマシンにインストールしたパッケージやスタックは下記

X61(roomba搭載)

~/catkin_ws/src/
 ・roomba_robotスタック(rosbuildスタック。パッケージroomba_500_seriesを使用。ここを参照)
 実行ノード・roomba500_light_node

 ・roomba_workパッケージ(ゲームパッドからの情報でroombaを操作する自作catkinパッケージ。ここここを参照)
 実行ノード・rbjoy(ファイル名はrbjoy.py。リモコン操作の本体)
 実行ノード・laseroffset(ファイル名はlaseroffset.py。測域センサの座標系をtfでブロードキャスト。ここを参照)
 二つのpyファイルは~/catkin_ws/src/roomba_work/scriptsに置く。ファイルを追加したらcatkin_makeを忘れずに。

/opt/ros/groovy/stacks/
 ・laser_driversスタック(測域センサのドライバなど。パッケージhokuyo_nodeを使用。ここを参照)
 実行ノード・hokuyo_node

T61(コンソール・ゲームパッドを接続)

~/catkin_ws/src/
 ・joyパッケージ(ゲームパッドのドライバ。ここを参照。もやもやありなので、その後の投稿も参照のこと)
 実行ノード・joy_node


今回の座標系はこんな感じ。トピックtfにブロードキャストされている。

Roomba

レーザー測域センサは、このように、roombaの中心から前に125mmオフセットして取り付けてある。

Dscn2657

今回はここまで。


2013年10月 5日 (土)

ROSのアップデートでsetup.bashがエラーに

ROSさんお手やわらかに:ROS奮闘編

最近(2013年10月)、ROS(groovy)が大幅にアップデートされたようだ。その結果、端末を開いた時の環境設定

$ source ~/catkin_ws/devel/setup.bash

を実行すると、このようなエラーが出るようになった。

bash: /share/rosbash/rosbash: そのようなファイルやディレクトリはありません

顕著な現象としては、tabでパッケージ名などを補完しようとすると、[rospack] Warning: ROS_ROOT=/share/ros is not a directoryというワーニングが出るというものだ。ワーニングの後に補完の文字列も出るので、無視して入力を続ければ、動作には問題がないようだが・・

このページによると、ディレクトリの指定が短縮形になっているためのようで、setup.bashの実行後(エラーは無視して)、環境変数に正しいパスを設定すればいいようだが、これは面倒だ。

抜本的な解決策なのかどうかは解らないが、catkin_wsのbuildとdevelフォルダを削除し、一度catkin_makeをすれば良いとある。これをやってみると、新たにbuild、develが作られた。
新たに作られたsetup.bashではエラーは出なくなる。動作も問題ないようだ。


2013年10月 3日 (木)

レーザー測域センサをrvizで読む

ROSさんお手やわらかに:ROS奮闘編

roombaに取り付けたレーザー測域センサを設定し、rvizでモニターした。名前が付いているのが座標系の原点、白いのがレーザーセンサが読み取った周囲の地形だ。

Rvizimg

センサはroombaのセンターから、X方向に125mmオフセットして取り付けてある。これをroombaの座標系にリンクするためのTFノード、laseroffset.pyを追加した。これは、roombaの子座標系として、x方向へ0.125mずれた、laser座標系をブロードキャストするものだ。以前の実験のスクリプトを改造した。
「laseroffset.py」をダウンロード

これをローンチするのがこれ(T61側に置く)
「rb2.launch」をダウンロード


だいぶややこしくなってきたので、詳しい解説を後日投稿する。

« 2013年9月 | トップページ | 2013年11月 »