Help us understand the problem. What is going on with this article?

ROS講座26 シミュレーターを作る

環境

この記事は以下の環境で動いています。

項目
CPU Core i5-8250U
Ubuntu 16.04
ROS Kinetic
Gazebo 7.0.0

インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。

概要

シミュレーション環境の使い方を説明します。rosにはgazeboという専用のシミュレーターがあります。今回は初回ということでただの箱を出現させる例を紹介します。

インストール

sudo apt-get install ros-kinetic-desktop-full
sudo apt-get install ros-kinetic-gazebo-ros-control 
sudo apt-get install ros-kinetic-ros-control ros-kinetic-ros-controllers

とりあえず上を実行してください。

シミュレーションワールドのlaunch

以下でgazeboを起動することができます。以下の画像のような何もないgazeboワールドが起動すれば成功です。

gazeboの起動
roslaunch gazebo_ros empty_world.launch 

sim1_empty_world.png

シンプルな箱の出現

ロボットのシミュレーションモデルをurdfで記述して、それをgazeboワールドに出現させることができます。今回は単純な箱を出現させます。

ソースコード

urdfファイル

基本は今までのurdfと同じですが、gazebo用に追加しなければならない要素があります。

sim1_lecture/urdf/simple_body.urdf
<?xml version="1.0"?>
<robot name="my_robo" xmlns:xacro="http://ros.org/wiki/xacro">
  <link name="base_link"/>

  <joint name="body_joint" type="fixed">
    <parent link="base_link"/>
    <child  link="body_link"/>
  </joint>
  <link name="body_link">
   <inertial>
     <origin xyz="0 0 0.5" rpy="0 0 0"/>
     <mass value="1"/>
     <inertia ixx="0.1" ixy="0" ixz="0" iyy="0.1" iyz="0" izz="0.1" />
   </inertial>
   <visual>
     <origin xyz="0 0 0" rpy="0 0 0" />
     <geometry>
       <box size="1 1 1" />
     </geometry>
     <material name="Cyan">
       <color rgba="0 1.0 1.0 1.0"/>
     </material>
   </visual>
   <collision>
     <origin xyz="0 0 0" rpy="0 0 0"/>
     <geometry>
       <box size="1 1 1" />
     </geometry>
   </collision>
  </link>
  <gazebo reference="body_link">
    <material>Gazebo/Red</material>
  </gazebo>
</robot>

今回追加されているのは以下の要素です。

  • link要素/inertial要素
    • origin要素:重心位置(省略可)
    • mass要素:物体の重さ
    • inertia要素:物体のイナーシャ ※後述
  • link要素/collision要素
    • origin要素:以下のgeometryの中心(省略可)
    • geometry要素(衝突判定に使う形の定義)
  • (option)gazebo要素(linkを参照)
    • material要素:gazeboで表示する色(rvizでの色とは別に指定する必要があります)

launchファイル

sim1_lecture/launch/simple_body.launch
<launch>
  <arg name="model" default="$(find sim1_lecture)/urdf/simple_body.urdf"/>   
  <param name="robot_description" command="$(find xacro)/xacro $(arg model)"/>

  <include file="$(find gazebo_ros)/launch/empty_world.launch" />

  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
    args="-urdf -model my_robo -param robot_description"/>
</launch>

empty_world.launchでgazeboワールドを立ち上げて、urdf_spawnerを使ってgazeboにurdfのロボットモデルを出現させます。
args="-urdf -model {ロボット名} -param {robot_descriptionのrosparam名}"と指定します。

実行

roslaunch sim1_lecture simple_body.launch 

実行すると以下のような画面が現れます。
画像で赤く示してるように矢印ボタンを押すと座標軸が出現します。これをマウスでドラッグすると図形を動かすことができます。物理シミュレーターで重力が効いているので上にあげるて離すと落ちます。
また下側の「Real Time Factor」はシミュレーションの時間が実時間の何倍の速度で動いているかということを示しています。1.0なら等速であり、それ以下ならシミュレーションが処理落ちしていることを示します。

sim1.png

rvizと違ってgazeobはシミュレーションです。例えば左上の矢印マークを押した後に物体をクリックしてz軸の座標軸を持ち上げると物体の位置が上に上がりますが、話すと重力が効いているので下に落ちます。

sim_gazebo1.gif

イナーシャについて

イナーシャは慣性モーメントとも呼ばれ、回転の運動において「重さ」に相当するものです。重さ(mass)は1次元ですが、イナーシャは回転方向も考慮した値で6次元の値になります。行列で書かれ

\begin{pmatrix}
I_xx & I_xy & I_xz\\
I_yx & I_yy & I_yz\\
I_zx & I_zy & I_zz
\end{pmatrix}

となります。これだと9次元あるように見えますが、$I_xy=I_yx, I_yz=I_zy, I_zx=I_xz$となるので6次元です。6次元の中でも対角要素$(I_xx,I_yy,I_zz)$と非対角要素$(I_xy,I_yz,I_xz)$があり、軸の方向をうまくとると非対角要素は0となることが知られています。正確な値はCADなどでないと出すのが難しいのですが、大体適当な値の出し方があります。

I_{xx} = I_{yy} = I_{zz} = \frac{MD^2}{10}\\
I_{xy} = I_{yz} = I_{zx} = 0\\
(D:長さ[m]、M:重さ[kg])

とすると程よい値になります。小さい部品をたくさん組み合わせるロボットのようなものでは、この程度のざっくりした値でどうにかなります。逆にこのざっくりした値からかけ離れた値が入っているとシミュレーションが期待した動作をしなくなったり、計算のエラーでモデルが破城したり、モデルが吹き飛んだりしてしまいます。

目次ページへのリンク

ROS講座の目次へのリンク

srs
ロボットを日々こつこつと製作しています。ロボットやROSやC++、pythonに関心があります。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした