Archives

March 2009 の記事

2009年初の新しい SDK です。

DirectX SDK (March 2009)

大きなトピックは Direct2D/DirectWrite の Technical Preview が含まれたこと。
Windows7 beta + Windows7 SDK beta でないと試すことが出来なかった
Direct2D / DirectWrite が Vista でも使えるようになりました。
ドキュメント類は以前から MSDN に上がっているのでそちらを参照することになります。
インストールによって d2d1_beta.dll, dwrite_beta.dll が入りました。

これでおそらく D2D/DWrite だけなら Windows7 SDK が無くてもテストできると思います。
ヘッダ類もこちらの方が新しいようです。コメントが増えて新しい定義もあります。

その他 DXGI1.1 も入りました。元々ヘッダは含まれてましたが、dxgi_beta.dll / lib が
追加されてドキュメントも統合されたようです。

Direct3D11 TechPreview の方はあまり大きな変化があったようには見えませんが、
細かく変更が入っています。
たとえばヘッダには CD3D11_RECT, CD3D11_DEPTH_STENCIL_DESC,
CD3D11_BLEND_DESC 等のヘルパークラスが多数追加されているようです。
Direct2D と同じようにデフォルト値による初期化がサポートされています。
デフォルト値を示すオーバーロード用の type は CD3D11_DEFAULT です。

マニュアルでは Shader Model 5 の Attributes に attrib, maxtessfactor,
earlydepthstencil が追加。Intrinsic Functions には
countbits, EvaluateAttributeAtControid, EvaluateAttributeAtSample
が増えています。
またヘッダを見ないと使い方が分からなかった D3DCompiler のマニュアルも入りました。

Shader の項目には Reflection 関連のインターフェースが追加されています。
このあたりヘッダを見てもかなり手が入っていることが分かります。
まだ Effect (fx) はありませんが進展は見られます。

その他マニュアルには載ってませんが D3D11_CREATE_DEVICE_BGRA_SUPPORT
も目新しいところです。


関連エントリ
Direct2D (7) Tessellate の 2
Direct2D と Direct3D10.1 の下位互換
Windows7 リモートデスクトップと Direct3D
Direct3D11/DirectX11 (18) GPU を使ったアウトラインフォントの描画の(6)
Direct3D11 Technical Preview D3D11の互換性、WARP Driver



2009/03/21
SSD OCZ Vertex

先週末、運良く店頭で入手できたので OS を入れ替えて一週間ほど使いました。

・OCZSSD2-1VTX60G

60GB の 2.5inch SSD です。22800円
RAM 8GB + Win7 beta x64 なので、ページングファイル無しにして休止状態ファイル
クリーナーで消して OS のみ 10GB くらい。

特に速度を実感できるのはソフトウエアのインストールで、残り時間が正確に
表示されないくらい。Windows の起動や終了も速いし、重いアプリケーションの
立ち上げも違いが分かるほどに短縮しています。

プログラミング作業はどうかというと、元々そんなに編集もコンパイル時間も
困ってなかったのであんまり速い感じはしていません。
その代わり作業中、非常に静かなのが心地よいです。

ファンの一定の音はありますが不定期に鳴り出す音が消えました。
ファイルに書き込んでるな、とか裏で何か動き出したな、とか無いので結構違います。
HDD が寝ていて、いざアクセスしようとしたらスピンアップ待ちで起動まで待たされる
こともないわけです。動作中の配置換えなんかも気にせず出来そう。

プロセッサは年々速くなっていくのでストレージとの速度差は離れる一方でしたが
ここに来て急に差が縮まり出したようです。
OS やアプリケーションも HDD のシークが遅いという前提で作られていますが、
そのうち全く気にしなくても良くなるかもしれません。
ファイルアクセスを速くするためのいくつかの工夫も、きっと古い技術となって
忘れていくのでしょう。

机の奥から古いレシートが出てきました。
1999年7月9日に 13GB の HDD を 21480円で買ってました。



PC-OP-RS1 (KURO-RS) を使って ROBO-Q と同じように調べてみました。
Q-TRAIN のコントローラの赤外線信号です。

TAKARA TOMY Q-TRAIN

●コマンドフォーマット

コマンドは 8bit 分
下記の順番で送信されています

