トップ «前の日記(2010/06/28(Mon)) 最新 次の日記(2010/07/01(Thu))»
【ソース+水=麦茶色の何か】

半期 四半期 全カテゴリ

今日の一言


2010/06/30(Wed) 急がば急げ! [長年日記]

_ [Linux][Ubuntu][FC][雑記] Thinkpadの加速度センサで遊ぶ(準備)

自分が持っているのはT43なので、それでやってみる。

Linux の場合には hdaps というのを入れるのが手っ取り早い。

まず、ここ(http://sourceforge.net/projects/tpctl/files/tp_smapi/)からソースをDL(おそらく最新は0.40)

解凍して

$ sudo make install HDAPS=1

追記:一部のデスとりビューションでは、

$ sudo apt-get install hdaps-utils

で入れられるっぽい。(hdaps-とかも入るので、こちらをおすすめ)

で、それを組み込む。

$ sudo modprobe hdaps

*おそらくコンパイルにカーネルソースが必要なので、それも入れておくこと。

これで、「sys/devices/platform/hdaps/calibrate」にキャリブレーションの値が、「/sys/devices/platform/hdaps/position」に現時点の位置が取り込まれる。

*テキストデータなので、lessとかでも読める。

あとはこれを読み込んで、どうにかするプログラムを書けばいい。

以上!

*IBMのThinkPad以外の加速度センサ内蔵PCでどうすればいいかは不明。時間が出来たらやる。

_ [Matlab][C++][Linux][FC][Ubuntu][Windows][雑記] mexを使ってC(C++)のプログラムをMatlab上で走らせる

基本となるソース(hello.c)は大体こんなの。

 #include <stdio.h>
 #include "mex.h"

 int hello_world(int nlhs, int nrhs)
 {
   printf("Hello World in c func nlhs = %d nrhs = %d\n",nlhs,nrhs);
   return 0;
 }

 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
 {
   mexPrintf("Hello World nlhs = %d nrhs = %d\n",nlhs,nrhs);
   hello_world(nlhs,nrhs);
   return;
 }

で、matlab上で、

 >> mex hello.c

としてコンパイルし、

 >> hello

で実行。(hogehoge.cのhogehogeが関数名になる)

また、mexでのコンパイル時には、gccとほぼ同様のオプションが指定できる。

なので、こんな書き方が出来る。

 >> mex CC=g++ CXX=g++ hogehoge.c -lhoge -L./

これで、.cのファイルをg++でコンパイルしてくれるようになり、libhogeをリンクするように指定できたはず。

まあ、あれだ。

プログラムは、mainの代わりにmexFunctionを使う、コンパイルはgcc(g++)の代わりにと思えば大体OK?(まったくもって厳密ではないが)

*printfによる表示が、matlabにコントロールが戻るときに一度に行われるっぽい?ので、バグ探しとかは難しそう。

  • scanfのような、入力を求める関数を呼ぶと、途中で終わってしまう?

_ [OpenCV][Matlab][C++][Linux][FC][Ubuntu][Windows][雑記] mexを使ってC(C++)のOpenCVを使ったプログラムをMatlab上で走らせる

次のような感じで特に問題はないはず。(ほぼOpenCVのサンプルと同じ)

ソース名:mex_opencv.cpp

 #include <cv.h>
 #include <highgui.h>
 #include <ctype.h>

 #include "mex.h"

 int capture()
 {
   CvCapture *capture = 0;
   IplImage *frame = 0;
   double w = 320, h = 240;
   int c;

   capture = cvCreateCameraCapture (0);

   cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
   cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);

   cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);

   while (1) {
     frame = cvQueryFrame (capture);
     cvShowImage ("Capture", frame);
     c = cvWaitKey (2) & 0xff;
     if (c == '\x1b')
       break;
   }

   cvReleaseCapture (&capture);
   cvDestroyWindow ("Capture");

   return 0;
 }

 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
 {
   capture();
   return;
 }

コンパイル:

 >> mex -I/usr/local/include/opencv -L/usr/local/lib -lml -lcvaux -lhighgui -lcv -lcxcore mex_opencv.cpp

どうも

 `pkg-config --cflags opencv`

とか

 `pkg-config --libs opencv`

は使えないっぽいので、そのまま書く。

それ以外はgccとかでコンパイルする際とほぼ同じオプションでいいはず。

実行は

 >> mex_opencv

でOK。

(「Esc」で終了するはずだが、Windowがきちんと消えない・・・要改善)

以上!