2013年9月13日金曜日

gmappingの地図がちゃんとしていない(途中)

gmappingが上手くできない…
直線コースがうまく地図にできない…まっすぐができない

症状:
gmapping中に直線コースをたどるとき、rviz上で、自己位置tfが戻ってしまう。つまり、まっすぐの距離が縮んでしまい、尺の合わない地図が生成されてしまう。
この状態だと、costmapしたときに、地図上の障害物と実際の障害物が不一致になるため、思ったとおりの動きをしない。

原因は何だろう
考えられる原因としては、

(1) エンコーダーの問題(ちゃんと距離を取れていない)
(2) tfの問題(/odomと/base_linkの変換が上手くいっていない)
(3) gmappingのパラメーターがおかしい

(1)について
エンコーダーの数値は、移動車をまっすぐ進めたらそれだけ増えるので、おかしいとは思えない…

(2)について
 /odomと/base_linkの変換はRosAriaというノードによって行われている。
おかしいとしたらこの変換なんだけどなあ…

→rvizでtfを可視化して確かめてみた。すると、tfだけなら位置のズレはまったく起こっていない
ちゃんと進んだ分だけrviz上のtfも動く。つまり、実測値とコンピューター上の値との齟齬はない

では、gmappingのやり方がおかしい。

ところで自分は、/odom -> /base_link -> camera_linkという変換をしている
しかし、 このページでは、間にfootprintをかませている。
つまり、/odom -> /base_footprint -> /base_link -> camera_link
でやっている。
これを直すか?
または、 (3)について、パラメーターがおかしいのか。

この様にやっている人もいる
$ rosrun gmapping slam_gmapping _xmin:=-5.0 _ymin:=-5.0 _xmax:=5.0 _ymax:=5.0 _maxUrange:=59.0 _maxRange:=63.0 _map_update_interval:=5.0 _linearUpdate:=0.2 _angularUpdate:=0.15 _particles:=50 _delta:=0.02

パラメーターの扱いはまだよくわかっていない…
このページをみて勉強しよう

そもそも
なぜマップを正確に取りたいかというと、move_baseを使いたいから
しかし、用意されたマップを用いるならば、こんな作業はおそらく必要ない。
正確なマップを使ってみるのも手段ではある…

2013年8月25日日曜日

move_base使ってみた

自律移動できた
詳しいことは後日まとめるとして、個人用メモ

roslaunch amcl amcl_deff.launch
move_base.launch
rorsrun topic_tools relay cmd_vel RosAria/cmd_vel
rvizの2dnavで移動先の指定

move_baseのyamlファイルとかがややこしい
というか自分の場合launchがうまくいかないので、わざわざlaunchファイルが置いてある場所に移動してからroslaunchしてる

topic_toolsについて

任意のトピックにパブリッシュするためのモジュール
http://ros.org/wiki/topic_tools

これかなあ?
http://ros.org/wiki/topic_tools/relay

2013年7月30日火曜日

launchファイルを作りたい

いま、自律移動やってるんですけど、
launchファイルを作らないといけない状況になってる。
でも、launchファイルって、どういう仕組みで作られているのか未だに良く分からない。
パッケージに、launchしたいノードのソースコードを入れるべきなのか、そうじゃないのか。
launchファイルも別のlaunchファイルに含められるのか。
launchファイルはフォルダのどこにおくべきなのか。

わからないことだらけ。

でも、ググってみたら、日本語のサイトがあった。やったー。

http://code.google.com/p/rtm-ros-robotics/wiki/ROS_Example_Launch_Syntax

2013年7月23日火曜日

gmappingのやり方

0. 環境

Pioneer3dx, Xtion PRO LIVEを使用する。

1. 前準備

 

1.1 ROSARIAを導入する

ROSARIAは以下のページを参照して導入する。

 

1.2 openni_launchを使えるようにする

KinectやXtionを使用するためのモジュールである
http://asukiaaa.blogspot.jp/2013/05/xtion_20.html

 

1.3 depthimage_to_laserscanを入れる

$ sudo apt-get install ros-groovy-depthimage_to_laserscan
赤外線データを取得するためのモジュールである。
これで入らない場合は、~/catkin_ws/src以下にgit cloneを使って入れる
$ cd ~/catkin_ws/src 
$ git clone https://github.com/ros-perception/depthimage_to_laserscan 
$ cd ~/catkin_ws 
$ catkin_make

 

1.4 rob_teleop.cppを追加する

rob_teleop.cppは、pioneer3dxをキー操作するためのモジュールである。
今回は、ROSARIAのパッケージにこのモジュールを追加した。

2. 手順

 

2.1 ROSARIAを使ってSLAMする(map_serverでマップを生成する場合)

$ roslaunch openni_launch openni.launch
 新しい端末を開いて
$ rosrun depthimage_to_laserscan depthimage_to_laserscan image:=/camera/depth/image
 新しい端末を開いて
$ rosrun ROSARIA RosAria
 新しい端末を開いて
$ rosrun tf static_transform_publisher 0.170 0.0 0.270 0.0 0.0 0.0 /base_link /camera_link 100
 新しい端末を開いて
