URDFをRviz2とGazeboで表示する (ROS2-Foxy)

ROS2
スポンサーリンク
スポンサーリンク

はじめに

前回は移動ロボットをURDFで記述しました。

このままでは動作の確認ができません。

今回は、Rviz2という三次元ロボットビューワーを用いて前回作成したロボットの可視化を行います。
また、Gazeboというシミュレーターソフトも説明していきます。

前提条件

前提条件は以下の通りです。

  • Rviz2、Gazeboがインストールされている

Rviz2起動ファイルの作成

作成したURDFファイルをRviz2で表示するためには、launchファイルというものが必要です。
早速、作成方法を説明します。まずはターミナルを開いて、

cd ~/ros_ws/src/ros2_first_test
mkdir launch
touch first_rviz.launch.py
code .

上記のようにコマンドを入力してください。
VSCodeが開くので、launch > first_rviz.launch.pyに以下のコードを入力してください。

import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():

    package_dir = get_package_share_directory("ros2_first_test")
    urdf = os.path.join(package_dir, "urdf", "first_robot.urdf")

    return LaunchDescription([

        Node(
            package='robot_state_publisher',
            executable='robot_state_publisher',
            name='robot_state_publisher',
            arguments=[urdf]),

        Node(
            package='joint_state_publisher_gui',
            executable='joint_state_publisher_gui',
            name='joint_state_publisher_gui',
            arguments=[urdf]),
            
        Node(
            package="rviz2",
            executable="rviz2",
            name="rviz2"),
    ])

順番に説明していきます。

package_dir = get_package_share_directory("ros2_first_test")
urdf = os.path.join(package_dir, "urdf", "first_robot.urdf")

上記の1行目の get_package_share_directory で ros2_first_test のパスを取得します。
この場合、”~/ros2_ws/src/ros2_first_test” が返されると思いきや、別の場所が指定されます。
“~/ros2_ws/install/ros2_first_test/share/ros2_first_test” が package_dir に格納されます。
後で説明する colcon build を実行すると自動的に install/ 以下へ登録されます。

2行目の os.path.join で Rviz2 に表示する urdf のパスを指定します。

続いて、return 部分を説明します。

