ロボットシミュレータ導入

Introduction to robot simulator

概要 Abstract
ODE (Open Dynamics Engine) を使ったシミュレーション環境を構築する手順について解説する.
Explain procedure to build simulation environment using ODE (Open Dynamics Engine).
注意 Attention
環境は Linux (Linux Mint, Ubuntu, or Debian) を想定している.
Linux (Linux Mint, Ubuntu, or Debian) is assumed as for environment.
目次 Table of contents

Open Dynamics Engine

  1. パッケージ libglut3 libglut3-dev をインストール Install package libglut3 libglut3-dev.
    sudo apt-get -f install libglut3 libglut3-dev
    Ubuntu14.04の人は,freeglut3, freeglut3-dev をインストール.
    For Ubuntu14.04 users, freeglut3, freeglut3-dev will be installed.
  2. http://sourceforge.net/projects/opende/files/ODE/0.11.1/ode-0.11.1.zip/download からダウンロード.Ubuntu14.04の人はode-0.13をダウンロード.下のsh autogen.shを./bootstrapにする. Download from http://sourceforge.net/projects/opende/files/ODE/0.11.1/ode-0.11.1.zip/download. For Ubuntu14.04 users, download ODE-0.13 ode-0.13 Please change commands from sh autogen.sh to ./bootstrap
  3. 適当なディレクトリ(e.g. ~/prg/libode)に解凍 Unzip to suitable directory (e.g. ~/prg/libode)
    cd ~/prg/libode
    unzip ode-0.11.1.zip
  4. 端末で以下を実行: Execute the following with terminal:
    cd ode-0.11.1
    sh autogen.sh
    ./configure --enable-double-precision
    make
    (完了)
    (completion)
Note
Ubuntuにインストールする際,以下の様なグラフィック(X11)関連の問題が起きることがある.
When installing in Ubuntu, graphic (X11)-related problem such as following may happen.
x11.cpp:108: error: undefined reference to 'XOpenDisplay'
x11.cpp:123: error: undefined reference to 'XCreateColormap'
x11.cpp:143: error: undefined reference to 'XCreateWindow'
x11.cpp:155: error: undefined reference to 'XSetWMName'
...
これは libX11.so がリンクされるように設定されていないことが原因で(なぜかは不明),リンカオプションに -lX11 を付けるように configure のオプションを設定すれば解決できる. 具体的には,X_EXTRA_LIBS に -lX11 を設定して configure を実行すればよい.
bash だと,以下を実行する:
This due to not being set to link to libX11.so (unclear for some reason), you can solve by setting configuration option as adding -lX11 to linker option. Specifically, set -lX11 in X_EXTRA_LIBS to execute configure. &br When it is bash, execute the following:
X_EXTRA_LIBS=-lX11 ./configure --enable-double-precision

確認作業 Confirmation work

(端末で)インストールディレクトリ (e.g. ~/prg/libode/ode-0.11.1) の ode/demo ディレクトリに移動し,適当なデモを実行:

(With terminal) Move to ode/demo directory of installation directory (e.g. ~/prg/libode/ode-0.11.1), then execute suitable demonstration:

cd ~/prg/libode/ode-0.11.1/ode/demo
./demo_chain2

ボックスが一列に連なったロボットが表示されて,動けばOK.終了はウィンドウ上で Ctrl+x を押す.

It is OK if robot, which box ranges in single row, is displayed and it moves. Push Ctrl+x on window to finish.

ロボット環境 Robot environment

ODE (Open Dynamics Engine) によってシミュレートされる仮想的なロボットのインストール方法について述べる.

We describe installation method of virtual robot simulated by ODE (Open Dynamics Engine).

インストール Installation

naist-robotics-edu

まず,naist-robotics-edu をインストールする.bin/config.sh も作成すること.

At first, install naist-robotics-edu. Create bin/config.sh, too.

ファイルの説明 Description of file

ロボット環境に関連するファイル群のみ説明する:

