マップを利用したナビゲージョン操作1
ナビゲーション とは、特定の環境でロボットをある場所から指定された目的地に移動することです。この目的のために、特定の環境の家具、オブジェクト、および壁のジオメトリ情報を含むマップが必要です。 前のSLAMセクションで説明したように、マップはセンサーによって取得された距離情報とロボット自体のポーズ情報を使用して作成されました。
ナビゲーションにより、ロボットは、マップ、ロボットのエンコーダー、IMUセンサーおよび距離センサーを使用して現在のポーズからマップ上の指定された目標ポーズに移動できます。 このタスクを実行する手順は次のとおりです。
まずシミュレーションで動作確認します。
下記の実習を行うために、まずROS_MASTER_URI
とROS_HOSTNAME
をlocalhost
に戻します(参照)。
シミュレーションを起動します
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
を押すと、非常に大きな緑色の矢印が表示されます。 所定のマップで実際のロボットが配置されているポーズに移動し、マウスの左ボタンを押したまま緑色の矢印をロボットの正面が向いている方向にドラッグし、以下の手順に従います。
2D Pose Estimate
ボタンを選択します。- TurtleBot3が配置されているマップ内のおおよそのポイントをクリックし、カーソルをドラッグしてTurtleBot3が向いている方向を示します。
次に、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
を押すと、非常に大きな緑色の矢印が表示されます。 この緑色の矢印は、ロボットの宛先を指定できるマーカーです。 矢印のルートはロボットのx
とy
の位置であり、矢印が指す方向はロボットのtheta
方向です。 ロボットが移動する位置でこの矢印をクリックし、ドラッグして以下の手順のように方向を設定します。
2D Nav Goal
ボタンを選択します。- マップ内の特定のポイントをクリックしてゴール位置を設定し、カーソルをTurtleBotが最後に向いている方向にドラッグします。
ロボットは、地図に基づいて目的地への障害物を回避するためのパスを作成します。 次に、ロボットはパスに沿って移動します。 この時、いきなり障害物を検知しても障害物を避けて目標点に移動します。
ゴール位置へのパスを作成できない場合、ゴール位置の設定に失敗することがあります。 ロボットが目標位置に到達する前に停止したい場合は、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
- デフォルト値:1.0
- このパラメーターは、障害物から膨張領域を作成します。このエリアを越えないようにパスが計画されます。これをロボットの半径よりも大きく設定しても安全です。詳細については、page of costmap_2d wikiをフォローしてください。
cost_scaling_factor
- デフォルト値:3.0
- この係数にコスト値を掛けます。相反する比率であるため、このパラメーターが増加し、コストが削減されます。
最適なパスは、ロボットが障害物間の中心を通過することです。 障害物から遠ざけるために、この係数を小さく設定します。
下記のパラメータのデフォルト値は/opt/ros/kinetic/share/turtlebot3_navigation/param/dwa_local_planner_params_burger.yaml
のファイルに定義されています。rosparam set
で変更することができます。
max_vel_x
- デフォルト値:0.22
- この係数は、並進速度の最大値に設定されます。
min_vel_x
- デフォルト値:-0.22
- この係数は、並進速度の最小値に設定されます。 これを負に設定すると、ロボットは後方に移動できます。
max_vel_trans
- デフォルト値:0.22
- 最大並進速度の実際の値。 ロボットはこれより速くなることはできません。
min_vel_trans
- デフォルト値:0.11
- 最小並進速度の実際の値。 ロボットはこれより遅くなることはできません。
max_vel_theta
- `デフォルト値:2.75
- 最小回転速度の実際の値。 ロボットはこれより遅くなることはできません。
min_vel_theta
- デフォルト値:1.37
- 最小回転速度の実際の値。 ロボットはこれより遅くなることはできません。
acc_lim_x
- デフォルト値:2.5
- 並進加速度リミット値の実際の値。
acc_lim_theta
- デフォルト値:3.2
- 回転加速度リミット値の実際の値。
xy_goal_tolerance
- デフォルト値:0.05
- ロボットが目標ポーズへの到達時に許可されるx、y距離。
yaw_goal_tolerance
- デフォルト値:0.17
- ロボットが目標ポーズへの到達時に許容されるヨー角。
sim_time
- デフォルト値:1.5
- この係数は、シミュレーションを秒単位で転送します。値が小さすぎると狭い領域を通過するのに十分な時間であり、値が大きすぎると急速に回転することはできません。 下の画像で黄色い線の長さの違いを見ることができます。