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 )までに学習済みであるから,ここでは,上で示したとおり,「出発地」と「目的地」について扱う.
位置の推定
まず,ロボットがどこにいるかを見つけ出す方法を学ぶ.以下に位置推定についてまとめた.
実装
ここからは,実際にシミュレーション上で動かしながら,実装方法を学ぶとともに,ナビゲーションについての理解を深める.以下にその手順とそのときの実行様子を示す.
必要なノードを起動
それぞれのターミナル(端末)での実行内容を以下に示す.
~$ roslaunch turtlebot3_gazebo turtlebot3_world.launch
~$ rosrun map_server map_server map2.yaml
~$ roslaunch turtlebot3_navigation amcl.launch
※初回では,次の2つをしていなければエラーが出てしまう.
sudo apt-get install ros-noetic-amcl
sudo apt-get install ros-noetic-dwa-local-planner
$^{(2)}$
~$ roslaunch turtlebot3_navigation move_base.launch
※初回では,次の操作をしていなければエラーが出てしまう.
sudo apt-get install ros-noetic-move-base
~$ 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_costmap
やlocal_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()
#!/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日参照)
Author And Source
この問題について(ROSの勉強 第22弾:ナビゲーション), 我々は、より多くの情報をここで見つけました https://qiita.com/Yuya-Shimizu/items/8448366e76763dd62f90著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .