LECTURE 講義・技術関連情報|谷口忠大Home Page(たにちゅー・どっと・こむ)

たにちゅーの思惑|谷口忠大Home Page(たにちゅー・どっと・こむ)

LECTURE 講義・技術関連情報|谷口忠大Home Page(たにちゅー・どっと・こむ)

たにちゅーの思惑|谷口忠大Home Page(たにちゅー・どっと・こむ)

LECTURE 講義・技術関連情報|谷口忠大Home Page(たにちゅー・どっと・こむ)

たにちゅーの思惑|谷口忠大Home Page(たにちゅー・どっと・こむ)

LECTURE 講義・技術関連情報|谷口忠大Home Page(たにちゅー・どっと・こむ)

HOME  > LECTURE > 技術関連情報

技術関連情報

WindowsでのWiiリモコンの開発

2009-06-06 (sat)|カテゴリー:コメント:3

WindowsでのWiiリモコンライブラリ使用方法の説明を行います.

wiilib.hlibWii.lib(Releaseビルド)又はlibWiid.lib(Debugビルド)を使います.

プロジェクトを作成してください.「Win32コンソール アプリケーション」を選び,プロジェクトを作成してください.作成できたらまずプロジェクトのプロパティを開き,ライブラリをマルチスレッド(/MT)又はマルチスレッド デバッグ(/MTd)に変更してください.

そして,プロジェクトの同じディレクトリにwiilib.hとlibWii.libとlibWiid.libを置いてください.

 

下記に使用例を載せておきます.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

// Wii_sample.cpp : コンソールアプリケーションのエントリポイントを定義します。

#include <stdio.h>

#include <windows.h>

#include “wiilib.h”

#ifdef _DEBUG

#pragma comment(lib,”libWiid.lib”)

#else

#pragma comment(lib,”libWii.lib”)

#endif

int main(int argc, char* argv[])

{

WiiLib wii;

double x,y,z;

if(!wii.initWii()){//Wiiリモコンを認識&初期化

return 0;

}

while(1){

Sleep(100);

x = wii.getWiiAngle(Wii_X_AXIS); //加速度センサX軸の情報を取得

y = wii.getWiiAngle(Wii_Y_AXIS); //加速度センサY軸の情報を取得

z = wii.getWiiAngle(Wii_Z_AXIS); //加速度センサZ軸の情報を取得

printf(”x:%lf y:%lf z:%lfn”,x,y,z);

if(wii.getWiiState(Wii_BUTTON_B)){//Bボタンが押されたかどうか?

printf(”キャリブレーションn”);

wii.setWiiCalibrate(); //加速度センサを現在の位置で初期化

wii.setWiiRumble(Wii_Rumble_ON); //振動させる

Sleep(50); //振動させる期間スリープする必要あり

wii.setWiiRumble(Wii_Rumble_OFF); //振動をやめる

}

}

return 0;

}

まずWiiLibクラスを宣言したら,initWiiを呼び出してWiiリモコンを認識させてください.Wiiリモコンの認識に成功したらbool変数trueが帰ってきます.

初期化後に関数getWiiState使うとどのボタンが押されたか?がわかります.

引数に列挙体WiiStateをとり,これでボタンや加速度,IRセンサを指定します.

また,getWiiAngleを使うとWiiリモコンの加速度センサの値がラジアンでわかります.

各メンバ関数の説明

// Wiiリモコンを探して接続し,初期化を行う

bool initWii(WiiInitType wit = Wii_ACCEL);

// Wiiリモコンとの通信を切る

void closeWii(void);

// どのボタンから入力があったかを得る

int getWiiState(WiiState Key);

// Wiiリモコンの傾きをラジアンで得る

double getWiiAngle(WiiState Axis);

// 現在のWiiリモコンの傾きを基点とする

void setWiiCalibrate(void);

//指定した LEDを点灯させる

static void setWiiLED(unsigned char LED_ID);

// Wiiリモコンを振動させる

void setWiiRumble(WiiRumble wr);

