ROSを使ったURDF作成


物理シミュレーションをする時にROS(Robot Operating System)が必要になります.
また,物理オブジェクトを作るのにurdf形式で物体を用意する必要もあります.
色々ハマった箇所があったので,今回はそのROSのインストールとURDFの作成についてまとめました.

目次

  1. ROSをインストールする
  2. ワークスペースを作成
  3. パッケージを作成
  4. launchファイルを作る
  5. URDFファイルを作る
  6. URDFをrivzで確認

バージョン

  • Ubuntu 14.04 Trusty
  • ROS indigo
  • Gazebo 2 (任意)

ROSの最新バージョンはmelodicですが,Ubuntu 14.04では対応していないので,indigoをインストールします.
Gazeboは物理エンジンで,ROSと連携できる機能があるため今回は一緒にインストールしましたが,特に必要ではないです.ROS indigoに対応しているGazeboはバージョン2です.(間違ってGazebo7を入れてしまってハマった)

1. ROSをインストールする

source.listとキーの設定

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'
wget http://packages.ros.org/ros.key -O - | sudo apt-key add -

インストール

sudo apt-get update
sudo apt-get install ros-indigo-desktop-full

ハマった箇所

  • 私の場合,Gazebo7を先に入れてしまってROSのインストールに失敗してハマりました. (依存パッケージがインストールできない問題) Ubuntu 14.04にはGazebo7が対応しているが,ROS indigoはGazebo2までしか対応していないことが原因でした.
sudo aptitude install ros-indigo-desktop-full

をして,解決方法を受け入れる(y)にすると,Gazebo2とROS indigoが両方入る.


rosdepの初期化

sudo rosdep init
rosdep update

環境変数の設定

echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
source ~/.bashrc

rosinstallの準備

sudo apt-get install python-rosinstall

Gazeboのインストール

source.listとキーの設定

sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu trusty main" > /etc/apt/sources.list.d/gazebo-latest.list'
wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -

インストール

sudo apt-get update
sudo apt-get install libsdformat1 libsdformat-dev gazebo2

ROSと連携するプラグインをインストール

sudo apt-get install -y ros-indigo-gazebo-ros-control ros-indigo-ros-control ros-indigo-ros-controllers

参考にしたサイト

2. ワークスペースを作成

空のワークスペースを作成

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace

catkin_makebuilddevelフォルダを作成

cd ~/catkin_ws/
catkin_make

有効化します

source devel/setup.bash

bashを立ち上げる時に自動で有効化するようbashrcに書き加えます.

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

ROSの設定をbashrcに記述

.bashrcに次を追加します.

# Set ROS Network
export ROS_HOSTNAME=127.0.0.1
export ROS_MASTER_URI=http://${ROS_HOSTNAME}:11311

ROS_HOSTNAMEはPCのIPアドレスを指定しますが,固定化されてない場合は127.0.0.1としておきます.


ハマった箇所

  • ROSはsystemのpython(python2系)でないと動かないので,pyenvを使っている方はsystemに変更しておきましょう.

参考にしたサイト

3. パッケージを作成

すでにROSは入っていて,新しくモデルを作りたいだけの時はここ(3. パッケージを作成)からで大丈夫です.

ワークスペースのsrcフォルダにパッケージを作成する

my_roboというワークスペースを作ります.
catkin_create_pkg <任意の名前>_descriptionでパッケージを作成します.

cd ~/catkin_ws/src
catkin_create_pkg my_robo_description

各種ディレクトリを作る

meshes, urdf, launch, rvizの4つのフォルダを作成します.

cd catkin_ws/src/my_robo_description
mkdir meshes urdf launch rviz

meshes : stlファイルを入れます
urdf : ここにurdfファイルを作ります
launch : launchファイル(urdfを確認するときに使います)を入れます
rviz : urdfを描画する際に使います

参考にしたサイト

4. launchファイルを作る

urdfをrivzで視覚的に確認したいときに必要になります.どのワークスペースでもほぼ共通です.
display.launchファイルを作ります.

cd launch
gedit display.launch

display.launchに以下を記述します.

<launch>
 
  <arg name="model" default="$(find <パッケージのときに作った名前>_description)/urdf/<モデルの名前>.urdf"/>
  <arg name="gui" default="True"/>
  <arg name="rvizconfig" default="$(find <パッケージのときに作った名前>_description)/rivz/urdf.rviz"/>
 
  <param name="robot_description" command="$(find xacro)/xacro.py $(arg model)"/>
  <param name="use_gui" value="$(arg gui)"/>
 
 
  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
 
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true"/>
 
