Quantcast
Channel: demura.net
Viewing all 757 articles
Browse latest View live

物理エンジンODEで学ぶC言語2017[Step1:物体の描画]

$
0
0
step1の実行画面

step1の実行画面

 

物理エンジンODEを使い,ゲームを作りながらC言語をマスターすることを目指して連載します。ODEのバージョンは0.13に対応しています。なお、KITロボティクス学科の講義「コンピュータ工学Ⅰ」と連動しており、昨年度から学習の進んだアドバンストコース向けです。我こそはと思う学生は是非、チャレンジしてください。

今回は何もなかった仮想空間に物体を表示させてみましょう.ODEではいろいろな形状がサポートされています.ここではその中でも使い方が最も簡単な球を表示させます.

/* step1 球の表示 */
#include "dm1.h"

dMatrix3 R;                    // ODEの3x3行列の型 回転行列(姿勢)
double r = 0.2;                // 半径 [m]
double p[3] = {0.0, 0.0, 1.0}; // 位置(x,y,z)[m]
double p2[3] = {0.0, 1.0, 1.0}; // 位置(x,y,z)[m]
double sides[3] ={0.1, 0.2, 0.3}; // サイズ(x,y,z)[m]

void simLoop(int pause)        /***  シミュレーションループ ***/
{
  dsSetColor(1.0, 0.0, 0.0);    // 赤色の設定(赤成分,緑成分,青成分)
  dsDrawSphere(p,R,r);         // 球の描画

  dsSetColor(0.0, 0.0, 1.0);
  dsDrawBox(p2, R, sides);    // 直方体の描画
}

int main()         /*** main関数 ***/
{
  dmLoop(800, 600, simLoop); // シミュレーションループ ウインドウの幅,高
  return 0;
}

まず,2行目のdm1.hはODEをより簡単に使うためのヘッダーファイルです.Step1ではまだ説明しません.

一般的に物体を3次元空間上に表示させるためには,物体の位置と姿勢を決める必要があります.ODEでは姿勢を回転行列とよばれる行列で表しています.その行列の要素を格納するのが配列R[12]です.回転行列は3×3の行列なので,1次元配列では要素数が9個で十分ですが,ODEでは高速化のために要素数12個の配列を用意します.配列の4, 8, 12番目の様子は0になっています.なお,R[12]には謎のヘッダファイルdm1.hの中で単位行列が設定されています.

また,位置は要素数3個のdouble型の配列p[3]に格納しています.位置のx座標(手前方向)を表す変数pの1番目の要素p[0]には0.0[m],y座標(右方向), z座標(高さ方向)を表すp[1], p[2]には0.0[m], 1.0[m]が設定されています.座標系は右手系です。上の図では中心から赤いピラミッドの方向がx軸の正,青いピラミッドの方向がy軸の正,上空方向がz軸の正です.ODEでは単位系はSI単位系で,長さはm,質量はkg,力はNとなります.

ソースコードのなかほどにあるsimLoop関数にシミュレーションでやりたいことを書きます.
12行目のdsSetColor()は色を設定する関数です.引数は光の3原色の値を3個取り,1番目は赤,2番目は緑,3番目は青成分で0以上1以下の値となります.ちなみに,全部0だと黒,全部1.0だと白です.
13行目は,球を表示したいのでdsDrawSphere関数を使って,位置p,姿勢R, 半径rの球を描画しています.なお、このソースコードだけではわかりませんが、simLoop関数はdmLoop関数の中で毎回呼び出されています。
同様にして15行目で青色を設定し、16行目で直方体を描画しています。

今回はこれで終わりです.簡単でしたね.なお,この説明でわからない場合は,わからない部分をコメントに書いて頂けると補足説明します.

  • 演習
    1. step1-160525.zipをダウンロードし,実行してください.
    2. 手順
      • ode-0.13がインストールされていなかったらこの説明に従いインストールする
      • ダウンロードしたファイルをc:\ode-0.13\myprogの中に保存する.デスクトップではなく、このフォルダに保存しないと失敗するので注意.
      • そこで解凍する.c:\ode-0.13\myprog\step1というフォルダが作られます.
      • c:\ode-0.13\myprog\step1\step1.cbpをダブルクリックしてcodeblocksを起動しビルド・実行する.ダブルクリックするファイルの拡張子はcbpです.間違ってcppをダブルクリックしないように!
  • 問題
    1. Prob.1  球の位置と大きさを変更してみましょう.
      • プロトタイプ宣言
        • void dsDrawSphere(const double p[3], const double R[12],  double r)
      • 引数p[3]は位置,R[12]は姿勢,rは半径.
      • ヒント
        • プロトタイプ宣言では仮引数は宣言していますが,呼び出す(使う)ときは宣言してはいけません.ソースコードsimLoop内のdsDrawSphereの使い方を参考にしてください.また,姿勢を表す回転行列Rは見えないところで単位行列に初期化しています.現時点では配列の各要素に値を代入する必要はないので配列名Rを引数として使ってください.
    2. Prob.2 直方体の位置と大きさを変更してみよう.
      • プロトタイプ宣言
        • void dsDrawBox(const double p[3], const double R[12], const double sides[3])
      • 上は関数のプロトタイプ宣言の形式なので,呼び出すときはconst doubleなどの型名を入れてはいけません.引数が配列の場合は,サンプルプログラムのように配列名だけを入れてください.
        例 dsDrawBox(p, R, sides);  // 呼び出す場合は配列名だけ
      • 1, 2番目の引数はdsDrawSphereのときと同じです.3番目の引数は直方体のx,y,z方向のサイズ[m]が入っている要素数3個の配列です.位置を表す配列pと同じように初期化すれば大丈夫です.
      • なお, doubleの前にあるconstは値を変えてはいけないという意味です。円柱を表示させてください
    3. Prob. 3 円柱を表示させましょう.
      • プロトタイプ宣言
        • void dsDrawCylinder(const double p[3], const double R[12],  double l, double r );
      • ここで,lは長さ,rは半径です.
    4. Prob. 4 カプセルを表示させてください.
      • プロトタイプ宣言
        • void dsDrawCapsule(const double  p[3], const double R[12], double l,  float r );
    5. Prob.5  Prob.3で制作した球の色を黄色に替えよう
      • プロトタイプ宣言
        • void dsSetColor(float r, float g, float b)
          r, g, bは光の3原色の赤、緑、青成分。値は0以上1以下のfloat型。例えば、緑にしたかったらrとbは0.0、gには1.0を代入する。

以上


JETSON TX2: DIGITS5.0とCaffeを入れる

$
0
0

JETSON TX2: DIGITS5.0とCaffeを入れたときのメモ

  • DIGITSのインストール
    • ソースから次のインストールする。https://github.com/NVIDIA/DIGITS/blob/master/docs/BuildDigits.md
    • 依存関係
      • sudo apt-get install –no-install-recommends git graphviz python-dev python-flask python-flaskext.wtf python-gevent python-h5py python-numpy python-pil python-pip python-protobuf python-scipy
    • 次の項目の「Caffeのインストール」を実施する。
    •  ソースのダウンロード
      • DIGITS_ROOT=~/digits
      • git clone https://github.com/NVIDIA/DIGITS.git $DIGITS_ROOT
    • Pythonパッケージ
      • sudo pip install -r $DIGITS_ROOT/requirements.txt
      • sudo pip install -e $DIGITS_ROOT
    • サーバーのスタート
      • ./digits-devserver
    • ウェブブラウザを開き、次のURLを入力する
      • http://localhost:5000/
    • さあ、早速使ってみましょう。ここをクリック。
    • 終わり
  • Caffeのインストール
    • 依存関係
      • sudo apt-get install –no-install-recommends build-essential cmake git gfortran libatlas-base-dev libboost-filesystem-dev libboost-python-dev libboost-system-dev libboost-thread-dev libgflags-dev libgoogle-glog-dev libhdf5-serial-dev libleveldb-dev liblmdb-dev libopencv-dev libprotobuf-dev libsnappy-dev protobuf-compiler python-all-dev python-dev python-h5py python-matplotlib python-numpy python-opencv python-pil python-pip python-protobuf python-scipy python-skimage python-sklearn
    • ソースコードのダウンロード
      • export CAFFE_ROOT=~/caffe
      • git clone https://github.com/NVIDIA/caffe.git $CAFFE_ROOT
    • Pythonパッケージのインストール
      • cat $CAFFE_ROOT/python/requirements.txt | xargs -n1 sudo pip install
    • ビルド
      • cd $CAFFE_ROOT
      • mkdir build
      • cd build
      • cmake ..
      • make –jobs=4

 

 

