2017年10月11日水曜日

オリジナルロボットでrviz、gazebo2-1: URDFファイルの記述

オリジナルのロボットモデルをURDFで記述して、それをrviz上で表示することを目標とします。
まずロボットモデルの記述ですがこれはURDFで行います。基本的にはROS Wikiを参照すればよいので、今回は大まかなところを注意点しか書きません。

パッケージの構成を以下のようにします。(黒はパッケージ作成時からあるもの、青は手動で追加するもの)
/package_name
   /src
   /include
   /urdf
     /robot.urdf
   /launch
     /display.launch
   /config
  /CMakeLists.txt
  /package.xml

この記事ではロボットモデルを記述するrobot.urdfの書き方と、モデルの確認を行うdisplay.launchの2つのファイルを書いていきます。

基本の表示

URDFの書き方


ロボットを可動部分で分割した部分であるlinkをjointでつなげてロボットを作ります。今回は2輪で動作するロボットを製作します。2つの動輪と2つの補助輪があるイメージです。
しかしとりあえず初めは上記のような複雑なことをせずにただの物体を表示することを目標とします。

##### robot.urdf #####
<robot name="my_robot">
  <link name="base_link">
   <visual>
     <geometry>
       <cylinder radius="0.15" length="0.10" />
     </geometry>

   </visual>
 </link>
</robot>

##### end #####

上記で原点を中心とする円柱を持つロボットモデル(これをロボットモデルというのは微妙ですが)が完成しました。
<link>タグに挟まれたところがlinkの定義です。name属性で名前を付けます。その下の<visual>タグで挟まれているのは「表示される形状」です。これとは別に衝突判定の形状を定義することが出来ます(衝突判定用の形状は処理を軽くするために細部を省略した形状を当てはめることが多い)。
geometryタグの中は形状の定義です。基本形状として、box、cylinder、sphere、それとstlファイルを読み込むmeshがあります。cylinderはz軸が軸になります。
各タグの詳細な意味はhttp://wiki.ros.org/urdf/XML/linkを見てください。

Launchの書き方

Launchではモデルのロードとrvizの起動を行います。

##### display.launch #####
<launch>
  <arg name="model" default="$(find package_name)/urdf/robot.urdf"/>
  <param name="robot_description" textfile="$(arg model)" />
  <node name="rviz" pkg="rviz" type="rviz" />
</launch>

##### end #####

model変数に先ほど作ったurdfファイルの場所を入れて、その内容をrobot_descriptionというrosparamに格納します。疎下4行目でrvizの起動を行います。

次にTerminalに移ってlaunchを行います。

$roslaunch package_name display.launch

このようにroslaunch <パッケージ名> <launchファイル名>とコマンド入力することでlaunchファイルを実行します。rvizが表示されるのですが、初期状態では以下の様に何も表示されないのでrvizの設定を行います。
この時roslaunch paぐらいまで売った後にtabキーを押せば保管されるはずです。しかしrosの仕様なのかpackageを作った後の初回時だけは補完をしてくれません。


  1. displaysウィンドウのGlobal Options→Fixed Frame の中身をmapからbase_linkに書き換える。
  2. displaysウィンドウ下部のAddボタンを押しBy display_tipeタブの中でrviz→RobotModelを選択してOKボタンを押す。
すると以下の様にモデルが表示されます。(もしかしたら色が灰色になるかもしれません)


毎回この設定をするのは面倒なのでrvizの設定ファイルを製作してそれを読み込み用にします。
上記のrviz上でモデルが表示されている状態でメニューバーからFile→Save Config Asを選択します。これをはじめに作ったフォルダのpackge_name/config/SETTING.rvizとして保存します。
この設定ファイルを起動時に読み込むためにlaunchを編集します。

##### display.launch #####
<launch>
  <arg name="model" default="$(find package_name)/urdf/robot.urdf"/>
  <param name="robot_description" textfile="$(arg model)" />
  <arg name="rvizconfig" default="$(find package_name)/config/SETTING.rviz" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" />
</launch>

##### end #####

こうすることで

$roslaunch package_name display.launch

だけでモデルが表示されます。

ロボットモデルの製作


他の部品も加えます。

##### robot.urdf #####
<robot name="my_robo" xmlns:xacro="http://ros.org/wiki/xacro">
  <!-- links -->
  <link name="base_link" />

  <link name="body_link">
    <visual>
      <geometry>
        <box size="0.400 0.200 0.140"/>
      </geometry>
      <material name="gray">
        <color rgba="0.8 0.8 0.8 1.0"/>
      </material>
    </visual>
  </link>

  <link name="left_wheel_link">
    <visual>
      <geometry>
        <cylinder radius="0.100" length="0.050"/>
      </geometry>
      <material name="red">
        <color rgba="1.0 0.0 0.0 1.0"/>
      </material>
    </visual>
  </link>

  <link name="right_wheel_link">
    <visual>
      <geometry>
        <cylinder radius="0.1" length="0.05"/>
      </geometry>
      <material name="green">
        <color rgba="0.0 1.0 0.0 1.0"/>
      </material>
    </visual>
  </link>

  <link name="caster_link">
    <visual>
      <geometry>
        <sphere radius="0.080"/>
      </geometry>
      <material name="gray"/>
    </visual>
  </link>

  <!-- joints -->
  <joint name="body_joint" type="fixed">
    <parent link="base_link"/>
    <child link="body_link"/>
    <origin xyz="0.000 0.000 0.150"/>
  </joint>

  <joint name="left_wheel_joint" type="continuous">
    <parent link="body_link"/>
    <child link="left_wheel_link"/>
    <origin rpy="-1.5707 0 0" xyz="-0.100 0.105 -0.050"/>
    <axis xyz="0 0 1"/>
  </joint>

  <joint name="right_wheel_joint" type="continuous">
    <parent link="body_link"/>
    <child link="right_wheel_link"/>
    <origin rpy="1.5707 0 0" xyz="-0.100 -0.105 -0.050"/>
    <axis xyz="0 0 -1"/>
  </joint>

  <joint name="caster_joint" type="fixed">
   <parent link="body_link"/>
   <child link="caster_link"/>
   <origin xyz="0.100 0 -0.070" />
   <axis xyz="0.0 0.0 1.0"/>
  </joint>
