AbudoriLab.

自律ロボットで誰でも遊べるよう試行錯誤するブログです。

Lidar SLAMで地図作成 -必要パッケージのインストールと自律移動で遊んでみた -

AbudoriLab.です。

これまでにSLAMの概念を理解する記事を難しい式など使用せずにまとめてきました。次の段階として誰でも使えるツールを用いて地図を作成する方法をまとめてます。
SLAMを理論的に理解する記事を先に作成しようとも思いましたが、机上の学びよりも手を動かして経験する学びで得られるメリットが高いと考えました。
もちろん理論的な解説もまとめる予定で、プログラムでの解説と合わせて後の記事として投稿していきます。
まずは、チュートリアルとしてシュミレータを使って遊んでみます。
この記事からロボットのソフトウェア製作でのベース環境を構築することができ、さらに、自律移動を体験できロボット実機で実装する際の準備にもなります。
具体的には作成した地図を使って、ロボットに目的地まで自律移動させてみます。

環境構築

OSはubuntu 18.04、開発プラットフォームはROS2 dashingを使用します。
本の受け売りとなりますが、ROS(Robot Operating System)はソフトウェア開発者のロボット・アプリケーション作成を支援するライブラリとツールを提供しており、さまざまな分野の先駆者達が築いた膨大な資産を利用できます。*1
ROSの次世代バージョンであるROS2は現在進行中で開発されていて、主に研究目的で開発されたROSを商業用途にまで拡大することを構想されています。
ROS2はROSと比べると使えるライブラリも潤沢ではないので、ROSの好む方も多いと思いますが、初めての方は今後のことを考えるとROS2の利用をオススメします。

インストール

必要なソフトウェアは以下のとおりです。

  • 開発プラットフォーム: ROS2 dashing
  • SLAMのライブラリ: Cartographer
  • 行動計画のライブラリ: Navigation2
  • シミュレータ: gazebo
  • モデル: Turtlebot3
  • おまけ: rviz2

これらをまとめてインストールする方法を提示します。

手順-0 ターミナルの起動

Ctrl+Alt+T

手順-1 保存先のフォルダーを指定してください

※ ホームに作成しました

手順-2 shellファイルをgit clone

shellファイルを入手できます
github.com

git clone https://github.com/AbudoriLab-org/lapin-env.git
手順-3 ターミナルに下記のコマンドを入力してインストールを実行

※ git cloneしたフォルダーまでターミナルで移動してください
ホームにgit cloneした場合

cd ~/lapin-env
bash install.sh
手順-4 ターミナルに下記のコマンドを入力してモデルの読み込みを実行

※好みのエディターを使用してください(例としてgeditを使用します)

gedit ~/.bashrc

.bashrcの最下段に下記を入力します

export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/dashing/share/turtlebot3_gazebo/models
export TURTLEBOT3_MODEL=burger

ファイルを閉じて更新コマンドをターミナルに入力して実行

source ~/.bashrc

※新規にターミナルを開く場合は自動で.bashrcを読み込むため、.bashrcを更新しない限りこのコマンドは以降使用しません。

SLAMを動かして地図作成

※シミュレータを使用します。
Lidarが搭載されたロボットを走らせて点群を計測し、それを入力としてSLAMを用いて地図を作成します。
ここからはずっとターミナルを使用します。

手順-1 新規ターミナルに下記のコマンドを入力してシミュレータ(gazebo)を起動
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

図1のようなウィンドウが表示されると思います。

f:id:nekoze-nya:20210810152422p:plain
図1: シミュレータ(gazebo)でturtlebot3のモデルを読み込み
手順-2 新規ターミナルに下記のコマンドを入力してシミュレータ時刻での同期を指示

計算が間に合わず次々とデータが送られたときに、ユーザの意図に反した結果になる場合があります。
それを避けるためのおまじないです。

ros2 param set /gazebo use_sim_time True
手順-3 SLAM(cartographer)の実行

可視化ツール(rviz2)が立ち上がり、地図が作られていく経過を観察できます。

ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True
f:id:nekoze-nya:20210810152611p:plain
図2:rviz2でロボットの自己位置と地図の作成状況を可視化
手順-4 新規ターミナルに下記のコマンドを入力してキーボード操作を実行

