ROS 2のナビゲーションを確認するためにturtlebot3のサンプルを実行してみます。
下記コマンドでturtlebot3のパッケージをインストール。全部入れていいかわかりませんが。。。
$ sudo apt install ros-humble-turtlebot3*
インストールが終わったら、下記コマンドでturtlebot3のモデルを.bashrcの環境に指定しておきます。
$ echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
$ source ~/.bashrc
"burger"のところは、burgerという移動ロボットのモデルを使うという意味なので、他に用意されているのはあと2つあり、"waffle", "waffle_pi"のいずれかの名前を入れるとそのロボットのモデルが画面に表示されるようになります。
モデルを変更したいときは、.bashrcの内容を修正してください。テキストなので下記コマンドでgeditで最後の行に追加されていると思いますので、burgerを他のロボットのモデルに名前を変更してください。
$ gedit ~/.bashrc
実際にロボットを表示させてみます。
下記のコマンドでgazeboが立ち上がり指定したロボットが画面に表示されます。
初回起動時はかなり大きなモデルを読み込んでいるらしく表示されるまでかなり時間がかかります。。。気長に待ちます。(体感5分以上:ネットワーク環境にも依存)
$ ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py
上記を実行すると動力学シミュレータGazeboの画面が立ち上がります。
下記コマンドでros2のナビゲーションパッケージを使ったturtlebot3のコントロールを立ち上げます。
$ ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True slam:=True
上記を実行するとRviz2の画面が立ち上がります。
use_sim_timeはシミュレーションの時はTrueを指定。実機の時はFalseを指定する。
slamは地図を作りたいときはTrueにしておくとgmappingが有効になって地図を作ってくれる。
地図があれば、Rviz2の画面の右上にある「Navigation2 Goal」のボタンを押してから、画面上の目標位置をドラッグして位置と方向を決めるとその目標位置に向けた移動をしてくれます。
下記コマンドでキーボードから直接ロボットの移動方向を指示することができます。
$ ros2 run turtlebot3_teleop teleop_keyboard
立ち上がった画面に表示がある通り、キーボードの「w」を押すと前進方向の速度が増加します。「x」が減速or後ろ方向への速度、「s」は左旋回、「d」が右旋回になります。「s」を押すと速度指令がすべてゼロになります。
キーボードの入力は開いた端末が選ばれている状態にしないと入力を受け付けくれないので注意。
キーボードで移動ロボットを動かしていくと地図ができてきます。地図を作るときは移動ロボットの支店のほうが分かりやすいと思うのでRviz2のFixed Frameをbase_footprintに変更しておくとRvizを見ながら地図作製はしやすいと思います。
できた地図の上でFixed Frameをmapに戻してから、Rviz2の右上にあるNavigation2 Goalをクリックしてから目的位置の方向をドラッグして指定をすると地図内に軌道を生成してくれて自動で目的位置まで移動してくれます。
ある程度地図ができたら下記のコマンドを使えば地図のデータを保存することができます。
$ ros2 run nav2_map_server map_saver_cli -f test_map
test_mapのところは自分のつけたい地図の名前で保存してください。serverとsaverの間違いやすい2つの単語があるので間違えないように。。。ROS1の時間違えたことあるので。
上記コマンドでなぜかtimeoutエラーが出て地図が保存されないので、下記のようにtimeoutを長めに設定するパラメータを与えると地図のデータが書きだされました。
$ ros2 run nav2_map_server map_saver_cli -f test_map --ros-args -p save_map_timeout:=10000
上記のコマンドで実行すると、コマンドを実行したディレクトリにtest_map.pgmとtest_map.yamlの2つのファイルが生成されます。
一回シミュレーションなどのプログラムを全部閉じてから、再度gazeboのシミュレータを下記コマンドで立ち上げなおす。
同じマップのものを立ち上げてください。今回はhouseをつかっているので、下記のコマンド。
$ ros2 launch turtlebot3_gazebo turtlebot3_house.launch.py
次に、ナビゲーションを立ち上げるのですが、slamは使わずに、保存したマップを指定します。
今回はホームディレクトリの下のtmpディレクトリにマップのデータを保存していた場合の例として下記のようにコマンドを打ちます。
$ ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=$HOME/tmp/test_map.yaml
$HOMEはホームディレクトリの場所です。その下にtmpディレクトリがあり、その中にtest_map.yamlとtest_map.pgmファイルがあります。
(注意)2024年7月26日に下記コマンドを試したところマップが表示されなくなりました.turtlebot3のyamlファイルの設定を直接修正する必要があります.
/opt/ros/humble/share/turtlebot3_navigation2/param/の中にあるburger.yaml, waffle.yaml, waffle_pi.yamlはすべて管理者権限でファイルを修正してください.(使うのだけでいいですが)
burger.yamlの場合29行目にある「robot_model_type: "differential"」を「robot_model_type: "nav2_amcl::DifferentialMotionModel"」に修正します.
上記実行後に出てくる画面は下記のとおりです。
地図が出てくるが、移動ロボットの位置が地図上で不明なのでtfが表示されていない状態になる。
下の写真のように画面の上にある「2D Pose Estimate」をクリックしてから、地図上のロボットが存在していそうな位置をクリックして矢印の方向も合わせてあげるとその位置での自己位置推定を開始します。
下記が、上記のように初期位置の矢印を設定した後に出てくる画面で、レーザのスキャンデータから想定される自己位置が点で示されています。
この状態で、画面上の「Navigation2 Goal」をクリックしてから、目標位置を指定すると経路計画をしてくれて目標位置まで移動します。
下記の通り経路を計画して移動を開始します.