// Wiiリモコンが使えるかどうかを確認する

int isWiiEnable(void);

 

BlutoothWiiリモコンとの接続について

今回,学校の生協で販売しているSANWA SUPPLY MM-BTUD11というBluetoothアダプタを用いて動作実験しました.下記は一例です.

clip_image002

「新しい接続」をクリックする

clip_image004

「エクスプレスモード(おすすめ)」

を選び次へ進む.その時にWiiリモコンの1ボタンと2ボタンを同時押しして,青のLEDランプを点滅した状態にしておく.

clip_image006

Wiiリモコンを発見出来たら選択して次へすすむ.

clip_image008

最後にこのような画面になり,接続できれば完了です.

この状態で,サンプルプログラムを動かしてみてください.

 

サンプルプログラムのダウンロード

Wii_sample.lzh

OpneGLの使い方


このページでは,OpenGLの使い方を学ぶ紹介をします.

1.OpenGLの基本について

基本については下記のページを参考にしてください.

コンピュータグラフィックス特論Ⅱ (大学院講義)

OpenGLを一から使うのはなかなか大変ですが, このページに紹介されているようにOpenGL & GLUTというライブラリを使えば,カナリ簡単に格好良い三次元グラフィックを使うことができます.

また,マウス入力やキーボード入力の関数も用意されていますので,簡単なゲームなどは作れるでしょう.

2.GLUTでロボットを表現してみる

知能ロボット関係の研究では,とりあえずOpenGLでロボットの形を作ってみたいということも有るでしょう.

そんな場合は,とりあえず以下のページのサンプルコードにトライしてください.

http://www.wakhok.ac.jp/~momma/lec2000/Graphics_Programming/6/lecture6.html

これをいじっていくことで徐々に狙いの形に持って行けると思います.

3.その他の参考ページ

http://verygood.aid.design.kyushu-u.ac.jp/opengl2005/material.html

http://verygood.aid.design.kyushu-u.ac.jp/opengl/3d.html

http://d.hatena.ne.jp/naf/searchdiary?word=glut

http://homepage3.nifty.com/tosikazu/pch/pchREP7.html

http://odalab.spub.chitose.ac.jp/~oda/lang/opengl_obj.html

CPPLapackの導入


このページでは,CPPLAPACKの使い方を学ぶ紹介をします.

1.CPPLAPACKについて

cpplapackはC++で利用できる行列演算ライブラリのラッパーです.

もともとLapackはFortranで開発された行列演算ライブラリですが,CLapackとしてC言語から利用できるようになりました.

これをC++のクラスやメモリ管理の機構を加え,グッと利便性を増したのがcpplapackです.

オペレータ演算子のオーバーロードや,クラス実装により 数学的な記述がかのうになりました.

つまり,行列の足し算が

A = B + C ;

で済むという・・・.さらに,転置は

At = t(A) ;

で済みます.

少しでもforループを減らしたい私としては,また,若い頃からオブジェクト指向にドクされた私としては最早,これなしにはやっていけないのです.

2.基本参考サイト

以下のサイトで基本を学んでください.

CPPLapackドキュメント日本語版

一応,日本語版ドキュメントの本家

CPPLapackチュートリアル

上島氏による,チュートリアルサイト.基本はまず,このチュートリアルに従って,やってみることで身につきます.

CPPLapack Documentation

総本山? ここにClassのメンバー関数などが全て書いてあり,どんな関数があるのか知りたいときはここにいって,Class Listをみます.

3.インストール(使用できるようになるまで: Linux編)

まず,Linuxにlapackのライブラリを入れるひつようがあります.

Synapticパッケージマネージャを立ち上げて,lapackで検索してみてください.

Vine linux 4.2 なら lapack が, Ubuntu 7 なら例えばlapack3 が引っかかると思います.

あと, -devというのがついたやつも出てきたら,それもチェックしてインストールしちゃいましょう.

これで,ライブラリ自体は入ってくれます.Syapticの無い人は

apt-get install lapack

とかで行けるらしい.