先頭
  C C A 0 R L B F


 CC = BAND A~D (00,01,10,11)
 A = 自動移動の指定かどうか (左サイドのスイッチが on なら 1)
 0 = 常にゼロ
 R = 右ボタン (→)
 L = 左ボタン (←)
 B = 後退ボタン (↓)
 F = 前進ボタン (↑)

R L B F の各ボタンは同時押しが出来ます。
例えば前進+右旋回だと F + R が同時に ON になります。


コマンド組み合わせの例

BAND A 前進	00000001
BAND B 前進	01000001
BAND C 前進	10000001
BAND D 前進	11000001

BAND A 前進自動	00100001
BAND A 後退	00000010
BAND A 左	00000100
BAND A 右	00001000
BAND A 前進+左	00000101

●コマンドエンコード

ヘッダや 1bit 分の波形も長く取られており ROBO-Q とは異なっています。

ヘッダ常に H 6.3msec

bit
 0 = L 0.5msec + H 1.7msec
 1 = L 1.5msec + H 0.7msec

エンコードされた bit データは ROBO-Q と違い、0 でも 1 でも同じ長さになります。
よって 1コマンドはだいたい 23.9msec


例 BAND D 前進 + 左 で受け取った波形 (0.1msec 単位のサンプリング)

// ヘッダ
11111111111111111111111111111111111111111111111111111111111111
// 1
000000000000000 1111111
// 1
000000000000000 111111
// 0
00000 11111111111111111
// 0
00000 11111111111111111
// 0
00000 11111111111111111
// 1 (左ボタン)
000000000000000 1111111
// 0
00000 11111111111111111
// 1 (前進ボタン)
0000000000000000 111111


使用したツールは ROBO-Q 同様「スーの道具箱/分解してみよう/PC-OP-RS1」の
IrReceiver です。


関連エントリ
タカラトミー ROBO-Q (3) PC から操作する実験
タカラトミー ROBO-Q (2) 赤外線コマンドの解析
タカラトミー ROBO-Q



Windows7 beta でも下記のハードでタッチ操作を試すことが出来るそうです。

 ・Windows 7で"マルチタッチ"を楽しむには? MSが利用方法やTIPSを紹介

HP TouchSmart PC IQ827jp に Windows7 beta を入れてみました。

 ・HP TouchSmart PC IQ800

IQ800 は液晶モニタ一体型のオールインワン PC で光学式のタッチパネルを搭載しています。
パネルに触れるぎりぎりの位置で反応するので、パネルに指を押しつける必要もなく
非常に軽い操作ができます。
iPhone 等の静電容量タイプと違うのは指でなくても反応すること。
つめでもいいしペンでも良いし、画面に近づく物は何でもタッチ扱いです。

付属するキーボードもマウスも最初からワイヤレスタイプで、無線LAN 11b/g/n も
Bluetooth も内蔵しています。ケーブルは電源のみ、AC アダプタは巨大だけど
すっきりとした見た目です。

キーボードも非常に薄く、ちょうど本体下の足の間に入ります。
タッチやマウスを使っていても邪魔になりません。

標準搭載の Vista だと、マルチタッチらしい操作ができたのは TouchSmart
画面のアイコン拡縮だけでした。


Windows7 beta x64 を install し、WindowsUpdate でタッチパネルドライバが
入ることを確認しました。でも予想外のところでトラブルが。
タッチは使えるものの GeForce 9600M GS のドライバが入らず Aero にできません。

Notebook 向け M 系は Windows7 ドライバがまだ無く Vista ドライバ 179.48 も
エラーが出ます。
「NVIDIA Setup プログラムは、現在のハードウエアと互換性のあるドライバを見つけることができませんでした」

アップグレードは出来るはずなので試しに Vista をクリーンインストールしても
Vista 向けドライバなのに同じエラーです。
その後 acryl さんに下記のページを教えてもらいました。

価格.com 『XPのインストール』のクチコミ掲示板

同じように LaptopVideo2Go から 182.06 Vista 64bit の inf を置き換えてインストール
したところうまくいきました。WDDM 1.0

CPU: 5.9
RAM: 5.9
AERO: 6.2
GAME: 5.2
HDD: 5.9

