0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IsaacSimでLIMO(無人走行UGV)でROS2 Navigationを試してみる

Posted at

1. はじめに

IsaacSimでLIMO(無人走行UGV)にLidarを追加してみた[1]ではLIMOのロボットモデルにLidarを追加し、そのLidarで周辺環境を確認することに成功しました。今回はこのLidarから取得した情報を使いつつ2D Mapを使った自律走行を試してみたいと思います。

2. 実行環境

  • CPU: CORE i7 7th Gen
  • メモリ: 32GB
  • GPU: GeForce RTX 2070
  • OS: Ubuntu22.04(WSL2ではなくPCに直接インストール)
  • ROS2: Humble
  • Nvidia Driver: 535

3. 手順

IsaacSimのROS2 Navigationを試してみる[2]で自律走行をしたNVIDIA Carterをコピーしてきてその中のAction GraphをLIMO用に書き換えるという手順をとりました。

以下で紹介する手順はかなり我流のやり方ですので、もっとうまくやる方法はいくらでもあると思います。ただ、躓いてる部分も含めて記録・公開するのも大事かと思いますので、記載していきます。

3.1 NVIDIA Carterのコピー

LIMOにカメラを追加したりLidarを追加したりする作業を省略するためIsaacSimでLIMO(無人走行UGV)にLidarを追加してみた[1]の記事で作成した、環境から壁などの余計なものを消した後に、limo_ROS_sample_v〇.usdといった適当な名前を付けて保存します(私はlocalhost>User>test/ROS2/Robotの中に保存しました)。そしてその環境にomniverse://localhost/NVIDIA/Assets/Isaac/2022.2.1/Isaac/Samples/ROS2/Robotの中にあるCarter_ROS.usdを以下の図で赤枠と赤線で示したようにドラッグアンドドロップしてきます。

Carter_ROSの読み込み.png

この状態だと、Carter_ROSとLIMOのモデルが併存している状態になります。

3.2 Action GraphとCamera Action Graphのコピー

Carter_ROSの中にあるAction GraphとCamera Action Graphを右クリックすると表示されるウィンドウに"duplicate"という項目が選択できますので、それをクリックします(以下の図の赤枠部分)。

Screenshot from 2024-10-05 10-38-15.png

そうすると以下の図のように"Action Graph_01"という項目が作成されます(以下の図の赤枠部分)。内容はコピーしたものなので"Action Graph"と同じです。

Screenshot from 2024-10-05 10-38-59.png

次に"Action Graph_01"をLIMOモデルの直下にドラッグアンドドロップしてきます(以下の図の赤枠と赤線部分)。

action_graphドラッグアンドドロップ.png

この作業をCarter_ROSの中にある"ROS_Cameras"のAction Graphにも同じように行い、LIMOのモデルにコピーしてきます。そしてコピーしたらCarter_ROSは削除します。

3.3 Action Graphの設定

Carter_ROSとLIMOのモデルの構成は似てはいるのですが、完全には一緒ではないので、組み換えが必要です。以下ではAction Graphの各モジュールのどこをLIMOのモデルに合わせてどのように変えたかを説明します。

3.3.1 Isaac Read Lidar Beams Nodeの設定

IsaacSimでLIMO(無人走行UGV)にLidarを追加してみた[1]の記事で設定したLidarの名前を"carter_lidar"に変えた上で(これを怠るとlidarのデータが取れませんでした。)、以下の図の"lidar_prim"フォルダマーク(赤枠部分)をクリックすると、ウィンドウ(黄枠部分)が表示されますので、先ほど名前を変えた"carter_lidar"(青枠部分)をクリックして"Select"(緑枠部分)を押して設定します。

lidarの設定.png

3.3.2 ROS2 Publish Laser Scanの設定

ここは特段修正する必要はありませんが、以下の図で赤枠で囲んだ"frameId"が"carter_lidar"になっているか確認します。

Screenshot from 2024-09-29 09-12-20.png

3.3.3 ROS2 Publish Raw Transform Treeの設定

ROS2 Publish Raw Transform Treeのオブジェクトは2つありますので、1つは以下の図のようにparentPrim(赤枠部分)とtargetPrims(青枠部分)のどちらにもbase_linkを読み込んでみます。
base_linkのtree読み込み.png

もう1つは以下の図のようにparentPrim(赤枠部分)にはbase_linkを読み込み、targetPrims(青枠部分)にはLidarとCameraを読み込みます。
lidarのtree読み込み.png

3.3.4 Isaac Compute Odometry Nodeの設定

Carter_ROSのchasis_linkが読み込まれていたところをbase_linkを読み込むようにします(以下の赤枠部分)。
Isaac Compute Odometry Nodeの設定.png

3.3.5 Differential ControllerとArticulation Controllerなどの設定

ここの設定はコピーしてきたROS_carterの設定を流用はできませんでしたので、IsaacSimでLIMO(無人走行UGV)をROS2で動かす[4]の記事の3.5.2項~3.5.5項の内容を反映しました。

3.3.6 ROS2 Publish Odometryの設定

これは修正を加えませんでした。