return LaunchDescription([

LaunchDescription 以下に、実行したい内容を記述していきます。
リスト形式で return できるようにする必要があります。

LaunchDescription に追加する内容を説明します。

Node(
    package='robot_state_publisher',
    executable='robot_state_publisher',
    name='robot_state_publisher',
    arguments=[urdf]
),

Node の中に記述するのは
ros2 run <package名> <実行ファイル名>
といった ros2 run で実行するコマンドをlaunchファイルで記述したいときです。
毎回ターミナルを開いて ros2 run を実行していては非常に手間ですので上記のように記述します。

今回は robot_state_publisher パッケージの robot_state_publisher を実行します。
これは /robot_descroption というトピック名で、robotの link と joint の状態を公開します。
詳細はROS公式のページに記載されています。joint_state_publisherRviz2もあります。

argumentsは引数であり、今回はurdfファイルのパスを指定します。

Rviz2起動の準備

これであとはRviz2を起動するだけですが、最後に準備が必要です。
その準備内容は

  • setup.py に urdf と launch ファイルのパスを追加

です。colcon build で ros2_first_test のパッケージをビルドする際に、どのファイルを install/ 以下に登録するかを教えてやる必要があります。

setup.py を以下の赤枠を追記してください。

これで準備は完了です。

Rviz2の起動

いよいよ起動です。まずはROS2のホームディレクトリに戻ってcolcon buildを実行します。

cd ~/ros_ws
colcon build --packages-select ros2_first_test

これで作成したパッケージのビルドが完了しました。
次に、パッケージのパスをシステムに登録する必要があります。

source ~/ros_ws/install/setup.bash

上記コマンドはcolcon buildとセットで必要です。
~/.bashrc の最下行に追加して source ~/.bashrc でも問題ありません。
記事では source ~/.bashrc で運用していきます。

それでは、rviz2 を起動します。

ros2 launch ros2_first_test first_rviz.launch

この段階ではまだ正常に表示されません。
Rviz上で以下2つの項目を指定してください。

  • first_robot.urdfの /base_footprint
  • robot_state_publisherが発行している topic の/robot_description

下の画像の赤枠をクリックして反映させてください。
赤枠 map → base_footprint
緑枠 Add → RobotModel
緑枠 Add → TF

すると、Rviz2の左側のバーが下記画像左のようになるので、RobotModel > Description Topic > /robot_descriptionを指定してください。

正常に実行されると、下記画像のようになります。

これでRvizへの表示は完了です。
ロボットをいろいろな角度から確認してみてください。
また、joint_state_publisher_guiの画面も表示されているので Randomize や Center を押して何が起こるのか確認してみてください。

また、ros2_first_test 内に rviz フォルダを作成し、左上の file > save config as でfirst_robot.rviz として保存をしておいてください。
setup.py に rviz ファイルの登録を追加してみてください。

Gazebo起動ファイルの作成

長くなりましたが、いよいよシミュレーションソフト Gazebo へロボットを表示していきます。
first_gazebo.launch.py を launch ディレクトリに作成します。

現在のフォルダ構成と setup.py は以下のようになります。

先ほど追加したrvizの部分は合わせておいてください。

Gazebo の launch ファイル first_gazebo.launch.py のコードは以下の通りです。

import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import ExecuteProcess
from launch.substitutions import LaunchConfiguration

def generate_launch_description():

    package_dir = get_package_share_directory("ros2_first_test")
    urdf = os.path.join(package_dir, "urdf" , "first_robot.urdf")
    rviz = os.path.join(package_dir, "rviz" , "first_robot.rviz")
    use_sim_time = LaunchConfiguration('use_sim_time', default='true')

    return LaunchDescription([

        Node(
            package='robot_state_publisher',
            executable='robot_state_publisher',
            name='robot_state_publisher',
            arguments=[urdf],
            ),

        Node(
            package='joint_state_publisher',
            executable='joint_state_publisher',
            name='joint_state_publisher',
            arguments=[urdf],
            ),
            
        Node(
            package="rviz2",
            executable="rviz2",
            name="rviz2",
            arguments=["-d", rviz]
            ),
        
        # gazebo settings
        ExecuteProcess(
            cmd=["gazebo", "--verbose", "-s", "libgazebo_ros_factory.so"],
            ),

        Node(
            package="gazebo_ros",
            executable="spawn_entity.py",
            name="urdf_spawner",
            parameters=[{'use_sim_time': use_sim_time}],
            arguments=["-topic", "/robot_description", "-entity", "first_robot"]),
    ])

今回追加した部分を説明していきます。

rviz = os.path.join(package_dir, "rviz" , "first_robot.rviz")
use_sim_time = LaunchConfiguration('use_sim_time', default='true')

先ほど作成した first_robot.rviz を rviz で読み込むためのパスを取得します。
use_sim_time はシミュレーション内部の時間を使用するかどうかを決定します。Gazebo を使用する際は default=’true’ としておきます。

Node(
    package="rviz2",
    executable="rviz2",
    name="rviz2",
    arguments=["-d", rviz]
),

rviz2 のノードに arguments を追加し、先ほど作成した first_robot.rviz のパス rviz を読み込ませます。
rviz2の引数は

ros2 run rviz2 rviz2 --help

で確認することができます。

次に Gazebo の起動部分を説明します。

ExecuteProcess(
    cmd=["gazebo", "--verbose", "-s", "libgazebo_ros_factory.so"],
),

ExecuteProcess はターミナル上で実行するコマンドを指定します。この場合、
“gazebo –verbose -s libgazebo_ros_factory.so” を実行します。

Node(
    package="gazebo_ros",
    executable="spawn_entity.py",
    name="urdf_spawner",
    parameters=[{'use_sim_time': use_sim_time}],
    arguments=["-topic", "/robot_description", "-entity", "first_robot"]
),

gazebo_ros パッケージの spawn_entity.py を実行します。
/robot_description トピック を Gazebo シミュレータ上に “first_robot” として表示します。

first_gazebo.launch.py の作成が完了したら、あとは起動するだけです。

Gazeboの起動

まずはいつも通りパッケージをビルドします。

cd ~/ros_ws
colcon build --packages-select ros2_first_test
source ~/.bashrc

あとは、launch ファイルを実行するだけです。

ros2 launch ros2_first_test first_gazebo.launch.py

これで完成です!

おわりに

本当はカメラや LIDAR の表示までいきたかったのですが、ここで一度区切らせていただきます。
次回こそ、Gazebo でカメラ、LIDAR、IMU を表示する方法を説明します。

コメント

タイトルとURLをコピーしました