We describe only file group related to robot environment:

  • bin/compile.sh : コンパイル用スクリプト bin/compile.sh : Compilation script
  • simpleode : ODE を使いやすくした環境 simpleode: Environment that made it easy to use ODE
    • lib : ロボット,ライブラリの定義ディレクトリ lib: Definitions directory of robot, library
      • arm.h : ロボットアームのヘッダ arm.h: Header of robot arm
      • fing.h : ロボットフィンガのヘッダ fing.h: Header of robot finger plate
      • xode.h : ODE 拡張ヘッダ xode.h: ODE extension header
    • libtest : テストプログラムディレクトリ libtest : Test program directory
      • test-arm.cpp test-arm.cpp
      • test-fing.cpp test-fing.cpp
    • textures : テクスチャディレクトリ textures : Texture directory
      • checkered.ppm checkered.ppm
      • ground.ppm ground.ppm
      • sky.ppm sky.ppm
      • wood.ppm wood.ppm

テスト Test

  1. 以下を実行 Execute the following :
    cd simpleode/libtest
    ../../bin/compile.sh -ode test-arm.cpp
    ./test-arm.out

プログラミング Programming

基本的には,simpleode/libtest/test-arm.cpp を見ればわかる.

Basically, you can understand if you read simpleode/libtest/test-arm.cpp.

#include "simpleode/lib/arm.h"
#include <iostream>
using namespace std;

void test_ctrl(xode::TEnvironment &env, xode::TDynRobot &robot)
{
  dReal target[3]={0.5,0.8,0.8};

  // robot.Body().back().addForce (0.1*(std::sin(env.Time())+1.0), 0.1*(std::sin(env.Time()*1.7)+1.0) ,0.1*(std::sin(env.Time()*0.7)+1.0));

  target[0]= std::sin(env.Time());
  target[1]= 0.5*(std::sin(0.2+2.0*env.Time())+1.0);
  target[2]= 1.57*0.5;

  const double kp(5.0);
  for(int j(0);j<3;++j)
    robot.SetAngVelHinge(j,kp*(target[j]-robot.GetAngleHinge(j)));

  // const double kp(0.2),kd(0.02);
  // for(int j(0);j<3;++j)
  //   robot.AddTorqueHinge(j,kp*(target[j]-robot.GetAngleHinge(j))-kd*robot.GetAngVelHinge(j));

  cerr<<robot.GetAngleHinge(0)<<" "<<robot.GetAngleHinge(1)<<" "<<robot.GetAngleHinge(2)<<endl;
}

static dVector3 KeyboardShperePos={0,0,1};

void test_draw(xode::TEnvironment &env, xode::TDynRobot &robot)
{
  dReal sides[3]={0.3,0.3,0.3};
  dsSetColorAlpha (0.0, 1.0, 1.0, 0.5);
  dsDrawBox (robot.GetHandPos(), robot.GetHandRot(), sides);
  dsSetColorAlpha (1.0, 0.0, 1.0, 0.5);
  // dsDrawSphere (KeyboardShperePos, robot.GetHandRot(), 0.2);
}

void test_keyevent(xode::TEnvironment &env, xode::TDynRobot &robot, int command)
{
  dReal d(0.05);
  switch(command)
  {
  case 'd': KeyboardShperePos[0]+=d; break;
  case 'a': KeyboardShperePos[0]-=d; break;
  case 'w': KeyboardShperePos[2]+=d; break;
  case 's': KeyboardShperePos[2]-=d; break;
  case 'e': KeyboardShperePos[1]+=d; break;
  case 'q': KeyboardShperePos[1]-=d; break;
  }
}

int main (int argc, char **argv)
{
  xode::TEnvironment env;
  dsFunctions fn= xode::SimInit("textures",env);
  // dsFunctions fn= xode::SimInit("/home/akihiko/proj/skyai/benchmarks/humanoid01/m/textures_w",env);
  xode::ControlCallback= &test_ctrl;
  xode::DrawCallback= &test_draw;
  xode::KeyEventCallback= &test_keyevent;

  dsSimulationLoop (argc,argv,400,400,&fn);

  dCloseODE();
  return 0;
}

以下の3つのコールバック関数を定義する必要がある.

It is necessary to define three following call back functions.

  • void xode::ControlCallback(xode::TEnvironment &env, xode::TDynRobot &robot) :
    各制御ループで呼ばれる.
    Called by each control loop.
  • void xode::DrawCallback(xode::TEnvironment &env, xode::TDynRobot &robot) : 各描画ループで呼ばれる. Called by each drawing loop.
  • void xode::KeyEventCallback(xode::TEnvironment &env, xode::TDynRobot &robot, int command) : ウィンドウ上でキーイベントが発生したら呼ばれる.command はキーコマンド. It is called when key event occurs on window.
    ただし,env は環境オブジェクト,robot はロボットオブジェクトを表す.
    But, env stands for environmental object, and robot stands for robot object.