次に,CPPLapackを入れます.この入れ方はCPPLapackチュートリアルに書いてあるのですが,一部間違っているので,再度書いておきます(引用).

  1. mkdir ~/local,mkdir ~local/libと入力し,ディレクトリ~/local/libを作成する.
  2. cd ~/local/libと入力する.
  3. http://sourceforge.net/projects/cpplapack/からCPPLapackの最新版cpplapack-XXXX_XX_XX.tar.gzをダウンロードする.
  4. tar xzf cpplapack-XXXX_XX_XX.tar.gzと入力し,CPPLapackを展開する.
  5. ln -s cpplapack-XXXX_XX_XX cpplapackと入力し,シンボリックリンクを作成する.

なぜか,チュートリアルでは5のln が luになってました.

この上で,プログラム中で

#include <cpplapack.h>

と呼び出せば,大概いけます.

4.主に使うもの

基本的に使うクラスは

dcovector

double の column (列) vector ということ.普通の列ベクトル.

drovector

double の row (行) vectorということ.普通の行ベクトル.時々使う.

dgematrix

double の general (一般) matrix(行列)ということ.非常によく使う.

使い方はとりあえず, CPPLapackチュートリアルで体感してください.

5.うまくいかない

Vine 4.2の場合,上記だけでは

/usr/bin/ld: cannot find -llapack

と,怒られる可能性があります.

これは,Vine でインストールした laplack, blas, g2cのlibファイルの名前が違うからの可能性があります.

su になって

> updatedb

として,

> locate liblapack

で,libの位置を特定

/usr/lib/liblapack.so.3.1.1

こんな場所を言ってくるので,これを /usr/lib/liblapack.so にコピーするなり,シンボリックリンクはるなりすればいけるはず.

同様のことが, blas と g2c にも言えるので,同じようにすること.

CPPLAPACKの導入法

CPPLAPACKの導入法

CPPLapackは BLAS および LAPACK の C++ クラスラッパーです.

CPPlapack自体はヘッダーのみで構成されていて,CPPlapackが内部でlapackやatlasライブラリを呼び出すことによってユーザが簡単にC++でlapackやatlasライブラリを使用できるようにしたものです.

http://cpplapack.sourceforge.net/doc/main_page/Japanese.html

このURLが参考となるかもしれません.

~Linux編~

1.ライブラリのインストール

Synaptic(Ubuntuなら)パッケージ・マネージャでlapackを検索して適切なものをインストールしてください.(下記はVine Linux 4.2の一例)

clip_image002[7]

また,コマンドからインストールする方法は,

clip_image003

としてroot権限になります(この作業は各Linuxとも共通です).Ubuntuの場合は

clip_image004

としなければならないかもしれません.(ローカルユーザの場合)

rootユーザになってから

Ubuntuやdebianなどの環境なら

clip_image005

でインストールをしてください.最新のUbuntu8.10では,パッケージ名がliblapack3gfという名前に変わっているので注意してください.

また,Fedoraなどでは

clip_image006

でインストールができます.また,OS等によりパッケージ名は変わるので適宜検索等を行い調べて適切なものをインストールしてください.

ここで,CPPLapackのプロジェクトページよりヘッダーのダウンロードをしましょう.

http://sourceforge.net/projects/cpplapack/

よりcpplapack-2005_03_25.tar.gzをダウンロードします.

clip_image007

このようにコマンドで直接ダウンロードしてもかまいません.

そこで,できたcpplapackを解凍します.

clip_image008

そして,

clip_image009

として解凍したフォルダに入りましょう.

すると中には

clip_image010

とあると思いますので,ここでrootユーザとなって/usr/local/以下にインストールしましょう.

clip_image011

このようにして/usr/local/includeの中にcpplapackのヘッダーをコピーしてください.このディレクトリにコピーすることによりコンパイラはヘッダーファイルを見つけることが可能となります.

また,rpmコマンドが使える環境(Fedora, Vine(Ubuntuもインストールしているなら))ならcpplapackのプロジェクトページよりcpplapackのrpmパッケージをダウンロードしてインストールした方がより簡単に済みます.