JETSON TX2: JetPack3.0のインストール

$
0
0

Jetson TX2へJetPack3.0をインストールしたときのメモ。TX1にインストールしたときとほぼ同じ。キャプチャ画面はTX1インストール時のものも利用しているので、TX1とあったらTX2と読み替えてください。

ホストPC環境

  • ThinkPad T450
  • CPU: Intel i7-5500U
  • GPU: nvidia 940m, moemory 1GB
  • xubunut14.04.5
  • Kernel 4.4.0-66-generic
  • gcc/g++ 4.8.4

NVIDIA EMBEDDED COMPUTINGのウェブサイトへ行き、下の[DOWNLOAD]をクリックする。

上から2つのTitle [JetPack]をクリック

DOWNLOADSの下のUbuntu [64.bit]をクリックする。

Embedded Developer Programのメンバーにならないとダウンロードできないので、未加入の場合は[Join now]に必要事項を入力してなる。既にメンバーの場合は、右の[Log in]からログインする。ログインするとダウンロードが可能になるのでダウンロードする。JetPack-L4T-3.0-linux-x64.run

ターミナル(端末)を開き、ダウンロード先へ移動し以下のコマンドを実行すると次のJetPack L4Tのウインドウが開く。

  • chmod +x JetPack-L4T-3.0-linux-x64.run
  • ./JetPack-L4T-3.0-linux-x64.run

実行すると下のWarningが出るが問題ないので、okayをクリック。

下のイントーラーウインドウがでるのでNextをクリック。

Nextをクリック。

Jetson TX1 Developer Kit (64bit) and Ubuntu Hostを選び、Nextをクリック。


管理者のパスワードを入力し、「認証する」クリック。

Fullを選択し、下の[Automatically resolve dependency conficts]にチェックを入れ、Nextをクリック。

注:ろ

ライセンスの同意を聞かれるので、Accept Allにチェックを入れて、Acceptをクリック。

 

Important Noteウインドウが開く。端末にメッセージが表示されるかもしれないので、注意を払っておく。OKをクリック。

インストールが始まり、インストールが終わるとCompletedと表示されるので、Nextをクリックする。

Jetsonとホストコンピュータの接続を聞かれるので、あっている方を選択し、Nextをクリック。

ネットワークのインタフェースを選択し、Nextをクリック。

インストール後の処理に移る。Nextをクリック。

Post Installationウインドウが開き、下の画面で処理が一度停止する。
1.  Jetsonの電源を切る。ACアダプタから給電している場合は、ACアダプタを抜く。
2. PCとJetsonをUSBケーブルで接続する。その際、Jetson側はUSB Micro-Bコネクタに接続する。
3. Jetsonの電源を入れる。
4. POWERボタンを押して放す。RECOVERYボタンを押しっぱなしにしながら、RESETボタンを押して放す。その2秒後にRECOVERYボタンを放す。
5. Jetsonがリカバリモードになったら、ターミナルでlsusbコマンドを実行し、NVIDIA Corpと表示されていれば成功。失敗した場合は再度、1から5までの作業をやり直す。
成功した場合は、Post Installationウインドウを選択して、エンターキーを押す。

mntウインドウが開く。

bootloaderウインドウが開く。

Finished Flashing OS. Determing the IP address of Target ..と表示され処理が停止されたままの場合はインストールを止めて./JetPack-L4T-3.0-linux-x64.runを再度実行する。先ほどと違い、Component Managerで下図のようにFullではなくCustomを選択し、Flash OS Image to Targetをno actionに変更する。そうするとFlash OSの作業はスキップする。

作業が成功すると以下のウインドウが開くので、JetsonのIPアドレス、ユーザ名、パスワードを入力する。IPアドレスはターミナルを開き、ifconfigコマンドで調べる。ユーザ名、パスワードはJetson側で登録したものを使う。Jetsonで新しくアドミニストレータアカウントを作るとログインできない場合がある。その場合は、/etc/groupのvideoにそのユーザアカウント名を追加するとログインできるようになる。Nextをクリック。

なお、ユーザ名ubuntuは事前に登録されているので、User NameとPasswordにubuntuを入れても良い。

Nextをクリック。

以下の画面になったら、Jetsonへのインストールが終わりなのでエンターキーを押す。

インストール作業がすべて終了すると次の画面になりFinishを押し、作業を終了する。

インストールがうまくいったかCUDAのサンプルプログラムを動かしてみる。ターミナルを開き、以下のコマンドを実行する。図のようなウインドウが開いたら成功。

  • cd  NVIDIA_CUDA-8.0_Samples/5_Simulations/smokeParticles
  • ./smokeParticles

 

 

お疲れ様!

JETSON TX2: Tensorflow-1.1.0のインストール

$
0
0

JETSON TX2にtensorflow1.1.0をインストールしたときのメモ。JetsonHacksの”TensorFlow on NVIDIA Jetson TX2 Development Kit“に従ってインストールしたがPrerequisitesでBazelのインストールでエラーになった。以下の記事を参考にインストールした。なお、python2.7を利用した。

私の環境では以下のコマンドを実行したところ

  • sudo  pip install ./tensorflow-1.1.0-cp27-cp27mu-linu2017-05-07x_aarch64.whl

次のエラーが出た。

  • “tensorflow-1.1.0-cp27-cp27mu-linux_aarch64.whl is not a supported wheel on this platform.”

以下のサイトでpipのバージョン問題だとわかり、サイトの説明に従いpython2.7用のpipをインストールして問題を解決した。

  • https://stackoverflow.com/questions/33622613/tensorflow-installation-error-not-a-supported-wheel-on-this-platform
  • Download get-pip.py from https://bootstrap.pypa.io/get-pip.py
  • sudo python2.7 get-pip.py
  • sudo pip install tensorflow-1.1.0-cp27-cp27mu-linux_aarch64.whl

終わり

保護中: C言語オンライン講座

$
0
0

このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。

物理エンジンODEで学ぶC言語2017 [Step2:switch文]キーボード操作

$
0
0
step3サンプルプログラムの実行画面

step2サンプルプログラムの実行画面

今回は、switch文を使ったキー処理の方法を学びます.キーボード入力の処理にswitch文はうってつけです。 ゲームではキーボード入力によりレーザービームを発射したり,車を操縦しますね.switch文を使って,キーボードからのキー入力を処理する方法を学びます.

  • switch文とキー処理

新しく登場したのが11行目のcommand関数です.これは,キーボードからのキー入力を引数cmdとして受け取ります.このサンプルプログラムではswitch文を使いキー入力の値に応じて分岐させ違う処理をさせています.zが入力されると初期位置のz成分を0.1m増加させます.つまり,zキーを押すたびに直方体全体が上空へ上がっていきます.その下のbreak文は忘れないでください.忘れるとdefaultに対応する21行目の文を実行し常にInput z keyと表示されてしまいます.

その他のキーを入力するとdefaultにある”Input z key”という文字列がコンソール画面に表示されます. なお、switch文の変わりにif文でもできますが、キー入力が増え分岐が多くなるとswitch文の方がすっきりした読みやすいプログラムを書けます。

  • 乱 数

ODEとは関係ありませんがゲームやシミュレータでは乱数も活躍します.乱数を使う場合は”stdlib.h”をインクルードします.ここではtime()関数も使っているので”time.h”もインクルードしています.

乱数を使用する場合は、まず,main関数の42行目にあるように乱数を初期化します.そのためにvoid srand(unsigned seed)関数を使います。引数seedは乱数を発生させる種を入れます.それが同じ値の場合は,常に同じ乱数系列が発生します.srand(time(NULL))は実行時に乱数の種を変更する一般的な方法です. ちなみに、time(NULL)は万国標準時1970年1月1日からの経過秒数です。大きな数値になるのでパット見意味がわからりづらいですね.

実際に乱数を発生させているのがsimLoop関数の30行目のrand関数です.rand関数のプロトタイプ宣言はint rand(void)なので引数は取らず,int型の値を返します.RAND_MAXは乱数の最大値なので,30行目は0以上1以下の乱数を発生させ,それを赤成分の値に代入します.なお,rand()とRAND_MAXの割り算をするとint型になり小数点以下が切り捨てられるのでfloat型にキャスト(型変換)することを忘れないようにしましょう.これによって,表示されている直方体(以下ボックスと表記)の赤成分の色だけが変わることになります.