AC アダプタがついていたりモバイル向け GPU が入っていたりと比較的ノート PC に
近い構造です。画面の明るさ調整ボタンもモニタ側についておらず、ノートのように
キーボードで操作します。
Windows7 ではこれらのショートカットが使えなくなりましたが、
ちょうど type P + Windows7 用に作っていた backlightwin がそのまま動きました。

肝心のタッチは一応 2点まで取れています。
こんなに Windows の ペイント ソフトの稼働率が高いのは初めてです。


関連エントリ
VAIO type P Windows7 beta とバックライト調整など



少々時間が無かったので昨日の解析結果が正しいかどうか確認するだけ。
BAND A/D の ROBO-Q も調達できたので 4バンド分の信号を確認できました。

実際にコマンド送信プログラムを作ってみます。
スーの道具箱/分解してみよう/PC-OP-RS1
のページを参考にさせていただきました。そのままです。

初期化

hPort= CreateFile(
		"COM4",
		GENERIC_WRITE|GENERIC_READ,
		FILE_SHARE_READ|FILE_SHARE_WRITE,
		NULL,
		OPEN_EXISTING,
		0,
		NULL
	);
if( hPort == INVALID_HANDLE_VALUE ){
	// ERROR
	return;
}
DCB	dcb;
dcb.DCBlength= sizeof(DCB);
dcb.BaudRate= CBR_115200;
dcb.fBinary= TRUE;
dcb.fParity= FALSE;
dcb.fOutxCtsFlow= FALSE;
dcb.fOutxDsrFlow= FALSE;
dcb.fDtrControl= DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity= FALSE;
dcb.fTXContinueOnXoff= FALSE;
dcb.fOutX= FALSE;
dcb.fInX= FALSE;
dcb.fErrorChar= FALSE;
dcb.fNull= FALSE;
dcb.fRtsControl= RTS_CONTROL_DISABLE;
dcb.fAbortOnError= FALSE;
dcb.fDummy2= 0;
dcb.wReserved= 0;
dcb.XonLim= 0;
dcb.XoffLim= 0;
dcb.ByteSize= 8;
dcb.Parity= NOPARITY;
dcb.StopBits= ONESTOPBIT;
dcb.XonChar= 0;
dcb.XoffChar= 0;
dcb.ErrorChar= 0;
dcb.EofChar= 0;
dcb.EvtChar= 0;
dcb.wReserved1= 0;
SetCommState( hPort, &dcb );

送受信は WriteFile()/ReadFile() です。

PC-OP-RS1 用の送信データを組み立てます。
赤外線の On/Off 情報をビット列で指定。あくまで動作確認用なのでべたで。

int pushbit( char* ptr, int index, int flag, int length )
{
	if( flag ){
		for( int i= 0 ; i< length ; i++ ){
			int	byteoffset= index >> 3;
			int	bitoffset= index & 7;
			ptr[byteoffset] |=  (1<<bitoffset);
			index++;
		}
	}else{
		index+= length;
	}
	return	index;
}

// H 1ms  + data x7
void SendCommand( int band, int speed, int turn )
{
	unsigned int	bitpattern=  ((speed<<5) & 0x60)
				|(( turn<<3) & 0x18)
				|(( band<<1) & 0x06);
	char	byte[240];
	memset( byte, 0, 240 );
	int	index= 0;
	index= pushbit( byte, index, TRUE, 10 ); // H 1ms
	for( int i= 0 ; i< 7 ; i++ ){
		if( bitpattern & (1<<(6-i)) ){
			index= pushbit( byte, index, TRUE, 10 ); // H 1ms
		}else{
			index= pushbit( byte, index, TRUE, 5 ); // H 0.5ms
		}
		index= pushbit( byte, index, FALSE, 5 ); // L 0.5ms
	}
	SendIR( byte, 240 );
}

データ送信

void SendIR( const char* command )
{
    iPort->Send( "t", 1 );
    iPort->Recv( rdata, 1 );	// 'Y'
    iPort->Send( "1", 1 );		// ch1
    iPort->Recv( rdata, 1 );	// 'Y'
    iPort->Send( command, 240 );
    iPort->Recv( rdata, 1 );	// 'E'
}

昨日のデータ通りです。すんなり動作しました。
PC で ROBO-Q を操作できます。

SendCommand( 1, 2, 0 ); // BAND B で中速(M)前進
SendCommand( 1, 1, 1 ); // BAND B で低速(L)右回転