$ rosrun ROSARIA rob_teleop
 新しい端末を開いて
$ rosbag record /scan /tf
 データの記録が始まるので、必要な分だけロボットを動かす。
 その時のデータは、その時のディレクトリにbagファイルとして保存される。
 Ctrl + c で強制終了。
 すべての端末を終了させて,
$ roscore
 新しい端末を開いて
$ rosparam set use_sim_time true
$ rosrun gmapping slam_gmapping scan:=scan
 新しい端末を開いて
$ rosbag play (保存したbagファイルの名前).bag
 処理が終わるまで待つ。
$ rosrun map_server map_saver
 すると、カレントディレクトリに map.pgm と map.yaml が生成される。

 

2.2 ROSARIAを使ってSLAMする(rvizでリアルタイムマップ生成)

$ roslaunch openni_launch openni.launch
 新しい端末を開いて
$ rosrun depthimage_to_laserscan depthimage_to_laserscan image:=/camera/depth/image
 新しい端末を開いて
$ rosrun rviz rviz
 新しい端末を開いて
$ rosrun ROSARIA RosAria
 新しい端末を開いて
$ rosrun tf static_transform_publisher 0.170 0.0 0.270 0.0 0.0 0.0 /base_link /camera_link 100
 新しい端末を開いて
$ rosrun ROSARIA rob_teleop
 新しい端末を開いて
$ rosrun gmapping slam_gmapping scan:=scan
 rvizの画面に戻り、mapをAddする。frameとtopicを/mapに設定する。
 rviz上で地図の生成が始まる。
$ rosrun map_server map_saver
すると、カレントディレクトリに map.pgm と map.yaml が生成される。

3. 上手くいかなかったら

 

3.1 tfに関するエラー(警告)が出た場合

以下のコマンドのフレームを調整する。
$ rosrun tf static_transform_publisher 0.17 0.0 0.270 0.0 0.0 0.0 /base_link /camera_link 100
 ここでは、tfを使って、レーザのリンクをオドメトリに渡している。
 /camera_link,/base_link,/base_footpointはロボットのフレームである。
 これらのフレーム変換によって、レーザースキャンデータをロボットの中心からレーザーが出ているように変換している。
 存在しないフレームがあると、データが所得できない。TF_OLD_DATAみたいなWARNINGが出る。
 したがって、tfで上手くいかなければ、まず、そのフレームが存在するかどうかを調べるべき。
 今回はそれでつまづいた。
$ rosrun tf static_transform_publisher 0.034 0.0 0.250 0.0 0.0 0.0 /base_link /camera_link 100
 デフォルトでは/laserのフレームを/base_linkに変換している。しかし、今回はXtionを使ったため、Xtion(OpenNI)のフレーム/camera_linkを指定しなければならなかった。

3.2 自己位置がrviz上で上手く反映されない場合(tfがチカチカする)
おそらく、単一のフレーム間に、tfが複数かかっていると思われる。
たとえば、ROSARIAでは、/odomから/base_linkのtfが、ROSARIAのモジュール内でなされている。
そのとき、/odomから/base_linkのtfを別にやってしまうと、rviz上でのtfの表示がチラつくようになる。
また、マップも上手く生成されなくなる。
これは、view frameで気づくことができないから、要注意である。
rqt_graphで、二重にかかっていないかチェックする。

4. 参考にしたページ

2013年7月16日火曜日

gmappingできた

gmappingできました

また後日清書します
それに伴って、ROSについて誤解していた記事も訂正・削除します

今は殴り書きだけ

$ roslaunch openni_launch openni.launch

$ rosrun depthimage_to_laserscan depthimage_to_laserscan image:=/camera/depth/image

$ rosrun rviz rviz

$ rosrun ROSARIA RosAria

$ rosrun tf static_transform_publisher 0.0 0.0 0.0 0.0 0.0 0.0 /base_footprint /camera_link 100

※ここで注意するのは、/laserじゃなくて/camera_linkで取得しなければならなかった
チュートリアルとかのデフォでは、/laserになっている。
でも、自分の場合、/laserというリンクが存在しなかったので、tfエラーが起きてた。 
よって、/laserを/camera_linkに変更したらできた
/camera_linkとは、camera(Xtion)の中心位置

$ rosrun tf static_transform_publisher 0.0 0.0 0.0 0.0 0.0 0.0 /be_footprint /base_link 100
$ rosrun gmapping slam_gmapping scan:=scan
$ rosrun map_server map_saver




rvizで、mapだけを追加して、topicを/mapにすると、リアルタイムでマップ生成が見れる
その場合は。gmappingの前に
$ rosparam set use_sim_time true
しないと、マップ情報がちぐはぐになって(?)ぐちゃぐちゃなマップができてしまう
LaserScanを加えると、コアダンプしてrvizが落ちる

gmappingができない原因

gmappingが上手くいかない原因として考えられるのは

1,オドメトリがレーザー(Xtion)の位置に変換できていない
2,Xtionからのレーザー情報に不備がある(?)
3,適切なやり方(PC的には何も失敗していない)ができていない。手順がおかしい。





openni_launchのチュートリアル
http://www.ros.org/wiki/openni_launch/Tutorials