今回は2つのことを学びました.特に乱数はゲームで使うと非常に面白いゲームになるのでしっかり覚えておきましょう.

でむ

/* step2 キー入力 switch文 */
#include "dm2.h"
#include <time.h>
#include <stdlib.h>

// Rは回転行列の各要素が格納される配列. 4, 8, 12番目の要素は高速化のために常に0
double R[12] ={1,0,0,0, 0,1,0,0, 0,0,1,0};
double p[3] = {0.0, 0.0, 0.05};   // 重心の位置
double p[3] = {0.0, 0.0, 0.05};   // 位置(x,y,z)[m]
double sides[3] = {0.1, 0.1, 0.1}; // 直方体のサイズ(x, y, z)[m]
double start_x = 0.0, start_y = 0.0, start_z = 0.0; // 初期位置

void command(int cmd)
{
    float xyz[3], hpr[3];
    switch (cmd) {
        case 'z':
            start_z += 0.1;
            break;
        default:
            printf("Input z key \n");
    }
}

void simLoop(int pause)        /***  シミュレーションループ ***/
{
  int i, j, num = 11;          // 直方体の数
  static float red = 0.0, green = 0.0, blue = 0.0; // 赤,緑,青成分

  for (i = 0; i < num; i++) {
      for (j = 0; j < num; j++) {
        red = (float) rand()/RAND_MAX;   // 赤成分を乱数で決定
        dsSetColor(red, green, blue);    // 色の設定
        p[0] = start_x;                  // 位置のx成分
        p[1] = i * 0.2 - 1.0  + start_y; // 位置のy成分
        p[2] = j * 0.2 + 0.05 + start_z; // 位置のz成分
        dsDrawBox(p,R,sides); // 直方体の表示
      }
  }
}

int main()         /*** main関数 ***/
{
  srand(time(NULL)); // 乱数の初期化
  dmLoop(800, 600, simLoop, command);  // ウインドウの横,縦,シミュレーション関数,コマンド関数
 return 0;
}