A,W,D,X,Sキーでロボットを操作して、全体の地図を作成します

ros2 run turtlebot3_teleop teleop_keyboard
f:id:nekoze-nya:20210810152920p:plain
図3: ロボットを操作して全体の地図を作成
手順-5 新規ターミナルに下記のコマンドを入力して地図を保存

map_serverと呼ばれる機能を使って地図を保存します。(pgmとyamlファイルが作成されます)
※本記事ではhomeディレクトリ下にmapsのディレクトリを作成して、そこに地図を保存します。

ros2 run nav2_map_server map_saver -f ~/maps/map
f:id:nekoze-nya:20210810153726p:plain
図4: SLAMを用いて作成地図データの保存

SLAMを使って地図を作成できましたが、ここで終わるのは面白みがないと思います。
そこで、作成した地図を使ってロボットに自律移動をさせてみようと思います。

ロボットの自律移動をシミュレート

目的地までの移動を指示して、ロボットが自律移動する経過を観察してみます。

手順-0 rviz2起動の設定

デフォルトではrviz2が自動的に起動しないためアレンジを加えます。
まずは、新規ターミナルで下記のコマンドを入力します。

cd /opt/ros/dashing/share/nav2_bringup/launch
sudo gedit nav2_bringup_launch.py

下記に記した箇所に加筆をお願いします。

...
    start_lifecycle_manager_cmd = launch_ros.actions.Node(
        package='nav2_lifecycle_manager',
        node_executable='lifecycle_manager',
        node_name='lifecycle_manager',
        output='screen',
        parameters=[configured_params])
    # この後に以下のプログラムを追加
    rviz_config_dir = os.path.join(
        get_package_share_directory('nav2_bringup'),
        'launch',
        'nav2_default_view.rviz')

    start_rviz2_cmd = launch_ros.actions.Node(
            package='rviz2',
            node_executable='rviz2',
            node_name='rviz2',
            arguments=['-d', rviz_config_dir],
            parameters=[{'use_sim_time': use_sim_time}],
            output='screen'
    )
...
    ld.add_action(start_navigator_cmd)
 # この後に以下のプログラムを追加
    ld.add_action(start_rviz2_cmd) 

これで準備完了です。

手順-1 gazeboを起動
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
手順-2 シミュレータ時刻での同期を指示
ros2 param set /gazebo use_sim_time True
手順-3 行動計画ライブラリ(Navigation2)を起動

ここで作成した地図の使用を指示します。

ros2 launch nav2_bringup nav2_bringup_launch.py use_sim_time:=True map:=~/maps/map.yaml

rviz2が起動して地図が描画されます。

f:id:nekoze-nya:20210810174928p:plain
図5: 読み込んだ地図の可視化
手順-4 ロボットの位置と向きを教示

rviz2上で自分の位置と向きをロボットに教示します。
メニューバーの"2D Pose Estimateを押し、地図上でロボットの位置をクリックします。そのままロボットが向いている方向にマウスを動かして矢印が伸びたところではなします。
すると、下図のように地図上で色が描画されると思いますが、これはコストマップと呼ばれています。*2

f:id:nekoze-nya:20210810175008p:plain
図6: ロボットの初期位置とコストマップ作成
手順-5 自律移動を実行

rviz2でメニューバーのNavigation2 Goalをクリックして、手順-4と同じやり方で目的地をロボットに教示します。
すると、rviz2,gazebo両方でロボット自身で行動計画して目的点まで自律移動する経過を観察できます。

f:id:nekoze-nya:20210810175222p:plain
図7: ロボットの自律移動

次回は実物のLidarを用いて地図作成し、ループクローズが起きるところを観察したりして遊んでみようと思います。

おわりに

AbudoriLab.の第一目標は、今回紹介した地図あり自律移動を自作ロボットで実現することです。
実機ではシミュレーションよりもやることが多くなりますが、第一目標を達成したら本活動の基盤が出来上がります。
その後はロボットアームをつけたり、完全自律移動の研究をやったりといろいろ遊んでいきたいと構想してます。

*1: 引用: ROS2ではじめよう 次世代ロボットプログラミング はじめに P.iii

*2:色はロボットが移動するにあたり、障害物に衝突する危険度を表現しています。