はじめに
JazzyからはGazebo Sim(旧Ignition)が公式推奨で、classicに対応しなくなるので、必然的に投稿されている多くの記事はGazebo Simでシミュレーションが行われていました。ただ、本記事が対象とするROSのバージョン、humbleはGazebo classicとGazebo Simの両方に対応可能なので、使用するシミュレーション環境に注意して参考にするサイトを選択する必要がありました。また、記者の使用環境に大きく左右されてしまうため、ネットの記事をそっくりそのまま真似したいという人にとっては結構きついです..。
かくいう私もそのうちの一人で、nav2を使うための記事を探してみたのですが、Gazebo Simでやってる人が自分の調べた限りだと発見できなかったので、やりながらメモ程度に残していきます。
環境整理
インストール
私は以下のバージョンのものを使用しています。これから記述するコードは以下のバージョンで動作することを想定しているので、他のバージョンで動作させる場合は動かなくなる場合もあるので各自対応をお願いします。(例えばjazzyだとopenCV系が自動インストールされるがhumbleでは手動になる、はず。)
| 項目 | 推奨スペック |
|---|---|
| Ubuntu | 22.04 |
| ROS2 | humble |
| gazebo | iginition(Fortress) |
インストールする手順等はすでにネットにたくさん転がっているので、ぜひそちらを参考にしていただきたいです。
使用ツールやパッケージの概要
- ROS2
- ROS(Robot Operating Sysytem)はロボットを開発するためのプラットフォームです。例えば移動ロボットの経路計画について研究をするときに、従来のシステムを利用するのであれば、経路計画以外にも機体の設計や自己位置推定等を自身で設計する必要があります。しかし、ROSを使えば、他のユーザーが開発して公開している既存パッケージを流用できるので、本来やりたい経路計画のみに注力することができる。ROS2に名前からお察しの通り旧モデルとしてROS1も存在しています。変更点として、ROS2ではリアルタイムの制御や複数ロボットの制御が可能になったことが挙げられます。
- Nav2
- ロボットの自己位置推定から経路計画、ロボットの指令計算まで行うためのソースファイルが詰まったパッケージの一つです。
- Gazebo Sim(旧Ignition)
- 物理演算がされている環境でシミュレーションができます。Gazebo Classicでは指令値をもとにタイヤの大きさ等からロボットの位置や速度が再計算されてROSに返します。センサの測定値等も返してくれます。Gazebo SimではROSとメッサージ(情報)の名前が異なるので、bridgeというものを使用して、ROSとGazebo Simの間をつなげる必要があります。イメージとしては速度を情報としてGazebo SimはAに速度の情報を入れているが、ROSではaに速度を入れているとき、bridgeはAとaは同じ情報(速度)が格納されていることを教える役割を担います。つまり、トピック名やメッセージの型がROS 2とGazebo Simで異なるため、それを翻訳する役割です。
前提条件
- ROS2(humble)のインストール済
- あとrvizもインストールする必要があるかも(
sudo apt install ros-humble-rviz2) - git系のコマンドも使えるようにダウンロードしないとcloneできない
シミュレーションの実行
今回使用するnavのインストールです。
sudo apt install ros-$ROS_DISTRO-navigation2
sudo apt install ros-$ROS_DISTRO-nav2-bringup
Gazebo Simのインストール。
ダウンロード済の人は飛ばしてください。
sudo apt install ignition-fortress
sudo apt install ros-humble-ros-ign
上記でinstallしたものは/opt/~というホーム直下ではなく、コードをいじらずに参照用途のみに使用される場所に保存されます。
そこで、gitからcloneをしたものを自分のワークスペース化に置くことで、コードをイジれるようにします。
mkdir -p ~/nav2_ws/src && cd ~/nav2_ws
git clone https://github.com/ros-planning/navigation2.git --branch $ROS_DISTRO ./src/navigation2
rosdep install -y --from-paths ./src --ignore-src
colcon build --symlink-install
ROSとGazebo Simはbridgeで橋渡しをしないとデータのやりとりができません。ただ、そのbridgeの設定やNav2でのパラメータ等を自分で設定するのは大変です。そこで、今回は一旦動かすことを目的としているので、launchファイルに頼ります。下記の動作を行えば「/home/ユーザ名/nav2_ws/src/navigation2_ignition_gazebo_example/src/sam_bot_nav2_gz/launch」に「complete_navigation.launch.py」というlaunchファイルがあると思います(パスは少し違うかも)。このlaunchファイルを今回は使用します。
cd ~/nav2_ws/src
git clone https://github.com/art-e-fact/navigation2_ignition_gazebo_example.git
cd ~/nav2_ws/
#依存関係チェックと足りないもののインストール
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro humble
#全体のビルドと反映
colcon build --symlink-install
source install/setup.bash
準備ができてので実際に動かしてみます。
ros2 launch sam_bot_nav2_gz complete_navigation.launch.py
rvizとGazebo Simが立ち上がったと思います。
gazebo ignitionの左下にある再生マークが押されていることを確認してから、rvizの上のタブにあるGoal Poseを選択してから、ゴールにしたい場所をクリックする(矢印が出てくる)とその場所に向かってロボットが動き始めると思います。
ゴール選択前
ゴール選択後
注意点
- Gazebo IgnitionはGerdenからパッケージ名、API、メッセージ型等がign→gzに名称が変更されています。
- AIにこの記事見せたら「Humbleでは ros-ign-*** という名前でも動きますが、最新の推奨は ros-gz-*** 系に移行しつつあります(後方互換性があります)。」っと言われましたが、私は上のコードで動いたので一旦置いときます。
- 間違いやより良い方法等があれば勉強になるので、ご教示いただけると幸いです。

