kakepro’s blog

プログラムとかPC周りのことを書いていきます

【ROS入門】Gazeboでシミュレーション

はじめに

・環境
Windows 10 Home 21H2
WSL2
Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz

・ROS melodicのインストール
下記記事を参照のこと
kakepro.hatenablog.com

・ここでやること
Gazeboでシミュレーションを行う上で最低限のURDFを書いてみる
set_model_stateトピックを使ってモデルを動かす

ロボットのモデリング:URDF

ROSではURDF(Unified Robot Description Format)というxml形式で記述したファイルを用いてロボットモデルを表現する
通常はツリー構造でロボットを表現する
例えば車両型のロボットなら車体をルートとして各車輪が枝となるような記述ができ、マニピュレータなら土台をルートとして上腕や前腕を枝となるように記述できる

基本的には
〇リンク:車輪や台座・上腕・前腕
〇ジョイント:関節(リンクとリンクを接続し、それらが互いに対してどう動くかを定義する)
を書けばモデルの可視化はできる
Gazeboでシミュレーションを行うにはイナーシャや干渉に関する情報も必要になる

モデルの作成

まずはワークスペースを準備する
cd
mkdir -p ./gazebo_ws/src
cd ./gazebo_ws
catkin init
cd ./src
catkin_create_pkg test_gazebo rospy
cd ../
catkin build
source ./devel/setup.bash

次にURDFを作成する
mkdir ./src/test_gazebo/urdf
cd ./src/test_gazebo/urdf
vim plate.urdf

URDFの中身は以下のような感じ

<?xml version="1.0"?>
<robot name="plate">
        <link name="base_link">
                <visual>
                        <geometry>
                                <box size="0.3 0.3 0.02"/>
                        </geometry>
                        <material name="silver">
                                <color rgba="0.75 0.75 0.75 1.0"/>
                        </material>
                </visual>
        </link>
</robot>

これをrvizで表示してみる
roslaunch urdf_tutorial display.launch model:=plate.urdf

f:id:kakepro:20220402165138p:plain
rviz

とりあえず板が出来たが、このURDFモデルはシミュレーションを行うために必要な物理的特性に関する一切の情報を持っていない

Gazeboでシミュレーション

Gazeboでのシミュレーションを行うために、collision(干渉)inertial(慣性)のタグを先ほどのURDFに追加する
干渉タグはvisualをコピペ、慣性は何の根拠もない適当な値をとりあえず入れておく
vim plate.urdf

<?xml version="1.0"?>
<robot name="plate">
        <link name="base_link">
                <visual>
                        <geometry>
                                <box size="0.3 0.3 0.02"/>
                        </geometry>
                        <material name="silver">
                                <color rgba="0.75 0.75 0.75 1.0"/>
                        </material>
                </visual>
<!-- ここから追加 -->
                <collision>
                        <geometry>
                                <box size="0.3 0.3 0.02"/>
                        </geometry>
                </collision>
                <inertial>
                        <mass value="0.5"/>
                        <inertia ixx="0.02" iyy="0.02" izz="0.02" ixy="0" iyz="0" ixz="0"/>
                </inertial>
<!-- ここまで -->
        </link>
</robot>

次はこれをGazeboに読み込むためのローンチファイルを作成する
cd ~/gazebo_ws/src/test_gazebo
vim plate.launch

<launch>
        <!-- load the urdf model  into the parameter server -->
        <param name="robot_description" textfile="$(find test_gazebo)/urdf/plate.urdf" />

        <!-- start gazebo with empty world -->
        <include file="$(find gazebo_ros)/launch/empty_world.launch" />

        <!-- spawn plate in gazebo and receive the description from the parameterserver -->
        <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model plate" />
</launch>

では実行してみる
roslaunch test_gazebo plate.launch

f:id:kakepro:20220402171213p:plain
gazebo

ちゃんとGazeboに板が読み込まれている

Gazeboが起動した状態でトピック一覧を表示してみる
別のターミナルで下記を実行
rostopic list
すると以下のように表示されるはず
/clock
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/set_link_state
/gazebo/set_model_state
/rosout
/rosout_agg
このうちの/gazebo/model_statesを使ってモデルを動かしてみる

Gazeboを起動した状態で別のターミナルから下記を実行
rostopic pub -r 1 gazebo/set_model_state gazebo_msgs/ModelState '{model_name: plate, pose: { position: { x: 0, y: 0, z: 0.5 }, orientation: {x: 0, y: 0, z: 0, w: 0 } }, twist: { linear: { x: 1, y: 0, z: 0 }, angular: { x: 0, y: 0, z: 0} }, reference_frame: world }'

板がZ=0.5の位置から重力を受けて放物線状に落ちてくる様子が確認できる
youtu.be

参考

wiki.ros.org