演習

  1. step2-160608.zipをダウンロードして実行しよう.
  2. jキーを押すと右,fキーを押すと左にボックス全体が移動するようにしよう.
  3. 3行(jの値が2)、4列(iの値が3)目のボックスだけをキー操作でx, y, z軸の正負方向へ移動できるようにしよう.つまり,6個のキーを割り当てる必要があります.simLoop関数の中でif文を使う必要があります.
  4. まず、ボックスを全て白色に変更し,乱数を使い1つのボックスだけ黒色に描画するプログラムを書こう.
  5. まず、ボックスを全て白にし、数字0を黒いブロックを複数使い電光掲示板のように表示するプログラムを書こう.
  6. [発展問題」 まず、ボックスを全て白にし、9から0までの数字を黒いブロックを複数使いカウントダウン表示する電光掲示板を作りましょう。0から9までの数字を表示する部分はそれぞれ関数にすること。

物理エンジンODEで学ぶC言語2017 [STEP3:関数]動力学計算

$
0
0
落下する赤い球

落下する赤い球

ODEで学ぶC言語のStep3です.今回は私がODEのAPIを元に作成した関数を使い,赤い球を落下させるプログラムを説明します.

今までのプログラムでは描画だけでしたが,今回からシミュレーションやゲームを作るために必要な動力学計算や衝突検出計算も含んでいます.サンプルプログラムとしては,物理シミュレーションで最も簡単な物体の落下を取り上げます.C言語などのプログラミングの教科書では初めの例題はHello Worldを表示する例が定番です。ここではHello Worldの物理シミュレーション版を紹介します.

 

  • API

    ここでは簡単にするためにODEのAPIを元に,超簡単なAPIを作成しました.ただし、ODEのAPIのように細かいことはできません。

    • void dmInit();
      シミュレーションを初期化します.
    • void dmCreateSphere(dmObject *obj, double p[3], double R[12], double m, double r, double color[3]);
      球を作成します.引数のp[3]は位置(x,y,z)[m],R[12]は姿勢(回転行列), mは質量[kg],rは半径[m],color[3]は色(赤,緑,青各成分、値は0以上1以下)です.
    • void dmSimStep();
      シミュレーションを1ステップ進めます.
    • dmDraw(MyObject obj);
      引数のオブジェクトobjを描画する.
  • ソースコード
      • 次に、詳しいコメントのついたソースコードを以下に示します。main関数から読んでください。
    /* step3 リンゴ(林檎)の落下  */
    #include "dm3.h"
    
    dmObject apple;  // リンゴ
    
    void simLoop(int pause)           /***  シミュレーションループ ***/
    {
        dmSimStep(); // シミュレーションを1ステップ進める
        dmDraw(apple);   // リンゴの描画
    }
    
    int main()   /*** main関数 ***/
    {
        double p1[3] = {0.0, 0.0, 2.0}; // 位置 [m]
        double R[12] = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // 姿勢(回転行列)
    
        double red[3]    = {1.0, 0.0, 0.0}; // 赤色
        double r = 0.2, m = 1.0;  // 半径[m],質量[kg]
    
        dmInit(); // 初期化
        dmCreateSphere(&apple, p1, R, m, r, red); // 球の作成
        dmLoop(800, 600, simLoop, NULL);  // ウインドウの幅,高, ループ関数,コマンド関数
        dmClose(); // 終了処理
    
        return 0;
    }
    • これは赤い玉の自由落下のプログラムです。まず、dmInit()でシミュレーションを初期化します。
    • 次に物体を作ります.球を作るAPIはdmCreateSphere()です.
    • 物体の生成が終わったら、次はシミュレーションを1ステップ進めます。dmLoop()の中身はwhileループになっていて、繰り返しsimLoop関数が呼び出しています。dmLoop()の一番最後の引数がNULLになっているのは、このサンプルプログラムではキー操作可能なcommand関数がないからです。前回の例のようにcommand関数がある場合はNULLの代わりにcommandを入れてください。
    • お次は物体の描画です.dmDraw(apple)で落下する球を表示しています。dmDraw()の引数は表示したい物体をいれてください。
    • 最後にシミュレーションをdmClose()で終了します.なお、小文字のdmで始まる関数は私がこの講義用にODEのAPI(application interface)を元に作成したものです.
  • ホームワーク
    1. step3-160615.zipをダウンロードして実行しよう!
    2. 次のAPIを使い青いボックスを位置p[3]={0.0, 1.0, 2.0}に作成し,落下させるプログラムを作ってください.
      • void dmCreateBox(dmObject *obj, double p[3], double R[12], double m, double side[3],  double color[3]);
      • 物体 obj, 位置 p[3],  姿勢(回転行列)R[12],  質量 m, サイズ(x,y,z) side[3], 色 color[3]
      • なお、回転行列は3×3行列ですが、ODEでは高速化のために3×4行列として各行の最後に0を追加しています。
    3. 今度は緑色の円柱を位置(0.0, -1.0, 2.0)に作成し,落下させなさい.
      • void dmCreateCylinder(dmObject *obj, double p[3], double R[12], double m, double r, double l, double color[3]);
      • 物体 obj, 位置 p[3],  姿勢 R[12],  サイズ sides[3], 半径 r, 長さ l, 質量 m, 色 color[3]
    4. 最後に,黄色のカプセルを位置(-1, 0, 2)に作成し,落下させなさい.
      • dBodyID  dmCreateCapsule(dmObject *obj, double p[3], double R[12], double m, double r, double l, double color[3]);
      • 物体 obj, 位置 p[3],  姿勢 R[12],  サイズ sides[3], 半径 r, 長さ l, 質量 m, 色 color[3]

 

物理エ物理エンジンODEで学ぶC言語2017 [STEP5:構造体]力とトルクの与え方

$
0
0

エアーホッケー風ゲームを作ろう![/caption]

物理エンジンで学ぶC言語のStep4です.今回は構造体と物体へ力やトルクを加える方法,さらにシミュレーションのリセット法などを学びます.構造体の概要については既にわかっているものとし,サンプルコードを示すことにより具体的な使い方を学びます.例として、エアーホッケー風のゲームを作り、最終的には対戦相手のAIプログラムを作ってみよう。

○ 構造体

配列では同じ型しかまとめることができませんでしたが,構造体では違う型をまとめて扱うことができるのでシミュレーションなど物体に多くの属性がある場合に便利です.このサンプルプログラムでは物体をdmObjectという構造体で次のように表しています.dm4.hの16行目に定義しています.

typedef struct{
    dBodyID body; // ボディのID
    dGeomID geom; // ジオメトリのID
    const double *p; // x, y, z [m]
    const double *R;   // 回転行列 要素数4x3
    double m; // 質量 [kg]
    double r,l; // 半径 [m], 長さ [m]
    const double *side; // サイズ x,y,z
    const double *color; // 色 r,g,b
} dmObject;

また、STEP3まではdmLoop関数の引数にstep関数やcommand関数を渡していましたが、ここでは関数のポインタを要素に持つ構造体dmFunctionsを定義します。今まではdmLoopに渡す関数が増えるとその数だけ引数が多くなってしまいましたが、この構造体だけを引数として渡せば良いのでプログラムがすっきりします。

typedef struct
{
    void (*start)();            // 初期化関数
    void (*step) (int pause);	// ステップ関数
    void (*command) (int cmd);	// キー関数
} dmFunctions;

 衝突検出だけ働く物体の作り方

物理エンジンODEでは物体は2つの属性からできています。一つは動力学計算の対象となるbody(ボディ)、もう一つは衝突検出の対象となるgeometry(ジオメトリ)です。ゲームでは動かない建物や壁など動力学計算を働かせる必要のない物体は衝突検出計算だけを適応すれば計算処理が軽くて済みます。ここでは、衝突検出計算だけ働く物体を作るAPIを紹介します。

  • void dmCreateBoxStatic(dmObject *obj, double p[3], double R[12], double m, double side[3], double color[3]);

衝突検出計算しか作用しない物体を作成します.dmCreateBoxの後にStatic(静的)を付け加えたAPI名です。引数のp[3]は位置(x,y,z)[m],R[12]は姿勢(回転行列), mは質量[kg],sideは直方体の各辺の長さ[m],color[3]は色(赤,緑,青各成分、値は0以上1以下)です.同様なAPIとして、dmCreateSphereStatic, dmCreateCylinderStatic, dmCreateCapsuleStaticがあります。

姿勢の変更

物体の姿勢を変更するためには次のAPIを使い回転行列Rの値を変更します.ここで,Rは回転行列が格納されている配列へのポインタ,ax, ay, axは回転軸ベクトル.angleは回転角度となります.なお,dだけで始まるAPIはODEのAPIです.

  • dRFromAxisAndAngle(double R[12], double  ax, doulbe  ay, double  az, double angle);

○ 力,トルクの加え方

  • void dmAddForce(dmObject *obj, double fx, double fy, double fz)
    • 物体objの重心に力(fx,fy,fz)を加える
  • void dmAddTorque(dmObject *obj, double fx, double fy, double fz)
    • 物体objの重心にトルク(fx, fy, fz)を加える.fx,fy,fzはそれぞれx, y, z軸まわりのトルク

○ 高速なシミュレーション

前回のサンプルではシミュレーションのステップ関数としてdmWorldStep()を使いましたが,ここではより高速なdmWorldQuickStep()を使います.ただし,dmWorldStep()と比較して精度が悪くなります.

○ シミュレーションのリセット

rまたはRキーを押すと,resetSim関数が呼ばれてシミュレーションがリセットされます.resetSimの中身はシミュレーションループが1回以上呼び出されたときにdmInit関数を呼び出して初期化し,物体を再度生成しています.

○ ソースコード

/* step4 ブロック崩し 2016-06-22  */
/* step4 エアーホッケー風ゲーム 2017-06-30  */
#include "dm4.h"

#define FENCE_NUM 6
static int STEPS = 0;   // シミュレーションのステップ数
double red[3]    = {1.3, 0.0, 0.0}; // 赤色
double yellow[3] = {1.3, 1.3, 0.0}; // 黄色
double green[3]  = {0.0, 0.8, 0.0}; // 緑色

dmObject ball, field, fence[FENCE_NUM], bar, bar_ai; // ドミノ, フィールド, 柵
dmFunctions dmf; // 描画関数の構造体

/***  シミュレーションループ ***/
void simLoop(int pause) {
    int i;

    if (STEPS == 1) {
        dmAddForce(&ball, 0.8, 0, 0); // ボールの落下速度を決める
    }
    dmWorldQuickStep(); // シミュレーションを1ステップ進める(高速版)

    dmDraw(&ball);
    dmDraw(&bar);
    dmDraw(&bar_ai);
    dmDraw(&field);
    for (i =0; i < FENCE_NUM; i++) {
        dmDraw(&fence[i]);
    }

    STEPS++;
}

void resetSim(int n) {
    double m = 0.1; // 質量
    double side[3] = {0.2, 0.05, 0.5}; // サイズ
    double R[12] = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // 姿勢
    double R_BAR[12] = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // 姿勢
    double R_BAR_AI[12] = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // 姿勢
    // double ball_pos[3]={-0.90, 0.25, 0.7}, ball_r = 0.03, ball_m = 0.1; // ボールの位置、半径、質量
    double ball_pos[3]= {-0.5, 0, 0.525}, ball_r = 0.03, ball_m = 0.1; // ボールの位置、半径、質量
    double bar_pos[3]= {-0.08, 0, 0.5}, bar_side[3] = {0.01, 0.1, 0.1}, bar_m = 0.1; // ボールの位置、半径、質量
    double bar_ai_pos[3]= {-0.9, 0, 0.6};
    double field_pos[3]= {-0.5, 0, 0.5}, field_side[3] = {1, 1, 0.01}, field_m; // スロープの位置、サイズ, 質量
    double fence_pos[FENCE_NUM][3] = {{-1.0, 0.3125, 0.6}, {-1.0,-0.3125, 0.6},{0.0, 0.3125, 0.6},{0.0,-0.3125, 0.6},{-0.5, -0.5, 0.6},{-0.5, 0.5, 0.6}};
    double fence_side[FENCE_NUM][3] = {{0.05, 0.425, 0.1}, {0.05, 0.425, 0.1},{0.05, 0.425, 0.1},
        {0.05, 0.425, 0.1},{1.0, 0.05, 0.1}, {1.0, 0.05, 0.1}
    };
    double fence_m[3] = {0.1, 0.1, 0.1};
    double slope_R[12]= {1,0,0,0, 0,1,0,0, 0,0,0};
    int i;

    STEPS = 0;

    // シミュレーションの終了
    if (STEPS != 0) {
        dmClose();
    }

    dmInit(); // 初期化

    //  ボールの生成
    dmCreateSphere(&ball, ball_pos, R, ball_m, ball_r, red);

    // バーの生成
    dRFromAxisAndAngle(R_BAR,0,0,1,M_PI/6);
    dRFromAxisAndAngle(R_BAR_AI,0,0,1,0);
    dmCreateBoxStatic(&bar, bar_pos, R_BAR, bar_m, bar_side, yellow);
    dmCreateBoxStatic(&bar_ai, bar_ai_pos, R_BAR_AI, bar_m, bar_side, red);

    // フィールドの生成
    dmCreateBoxStatic(&field, field_pos, R, field_m, field_side, green);
    for (i =0; i < FENCE_NUM; i++) {
        dmCreateBoxStatic(&fence[i], fence_pos[i], R, fence_m[i], fence_side[i], green);
    }
}

/*** キ―入力関数 ***/
void command(int cmd) {
    switch (cmd) {
    case 'r':
    case 'R':
        resetSim(0);
        break;
    default:
        printf("Input r, R, f, F key \n");
        break;
    }
}

/*** カメラの位置と姿勢設定 ***/
void setCamera() {
    float x =  -0.5, y = 0.0, z = 1.5;    // カメラの位置
    float roll = 0, pitch = -90, yaw = -180; // カメラの方向[°]
    dmSetCamera(x,y,z,roll,pitch,yaw);  // カメラの設定
}

/*** 描画用構造体の設定 ***/
void setDraw() {
    dmf.start       = &setCamera;
    dmf.step        = &simLoop;
    dmf.command = &command;
}

/*** main関数 ***/
int main() {
    resetSim(0); // シミュレーションのリセット
    setDraw();   // 描画関数の設定

    dmLoop(800, 600, &dmf);  // ウインドウの幅,高, ループ関数,コマンド関数
    dmClose(); // 終了

    return 0;
}

ホームワーク5

  1. step4-170630.zipをダウンロードして実行しよう!
  2. 黄色のバーをキーを押すと上下左右と姿勢を変化できるようにしよう。
    ヒント: 黄色のバーには動力学を適応させていないのでdGeomSetPosition(dGeomID geom, double x, double y, double z);を使って強制的に位置を移動させる。ここで、1番目の引数にはbar.geomを入れればよい。2から4番目の引数は、絶対座標系での位置のx, y, z成分。姿勢はdGeomSetPosition(dGeomID geom, const dMatrix3 R);を使う。2番目の引数は回転行列R。好きな姿勢のRを取得するにはdRFromAxisAndAngle(dMatrix3 R, dReal ax, dReal ay, dReal az, dReal angle);を使う。
  3. 一人で遊べるようにしよう!
  4. 対戦相手を自動で動きプレーできるようにAIプログラムを作ろう!
  以上

物理エンジンODEで学ぶC言語 [STEP5:終わり] ジョイントの生成と制御

$
0
0

 

STEP5: 玉突きロボット

 

ODEで学ぶC言語のStep5です.Step4でエアーホッケー風ゲームは終わりましたが、要望の多かったジョイントの使い方と制御を説明します。補講となります。

ジョイントは我々の周りでは、折畳み携帯のヒンジやドアの蝶番に相当します。小難しくいうと、2つのボディの位置や姿勢をある一定の関係に保つ拘束がジョイントとなのです。ODEではジョイントと拘束を同じ意味で使っています。

ODEのジョイント(関節)は2つのボディ(剛体,body)をつなげるものです。1つのジョイントで3個以上のボディをつなげることはできませんし,1個のボディだけをつなげることもできません.必ず2個のボディを1つのジョイントでつなげなければなりません.

また,ODEのジョイントは摩擦がありませんし,可動域を設定しないと+dInfinity(+無限大)から-dInfinity(-無限大)まで回転または移動します.角度は[rad]です.

 

  • ジョイントの使い方
  1. ***ジョイントの生成      dmJointCreate***()
  2. ***ジョイントとボディの結合  dJointAttach(dJointID, dBodyID, dBodyID)
  3. ***ジョイントの中心点を設定 dJointSet***Anchor()
  4. ***ジョイントの回転軸を設定 dJointSet***Axis()

上で***にはジョイントのタイプが入ります。タイプにはHinge(ヒンジ)、Slider(スライダー)があります。サンプルプログラムではヒンジジョイントと直動式のスライダージョイントを使います.

  • ジョイントのパラメータ設定
  1. 可動域の設定
    dJointSetHingeParam(dJointID, dParamLoStop, 可動域の下限);
    dJointSetHingeParam(dJointID, dParamHiStop, 可動域の上限);
  2. 目標角速度とそれを実現するための最大トルクの設定
    dJointSetHingeParam(dJointID, dParamVel, 目標角速度);

    dJointSetHingeParam(dJointID, dParamFMax, 最大トルク);

パラメータとしては、関節可動域の下限を示すdParamLoStop、上限を示すdParamHiStop、角速度(ヒンジジョイント)または速度(直動式関節)を示すdParamVel、最大トルクを示すdParaFMaxなどがあります。なお、ODEでは関節にモータが標準で組み込まれているので、dParamVelやdParaFMaxを指定すると関節が動きます。

ソースコード
少し長くなりますが,ソースコードを掲載します.このコードは今まで習った,キー操作関数,シミュレーションの再スタート,ボディへ力を加えるなどのほかに,ジョイントの生成と制御法など簡単なゲームやシミュレータを作るために必要なことは一通り入っています.

/* step5 */

#define START_X 0.0
#define START_Y 0.0
#define START_Z 0.1

dmObject torso, leg[2], ball;
static int STEPS = 0;      // シミュレーションのステップ数
double S_LENGTH  = 0.0;    // スライダー長
double H_ANGLE   = 0;      //ヒンジの角度

// ロボットの生成
void createMonoBot()
{
    int i;
    double l_leg = 0.75; // 長さ
    double m_leg = 1.0;  // 質量
    double r_leg[2] = {0.05, 0.03}; // 半径
    double m_torso = 100.0; // 胴体の質量
    double r_torso = 0.25;  // 胴体の半径
    double l_torso = 0.2;   // 胴体の高さ
    double r_ball = 0.11;   // ボールの半径
    double m_ball = 0.5;    // ボールの質量
    double p_ball[3] = {START_X, START_Y+2*l_leg+0.1, START_Z}; // ボールの位置
    double p_torso[3] = {START_X, START_Y, START_Z};  // 位置
    double p_leg[2][3] = {{START_X, START_Y+0.5*l_leg, START_Z},
        {START_X, START_Y+l_leg, START_Z}
    };
    double p_anchor[3] = {START_X, START_Y, START_Z};
    double R[12];   // 回転行列

    static double  red[3] = {1.0, 0.0, 0.0}; // 色
    static double  color_leg[2][3] = {{0.0, 0.0, 1.0},{1.3, 1.3, 1.3}};

    dRSetIdentity(R);  //回転行列を単位行列で初期化
    dmCreateSphere(&ball, p_ball,R,m_ball, r_ball, red); // ボールの生成
    dmCreateCylinder(&torso,p_torso,R,m_torso,r_torso,l_torso,red); // 胴体の生成

    dRFromAxisAndAngle(R, 1, 0, 0, M_PI/2);
    for (i = 0; i < 2; i++)
    {
        dmCreateCapsule(&leg[i],p_leg[i],R,m_leg,r_leg[i],l_leg,color_leg[i]); // 脚の生成
    }

    // ヒンジジョイント
    leg[0].joint = dmJointCreateHinge();
    dJointAttach(leg[0].joint, torso.body,leg[0].body);
    dJointSetHingeAnchor(leg[0].joint, p_anchor[0],p_anchor[1],p_anchor[2]);
    dJointSetHingeAxis(leg[0].joint, 0, 0, 1);

    // スライダージョイント
    leg[1].joint = dmJointCreateSlider();
    dJointAttach(leg[1].joint, leg[0].body,leg[1].body);
    dJointSetSliderAxis(leg[1].joint, 0, 1, 0);
    dJointSetSliderParam(leg[1].joint, dParamLoStop, -0.25);
    dJointSetSliderParam(leg[1].joint, dParamHiStop,  0.25);
}

// ヒンジジョイントの制御
static void controlHinge(dReal target)
{
    static dReal kp = 10.0, fmax = 1000;

    dReal tmp   = dJointGetHingeAngle(leg[0].joint);
    dReal diff  = target - tmp;
    if (diff >=   M_PI) diff -= 2.0 * M_PI; // diffが2πより小さく
    if (diff <= - M_PI) diff += 2.0 * M_PI; // diffが-2πより大きく
    dReal u     = kp * diff;

    dJointSetHingeParam(leg[0].joint, dParamVel,  u);
    dJointSetHingeParam(leg[0].joint, dParamFMax, fmax);
}

// スライダの制御 プログラム2.4
static void controlSlider(dReal target)
{
    static dReal kp   = 25.0;                       // 比例定数
    static dReal fmax = 1000;                        // 最大力[N]
    double tmp, u;

    tmp  = dJointGetSliderPosition(leg[1].joint);  // スライダの現在位置
    u    = kp * (target - tmp);                    // 残差
    dJointSetSliderParam(leg[1].joint, dParamVel,  u);
    dJointSetSliderParam(leg[1].joint, dParamFMax, fmax);
}

// シミュレーションのリセット
static void resetSim()
{
    STEPS    = 0;      // ステップ数の初期化
    H_ANGLE  = 0.0;    // ヒンジ角度の初期化
    S_LENGTH = 0.0;

    if (STEPS != 0) dmClose(); // シミュレーションの終了

    dmInit();  // シミュレーションの初期化
    createMonoBot();
}

// キー操作
void command(int cmd)
{
    switch (cmd)
    {
    case 'j':
        S_LENGTH =   0.25;
        break;
    case 'l':
        S_LENGTH = - 0.25;
        break;
    case 'i':
        H_ANGLE +=   0.25;
        if (H_ANGLE  >   M_PI) H_ANGLE  =  -M_PI;
        break;
    case 'm':
        H_ANGLE -=   0.25;
        if (H_ANGLE  <  -M_PI) H_ANGLE  =   M_PI;
        break;
    case 'r':
        resetSim();
        break;
    case 'a':
        dBodyAddForce(torso.body, 0, -500, 0);
        break;
    case 'w':
        dBodyAddForce(torso.body, -500, 0, 0);
        break;
    case 'd':
        dBodyAddForce(torso.body, 0,  500, 0);
        break;
    case 'x':
        dBodyAddForce(torso.body,  500, 0, 0);
        break;
    case 's':
        dBodySetLinearVel(torso.body,  0, 0, 0);
        dBodySetAngularVel(torso.body, 0, 0, 0);
        break;
    default :
        printf("key missed \n");
        break;
    }
}

void simLoop(int pause)           /***  シミュレーションループ ***/
{
    int i;
    int s = 1000;                   // 跳躍する周期(ステップ)

    if (!pause)
    {
        printf("STEPS=%d \n",STEPS++); //  ステップ数

        // スライダーの伸縮
        //if ((0 <= (STEPS%s)) && ((STEPS%s) <= 10)) S_LENGTH = 0.6;
        //else if ((11 <= (STEPS%s)) && ((STEPS%s) <= 15)) S_LENGTH = 0.0;

        controlSlider(S_LENGTH); // スライダージョイントの制御
        controlHinge(H_ANGLE);   // ヒンジジョイントの制御

        dmSimStep(); // シミュレーションを1ステップ進める
    }

    dmDraw(&ball); // ボールの描画
    // ロボットの描画
    dmDraw(&torso);   // 胴体の描画
    for (i = 0; i < 2; i++)dmDraw(&leg[i]); //脚の描画
    STEPS++;
}

int main()         /*** main関数 ***/
{
    dmInit(); // ODEの初期化
    resetSim();   // ロボットの生成
    dmLoop(800, 600, simLoop, command);  // シミュレーションループ ウインドウの幅,高
    dmClose();          // ODEの終了
    return 0;
}

ホームワーク

  • step5-170707.zipをダウンロードして実行してみましょう.
  • サンプルプログラムを改良してビリヤードをプレイするロボットを作りましょう.

Turtlebot3: 組み立て

$
0
0

Turtlebot3 Burgerの組み立てメモ。組み立てマニュアルがレゴのように図で説明しているのでとてもわかりやすい。中学生以上なら問題なく組み立てられる。ゆっくり作業したので所要時間約2時間。早い人なら1時間もあれば十分だろう。

なお、BurgerのボードコンピュータにはRaspberry Pi 3を使い、動輪の駆動にはRobotis社のサーボモータXL430-W250-T (WaffleはXM430-W210-R)を使っている。このサーボモータは無限回転できるが無負荷速度が61rpm(12.0V)なので、Burgerの最高速度は0.22m/sと遅い。この点がRoboCup@Homeで使う場合、問題になる。

ただ、安価(Burgerが約6万円、Waffleが22万円)と比較的安価なので、ROSの勉強や自律移動ロボットの教育に適していると思う。

 

 

Ubuntu16.04: Kinect V2の設定

$
0
0

Ubuntu16.04.2でKinect V2の設定したときのメモ

libfreenect2のインストール

  • cd
  • mkdir src
  • cd src
  • git clone https://github.com/OpenKinect/libfreenect2.git
  • cd libfreenect2
  • sudo apt-get install build-essential cmake pkg-config libusb-1.0-0-dev libturbojpeg libjpeg-turbo8-dev libglfw3-dev
  • mkdir build
  • cd build
  • cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/src/freenect2
  • cmake .. -Dfreenect2_DIR=$HOME/src/freenect2/lib/cmake/freenect2
  • make -j8
  • sudo make install
  • sudo cp ../platform/linux/udev/90-kinect2.rules /etc/udev/rules.d/
  • kinect v2をUSB3.0ポートに接続する
  • ./bin/Protonect

iai_kinect2のインストール

  • cd ~/catkin_ws/src/
  • git clone https://github.com/code-iai/iai_kinect2.git
  • cd iai_kinect2
  • rosdep install -r –from-paths .
  • cd ~/catkin_ws
  • catkin_make -DCMAKE_BUILD_TYPE=”Release”  -Dfreenect2_DIR=~/src/freenect2/lib/cmake/freenect2

ROSで確認

  • roslaunch kinect2_bridge kinect2_bridge.launch
  • クラウドビュアーで表示
    • rosrun kinect2_viewer kinect2_viewer kinect2 sd cloud
  • イメージビュアーで表示
    • rosrun kinect2_viewer kinect2_viewer kinect2 sd image

終わり

 

rosbagのイメージデータをyoloで物体検出

$
0
0

rosbagで保存したイメージデータをyoloで物体検出した作業のメモ。上と下の写真はつくばチャレンジ実験走行で探索対象を検出したときのスクリーンショット。マネキンもpersonと検出するので実験走行に使える。。。

環 境

  • Ubuntu16.04, ROS Kinetic, Cuda 8.0, OpenCV3.2

インストール

  • cd catkin_ws/src
  • git clone –recursive https://github.com/leggedrobotics/darknet_ros.git
  • cd ..
  • catkin_make -DCMAKE_BUILD_TYPE=Release

重みのダウンロード

  • cd catkin_ws/src/darknet_ros/darknet_ros/yolo_network_config/weights/
  • wget http://pjreddie.com/media/files/yolo-voc.weights
  • wget http://pjreddie.com/media/files/tiny-yolo-voc.weights
  • wget http://pjreddie.com/media/files/yolo.weights
  • wget http://pjreddie.com/media/files/tiny-yolo.weights
  • wget http://pjreddie.com/media/files/yolo9000.weights

設 定

  • モデルの変更
    • catkin_ws/src/darknet_ros/darknet_ros/launch/darknet_ros.launchの以下の行のyolo_voc.yamlを好きなネットワークモデル(つまり、yolo.yaml, tiny_yolo.yaml, yolo9000.yaml)に変更する。
    • <rosparam command=”load” ns=”darknet_ros” file=”$(find darknet_ros)/config/yolo_voc.yaml”/>
  • トピック名の変更
    • catkin_ws/src/darknet_ros/darknet_ros/config/ros.yamlのトピック名を必要があれば変更する。特にcamera_readingのトピック名は変更しなければならないと思う。私の場合はサブスクライバだけ次のように/image_rawに変更した。
    • subscribers:
      camera_reading:
      topic: /image_raw
      queue_size: 1

実行方法

  • roscore
  •  rosbagの再生
    • rosbag play   bagfile.bag
  • roslaunch darknet_ros darknet_ros.launch

終わり

ロボットプログラミングⅡ:Virtualbox5.1+Ubuntu16.04のインストール法

$
0
0

この記事は私が担当している講義ロボットプログラミングⅡ用です。

ここでは、Virtualbox5.1+Ubuntu16.04のインストール法を説明します。

○ VirtualBoxのインストール

(1) VirtualBoxのダウンロード

ここをクリックしてVirtualBox 5.1.28 for Windows hostsのx86/amd をダウンロードする。

vm-download

(2) Extention Packのダウンロード
ここをクリッしてVirtualBox 5.1.28 Oracle VM VirtualBox Extension をダウンロードする。

extention

(3) ダウンロードしたVirtualBox-5.1.28-117968-Win.exeファイルをダブルクリックすると以下のsetup画面になる。[Next]をクリック。

(4)  何もしないので、[Next]をクリック。

(5) 何も変更しないで、[Next]をクリック。

(6) Warning(警告)が出るが、このまま、[Yes]をクリック。

(7)  インストールの準備完了。[Install]をクリック。

(8) インストールが始まる。

もし、途中でウインドウが開き「このデバイスソフトウェアをインストールしますか?名前:Oracle corporation ユニバーサルシリアルパスコントローラ」などデバイスソフトウェアのインスト―ルを聞かれたら、全て「インストール」する。

(9) インストールが終わったので[Finish]をクリックすると、VirtualBoxが起動する。

○ 拡張パッケージのインストール

(1) USB2.0/3.0を使えるようにダウンロードしておいたExtention Packをインストールする.VirtualBoxマネージャーの

ファイル→環境設定→機能拡張

を選択。下図の赤枠部分をクリックして、ダウンロードしたOracle_VM_VirtualBox_Extension_Pack-5.1.28-117968.vbox-extpackを選択し,[OK]をクリックする.

(2) 質問のウインドウになるので,[インストール]をクリックする.

(3) VirtualBoxライセンスの画面になるので、スクロールバーを最後降ろし最後まで読み、[同意します]をクリック。
(4) 成功すると以下の画面いなるので、[OK]をクリック。

次のように拡張パッケージ名が表示されれば成功。[OK]をクリック。

○ 仮想ハードディスクファイルのダウンロードと解凍

(1)  Cドライブ直下に以下のフォルダを作成する

  • c:\education\VirtualBox

(2) 以下のサイトから次のファイルを(1)で作成したフォルダへダウンロードする。学内の場合は上、学外の場合は下のサイトからダウンロードすること。

○ 仮想マシンの登録と起動

(1) VirtualBoxマネージャ左上の[新規(N)]をクリックする。

vm1-welcome

(2) 仮想マシンの名前を[Ubuntu-16.04]、タイプを[Linux]、バージョンを[Ubuntu(64-bit)]に選び、「次へ」をクリック。Ubuntu(32-bit)だとインストールに失敗するのでUbuntu(64-bit)がない場合は下の注を参照。

注:ここで、Ubuntu (64-bit)がなくUbuntu(32-bit)しかない場合は、コントロールパネル」→「プログラム」→「プログラムと機能」の「Windowsの機能の有効化と無効化」をクリックし、下図のようにHyper-Vのチェックを外す。
hyper-v

(3) 仮想マシンに割り当てるメモリーサイズを、実メモリの半分にする。
私のマシンでは8192MB使えるので半分の4096MB割り当てた。
[次へ]をクリック。

(4) 「仮想ハードディスクを作成する」にチェックを入れ[作成]をクリック。

(5) ハードディスクのファイルタイプは「VDI」をチェックし、[次へ]をクリック。

(6) 物理ハードディスクにあるストレージは「可変サイズ」を選び[次へ]をクリック。

(7) ファイルの場所とサイズは先ほど作成したフォルダC:\education\VirtualBoxへファイル名をeagle.vdiとする。サイズは余裕を持って256GBにする。可変なので実際に使った分しかハードディスクは消費されない。ここで、標準の10GBだと授業で利用するソフトを全て入れることはできないので注意。[作成]をクリック。

 

Xubuntuのインストール準備

(1) VirtualBoxマネージャーの歯車のアイコン[設定]をクリック。

(2) 「Ubuntu-設定」ウインドウが開いたら、ストレージ→コントローラー:IDE 空をクリック。次に、属性→光学ドライブ IDEセカンダリマスターの横のCDアイコン(下図では赤で囲まれている)をクリックし、「仮想光学ディスクファイルを選択」を選ぶ。

 

(3) 先ほど、ダウンロードした「ubuntu-16.04.3-desktop-amd64.iso」を選び、[開く]をクリック。

(4)  設定の画面に戻るので[OK]をクリック

Ubuntuのインストール

(1) Ubuntuのインストール準備が整ったので、仮想マシンを起動する。virtual boxマネージャーの[起動]をクリック。

(2) 「Welcome」の画面になるので左枠一番下に隠れている「日本語」を選択して、[Ubuntuをインストール]をクリック。

(3) 「Ubuntuのインストール準備」の画面になるので、「Ubuntuのインストール中にアップデートをダウンロードする」を選択して、[続ける]をクリック。

(4) 「インストールの種類」の画面になる。仮想マシン上にインストールするので、「ディスクを削除してUbuntuをインストール」を選び[インストール]をクリックする。

(5) 「ディスクに変更を書き込みますか?」と聞かれるので[続ける]をクリック。

(6) 「どこに住んでいますか?」と聞かれるので、Tokyoのまま[続ける]をクリック。

(7) 「キーボードレイアウト」の画面になるので、自分のキーボードのレイアウトに合わせる。特殊なノートパソコン以外は標準で良い。[続ける]をクリック。

(8) 「あなたの情報を入力してください」と聞かれるので次のように入力する。この際、日本語は使わず、半角英数字を使うこと。

■ あなたの名前: ローマ字(英数半角)で苗字 名前
■ コンピュータの名前:b学籍番号
■ ユーザー名の入力: ローマ字(英数半角)で苗字
■ パスワード:好きなパスワードを入れること。忘れないようにどこかにメモをすること。忘れた場合は、こちらでもわからないので、インストールのやり直しになる。

[続ける]をクリック。

(9) 設定作業が終わるまで待つ。私の環境では約4分かかった。

(10) 「インストールが完了しました」の画面になるので、[今すぐ再起動する]をクリック。

(11) 下の画面になり、「Please remove the installation medium, then press Enter」と表示されるが、DVDは入れていないので、Enterキーを押すだけで良い。Enterキーを押す。

(12)  ログインする画面になるので、設定したパスワードを入力する。

次の画面になる。

(13) 左上の「コンピュータを検索する」ボタンを右マウスボタンをクリックして、検索までにterminalと入力すると下図のように端末アイコンが現れるので、選択して起動する。

下図のように背景が黒いウインドウが開く。開いたら終わり。なお、LinuxではこのTerminalにいろいろなコマンドを打ち込んで、アプリを実行する。

終わり

ロボットプログラミングⅡ:VirtualBox 5.1の設定

$
0
0

この記事は私が担当している講義ロボットプログラミングⅡ用です。

この記事では、快適に使うためにVirtualBox5.1の設定を行います。

○ VirtualBoxの設定

(1) VirtualBoxを起動し、「設定」をクリック。

set1

(2) 左欄の「システム」を選択し、「マザーボード」のタブをクリックし、下図のように設定する。メインメモリを実メモリの半分程度(私の場合は4096MB)にし、後の設定は変更しない。

(3) 「プロセッサー」のタブをクリックし、下図のようにCPUの個数を2、使用率制限を100%にする。

set3

(5) 左欄の「ディスプレイ」を選択し、「3Dアクセラレーションの3Dを有効化」に✔を入れ、[OK]をクリック。

(7) 左欄の「USB」を選択し,USB3.0コントローラーに✔を入れ、[OK]をクリック。

set5(8) 「起動」をクリックしてUbuntuをスタートさせる。

setup5

以上

 

 

 

 

 

ロボットプログラミングⅡ:ROS Kineticのインストール

$
0
0

私が担当している授業のロボットプログラミングⅡ用です.この記事はROS のオフィシャルウェブサイトの次の日本語記事を簡略化しています。詳しい説明は次のリンクをご覧ください。

———————————————————————————————-

以下の手順でROSをインストールしてください。Ubuntuをブートして、Firefoxを起動し、このページを開く。

1.準備

(1) 端末(ターミナル、terminal)を開いて、以下のコマンドをコピペして、Enterキーを押し実行する。パスワードを聞かれたら入力する。

  • sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

 (2)  同様にして以下のコマンドを実行する。

  • sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

2. インストール

(1)  以下のコマンドでパッケージをアップデートする。

  • sudo apt update

(2)  ROSのインストール

  • sudo apt install ros-kinetic-desktop-full

なお、sudo apt-get updateで次のように怒られる場合は、Ubuntuのネットワーク設定がうまくいっていない可能性があります。この記事を参考に設定してください。
SnapCrab_NoName_2015-10-15_17-25-11_No-00

3. 初期設定

(1)  以下のコマンドでrosdepを初期化する。1行目を入力したらEnterキーを押し、2行目を入力したらEnterキーを押す。rosdepはコンパイルを楽にするツール。

  • sudo rosdep init
  • rosdep update

(2) 環境設定。楽をするための設定。以下のコマンドを端末にコピペしてEnterキーを押す。1行ずつ実施する。

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

(3) rosinstall 。インストールが簡単になるツール。以下のコマンドでインストールする。

  • sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential

終わり


ロボットプログラミングⅡ:Ubuntu16.04のネットワーク設定

$
0
0

この記事は私が担当している講義ロボットプログラミングⅡ用です。

VirtualBox5.1にインストールしたUbuntu16.04でのネットワーク設定を説明します。

○ ネットワーク設定

(1) 画面左下の「システム設定」アイコンをクリック。

(2) 「システム設定」のウインドウが開くので、「ネットワーク」をクリックする。

(3) 「ネットワーク」ウインドウが下図のように起動する

proxy1

(4) 「有線」の下にある「ネットワークプロキシ」をクリックして選択

proxy2

 

(5) メソッド:「自動」、設定URLは大学で設定されているプロキシのアドレス(Windowsや情報処理サービスセンターを参照)にする。

proxy3

ネットワーク設定終わり。

○ Firefoxの設定
Google Chromeは標準で入っていないので、Firefoxを使用する。
(1)  画面左の「Firefoxウェブ・ブラウザ」アイコンをクリック。
(2) Firefoxの一番右上にある三本線の「Open menu」アイコンをクリックし、「Preferences」を選択
(3)  左メニューの魔女帽子アイコン(Advanced)をクリック(下図1)して、上のタブから「Network」をクリック(下図2)、Connectionの[Settings]をクリック(下図3)。
 
(4)  Proxyの設定は自動検出と手動設定がある。Use system proxy settingsを選択して[OK]をクリックする。もし、この設定でもネットワークにつながらないようなら次の手動設定をする。
a. 自動検出設定
b. 手動設定
学内でネットワークにつながっている場合は次の作業は必要ない。
「Manual proxy configuration」に選択し、HTTP Proxy、SSL Proxy、FTP Proxyに大学指定のプロキシアドレスを入力し、[OK]をクリックして終了。
以上

ロボットプログラミングⅡ:Ubuntu16.04ウインドウマネージャーの設定

$
0
0

この記事は私が担当している講義ロボットプログラミングⅡ用です。

Ubuntu16.04の標準WindowマネージャーUnityは動作が重いので、動作が軽快なUbuntu Flashback(Metacity)に変更します。
ここでは、gnome-panelがインストール済みを想定しています。インストールしていない場合は、端末で以下のコマンドを実行し、ログアウトしてください。

  • sudo  apt-get  install  gnome-session-flashback

(1) 名前の横にあるUbuntuマークアイコンをクリックする。

wm1

 

(2) GNOME Flashback (Metacity)をクリックして、パスワードを入力する。

(3) Window左上の「アプリケーション」をクリックする。

(4)  「システムツール」→「端末」をクリック。

 

(5) 下図のように端末が起動する。

以上

 

ロボットプログラミングⅡ-2017:環境設定

$
0
0

この記事は私が担当している講義ロボットプログラミングⅡ用です。

turtlebot

ロボットプログラミングⅡでは、フレームワークとしてROSロボットシミュレータとしてGAZEBOを使用します。インストールは次の手順です。Panasonic Let’s Note CF-LX3 (Windows 8.1, Core i7, Memory 8GB)で試しています。

では、以下のリンクに従って第3週の授業までに作業を進めてください。

  1. VirtualBox5.1 + Ubuntu16.04のインストール
  2. VirtualBox5.1の設定
  3. Ubuntu16.04のネットワーク設定
  4. Ubuntu16.04のウインドウマネージャーの設定
  5. ROS Kineticのインストール

以上

Ubuntu16.04: OpenCV3.2.0インストール

$
0
0

Ubuntu16.04にOpenCV3.2.0をソースからビルドしインストールしたときのメモ。以下のサイト等を参考にした。なお、OpenCV3.3.0は以下の手順ではエラーが出てビルドができないので注意。

http://docs.opencv.org/trunk/d7/d9f/tutorial_linux_install.html

準備

  • sudo apt install build-essential cmake git
  • sudo apt install pkg-config unzip ffmpeg qtbase5-dev python-dev python3-dev python-numpy python3-numpy
  • sudo apt install libopencv-dev libgtk-3-dev libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev
  • sudo apt install libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
  • sudo apt install libv4l-dev libtbb-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev
  • sudo apt install libvorbis-dev libxvidcore-dev v4l-utils vtk6
  • sudo apt install liblapacke-dev libopenblas-dev libgdal-dev checkinstall

ソースコードのダウンロード

  • cd
  • mkdir src
  • cd src
  • git clone https://github.com/opencv/opencv.git
  • cd opencv
  • git checkout 3.2.0
  • cd ~/src
  • git clone https://github.com/opencv/opencv_contrib.git
  • cd opencv_contrib
  • git checkout 3.2.0

ソースのビルド

  • cd ~/src/opencv
  • mkdir build
  • cd build
  • cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=~/src/opencv_contrib/modules  -D BUILD_EXAMPLES=ON  -D WITH_OPENGL=ON ..
  • make -j 2
  • sudo make install
  • sudo /bin/bash -c ‘echo “/usr/local/lib” > /etc/ld.so.conf.d/opencv.conf’
  • sudo  ldconfig

以上

RobotVision勉強会:1回目 画像の読込・表示・保存

$
0
0

この記事は私が主催しているRobotVision勉強会の内容メモです。OpenCVの内容については下のサイトやOpenCV3.2.0のドキュメントを参考にしています。なお、開発環境はUbuntu16.04、OpenCV3.2.0です。

  •  http://opencvexamples.blogspot.com/p/learning-opencv-functions-step-by-step.html

初回なので開発環境のインストールと画像ファイルの読み込み、保存、表示について紹介します。

1.開発環境のインストール

2.ステップ

  • (1). 画像を imread()で読み込む。
  • (2). namedWindow()とimshow()を使いウインドウに表示する。
  • (3). 必要があればimwrite()で画像をファイルに保存する。
  • (4). キーボードのキーが押されるまで waitKey()で待つ。

3.画像の読み込み、表示、保存等のAPI

  • Mat imread(const String& filename, int flags=IMREAD_COLOR )
    • 機能:画像ファイルを読み込む
    • 引数:
      filename – 読み込まれるファイル名
      flags –読み込まれる画像のカラータイプを指定
      • CV_LOAD_IMAGE_ANYDEPTH – 入力された色深度が16ビット/32ビットならその画像を返す。それ以外は色深度を8ビットに変換して返す。
      • CV_LOAD_IMAGE_COLOR – カラー画像
      • CV_LOAD_IMAGE_GRAYSCALE – グレースケール
      • >0:3チャンネルのカラー画像を返す。αチャンネルが必要なら負の値を使うこと。
      • =0:グレースケール画像を返す
      • <0:読み込んだ画像をそのまま返す (alphaチャンネル付).
  • bool imwrite(const String& filename, InputArray img, const vector<int>& params=vector<int>() )
    • 機能:指定した画像にファイルを保存
    • 引数:
      •  filename – ファイル名
      •  image – 保存される画像
      •  params –
        フォーマット個別の保存パラメータ.詳細はここを参照
  • void imshow(const String& winname, InputArray mat)
    • 機能:指定したウインドウに画像を表示
    • 引数:
      • winname – ウインドウの名前
      • image – 表示される画像
  • void namedWindow(const String& winname, int flags=WINDOW_AUTOSIZE )
    • 機能:ウインドウの生成
    • 引数:
      • winname – ウインドウの名前
      • flag – ウインドウのフラグ
        • WINDOW_NORMAL :ユーザがウインドウをリサイズ可能 (制約なし).
        • WINDOW_AUTOSIZE :表示された画像に合うようにウインドウが自動調整する。ユーザは手動でウインドウサイズを変更できない。
        • WINDOW_OPENGL:ウインドウがOpenGLサポートで生成される。
  • void destroyAllWindows()
    • 機能:生成したウインドウを全て破壊する
  • int waitKey(int delay=0)
    • 機能:キーが押されるまでdelay[ms]待つ。delayが負の場合は無限に待つ。
    • 戻り値:入力されたキー。キー入力が指定された時間ない場合は-1を返す。

4.サンプルコード

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

int main(int argc, const char* argv[])
{
  // 画像データをファイルから読み込む
  cv::Mat src = cv::imread("~/src/opencv/samples/data/lena.jpg",cv::IMREAD_COLOR);

  // 画像の読み込みに失敗したらエラー終了する
  if(src.empty()) {
      std::cerr << "Failed to open image file." << std::endl;
      return -1;
  }

  cv::namedWindow("image", cv::WINDOW_AUTOSIZE);
  cv::imshow("image", src);
  cv::waitKey(0);
  cv::destroyAllWindows();

  return 0;
}

5.ビルド

  • 方法1: 端末を開き、以下のコマンドを実行する。なお、先頭の$はコマンドプロンプトを表しているので打ち込まない。

$ g++ test.cpp -I/usr/local/include/opencv2 -I/usr/local/include/opencv -L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_highgui

  • 方法2
    • (1) CMakeLists.txtを作る。
# cmake needs this line
cmake_minimum_required(VERSION 2.8)

# Define project name
project(sample1)

# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)

if(CMAKE_VERSION VERSION_LESS "2.8.11")
  # Add OpenCV headers location to your include paths
  include_directories(${OpenCV_INCLUDE_DIRS})
endif()

# Declare the executable target built from your sources
add_executable(sample1 sample1.cpp)

# Link your application with OpenCV libraries
target_link_libraries(sample1 ${OpenCV_LIBS})

(2) 以下のコマンドを実行する

$ cmake .
$ make

6.演習

  • このサンプルプログラムを少し変更して、好きな画像を表示させよう!

以上

 

&nbsp

Viewing all 757 articles
Browse latest View live