2025年5月
 123
45678910
11121314151617
18192021222324
25262728293031

検索・リンク

ARToolKitのsampleVRMLがようやく動く

他の雑務の合間にちょろちょろと実験しているARToolKitだけど、 OpenVRMLを使うサンプルプログラム(sampleVRML)がMac OS Xで 動かず、手間取った。 簡単に言えば、慣れないXcodeのルールを分かってないだけだった。

コンパイル中のエラーを見ると、C++のメソッドがたっぷり出てきたし、 名前修飾(mangling)のルールがgccのバージョン違いで発生しているのかと 思っていた。でもgccのオプションを調べてもgcc-2.Xと3.Xは違うみたい だけど、その後は特にトラブルの解説もない。

実は単純に、openvrmlのダイナミックリンクライブラリlib*.dylibの コピーする先が違ってただけじゃん。やっぱりXcodeとか慣れない統合環境は、 解ってないなぁ…

共用体と列挙型、グラフィックディスプレィの構造

構造体の続きということで、共用体と列挙型の説明を行う。 後半は、中間試験以降のグラフィックスの導入ということで、 ディスプレィの構造について説明する。

共用体と列挙型

共用体の説明ということで、異なる型のデータを保存する場合で、その型のうちのどれか1つ という場合には、共用体を使うということで説明を行う。

union Data {
int    integer ;
double real ;
char   string[ 10 ] ;
} ;
union Data x[ 3 ] ;
x[0].integer = 1234 ;
x[1].real = 1.234 ;
strcpy( x[2].string , "斉藤" ) ;

ただし、上記の例はどの型のデータが保存されたのかヒントになるような情報も 保存しなければ不便だけど….

列挙型は、プログラムの中でデータを区別するためのヒントのような情報で数値を列挙したい ときに使う。

enum Week {
SUN , MON , TUE , WED , THR , FRI , SAT
} ;
enum Week w ;
for( w = SUN ; w <= SAT ; w++ ) {
if ( w == WED ) {
// 水曜日の処理....
}
}

グラフィックディスプレィの構造

グラフィックスのネタの導入ということで、最近のディスプレィの構造を説明する。

CRT(ブラウン管)
高電圧を使った電子銃から飛び出た電子を、偏向ヨークで画面上の電子のぶつかる場所をコントロールする。ディスプレィの表面には電子がぶつかると光る蛍光体を塗ってある。 古くは、一筆書きで描くようなベクトルスキャン方式があったけど、 普通のテレビなどは、ラスタースキャン方式で電子のあたる場所を左右移動しながら上下移動することで、画面一面に情報を表示する。 色を表現する際には、各色の電子をとばし、スリットを抜けた電子のぶつかる場所に応じて、 違う色の蛍光体を塗っておく。 欠点は、巨大なディスプレイが作りにくい。厚さを薄くできない。
液晶
液晶は、電圧によって通り抜ける光の偏光方向をコントロールできる。 透明電極が配線されたガラス板の間に液晶を入れ、これを偏光板とカラーフィルタと重ねる。 液晶で発光を細かく制御しにくいため、色の再現性が悪かったり、偏光方向が変わるまでの 時間がかかるため、残像がでる。偏光板と液晶のずれから、横方向からだと表示が見にくくなる などの問題がある。
有機EL
ドットごとにLEDが並んでいるような構造。現段階では巨大なモニターは作りにくいけど、 発色がいい。
プラズマディスプレィ
電極と発光部の間にガスを封入して、その間に高電圧を加え放電させて光る。

MoodleサーバのHTTPSの設定

学校でのICT活用の一環である Moodle サーバの活用だけど、 今まで http 接続で、https 接続は自作鍵だったので、 警告メッセージが出たり、携帯でアクセスできなかったりという問題があった。

以前に、学科サーバでUPKIオープンドメイン証明書自動発行検証プロジェクトを利用して、https を 利用出来るようにしたけど、 出遅れて設定をしてなかったので、同様に 福井高専の Moodle サーバも、 https を利用出来るように設定した。

前回の学科サーバでの設定から日も経っているので、設定の間違いやらで 何度か再設定をしたり、学外からのアクセスの ReverseProxy の設定の 問題とかもあったけど、ようやく設定終了。

芦田先生のOSの授業で、一部実験していて家からだと使えんかった…という皆様方、 再度お試しあれ。

B木とハッシュ法

2分木の応用(式の表現・意思決定木)の説明が終わったので、 B木とハッシュ法の説明を行った。

B木

2分木では、ポインタの参照も頻繁に発生するし、偏った木への対応も面倒なので、 その対処方法として B木が使われる。 イメージは、2分木をそのままN要素にしただけ。

#define N 4
struct BTree {
int           size ; // ノード内に実際に入っているデータ件数。
int           data[ N ] ;
struct BTree* ptr[ N+1 ] ;
// data[i]〜data[i+1]は、ptr[i+1]に保存
} ;