3.4 ROS_Cameras(Action Graph)の設定

Carter_ROSには2つカメラがあり、それを使ってVisual Slamなどができるのですが、今回のLIMOのモデルにはCameraが1個だけですので、2つあるIsaac Set Cameraには、以下の図のようにcam_linkの直下にあるCameraをInputs>CameraPrimのところに設定します(以下の図の赤枠部分)。
camera_left.png
camera_right.png

4. 地図作成などのシミュレーションの準備

IsaacSimでLIMO(無人走行UGV)にLidarを追加してみた[1]の記事で作成した環境からロボットを削除したusdファイルを一旦作成します。その中に前章で作成したLIMOのモデルをドラッグアンドドロップで読み込みます。
limo読み込み.png

以下が読み込み後の様子です。

limo読み込み後.png

次に地図の作成ですが、IsaacSimでロボット走行用の2D地図を作ってみる[5]の記事の方法をそのまま実行し、
地図はlimo_wall_test.pngとして保存しました。壁が両側にあるだけなので、地図は=(イコール)みたいな形になっています。

そしてIsaacSimでLIMO(無人走行UGV)にLidarを追加してみた[1]の記事で作成した/ros2_isaacsim_test/src/carter_navigation の中にあるcarter_warehouse_navigation.yamlをコピーしてlimo_wall_test.yamlとして保存した上で内容を以下のように修正しました。

limo_wall_test.yaml
image: limo_wall_test.png
resolution: 0.05
origin: [-4.925, -4.925, 0.0000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

またIsaacSimでLIMO(無人走行UGV)にLidarを追加してみた[1]の記事で作成した/ros2_isaacsim_test/src/carter_navigation の中にあるcarter_navigation.launch.pyをlimo_test.launch.pyとしてコピーして、以下のようにしました。修正した部分は"get_package_share_directory("carter_navigation"), "maps", "limo_wall_test.yaml""という部分で読み込むyamlファイルを先ほど保存したyamlファイルにしています。

limo_test.launch.py
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node


def generate_launch_description():

    use_sim_time = LaunchConfiguration("use_sim_time", default="True")

    map_dir = LaunchConfiguration(
        "map",
        default=os.path.join(
            get_package_share_directory("carter_navigation"), "maps", "limo_wall_test.yaml"
        ),
    )

    param_dir = LaunchConfiguration(
        "params_file",
        default=os.path.join(
            get_package_share_directory("carter_navigation"), "params", "carter_navigation_params.yaml"
        ),
    )

    nav2_bringup_launch_dir = os.path.join(get_package_share_directory("nav2_bringup"), "launch")

    rviz_config_dir = os.path.join(get_package_share_directory("carter_navigation"), "rviz2", "carter_navigation.rviz")

    return LaunchDescription(
        [
            DeclareLaunchArgument("map", default_value=map_dir, description="Full path to map file to load"),
            DeclareLaunchArgument(
                "params_file", default_value=param_dir, description="Full path to param file to load"
            ),
            DeclareLaunchArgument(
                "use_sim_time", default_value="true", description="Use simulation (Omniverse Isaac Sim) clock if true"
            ),
            IncludeLaunchDescription(
                PythonLaunchDescriptionSource(os.path.join(nav2_bringup_launch_dir, "rviz_launch.py")),
                launch_arguments={"namespace": "", "use_namespace": "False", "rviz_config": rviz_config_dir}.items(),
            ),
            IncludeLaunchDescription(
                PythonLaunchDescriptionSource([nav2_bringup_launch_dir, "/bringup_launch.py"]),
                launch_arguments={"map": map_dir, "use_sim_time": use_sim_time, "params_file": param_dir}.items(),
            ),
        ]
    )

5. シミュレーション結果

4章で地図を作成した環境にて▶ボタンを押してシミュレーションを始めます。

そして別ターミナルを開き以下のコマンド実行しました。

terminal
cd ~/ros2_isaacsim_test
source ~/ros2_isaacsim_test/install/setup.bash
ros2 launch carter_navigation limo_test.launch.py

そうするとrivz2が開き、ちょっと時間はかかりますが、ロボットの状態が読み込まれます。

rivz起動.png

👆の状態だと自己位置(上図で緑の丸の部分)がずれていますので、2D pose estimate(下図の赤枠部分)を使って現在地を修正して以下のようにします。

自己位置修正.png

そしてrviz2上のNav2 goalで行きたいところを指定するとその地点にLIMOが自律走行して移動をしていきますが、これらの一連の動きの動画が以下です。

6. まとめ

上記の手順でLIMOのロボットモデルを読み込み、そのロボットモデルで自律走行や移動ができました。今後は四足歩行ロボットなどのロボットでも自律走行ができるかやViual SLAMなどを試していきたいと思います。

参考記事やサイト

[1]IsaacSimでLIMO(無人走行UGV)にLidarを追加してみた
[2]IsaacSimのROS2 Navigationを試してみる
[3]agilexrobotics/Limo-Isaac-Sim
[4]IsaacSimでLIMO(無人走行UGV)をROS2で動かす
[5]IsaacSimでロボット走行用の2D地図を作ってみる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?