clip_image012

rootになってからrpmコマンドでインストールします.(すでにrootユーザの場合suコマンドは不要)

clip_image013

この場合cpplapackが/usr/include下に自動的にインストールされるので標準ライブラリを使う時と同様に扱え便利です.(コンパイル時にディレクトリを指定する特殊な操作が不要ということ)

2.サンプルプログラムの実行

では,準備ができたらサンプルを作成してコンパイルを行ってみましょう.

ホームディレクトリにtest.cというファイルを用意し

1

2

3

4

5

6

7

8

9

10

11

#include <cpplapack.h>

int main()

{

CPPL::dgematrix A(2,3);

A(0,0)=1; A(0,1)=7; A(0,2)=5;

A(1,0)=3; A(1,1)=4; A(1,2)=6;

std::cout << A << std::endl;

return 0;

}

と入力してください.コンパイルの方法は

clip_image014

とすると,ホームディレクトリにtestが作成され

clip_image015

とこのような結果となればインストールは成功です.

ここでCPPL::i()は逆行列を求める関数ですが,この関数を用いる場合はコンパイル時にライブラリをリンクする必要があります.

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <cpplapack.h>

int main()

{

CPPL::dgematrix A(2,2);

A(0,0)=1; A(0,1)=7;

A(1,0)=3; A(1,1)=4;

std::cout << A << std::endl;

CPPL::dgematrix B = CPPL::i(A);

std::cout << B << std::endl;

return 0;

}

このようなAの逆行列を求める場合は

clip_image016

としてコンパイルする必要があります.(-llapackで/usr/libディレクトリに存在するliblapack.*** (***は環境により異なる)というライブラリをリンクするという意味です.)

clip_image019

3.基本的な使用例

cpplapackで主に使うクラス,変数はdgematrix(一般行列),drovector(行ベクトル),dcovector(列ベクトル)でしょう.これらは四則演算等の演算子がそのまま使えます.(演算子オーバーロードされている)

http://cpplapack.sourceforge.net/doc/html/index.html

このページに詳しく書かれているので,どのようなメンバ関数があるのかは自身で調べてください.

サンプルとして行,列ベクトルのそれぞれの掛け算と逆行列,逆行列,転置を載せておきます.参考にしてください.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#include <iostream>

#include <cpplapack.h>

int main()

{

CPPL::dgematrix A,iA,tA;//一般行列

CPPL::drovector R(2);//行ベクトル

CPPL::dcovector C(2);//列ベクトル

double S;

R(0) = 3; R(1) = 4;

C(0) = 5; C(1) = 6;

A = C*R;//列x行

S = R*C;//行x列

iA = CPPL::i(A);//逆行列

tA = CPPL::t(A);//転置

std::cout <<”R n” << R << std::endl;

std::cout <<”C n”<< C << std::endl;

std::cout <<”A n”<< A << std::endl;

std::cout <<”S n”<< S << std::endl;

std::cout <<”iA n”<< iA << std::endl;

std::cout <<”tA n”<< tA << std::endl;

return 0;

}

実行例

clip_image021

4.分割コンパイル方法

(複数のソースコードファイルに分けたプログラムのビルド方法)

プログラムを書いていくとコードが非常に長くなり,ある特定の機能を持つモジュールを特定のファイルに分割してコンパイルしたい場合があります.そのようなときに役立つのがMakefileです.書き方はいろいろありますが,一例を載せておきます.

clip_image022

このような書き方でsample.cppをmain関数の存在するメインファイルとして,cpplapack_plus.h,cpplapack_plus.cppが新たに作ったモジュールとしてファイルを分割してコンパイルすることが可能です.

コンパイルするときはmakeとすれば,

clip_image024

このようにコンパイル可能です.

また,新たにファイル(例えばadd.cpp と add.hというファイルを追加するとする)を作成しMakefileへと追加する場合はMakefileの内容を

clip_image025

のように変更すれば,追加することができます.(赤色の部分が変更点)

