📝

ROS 2: Gazebo上にFusionで作成した探査機のmodelを出現させる

に公開

宇宙系のロボット開発サークルで制御の開発をしています。

アメリカで行われる火星探査機の世界大会UniversityRoverChallengeに出場した際、Navigation2を使ってGPSポイントを巡るような探査機型ロボットの制御開発をしていたのでその備忘録になります。

本記事では、Fusionから作成したモデルをgazeboで読み込むところまでを紹介します。ローバーのモデルを実際に動作させるのは次回以降の記事で紹介します。

1. fusionを使ったモデルの作成

項目 Version
Ubuntu 22.04
ROS 2 Iron
CPU Intel Core i7-12700H
GPU Intel Arc A550M
Memory 16GB

使用コードは以下のリポジトリで公開しています。
https://github.com/SoraKarimata/navigation_sim_tutorial

私たちはNavigation2のtutorialにあるGPS Waypoint Followerというパッケージを利用したかったため、そのパッケージの依存関係上ROS2 Iron環境で開発を行いました。

1.1 Fusionで作成したモデルのexport

Fusionで作成したCADモデルをgazebo上で動かせるようにFusionのアドインを使ってエクスポートします。アドインはfusion2urdf-ros2というパッケージを利用しました。部品ごとにコンポーネントを作成し、jointで固定して関節の設定を行います。詳しくはこちらのサイトを参考にさせていただきました。
注意点としてjointやコンポーネント名前を英語にしておかないとエクスポート時にエラーが発生するので気を付けてください。またあまりにも複雑な形にすると後で行うシミュレーションの処理が重くなってしまうのでできるだけ簡素化したモデルを使うことをおすすめします。

1.2 Rviz2上でモデルを表示させる

私のモデルは名前をares8_roverにしたのでares8_rover_descriptionという形でフォルダがダウンロードされます。このフォルダをubuntu上に移動させ新しいワークスペースでbuildします。

mkdir ros2_ws
cd ros2_ws
mkdir src

このsrcのフォルダ内にares8_rover_descriptionをコピーして貼り付けます。

source /opt/ros/iron/setup.bash
colcon build
source install/setup.bash

ここまでできたらrviz2を起動させます。

ros2 launch ares8_rover_description display.launch.py

1.3 URDFを作成する

Gazebo上でモデルを表示させるにはモデルをURDF形式にする必要があります。ダウンロードしたフォルダにはurdfというフォルダはあるものの、xacro拡張子などになっているためこれらをまとめて.urdf形式にします。
ここで、materials.xacroやares8_rover.xacroなどを一つのurdfファイルとしてまとめます。ares8_rover_description内のurdfフォルダには4つのファイルがあると思うのですが1箇所だけ修正を行います。

ares8_rover.xacro

- <mesh filename="file://$(find ares8_rover_description)/meshes/base_link.stl" scale="0.001 0.001 0.001"/>
+ <mesh filename="file:///home/karisora/ros2_ws/src/ares8_rover_description/meshes/base_link.stl" scale="0.001 0.001 0.001"/>

ares8_rover.xacro内のfilenameのURLです。もともとmeshファイルの場所が相対パスで書かれていますが、私の環境では絶対パスでしか認識できなかったのでares8_rover.xacro内の相対パス部分をすべて書き換えています。絶対パス部分は自分の環境のものに合わせてください。

書き換えたものを1つのファイルにまとめて、実際にできたares8_rover.urdfはこのようになります。ここでは行数が多くて見切れてしまっているので、詳しくはリンクを踏んで見てみてください。
https://github.com/SoraKarimata/navigation_sim_tutorial/blob/main/ares8_rover_description/urdf/ares8_rover.urdf

1.4 gazebo上でモデルを表示する

urdfファイルをlaunchさせるために新しくlaunchファイルを作成します。

urdf_gazebo.launch.py

#!/usr/bin/env python3

import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription, ExecuteProcess
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration

def generate_launch_description():
    pkg_name = 'ares8_rover_description'
    pkg_share = get_package_share_directory(pkg_name)
    
    # URDFファイルのパス
    urdf_file = os.path.join(pkg_share, 'urdf', 'ares8_rover.urdf')
    
    # Gazeboの起動
    gazebo = IncludeLaunchDescription(
        PythonLaunchDescriptionSource([os.path.join(
            get_package_share_directory('gazebo_ros'), 'launch', 'gazebo.launch.py')]),
    )
    
    # Robot State Publisherの設定
    robot_state_publisher = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        name='robot_state_publisher',
        output='screen',
        parameters=[{'robot_description': open(urdf_file).read()}]
    )
    
    # Gazeboにロボットモデルをスポーン
    spawn_entity = Node(
        package='gazebo_ros',
        executable='spawn_entity.py',
        arguments=['-entity', 'ares8_rover', '-file', urdf_file],
        output='screen'
    )
    
    # Joint State Publisherの設定
    joint_state_publisher = Node(
        package='joint_state_publisher',
        executable='joint_state_publisher',
        name='joint_state_publisher',
        output='screen',
    )

    return LaunchDescription([
        gazebo,
        robot_state_publisher,
        joint_state_publisher,
        spawn_entity,
    ])

このlaunchファイルを作成したら再度buildしてlaunchします。

ros2 launch ares8_rover_description urdf_gazebo.launch.py


このようにgazebo上でモデルがスポーンしたら成功です。
次回は実際にロボットの関節に指令を送り、ローバーを操作します。

Discussion