View on GitHub

ROSを使用した移動ロボットのナビゲーション

日本ロボット学会 第131回 ロボットの作り方セミナー

マップを利用したナビゲージョン操作1

ナビゲーション とは、特定の環境でロボットをある場所から指定された目的地に移動することです。この目的のために、特定の環境の家具、オブジェクト、および壁のジオメトリ情報を含むマップが必要です。 前のSLAMセクションで説明したように、マップはセンサーによって取得された距離情報とロボット自体のポーズ情報を使用して作成されました。

ナビゲーションにより、ロボットは、マップ、ロボットのエンコーダー、IMUセンサーおよび距離センサーを使用して現在のポーズからマップ上の指定された目標ポーズに移動できます。 このタスクを実行する手順は次のとおりです。

まずシミュレーションで動作確認します。

下記の実習を行うために、まずROS_MASTER_URIROS_HOSTNAMElocalhostに戻します(参照)。

シミュレーションを起動します

1
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch

下記のようなウィンドウが表示されるまで待ちましょう。

マップを作る

新しいターミナルを開き、SLAMファイルを起動します。

1
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping

新しいターミナルを開き、遠隔操作ノードを実行します。

1
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

ロボットを動かして下記のようなマップが作成すれば終了です。

マップを保存

1
$ rosrun map_server map_saver -f ~/map_sim

Slamノードを起動しているターミナルでCtrl+cを押してプログラムを終了させます。

ナビゲーションノードの実行

新しいターミナルを開き、ナビゲーションファイルを起動します。

1
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map_sim.yaml

初期ポーズを推定する

まずロボットの初期姿勢推定を実行する必要があります。 RVizのメニューで2D Pose Estimateを押すと、非常に大きな緑色の矢印が表示されます。 所定のマップで実際のロボットが配置されているポーズに移動し、マウスの左ボタンを押したまま緑色の矢印をロボットの正面が向いている方向にドラッグし、以下の手順に従います。

次に、turtlebot3_teleop_keyboardノードなどのツールを使用してロボットを前後に動かし、周囲の環境情報を収集して、ロボットが現在地図上のどこにあるかを調べます。

1
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

このプロセスが完了すると、ロボットは緑色の矢印で指定された位置と方向を初期ポーズとして使用して、実際の位置と方向を推定します。 すべての緑色の矢印は、TurtleBot3の予想される位置を表しています。 レーザースキャナーは、地図上に壁のおおよその図を描画します。 図面に図が正しく表示されない場合は、上の2D Pose Estimateボタンをクリックして、TurtleBot3のローカライズを繰り返します。

注意: Estimate InitialPoseに使用されるturtlebot3_teleop_keyboardノードは、使用後に終了する必要があります。 そうしない場合はトピックが次のステップのナビゲーションノードの/cmd_velトピックと重複するため、ロボットは奇妙な動作をします。

ナビゲーション目標の送信

すべての準備ができたらナビゲーションGUIからmoveコマンドを試してみましょう。 RVizのメニューで2D Nav Goalを押すと、非常に大きな緑色の矢印が表示されます。 この緑色の矢印は、ロボットの宛先を指定できるマーカーです。 矢印のルートはロボットのxyの位置であり、矢印が指す方向はロボットのtheta方向です。 ロボットが移動する位置でこの矢印をクリックし、ドラッグして以下の手順のように方向を設定します。

ロボットは、地図に基づいて目的地への障害物を回避するためのパスを作成します。 次に、ロボットはパスに沿って移動します。 この時、いきなり障害物を検知しても障害物を避けて目標点に移動します。

ゴール位置へのパスを作成できない場合、ゴール位置の設定に失敗することがあります。 ロボットが目標位置に到達する前に停止したい場合は、TurtleBot3の現在の位置を目標位置として設定します。

チューニングガイド

ナビゲーションスタックには、さまざまなロボットのパフォーマンスを変更するための多くのパラメーターがあります。 これに関する情報は、ROS Wikiで入手するか、ROS Robot Programmingの第11章を参照してください。

このチューニングガイドでは、重要なパラメーターを設定するためのヒントをいくつか紹介します。 環境に応じてパフォーマンスを変更したい場合は、このヒントが役立つ可能性があり、チューニングの時間を節約できます。

下記のパラメータのデフォルト値は/opt/ros/kinetic/share/turtlebot3_navigation/param/costmap_common_param_burger.yamlのファイルに定義されています。下記のようなコマンドで設定することができます。parameter_nameに変更したいパラメータ名に書き換え、xに新しい値に書き換えます。

1
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml parameter_name:=x

inflation_radius

cost_scaling_factor

最適なパスは、ロボットが障害物間の中心を通過することです。 障害物から遠ざけるために、この係数を小さく設定します。

下記のパラメータのデフォルト値は/opt/ros/kinetic/share/turtlebot3_navigation/param/dwa_local_planner_params_burger.yamlのファイルに定義されています。rosparam setで変更することができます。

max_vel_x

min_vel_x

max_vel_trans

min_vel_trans

max_vel_theta

min_vel_theta

acc_lim_x

acc_lim_theta

xy_goal_tolerance

yaw_goal_tolerance

sim_time