~Windows編~

まず,CPPLAPACKのヘッダーをダウンロードしてください.

http://sourceforge.net/project/showfiles.php?group_id=78519&package_id=87720&release_id=315440

よりcpplapack-2005_03_25.tar.gzをダウンロードして解凍してください.

適当な解凍ソフトで解凍したのち,その得られたcpplapack-2005_03_25とうフォルダをC:に置いてください.

次にライブラリの準備をします.

ライブラリを

http://www.netlib.org/clapack/index.html

のサイトからCLAPACK-3.1.1-VisualStudio.zip

をダウンロードして,解凍したフォルダCLAPACK-3.1.1-VisualStudio

を同様にC:直下に置いてください.

C:直下に図のようにおけたらVisualStudioを起動しましょう.

VisualStudioを起動したら

clip_image027

メニューのツールよりオプションを選択してください.

clip_image029

オプションを開いたら,左のメニューの「プロジェクトおよびソリューション」の中の「VC++ ディレクトリ」を選び,ディレクトリを表示するプロジェクトのコンボボックスの中の「インクルードファイル」を選択します.

そしてclip_image031を押して新しい行を追加し,その右側のclip_image033を押し先ほどC:直下に置いたcpplapack-2005_03_25の中のincludeファイルを選択します.

(C:cpplapack-2005_03_25includeこのディレクトリを追加します.)

同様に,コンボボックスを「ライブラリ ファイル」に変更して同じようにclip_image034を押して新しい行を追加し,

その右側のclip_image035を押し,CLAPACK-3.1.1-VisualStudioの中のLIBの中のWin32を選択します.(64bitOSならx64を選択)

(C:CLAPACK-3.1.1-VisualStudioLIBWin32このディレクトリを追加)

以上で設定は完了です.

おつかれさまでした.準備ができたらサンプルコードを書いてインストールができたかを見ましょう.

新たにVisualStudioを起動したら,プロジェクトを作成してください.

「Win32コンソール アプリケーション」を選び,プロジェクトを作成してください.作成できたらまずプロジェクトのプロパティを開き,ライブラリをマルチスレッド又はマルチスレッド デバッグに変更してください.

clip_image037

変更できたらソースにこのようにタイプしてください.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

// cpplapack_test.cpp : コンソールアプリケーションのエントリポイントを定義します。

//プリコンパイル済みヘッダーファイルを使用する(/Yu)場合はインクルード

#include “stdafx.h”

#include <cpplapack.h>

//ライブラリリンク

#ifdef WIN32

#ifdef _DEBUG

#pragma comment(lib,”f77blaswrapd.lib”)

#pragma comment(lib,”libf2cd.lib”)

#pragma comment(lib,”BLASd_nowrap.lib”)

#pragma comment(lib,”clapackd_nowrap.lib”)

#else

#pragma comment(lib,”f77blaswrap.lib”)

#pragma comment(lib,”libf2c.lib”)

#pragma comment(lib,”BLAS_nowrap.lib”)

#pragma comment(lib,”clapack_nowrap.lib”)

#endif

#endif

int main()

{

CPPL::dgematrix A(2,2);

A(0,0)=1; A(0,1)=7;

A(1,0)=3; A(1,1)=4;

std::cout << A << std::endl;

CPPL::dgematrix B = CPPL::i(A);

std::cout << B << std::endl;

return 0;

}

このようにタイプして,正常にコンパイルが通り,

clip_image039

このような結果となればOKです.お疲れ様でした.

補足説明:

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//ライブラリリンク

#ifdef WIN32

#ifdef _DEBUG

#pragma comment(lib,”f77blaswrapd.lib”)

#pragma comment(lib,”libf2cd.lib”)

#pragma comment(lib,”BLASd_nowrap.lib”)

#pragma comment(lib,”clapackd_nowrap.lib”)

#else

#pragma comment(lib,”f77blaswrap.lib”)

#pragma comment(lib,”libf2c.lib”)

#pragma comment(lib,”BLAS_nowrap.lib”)