でもデータ送信まで思ったより時間がかかるので、細かい制御をリアルタイムに
行うには少々厳しいです。要検討。

修正 2009/3/5 4:27 勘違いでした。十分な速度で操作できます。

きちんと使うなら 192ms 分複数のコマンドをパックして送る必要あります。


関連エントリ
タカラトミー ROBO-Q (2) 赤外線コマンドの解析
タカラトミー ROBO-Q



ROBO-Q のリモコンコマンドを調べてみました。

ROBO-Q 赤外線
コマンドは 7bit (最後は固定なので、data 6bit + 終端bit かもしれない)

先頭     終端
S S T T B B 0

SS = 速度
  00 = AUTO 等のコマンド送信
  01 = 前進 速度L
  10 = 前進 速度M
  11 = 前進 速度H

TT = ターン他 (bit が 1 の方の足を止める)
  00 = 前進 (両足とも止めない)
  01 = 右回転 (右足を止める) / 回避モード
  10 = 左回転 (左足を止める) / 回避モード
  11 = 追跡モード

BB = バンド
  00 = BAND A
  01 = BAND B
  10 = BAND C
  11 = BAND D


全部の組み合わせ

前進L   = 0100bb0
前進M   = 1000bb0
前進H   = 1100bb0
右回転L = 0101bb0
右回転M = 1001bb0
右回転H = 1101bb0
左回転L = 0110bb0
左回転M = 1010bb0
左回転H = 1110bb0
AI回避  = 0011bb0
AI追跡  = 0010bb0 / 0001bb0

移動はコマンドを送信し続ける必要があります。
何もコマンドが送られていない状態が停止です。


●解析に使用したもの

PC に USB 接続できる学習リモコンキットです。
BUFFALO と 玄人志向 どちらも同じものだそうです。

BUFFALO PC-OP-RS1
玄人志向 KURO-RS


●PC-OP-RS1 WindowsVista x64 用ドライバ

付属ドライバも web から落とせるドライバも Windows x64 に対応していません。
x64 で動作させるために下記のページを参考にさせていただきました。

プログラミング研究所 KURO-RSをWindows XP x64で使用する

上のページを参考にして FTDI Virtual COM Port Drivers の最新版を入れました。
これで PC-OP-RS1 を Vista x64 で使用することが出来ます。
以下詳細手順


● x64 ドライバ導入手順のメモ

(1) FTDI Virtual COM Port Drivers から 2.04.16 を download (CDM 2.04.16 WHQL Certified.zip)

(2) デバイスマネージャーから PC-OP-RS1 のデバイスIDを確認しておく
  不明なデバイスのままで構わない。
   プロパティ→詳細→ハードウエアID
  これで vid=0411, pid=00b3 であることがわかる

(3) (1) のアーカイブを展開しフォルダ内の *.inf ファイルを書き換える

2つあります。
どちらも [FtdiHw]/[FtdiHw.NTamd64] の項目の先頭行を複製して VID/PID を書き換える
だけです。[Strings] は書き換えなくてもインストールできました。

ftdibus.inf の対応する項目に追加する行(追加する行だけ記述)
[FtdiHw]
%USB\VID_0411&PID_00b3.DeviceDesc%=FtdiBus.NT,USB\VID_0411&PID_00b3

[FtdiHw.NTamd64]
%USB\VID_0411&PID_00b3.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0411&PID_00b3

[String]
USB\VID_0411&PID_00b3.DeviceDesc="USB Serial Converter"


ftdiport.inf の対応する項目に追加する行(追加する行だけ記述)
[FtdiHw]
%VID_0411&PID_00b3.DeviceDesc%=FtdiPort232.NT,FTDIBUS\COMPORT&VID_0411&PID_00b3

[FtdiHw.NTamd64]
%VID_0411&PID_00b3.DeviceDesc%=FtdiPort232.NTamd64,FTDIBUS\COMPORT&VID_0411&PID_00b3

[String]
VID_0411&PID_00b3.DeviceDesc="BUFFALO RemoteStation PC-OP-RS1"


ドライバインストール時は、上記フォルダを手動で指定します。
ドライバを検索せずにディスク使用まで持って行く。
KURO-RS でもおそらく同じです。


● PC-OP-RS1 を使ったデータ取り込み

