ルンバで地図をつくってみました その2 (おおたfab 第50回 素人でもロボットをつくりたい)

おおたfabさんでは、「素人でもロボットをつくりたい」という勉強会を定期的に行っています。前回LiDARを使って地図の作成を行いましたが、はっきりとした地図はできませんでした。もう一度地図作成にチャレンジする前にRVIZでロボットの状態を可視化してみます。

Rvizでロボットの状態を可視化してみる

Gazeboを動かし、Rvizを動かします。

1. ターミナルを開いて以下を入力します

$ export LOCALIZATION=slam
$ export RVIZ=true
$ export NUM_ROBOTS=1
$ export LASER=rplidar
$ roslaunch ca_gazebo create_maze.launch

rviz_sample1_20211116.png

2. もう一つターミナルを開いて以下を入力します。

$ roslaunch ca_tools keyboard_teleop.launch

3. Rviz の機能をいろいろ触ってみます。

  • Robot description
    • RobotModelのチェックをはずすとロボットの外観がみえなくなります。
  • TF(座標変換:transformation)の表示
    • TFのFramesでAll Enabledにチェックを入れると様々な座標が見えます。
    • 見やすくするために以下のところだけチェックをいれます。
      • create1/base_footprint
      • create1/base_link
      • create1/odm
      • create1/wheel_left_link
      • create1/wheel_right_link
      • map
    • Addボタンを押す→By display typeでtfを選択→Topicで/create1/base_footprintを選択→OK
  • LaserScanの表示
    • Addボタンを押す→By display typeでLaserScanを選択→Topicで/create1/rplider/scanを選択→OK

4. 2枚目のターミナルからキーボードでルンバを動かしてみる

  • create1/wheel_left_link, create1/wheel_right_link の座標が回転しているのがわかります。
  • create1/odom や /map は元の位置にとどまっているのがわかります。

rviz_sample3_20211106.png

5. TFがツリー構造になっているのがわかります。

rviz_sample2_20211106.png

  • map ワールドの原点(大体は起動した絶対的な位置)
  • create1/odom ワールドの基準点(様々な原因で起こる微妙なずれを調整するためのもの)
  • create1/base_footprint ロボットの現在位置(車軸の中心の地上面)
  • create1/base_link ロボットの基準位置
  • create1/battery_link バッテリーの位置
  • create1/wheel_left_link  左車輪の位置
  • create1/wheel_right_link 右車輪の位置

URDFをRvizで見てみる

URDF (Unified Robot Description Format)は、ロボットの構造を記述するためのXMLのフォーマットです。いろいろなURDFをRvizで表示してみました。

この部分は以下のサイトを参考にしました。

ルンバ実機で地図を作ってみよう

もう一度ルンバで地図を作成してみます。

初期設定

1.ca_driverのconfigファイルで/tfをpublishするように設定する。

  • 変更するファイル
~/catkin_ws/src/create_autonomy/ca_driver/config/default.yaml

  • 変更箇所
# Whether to publish the transform between odom_frame and base_frame
#publish_tf: false
publish_tf: true

2.rplidarのlaunchファイルでlaserとbase_footprintのリンクをpublishするように設定する。

  • 変更するファイル
~/catkin_ws/src/rplidar_ros/launch/rplidar.launch

  • 追加部分
<!-- run static_transform_publisher -->
<node pkg="tf" type="static_transform_publisher" name="basefootprint_to_laser" args="0.08 0 0.2 0 0 0 create1/base_footprint laser 100" />

ルンバを動かす

1.bagデータを取得

$ cd ~/bag
$ rosbag record -a

2.ルンバのドライバを起動する

$ roslaunch ca_driver create_2.launch

3.RPLiDARのノードを起動する。

$ roslaunch rplidar_ros rplidar.launch

4.キーボード操作でルンバを動かす

$ roslaunch ca_tools keyboard_teleop.launch

5.動かし終わったらbagデータの取得を止める

roomba_getlog_20211106.jpg

地図を作成する

1.gmappingを起動する。

$ rosparam set use_sim_time true
$ rosrun gmapping slam_gmapping _base_frame:=create1/base_footprint _odom_frame:=create1/odom

2.取得したbugデータを再生する。

$ rosbag play 2021-11-03-15-32-21.bag --clock

3.再生が終わったらmap情報を取得する。

$ rosrun map_server map_saver -f my_map_log

作成できた地図

1回目(2021-11-03取得)

途中でバッテリーが切れたため中途半端な地図になりました。しかし通路がはっきりわかります。

map_2021-11-03-19-56-39.png

2回目(2021-11-06取得)

データをしっかりとろうと細かく動かしすぎたせいか通路や壁もわからなくなってしまいました。これは失敗です。

map_2021-11-06-15-22.png

次回の予定

データの取得はコツが必要のようです。もう少し試したあとに自律走行に向けて準備をしてみます。

前へ

ルンバで地図をつくってみました (おおたfab 第49回 素人でもロボットをつくりたい)

次へ

Sparkfun版JetBotを組み立てました(ハードウェア編)