今日の一言
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がきちんと消えない・・・要改善)
以上!