すべて下記のページを参考にさせていただきました。
ツールも下記ページからダウンロードできる IrReceiver/IrSender を使用しています。

スーの道具箱/分解してみよう/PC-OP-RS1


● ROBO-Q 赤外線コマンドの信号

スーの道具箱/分解してみよう/PC-OP-RS1」によると、受信データは
0.1ms のサンプリング情報とのこと。
240byte x 8bit = 1920bit が 0.1ms 単位だとすると 192ms 分の情報が一度に
取れます。

実際にサンプリングした bit パターンを見てみると下記のようになっています。
実際には 1bit 程度の誤差が入ります。

111111111111111100000111111111100000111111000011111100000111110000011111111110000011111100000000


・信号と思われるところ = 5個並んだ1(H) または 10個並んだ1(H)
・区切り = 5個並んだ0(L)

よって
0.5ms の連続する H = データの 0
1.0ms の連続する H = データの 1
0.5ms の連続する L = 区切り

とみなすと、一番最初に書いた 7bit のデータが得られます。
データの先頭は 1ms 程度の H が続きます。

コマンドの長さは

1.0 + 1.5*6 + 1.0 = 11ms
1.0 + 1.0*6 + 1.0 = 8ms

なので、送信に 8~11ms かかります。
連続歩行の場合 170ms 程度の間を空けているようです。
スライダを L→H と移動する場合やターンの開始時などは、間無しにほぼ連続して
コマンドが送られています。


●障害物認識ユニット

障害物認識ユニットは、上記のコマンドとは全く異なるパターンが送られています。

1111110000000000111111000000

最初の H が 0.5ms でデータ区切りが 1ms あるためコマンドと区別可能です。
左右の違いが無かったため、どのように区別しているのかはまだわかりませんでした。


●参考にさせていただきました

下記のページが無かったら調べることが出来ませんでした。
JuJu 様、NMVL 様に感謝します。

スーの道具箱/分解してみよう/PC-OP-RS1
プログラミング研究所 KURO-RSをWindows XP x64で使用する


関連エントリ
タカラトミー ROBO-Q



非常に小さいです。

TAKARA TOMY ROBO-Q

ROBO-Q

とことこ歩きます。
付属のコントローラを使えば、こんなに小さいのに歩かせたり回転したりと操縦できるんです。
ゆっくり動けるので、EIZO のモニタの上の縁なども端から端まで歩くことが出来ました。

さらにユニークなのは自律モードがあること。
左右に障害物認識ユニット(マニュアルに記載された名称)があって、
障害物をよけたり目の前のものを追跡したりします。

コントローラは TV リモコンのように赤外線を使っています。
ロボット側の赤外線受光部はちょうど顔の位置、正面です。


赤外線なのでおそらくリモコンのようにパルス信号でコマンドを識別しています。
ROBO-Q は A BAND ~ D BAND と 4種類あり、4台までは同時に操作しても混信しません。
前進や回転などの赤外線コマンドも 4セット用意されているのだと考えられます。

ちなみに同じ BAND タイプの ROBO-Q が 2台あると、1つのコントローラで同時に
操作できます。


自律モードではいったいどうやって障害物を見ているんでしょう。
小さいし価格も安いし、あまり複雑な仕組みは使っていないはずです。
障害物認識ユニットはちょうど顔の横についており、それぞれ右側と左側の障害物を
感知できます。
このセンサー赤外線発信部にそっくりです。

ROBO-Q

おそらく想像ですが、コントローラと同じように左右に赤外線のコマンドを発信して
いるのだと思われます。
赤外線の届く距離をうまく調整すれば、目の前に障害物が来たときだけ反射して
顔の正面の受光部でコマンドを受けることが出来ます。
受光部は共有できるし仕組みも単純にできて非常にうまい方法だと思います。

考えられる赤外線コマンドの種類は下記の通り。

・両足を動かす x3速度
・左足を動かす x3速度
・右足を動かす x3速度
・AI回避モードへ移行
・AI追跡モードへ移行
・右側障害物認識ユニット
・左側障害物認識ユニット

前進は左右のコマンドを同時に送ってるだけかもしれません。
障害物認識ユニットも微弱ながら学習リモコンが反応しました。
まだ障害物の再現は出来ていないので想像の範囲を超えてないです。