はじめに
前回は移動ロボットを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_publisherとRviz2もあります。
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 を表示する方法を説明します。
コメント