Wikipediaより引用

B木では、データの追加の際に、ノードの中央値を上のノードに組み込む 処理を行うために、木の偏りが発生しにくいようになっている。


Wikipediaより引用

B木の改良型であるB+木をさらに発展させたアルゴリズムが、 データベースエンジンで用いられている。 データベースでは、全要素シーケンシャルアクセスなどが発生するため、 B+木ではノードを横断的に移動するためのポインタを持っているのが特徴。

ハッシュ法

ここまでに説明してきた方法は、速くても であったが、もっと速いアルゴリズムは無いか?

電話番号の検索であれば、電話番号そのものが保存場所という方式であれば、 一発でデータを見つけることができるが、メモリはあまりにも無駄遣いとなる。

int tel = 272925 ;
int a[ 1000000 ] ;
a[ tel ] = tel ;

このままでは、メモリがムダだけど、電話番号であれば、50件程度ならば、 末尾2桁が同じ場合は、極めて少ない。

int a[ 100 ] ;
a[ tel % 100 ] = tel ;

この様に、データの一部分を計算処理(ハッシュ関数)で抜き出し、 その値(ハッシュ値)を保存場所とする方式は、ハッシュ法と呼ばれる。 また、異なるデータでも同じハッシュ値になる(衝突)場合があり、 この対処方法で、いろいろな方法がある。 ここでは、最も簡単な「イス取りゲームでダメなら隣りに座る」方式(オープンアドレス方)を紹介する。

// 電話番号が保存されているかを判断する
#define SIZE 100
int hash[ SIZE ] ; // 電話番号0はエントリ無しとして扱う
int hash_func( int tel ) {
return tel % SIZE ;
}
void entry( int tel ) {
int h = hash_func( tel ) ;
while( hash[ h ] != 0 ) {  // 溢れると無限ループの問題あり
h = (h + 1) % SIZE ;
}
hash[ h ] = tel ;
}
int search( int tel ) {
int h = hash_func( tel ) ;
while( hash[ h ] != 0 ) {  // 無限ループの問題あり
if ( hash[ h ] == tel )
return tel ; // 見つかった
h = (h + 1) % SIZE ;
}
return 0 ; // 見つからない
}

データベースの正規形とオブジェクト指向

データベースの設計におけるER図の書き方で、 補足説明として対応数やロール、弱実体などの説明を行う。 この際に、汎化の説明があったので、これに伴いオブジェクト指向の話を少し行う。

オブジェクト指向の一部として、派生・導出・継承というキーワードを簡単に説明する。 また、ER図との関連性として、UMLを紹介し、フローチャートやPADなどが 振る舞い図として発展していることや、データ記述でもクラス図なども紹介する。

次に、データベースの正規化の話の説明として、第2正規形までを説明。 全属性が単一の値であれば原子値と呼ばれ、 すべての項目が原子値になっているものを第一正規形と呼ぶ。 一つのキーが決まると、他の属性も1つの物に絞り込める場合、 従属関係があると呼ばれる。 一つのキーが決まれば、他の属性がすべて従属するものは完全従属と呼ばれる。 他の非キー項目間で従属関係があるものは、部分従属と呼ばれる。 部分従属がなくて完全従属であれば、第2正規形と呼ぶ。

ネットワークとTCP/IP

先週のネットワークの物理層(LAN)の続きということで、 WANの全容を紹介した後、Ethernetの接続とTCP/IPの話をする。

WAN

LANでは拠点内の接続だけど、WANでは接続は電話が中心となる。 電話では音声の波を電気の波に変換して送られるが、 コンピュータのデジタル信号で送る場合には、間にモデムが入る。 しかし、通常の電話では64Kbps通信しかできないので、 デジタル信号で送るISDN(Max 128Kbps)が出てきた。 しかしながら速度が遅いため、音声信号の高周波帯にデジタル信号を入れ、 下り優先で帯域を割り振ったADSLが使われる。 しかしながら交換機までの距離が短くないと高速通信ができない。 最近は、CATVやFTTH(光ファイバ通信)が使われ、100Mbps通信ができる。

本当なら、AM/FM/PMなどの変調方式も説明すべきだけど、 時間を考え省略。

EthernetとIP接続

Ethernetの説明として、サブネットに分割しルータで中継…というIP接続の基本を説明する。

説明にあたり、バス型・リング型・スター型・ネット型・ツリー型などの説明の後、 Etherではバス型接続で、CSMA/CD方式をとることを説明する。

CSMA/CD方式では、 (a)バスが使われていないことを検出(Carrier Sense)し、 (b)使われていなければ使う(Multiple Access)。 しかしながら、キャリア無し検出からデータを出すまでの間のタイムラグがあるため、 (c)信号をだしたら他に使う人がいて通信に失敗するかもしれない(Collision Detect) このため、 (d)衝突が発生したらリトライするけど、リトライ待ち時間は乱数で決める。 この方式では、バスに接続する機器が多いと、どちらにしろ待ち時間が長くなる。 このため、ネットワークを細かく分離したサブネットを作る。 サブネット間には、ルータやブリッジを置いて、中継をしてもらう。