</robot>

##### end #####

<visual>タグの中に<material>というものが増えました。
<material name="gray">
  <color rgba="0.8 0.8 0.8 1.0"/>
</material>
これはrviz上での色を定義するものです。
$ cd ~/catkin_ws/package_name
$ check_urdf robot.urdf
とするとurdfファイルが正しいかが分かります。

オリジナルロボットでrviz、gazevo1-2: rosの準備

ROSの準備

wikiについて

ROSには公式のwikiがあって、それがだいぶ充実しています。日本語化も一部していて、初心者が見るようなところは丁寧に日本語になっているので、実際はROS wikiを見て学ぶのが一番です。
  • wiki;
    http://wiki.ros.org/ja
  • インストールについて
    http://wiki.ros.org/kinetic/Installation/Ubuntu
    (日本語のページは古いバージョン(indigo)の内容なので少し違います)
  • チュートリアル
    http://wiki.ros.org/ja/ROS/Tutorials
    長いですがこれで一通りすべてが学べるので良い

1.インストール

前の記事で概要を示したので今回はROSのインストールを行います。ROSは色々なツールからなっていてその環境は複雑です。そのためにインストールはROSの最初の関門です。しかし環境さえ間違えなければ以下のスクリプトでインストールが出来ます。

環境
  • x86系のPC(普通のPCのこと、Raspberry Piは不可:ここを参照)
  • Ubuntu 16.04
インストールするのはROSのKineticというバージョンです。インストールには1時間ほどかかります。少なくともクリーンインストール状態からでの動作を確認しています。

###### script ######
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get -y update
sudo apt-get -y upgrade

sudo apt-get -y install ros-kinetic-desktop-full
apt-cache search ros-kinetic

sudo rosdep init
rosdep update

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

source /opt/ros/kinetic/setup.bash
sudo apt-get -y install python-rosinstall
###### script end ######

2. catkin_wsの製作

上記でROS自体のインストールが完了でここからcatkin workspaceを製作します。これはrosにおけるコンパイルを行う単位です。フォルダを製作して、一度makeをしてセットアップファイルの読み込みを行います。

###### script ######
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws
catkin_make
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
###### script end ######

3.パッケージの製作

パッケージというのはROSの単位で、1つの機能を持ったソフトの集合です。例えばロボットアームに対応したパッケージ、色々場パッケージを統合して台車ロボットを制御するパッケージ等があります。またgitなどで分配するときでの最小単位になります。 package_nameは任意のパッケージ名でその後ろは依存するパッケージの一覧です。とりあえず以下の様にしておけば良いでしょう。

###### script ######
cd ~/catkin_ws/src
catkin_create_pkg package_name std_msgs rospy roscpp
###### script end ###### 

オリジナルロボットでrviz、gazebo1-1: 概要

概要


rvizとgazeboはロボット開発においては大変便利なROSに付属しているツールです。rvizは可視化ツールと呼ばれていてロボットの状態をGUIで表示するツールです。gazeboは物理シミュレーターでして、実機が無くてもロボットの動作をシミュレーションすることが出来ます。
これらはROSのツールに組み込まれていてROSとの親和性が高いのですが、やはり使い方が難しく、設定項目が多いために使うのは困難です。メモもかねてここに設定の仕方を残しておきます。

Rvizは下の図の様にロボットの状態を表示するツールです。このツール自体はシミュレーターではなく、ロボット実機やシミュレーションから出力されるタイヤの回転やロボットアームの関節角をデータをGUIに表示するツールです。また3次元空間上での表示に特化したシステムになります。
ロボット実機が動いている場合このツールの存在意義はあるのかと思ってしまうのですが、実機のロボットの状態を確認するもなかなか面倒なものです。またコンピューターからのコマンド通りにロボットが動いているのかといったことも確認できます。
またプラグインを使うことで電流値やエラー情報等も下の図のようにすっきりと表示することが出来ます。


gazeboは物理シミュレーターです。rosと連携していてROSのロボットモデルにいくらかの(という名の大量の)データを付加するだけでロボットモデルの物理シミュレーションができます。物理シミュレーションのカーネルはODEを使っています(ほかのシミュレーションカーネルと入れ替えできるらしいが不明)。ODEによる動力学、接触のシミュレーションができるだけでなく、カメラ画像を取得したり、LIDER(レーザーを使ったレーダー)のシミュレーションもできます。
ロボットの動力学シミュレーション(制御器など)よりもセンサーのシミュレーションに使われているという印象がある。
以下では2軸のロボットアームのシミュレーション画面で各関節には力駆動のモーターが入っていてそれをPID制御器でコントロールして関節を曲げることが出来ます。


構成

  1. ROSの準備
  2. URDFを学ぶ
    urdfはrosでロボットの形状や機能を定義するためのファイル形式で実態はxmlです。このファイルで形状を表すlinkに形や重さの属性を付与して、linkとlinkの接続点をjointで定義してロボットを製作します。
  3. Rvizで表示する
    rvizで上記のurdfを読み込んで表示します。
  4. gazeboで動かす
の順に説明していきます。