【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
とりあえず板が出来たが、この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
ちゃんと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