#pragma comment(lib,”clapack_nowrap.lib”)

#endif

#endif

これは,ソースコードでどのライブラリをリンクするかを指定しています.Linuxでのg++オプションの”-llapack –lblas –lf2c”に相当するものです.このこのように

#ifdef WIN32

#endif

で括っておけばソースコードをLinux環境のg++でコンパイルしても無視されるため,他環境への移行も簡単になります.また,

#ifdef _DEBUG

ではビルドの設定を指定しています.Debugモードでビルドする場合はVisualStudioで自動的に

#define _DEBUG

とマクロが定義されるために_DEBUGが有効になりビルドモードに応じて適切なライブラリがリンクされます.

~Linux編おまけ~

Lapackなどのライブラリをパッケージ・マネージャでインストールすることができない環境での構築法を書いておきます.以下かなり操作が煩雑になります.

CLAPACKとATLASというライブラリをソースコードからコンパイルしてライブラリを作成します.

まず,

http://sourceforge.net/project/showfiles.php?group_id=23725

からStable版のatlasライブラリをダウンロードします.

09/3/4時点ではatlas3.8.3.tar.gzが最新版のようです.

atlas3.8.3.tar.gzをダウンロードしたら,解凍します.

clip_image040

するとATLASというフォルダができるので,そのディレクトリに入ってATLASライブラリをコンパイルします.そこで

clip_image041

として,ATLASディレクトリの中に新たなMyObjというディレクトリを作成します.そしてMyObjディレクトリの中に入り下記のコマンドを打ちます.

clip_image042

エラーが出ずにconfigureが終わればそのまま

clip_image043

と打ち,コンパイルが完了するのを待ちます.コンパイルが完了するとMyObj以下のlib/フォルダにlibatlas.a libf77blas.a libptcblas.a libtstatlas.a libcblas.a liblapack.a libptf77blas.aというライブラリができているのを確認してください.

clip_image044

そして,このライブラリはいったんこのままにしておき,次にlapackの準備をします.

http://www.netlib.org/clapack/index.html

よりclapack.tgzをダウンロードします.
clip_image045

clip_image046

ここで先ほど作成したATRASのライブラリをこのCLAPACKフォルダにコピーします.

clip_image047

となり,コピーできたら次にCLAPACKのmake.inc.exampleを編集します.

make.inc.exampleの中の

clip_image048


clip_image049

と書き換えます.そしてmake.inc.exampleをmake.incとリネームします.

clip_image050次にCLAPACKをコンパイルします.

clip_image051

と打ち,コンパイルが正常に完了するのを待ちます.コンパイルが完了するとディレクトリの中が

clip_image052

となり,新しくlapack_LINUX.a,libcblaswr.aができているのを確認してください.

次に,順に下記のコマンドを打ち

clip_image053

clip_image054

clip_image055

clip_image056

と打っていきます.するとディレクトリは

clip_image057

のようになっていればOKです.ここで新たにliblapack.aとlibblas.aがあればOKです.また,libf2c.aはF2CLIBS/フォルダの中にあります.

それも必要なら~/libに入れておきましょう.

このliblapack.aとlibblas.aの二つのライブラリをホームディレクトリにlibフォルダを作成してその中に入れておきます.

clip_image058

ライブラリのコンパイルが完了しました.このライブラリを実際に使用するには,先のサンプルをコンパイルするときに

clip_image059

としてコンパイルしてください.お疲れ様でした.

参考にしたURL

http://www.eml.hiroshima-u.ac.jp/member/staff/tamaki/LTI-Lib/index.php?LAPACK%2BATLAS

資料作成のために研究室のscuderia(Xeon Ubuntu 2.6.22-15-generic x86_64)マシンとmondeo(Pentium4 Fedora 2.6.25.9-40.fc8 i686)でライブラリコンパイルして作成し,テストプログラムの動作を確認した.(mondeoではCPPL::t 転値が使用できなかった)

インフォメーション

LECTURE menu



tanichuの著作

copyright © Tadahiro Taniguchi All Right Reserved.