ROSの勉強 第22弾:ナビゲーション


#プログラミング ROS< ナビゲーション >

はじめに

1つの参考書に沿って,ROS(Robot Operating System)を難なく扱えるようになることが目的である.その第22弾として,「ナビゲーション」を扱う.

環境

仮想環境
ソフト VMware Workstation 15
実装RAM 2 GB
OS Ubuntu 64 ビット
isoファイル ubuntu-mate-20.04.1-desktop-amd64.iso
コンピュータ
デバイス MSI
プロセッサ Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz
実装RAM 8.00 GB (7.89 GB 使用可能)
OS Windows (Windows 10 Home, バージョン:20H2)
ROS
Distribution noetic
プログラミング言語 Python 3.8.5
シミュレーション gazebo

世界を動き回る

ロボットができる最も基本的なことの1つは世界を動き回ることである.以下にまとめを示す.

地図は前回(https://qiita.com/Yuya-Shimizu/items/fbc2a9c6c7810f6af5e6 )までに学習済みであるから,ここでは,上で示したとおり,「出発地」と「目的地」について扱う.

位置の推定

まず,ロボットがどこにいるかを見つけ出す方法を学ぶ.以下に位置推定についてまとめた.

実装

ここからは,実際にシミュレーション上で動かしながら,実装方法を学ぶとともに,ナビゲーションについての理解を深める.以下にその手順とそのときの実行様子を示す.

必要なノードを起動

それぞれのターミナル(端末)での実行内容を以下に示す.

ターミナル(左上);gazebo起動
~$ roslaunch turtlebot3_gazebo turtlebot3_world.launch
ターミナル(真上);地図サーバ起動
~$ rosrun map_server map_server map2.yaml
ターミナル(左下);位置推定のためのamcl起動
~$ roslaunch turtlebot3_navigation amcl.launch

※初回では,次の2つをしていなければエラーが出てしまう.
sudo apt-get install ros-noetic-amcl
sudo apt-get install ros-noetic-dwa-local-planner
$^{(2)}$

ターミナル(真下);ナビゲーション移動のためのmove_base起動
~$ roslaunch turtlebot3_navigation move_base.launch

※初回では,次の操作をしていなければエラーが出てしまう.
sudo apt-get install ros-noetic-move-base

ターミナル(右端);可視化のためのrviz起動
~$ rviz rviz

ここからは,rvizでの様子を示す.
rvizの起動

mapの反映準備

mapのトピックを購読

map反映

ロボットモデルの反映準備

ロボットモデルの反映

候補となる姿勢を矢印で示すparticle arrowの反映準備

particle arrowのトピックを購読

以下に,動画像でそのparticle arrowの様子を示す.

ロボットを好きな位置にできる.初期姿勢を自由に指定できるということである.ただし,ロボットの初期位置が本当に分からない時にのみ適当に指定するのが好ましい.

たくさん動かすことで,センサの情報などから候補が収束していく様子がうかがえる.なお,ここでは新たなターミナル(端末)でroslaunch turtlebot3_teleop turtlebot3_teleop_key.launchを実行してロボットの操作をしている.

続いては,rviz上でのナビゲーションについての様子を示す.
現在の目標値を可視化するものを準備

グローバル経路を示すものを準備

ローカル経路を示すものを準備

ここで,グローバル経路とローカル経路について簡単に触れておく.グローバル経路は現在の位置から目標までロボットがたどろうとするもの(計画)であるのに対して,ローカル経路は大局的な経路をたどることと地図上にはないがロボットのセンサが検出した障害物を避けることとのバランスをとる(実際に移動する経路).
rviz上でのナビゲーション
アップロード容量の関係により,3つに分割して実行の様子を示している.


costmap

ほかにもさまざまなツール(トピック)がある.ここでは,global_costmaplocal_costmapだけを示しておく.これらを指定すると進むべき場所やどれくらいよいのか悪いのかということを各セルを明暗により表現したものを観察できる.
まず,その指定方法を示す.
global_costmapのMAPを追加

local_costmapのMAPを追加

以下にその実行様子を示す.

global_costmap

local_costmap

global_costmapとlocal_costmap

グローバル経路とローカル経路と同様に,ローカルのコストマップの方がロボット周辺でセンサによる周囲状況の変更が多くみられることが分かる.

コードによるナビゲーション

rvizで手作業でゴールを示すのではなく,もうルートがすでに決まっているようなもの(たとえばパトロール)は,あらかじめコードにまとめて実行することでナビゲーションを実現することができる.
以下にソースコードを示す.

ソースコード

patrol.py
#!/usr/bin/env python3

import rospy
import actionlib

from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal

#ロボットが巡回する経由地のリスト:位置と回転(四元数)
waypoints = [
    [(2.1, 2.2, 0.0), (0.0, 0.0, 0.0, 1.0)],
    [(6.5, 4.43, 0.0), (0.0, 0.0, -0.984047240305, 0.177907360295)]
]


def goal_pose(pose):  #waypointsをMoveBaseGoalメッセージにするヘルパー関数
    goal_pose = MoveBaseGoal()
    goal_pose.target_pose.header.frame_id = 'map'
    goal_pose.target_pose.pose.position.x = pose[0][0]
    goal_pose.target_pose.pose.position.y = pose[0][1]
    goal_pose.target_pose.pose.position.z = pose[0][2]
    goal_pose.target_pose.pose.orientation.x = pose[1][0]
    goal_pose.target_pose.pose.orientation.y = pose[1][1]
    goal_pose.target_pose.pose.orientation.z = pose[1][2]
    goal_pose.target_pose.pose.orientation.w = pose[1][3]

    return goal_pose


if __name__ == '__main__':
    rospy.init_node('patrol')

    #アクションクライアントを作成し,サーバの準備完了を待つ
    client = actionlib.SimpleActionClient('move_base', MoveBaseAction)
    client.wait_for_server()

    #waypointsを繰り返し処理し,それぞれをアクションのゴールとする
    while True:
        for pose in waypoints:
            goal = goal_pose(pose)
            client.send_goal(goal)
            client.wait_for_result()

これは,教材(参考文献)のサンプルである.少し説明を加えているが,そもそも適用しているシミュレーション環境が今回とは異なるため巡回する経由地などは,改めて書き換える必要はある.しかしながら,パトロールのようなものは,このようにしてコードを書くことで実現できるということを学ぶことが本質であるため,今回は書きかえまではしていない.今後できたらと思う.簡単にまとめておく.rvizでも見たようにゴールを与えてあげることで,アクションが作動しそのゴールへ向かう.なので,目標値を逐次変更することで巡回するような動作を実現することができる.

感想

rvizでの操作が少しずつではあるが,慣れてきた.今回も様々なツールを学んだことで,できることも増えた.ただのマップ生成だけではなく,そのマップを活用したナビゲーションができるようになったことはロボット工学を学ぶ上で大きな一歩となったのではないかと感じている.しかしながら,まだまだ学ぶべきことがあると思うため,気を抜いてはならない.むしろ楽しみである.

参考文献

(1) プログラミングROS Pythonによるロボットアプリケーション開発
        Morgan Quigley, Brian Gerkey, William D.Smart 著
                       河田 卓志 監訳
            松田 晃一,福地 正樹,由谷 哲夫 訳
                  オイラリー・ジャパン 発行

(2) ROS kineticでmove base使用時にDWAPlannerROS planner周りのエラーが出た時の対策メモ
                              @seigot 2020年02月10日
         (https://qiita.com/seigot/items/a13558e92c84f676dd0a ;‎2021‎年‎3‎月‎8‎日参照)