</launch>

参考にしたサイト

5. URDFファイルを作る

事前に適当な3DCADソフトでstlファイルを作っておき,~/catkin_ws/src/my_robo_description/mesh/に置きます.
urdfはXMLで記述されています.例えば

<?xml version="1.0"?>  <!-- xmlコードを認識してくれる -->
<robot name="my_robo"> <!-- 全体をrobotタグでくくる -->
  <link name="base_link">
 
    <visual>
      <geometry>
        <box size="0.400 0.200 0.100"/>  
      </geometry>
    </visual>
 
    <collision>
      <geometry>
        <box size="0.400 0.200 0.100"/>
      </geometry>
    </collision>
 
  </link>
</robot>

visualタグとcollisionタグは基本的に同じ記述をします.geometryタグで形状を指定します(boxは直方体を描画).基本的に,linkタグでパーツをそれぞれ指定していき,それをjointタグで結合していきます.
各タグの詳しい説明はここを参照してください.

今回はmy_roboという名前のurdfを作成するので,適当なエディタで開きます.

cd urdf
gedit my_robo.urdf

必要な要素

linkタグ

  • inertial : 物理パラメータを記述
    • origin : 座標x,y,z
    • mass : 質量(kg)
    • inertia : 慣性モーメントixx, iyy, izz, ivy, iyz, ixz
  • visual : 見た目
    • origin : 座標x,y,z・オイラー角(向き)row, pitch, yaw
    • geometry : 形状を指定
      • mesh : stlを読み込む
    • (material) : colorを指定できます.必須ではない.
  • collision : 物理的な接触範囲.visualと同じでいい.
    • origin
    • geometry
      • mesh

jointタグ

  • parent : 物体の本体を指定
  • child : 親linkに対して結合するlinkを指定
  • origin : jointの方でパーツの位置を指定
  • axis : 軸の座標x, y, z.回転させたいパーツのときに,回転軸をここで指定します.

CADで作ったstlをurdfに取り込む

geometryタグ内にmeshタグを記述し,そこにstlのパスを指定します.

<geometry>
  <mesh filename="package://robot_description/meshes/base_link_simple.stl"/>
</geometry>

ハマった箇所

  • 3DCAD(123D Designを使ってました)でstlを作るとき,プリミティブ物体ではなく,平面を指定して押し出しというように1から作った方がいいです.物理シミュレーション上で,連続で物体を呼び出すときに途中で読み込みエラーが出ます.
  • 3DCAD上での軸がstlに採用されるので,タイヤなど回転させる物体を作る際は回転軸を考えてstlを作成してください.

jointでくっつけたlinkの関係をチェック

check_urdf <作ったurdf>.urdf

jointとlinkの関係に問題がなければ,successfulと出ます.

参考にしたサイト

6. URDFをrivzで確認

rvizというソフトで作ったurdfを視覚的に確認できます.次でrvizを起動します.

roslaunch <パッケージのときに作った名前>_description display.launch model:=<開くurdfのパスを指定>

例えば,今回ではmy_roboを作っているので

roslaunch my_robo_description display.launch model:=urdf/my_robo.urdf

model:=のパスに注意.カレントディレクトリからの相対パスを指定してください.ただ,urdfモデルはデフォルトでパスを指定してあるため(display.launchファイルに記載),パスを指定しなくても問題ないです.


ハマった箇所

  • ascii codecのエラーが起こる場合,urdfのファイルにスペースではなくtabが入っているとエラーになります.

rvizでの設定

左側のDisplaysより,Global OptionsFixed Framebase_linkを選ぶ

左下のAddボタンをクリックし,rvizRobotModelを選択しOKを押します. (これを忘れて表示されない!って焦りました)
追加すると,my_robo.urdfで定義した車体が表示されます.

左側のDisplaysより,RobotoModelLinksbase_linkを展開します.

  • Alpha0.5にして,物体を半透明にします.
  • Show Axesにチェックを入れ,x軸(赤)y軸(緑)z軸(青)が表示させます.
  • 全てのlinkに上記を行い,各linkの軸の位置を確認しましょう.

参考にしたサイト