サブネットの分割以外にも、接続用のHUBで内部的な接続を必要に応じてつなぐ スイッチングHUBを使うことで、バス競合を減らすように工夫をする。 でも、分割されたサブネットのどこに機器があるのか、どう中継させるのかを 判断するメカニズムが必要。

IPプロトコルは、このサブネット間の中継を行うためのプロトコルで、 ネットワークの聞きを識別するための番号を個別に割り振る。 この番号は、IPv4では32bitを用いるが、近年のIPv4アドレスの枯渇から、 IPv6が使われるようになってきた。IPv6では、128bitを使用するため、アドレス枯渇はない。

授業時間が短くなってきたので、IPアドレスではネットワーク番号とホスト番号に 分けて、ネットワーク番号が違えば別サブネット、同じならサブネット内で通信という メカニズムまでを説明する。

2010年11月14日(第190回)

  • 数学の部屋 第54回 物理の池田先生にインタビュー 長水先生
    math101114.mp3
  • 長水先生が生出演
  • 誠市、ご縁市について

photo10111401.jpg
長水先生が生出演しました。

photo10111402.jpg
鯖江の地域通貨「ハピー」です。誠市に福鉄で来るともらえるそうです。

PTAMお試し中

ARToolKitを試す中、sampleVRMLのライブラリのコンパイルがうまく通らず、 現実逃避の情報探し。 この中で、リアルタイムに画像内の特徴点を見つけ、空間認識できる PTAM(Parallel Tracking and Mapping for Small AR Workspaces – Source Code) なるものを見つける。カメラの移動による視差変化を使ってくれて、 ソースコードも公開されている。

デモ画面を見ていても、最初のカメラ移動から空間をうまく認識しているのが 分かるし、普通のMacBookで動いているのもすごい。

Webに載っている情報を元に、手元でコンパイルを試みているけど、 うまく通ってくれないなぁ…
# もう少し別ネタを元にコンパイル試すか…
# Xcode 使わないで書いてある環境の方が馴染みやすいと
# 思うのはオッサンな証拠…

コンパイルを試みるけど、TooN::Vector で Zerosが見つからないとかいう エラーがでる。TooNのベクトルのZero初期化なんだけど、どうも バージョンが合っていないと思われるので、最初から 入れ直し。

Auto Focus カメラはダメ、単焦点Webカメラ必須

上記の資料にそって作業したところ、うまく動くようになった。 しかしながら、問題が1つ。 iSight だと、パソコン操作者側を撮るので、外付けのUSBカメラに変えてみた。 外付けでも普通に動き出すのはいいんだけど、 実験で使用したのは Auto Focus 付きのUVCカメラなんだけど、 初期状態のフォーカスに固定になり、視点移動でカメラを動かすけど、 ピンボケでトラッキング対象をうまく見つけられない。

ということで、単焦点のAuto Focus 機能の無いカメラを購入しないとダメあるね。

ARToolkit拡張現実感プログラミング入門…

卒研でARToolkitが使えないかと、試したりしているんだけど、 外部カメラの解像度指定方法しらべてたら、参考にしている 『ARToolkit拡張現実感プログラミング入門』の一番最初の部分が、 そのままWebに載っているじゃないの…

ほっほぉ、OpenGLの解説のいい本も紹介してある。 さっそく発注するあるね。

Mac OS Xでカメラ解像度指定

simpleTestあたりの実験で、USB外部カメラが使えるのはいいんだけど、 iSight なら丁度いいサイズ(max?)なんだけど、外部カメラは最大解像度で ムダに大きい動画を取得している。調べてみると、 main で arVideoOpen( vconf ) を呼び出す際の vconf がプログラム先頭で、 以下のように宣言されてるのね。

  //
// Camera configuration.
//
#ifdef _WIN32
char   *vconf = "Data\\WDM_camera_flipV.xml";
#else
- char   *vconf = "";  // デフォルトそのままだとダメ。
+ char   *vconf = "-width=640 -height=480";
#endif

使える設定は、プログラムの "ARToolKit/doc/video/index.html#VideoMacOSX" に説明が書いてある。

秋の遠足にてバーベキュー

3年生の工場見学旅行中に例年実施されている 秋の遠足にて、4EIでは「ふくい健康の森」にて バーベキューをしました。

朝は、雨が降っていて心配でしたが、 集合時間には晴れ、バス停から健康の森までを ウォーキング。参加費1000円にて昨日購入した 食材が足りるかなと心配でしたが、調度良い量で きれいにすべてなくなりました。

1011111656_320x240.jpg
1011111656-1_320x240.jpg

晴れているとはいえ、季節的にも寒いバーベキューでしたが、 楽しめました。

システム

最新の投稿(電子情報)

アーカイブ

カテゴリー