コールバックで利用可能な関数:

Function that is available in call back:

  • robot.SetAngVelHinge(j,w) : 関節 j の角速度 w (ラジアン/秒) を設定する. robot.SetAngVelHinge(j,w) : Set angular velocity w (radian / sec) of joint j.
  • robot.GetAngleHinge(j) : 関節 j の角度(ラジアン)を得る. robot.GetAngleHinge(j) : Get angle (radian) of joint j.
  • robot.GetHandPos() : エンドエフェクタの位置. robot.GetHandPos() : Position of end effector.
  • robot.GetHandRot() : エンドエフェクタの姿勢. robot.GetHandRot() : Posture of end effector.
  • env.Time() : シミュレーション時間. env.Time() : Simulation time.
  • dsDrawBox(pos, rot, sides) : 位置 pos に姿勢 rot の大きさ sides のボックスを描画する. dsDrawBox(pos, rot, sides) : Draw box of size sides of posture rot at position pos.
  • dsDrawSphere(pos, rot, radius) : 位置 pos に姿勢 rot の半径 radius の球を描画する. dsDrawSphere(pos, rot, radius) : Draw ball of radius radius of posture rot at position pos.

test-arm.cpp の test_ctrl 関数では,P制御が行われていることに注意しよう.

For test_ctrl function of test-arm.cpp, be careful about that P control is performed.

注意 Note
ODE では,回転が 反時計回り なので,Eigen の回転オブジェクトや「ヒューマノイドロボット」のテキストにあるような回転行列を使って計算した姿勢を描画で使う場合,転置して dsDrawBox などに渡す必要がある.ただし,SetAngVelHinge や GetAngleHinge では 時計回り で計算できるようにプログラムされている.
In ODE, because rotation is counter clockwise, when you use calculated posture by rotation matrix, such as one of Eigen Rotational object and text of "humanoid robot", for drawing, it is necessary to transpose and to hand it to dsDrawBox. But, SetAngVelHinge and GetAngleHinge are programed to calculate clockwise.

コンパイル Compilation

コンパイルとリンク

Compilation and link

g++ -g -Wall -O3 FILE_NAME -I$ODE_PATH/include -DdDOUBLE -lm $ODE_PATH/ode/src/.libs/libode.a $ODE_PATH/drawstuff/src/.libs/libdrawstuff.a -lSM -lICE -lGL -L/usr/X11R6/lib -lXext -lX11 -ldl -lGLU -lpthread

ただし

But

  • $ODE_PATH : ODE をインストールしたディレクトリ. $ODE_PATH : Directory which installed ODE.

compile.sh スクリプトを使う場合

When using compile.sh script

../../bin/compile.sh -ode OPTION FILE_NAME

OPTION:

  • -eig : Eigen を使う. -eig : Use Eigen.
  • -eg : Shogun を使う. -eg : Use Shogun.

実行 Execution

  • ウィンドウで: With window:
    • Ctrl+X : 終了 Ctrl+X : End
    • Ctrl+W : フレームの書き出し (frame ディレクトリを作成しておく必要あり) Ctrl+W : Writing of frame (It is necessary to create frame directory)
    • Ctrl+T : テクスチャを描画しない (グラフィックアクセラレータの性能が悪い場合に) Ctrl+T : Do not draw texture (When performance of graphic accelerator is bad)
    • Ctrl+S : 影を描画しない Ctrl+S : Do not draw shadow
    • Ctrl+P : 一時停止・再開 Ctrl+P: Suspension, restart
  • コマンドラインオプション: command-line optional:
    • "-pause" == Ctrl+P
    • "-notex" == Ctrl+T
    • "-noshadow" == Ctrl+S

ロボットモデル Robot model

ロボットアームRM3: 3リンクロボットアーム Robot arm RM3: 3 link robot arm

  • 外観 Appearance
    arm01.png
    arm02.png
  • 仕様 Specification
    robot-arm.png
    click to zoom in
  • ロボットフィンガRF1: 1リンクロボットフィンガ Robot finger RF1: 1 link robot finger

    This text is replaced by the Flash movie.

    トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
    Last-modified: 2016-06-06 (月) 18:00:06 (292d)