IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Open source  >

ThinkPad を携えて行うワイヤレス環境の実地調査

歩きながらワイヤレス・ネットワークの強度を記録して自動的にデータ・ポイントをレンダリングする

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

サンプルコード

原文はこちら

原文はこちら


レベル: 中級

Nathan Harrington (harrington.nathan@gmail.com), Programmer, IBM 

2008年 2月 12日

ThinkPad に組み込まれている加速度センサーを使って、自分の動きを記録しながらネットワークの接続性をモニターしてください。記録したデータからカスタム・アルゴリズムを使って歩行動作の特徴を抽出し、それから信号強度のグラフを自動的に見取り図に書き出すことで、最高のカバレッジを示すエリアを判断することができます。

さまざまな環境におけるネットワーク・カバレッジの正確なデータ・モデルを作成するには、ワイヤレス環境の実地調査が不可欠です。信号強度の広域マップを作成する際に現在使われている方法には、ポイントを指定して信号強度を記録するという時間のかかる手作業が必要になりますが、この作業のほとんどを移動距離の計算と信号強度の測定によって自動化できるのが、HDAPS (Hard Disk Active Protection System) 加速度センサーを備えた ThinkPad です。この記事ではサンプル・コードを使って一連の加速度センサー・データから歩き方の特徴を抽出し、ワイヤレス・ネットワークの信号強度を広範なエリアでマッピングするためのレンダリング・アルゴリズムを紹介します。

必要条件

ハードウェア

2003年以降に製造された ThinkPad の多くは、HDAPS ハードウェアを誇らしげにサポートしています。ご使用の ThinkPad に HDAPS が装備されているかどうか確かでない場合は、Lenovo の Web サイトで該当する技術仕様を確認してください。有効な 802.11 ネットワーク・カード、または組み込み WiFi ハードウェアも必要です。

ソフトウェア

HDAPS のカーネル・サポートを備えた Linux® ディストリビューションが必要です。カーネルに HDAPS ドライバーが含まれていなければ、この加速度センサーにはアクセスできません。Red Hat、Debian、Gentoo、Ubuntu をはじめとする最近のカーネル・ディストリビューションには HDAPS ドライバーが含まれています。HDAPS カーネル・ドライバーの使用方法については、「参考文献」セクションに記載した HDAPS 関連の記事を調べてください。

データの記録時に秒単位より精度の高い計時制御を行うために、Perl ファイル・アーカイブである CPAN から Time::HiRes モジュールを入手する必要もあります。また、ImageMagick も必要です。レンダリング・プログラムは ImageMagick の convert および composite コマンドを使って最終的な信号強度マップを生成するためです。この 2 つのツールへのリンクは「参考文献」に記載されています。

この記事で説明する手法とアルゴリズムは、加速度センサーを搭載したノート・パソコンすべてに適用できます。Linux 以外のオペレーティング・システムを実行する MacBook または ThinkPad の場合でも、ここに記載するコードを難なく適応させられるはずです。




上に戻る


recordData.pl でデータを収集する

recordData.pl プログラムについての説明

リスト 1 に recordData.pl プログラムを示します。最初の 12 行では、HDAPS センサー・データを検索する場所やワイヤレス・ネットワークの接続情報など、プログラムのグローバル変数が定義されています。readPosition および readSignal は、該当するファイルから (x,y) 加速度センサーと信号強度の値を抽出するだけのサブルーチンです。この例では、メイン・プログラム・ループがこの情報を出力し、1/20 秒間スリープ状態になります。データ収集の状況によっては毎秒のサンプル数を増やしたり、ESSID などの別のパラメーターを追加したりすることもできますが、この記事の例で平均的なユーザーの歩行特性を記録するための分解能としては、毎秒 20 のサンプル数で十分です。


リスト 1. recordData.pl - 加速度センサーと信号強度のデータ収集
                
#!/usr/bin/perl -w  
# recordData.pl - record accelerometer readings and wireless signal strength
# usage: recordData.pl | tee logFile
use strict;
use Time::HiRes qw( usleep );

$|=1; # non-buffered output

my $hdapsFN = "/sys/devices/platform/hdaps/position"; # hdaps data
my $netwkFN = "/proc/net/wireless";                   # network data
my ($restX, $restY ) = ""; # default position of hdaps sensors
my $SLEEP_INTERVAL = 50000; # microseconds to pause between data reads

# setup the default position of the hdaps sensor values
($restX, $restY ) = readPosition();

while(1)
{
  my ($currX, $currY) = readPosition();
  $currX -= $restX;  # adjust for rest data state
  $currY -= $restY;

  print Time::HiRes::time(), " ", readSignal(), " $currX $currY \n";
  usleep($SLEEP_INTERVAL);
}#end main loop

# begin subroutines

sub readPosition
{
  my ($posX, $posY) = "";
  open(FH," $hdapsFN") or die "can't open hdaps file";
    while(my $hdapsLine = <FH> )
    { 
      $hdapsLine =~ s/(\(|\))//g; # remove parens
      ($posX, $posY) = split ",", $hdapsLine;
    }# while hdaps line read
  close(FH);
  return( $posX, $posY );
}#readPosition

sub readSignal
{ 
  my $sigLev = 0;
  open(FH," $netwkFN") or die "can't open wireless network file";
    while( my $networkLine = <FH> )
    { 
      next unless( /eth/ );
      (undef, undef, undef, $sigLev ) = split " ", $networkLine;
    }# while read
  close(FH);
  return( $sigLev );
}#readSignal

recordData.pl を使用したデータ・ロギング

お使いのネットワーク・カードをアクセス・ポイントに接続できるようにし、コマンド perl recordData.pl | tee logFileN を実行して recordData.pl プログラムを起動してください。起動後の logFile への出力処理は、ユーザーがどのように ThinkPad を持つかによって変わってきます。例えば、データ収集を開始する目的の地点まで歩いて行き、ThinkPad を閉じて本やブリーフケースのように脇に抱えます。その場所で 2 秒以上、止まった後、データ収集の終了地点に向かって通路や廊下を歩きます。データ収集の終了地点でも忘れずに 2 秒以上静止してください。それから、ThinkPad を開いて Ctrl+C で recordData.pl プログラムを停止します。

歩くときは、必ずいつものように歩いてください。ThinkPad を抱えている腕は自由に前後に振って構いません。これらの特徴的な振動が、後で歩き方を示す特徴として検出されることになります。ログ・ファイルは通路ごとに記録し、後で処理しやすいように各ファイルには順番がわかるような名前あるいは番号を付けます。この手順に伴う並行移動や回転運動から歩行動作を分離するには、データ収集の最初と最後の 2 秒間の休止を判別するという方法を採ります。そのため後処理を成功させるには、データ収集を中断する際には動かずにじっと立ってください。リスト 2 は recordData.pl プログラムの出力例で、ここには一般的な歩行セッションでの時間、信号強度、そして X、Y 加速度センサーの測定値が示されています。


リスト 2. recordData.pl の出力例
                
...
1199973721.01845 179.  -15 -140 
1199973721.06944 181.  -11 -141 
1199973721.12043 181.  -8 -139 
1199973721.22242 183.  -4 -139 
...




上に戻る


記録されたデータから歩行動作を抽出する

一般的なデータ収集の実行結果の出力を視覚化するタスクは、データをグラフにするための KDE アプリケーション、kst が得意とするところです。この記事では必要になりませんが、実データや記録されたデータを分析するには kst が欠かせません。kst がインストールされている場合、コマンド kst -y 2 -y 3 -y 4 logFile を実行すれば以下に示すようなグラフを生成することができます。


図 1. kst によるデータ収集の視覚化

図 1 では重要な部分に注釈と四角で印を付けてあり、データ収集に必要な動作が示されています。まずデータ・ロギングの開始、それから「歩行」を開始するための静止位置まで ThinkPad を持って移動します。最初の「静止」状態が記録されると、「歩行」セクションがそれに続きます。その後の残りの時間では「標準」状態 (データ収集をする前の状態) まで戻り、最後にプログラムが手動で停止されます。

関連データ部分の抽出

recordData ログ・ファイルから信号強度グラフを作成する上で最初のステップとなるのは、関連するデータの部分だけを分離することです。リスト 3 に記載する detectEnds.pl プログラムは、データ・ログ・ファイルから静止/歩行/静止の部分だけを出力するように設計されています。

detectEnds.pl は、recordData.pl プログラムによって入力された logFile の各行を読み取ります。2 秒以上 (50,000 マイクロ秒の遅延に基づく 40 以上のサンプル)、Y 加速度センサーの測定値が -100 未満になっているデータがあると、基本的な平均偏差のチェックを行います。このチェックの結果、ゼロに近い平均偏差は静止状態と見なされます。最初の静止状態の後に想定されるのは、測定値の偏差が高い歩行状態です。歩行状態が設定された後、次の静止状態が検出されると detectEnds.pl プログラムは endFile を生成して終了します。このログ・ファイルは最初の logFile と同じフォーマットですが、遥かに多くの有用なデータが含まれます。


リスト 3. ログ・ファイルの関連部分のみを出力する detectEnds.pl
                
#!/usr/bin/perl -w
# detectEnds.pl - find rest/walking/rest section of recordData.pl output
# usage: cat logFile |  detectEnds.pl > endFile
use strict;
my @dataArr = ();
my $maxDeviation = 1;
my $minimumData = 40; # 2 seconds at 20 samples/sec
my $lastMode = "start";

while(my $line = <STDIN> )
{ 
  my( $time, $signal, $x, $y ) = split " ", $line;

  # only process entries where unit is rotated properly
  next if( $y > -100 );

  push @dataArr, $y;  # add to the data sample

  # if at least N seconds or data has been recorded
  next if( @dataArr <= $minimumData );

  # zero deviation is near zero movement (rest), deviation 4 or more is walking
  my $deviation = avgCheck(9) + avgCheck(19) + avgCheck(29) + avgCheck(39);

  if( $deviation == 0 )
  { 
    # first rest, before any other state
    $lastMode = "rest" if( $lastMode eq "start" );

    # terminate if post-walking rest detected
    exit(0) if ( $lastMode eq "walking" );

  }elsif( $deviation >= 4 )
  { 
    # set walking mode on first rest detection
    $lastMode = "walking" if( $lastMode eq "rest" );

  }#check deviation

  shift @dataArr;  # maintain a minimumData size sample
  print $line if( $lastMode eq "rest"  || $lastMode eq "walking" );
}#while line in 

# begin subroutines 

sub avgCheck
{ 
  # build and average of two seconds worth of data, return an integer of it's
  # deviation from the center point
  my $avgIndex = $_[0];
  my $avgArr = 0;
  for my $eachArr ( @dataArr ){ $avgArr += $eachArr };
  $avgArr = $avgArr / ($minimumData+1);

  return(1) if(  abs( $dataArr[$avgIndex] - $avgArr ) > $maxDeviation );
  return(0);
}# avgCheck

コマンド cat logFileN | perl detectEnds.pl > endFileN を実行して、歩行データのみのファイルを作成してください。これで、endFile には加速度センサーと信号強度の関連部分だけが含まれることになり、プログラムの開始と停止に伴う関係のない並行移動や回転運動は省かれます。

レンダリングを効率的にするために、通路データは別に保持しておいてください。例えば通路が 3 つある場合、以下の 1 行によって複数ファイルの処理を自動化することができます。

perl -e 'while($c<3){`cat logFile$c | perl detectEnds.pl > endFile$c`;$c++}'




上に戻る


findStep.pl で歩行動作を識別する

関連するデータ部分は endFile に用意できているので、歩行動作がわかるようにするための処理は遥かに簡単になります。図 2 を見てください。これは kst プログラムによる endFile の処理結果で、この出力から歩行動作がわかります。この図の画像作成の際に使用されるデータ・ファイルを生成するのが、リスト 4 に記載する findStep.pl プログラムです。


図 2. 歩行動作を表す詳細データ


リスト 4. findStep.pl プログラム
                
#!/usr/bin/perl -w 
# findStep.pl - indicate peaks and nadirs (left and right steps) in an endFile
use strict;
die "usage: cat endFile | findStep.pl dataSz lowOrder > steps" unless @ARGV==2;

my $dataSz   = $ARGV[0]; # number of samples to process for a wave
my $lowOrder = $ARGV[1]; # level of modulation that indicates a low order wave
my @lineArr = ();

# read the whole file in to set defaults and compute total data size
while( my $line = <STDIN> )
{
  chomp($line);
  push @lineArr, "default $line -60 -240 ";
}#while stdin

die "specify dataSz at most (totalSampleSize/2)-1" if ( (@lineArr/2)+1 < $dataSz );

my $lineNum = $dataSz; # skip the first N samples (known 'resting' mode)

for( $lineNum = $dataSz; $lineNum < (@lineArr-$dataSz); $lineNum++ )
{
  my ( undef, $time, $signal, $x, $y ) = split " ", $lineArr[$lineNum];

  # require a coffee bender before twitch=step
  next unless ( highOrderWave($lineNum, $y) == 1);

  if( findModulation( "peak", $lineNum, $y ) == (($dataSz*2)+1) )
  {
    $lineArr[$lineNum] =~ s/default/peak   /i;
    $lineArr[$lineNum] = "peak $time $signal $x $y $y -240";
  }elsif( findModulation( "nadir", $lineNum, $y ) == (($dataSz*2)+1) )
  {
    $lineArr[$lineNum] =~ s/default/nadir  /i;
    $lineArr[$lineNum] = "nadir $time $signal $x $y -60 $y";
  }#if peak or nadir detected

}#for each linearr

for my $lineItem( @lineArr ){ print "$lineItem\n" }

findStep.pl には以下の 2 つのパラメーターが必要です。

  • dataSz' - グラフに含める最小データ・ポイント数
  • lowOrder' - 変調を「一歩」と見なす条件とする下限しきい値

データ・コレクターの歩き方や ThinkPad の持ち方によっては、上記の変数をいろいろ試してみる必要があります。また、recordData および detectEnds のサンプル・サイズを変更する場合は、この 2 つの変数の変更も併せて考慮しなければなりません。プログラムがファイルの内容を読み込んでデータ全体のサイズを判断し、さらにデフォルト値を設定すると、歩行セクションの各データ・ポイントが処理されます。この際、2 つのチェックが行われます。1 つは十分な振幅変調であると判断するためのチェック、そしてもう 1 つは変調のタイプを検出するためのチェックです。極大値または極小値が検出されると、その特定のエントリーは文字列識別子とともに設定され、処理が終わった時点ですべてのエントリーが出力されます。


リスト 5. highOrderWave サブルーチン
                
sub highOrderWave
{   
  my(  $startVal, $currY ) = @_;
  my $avgSize = 0;
  
  # for selected sample size before and after current position, build average
  for( my $pos = ($startVal-$dataSz); $pos <= ($startVal+$dataSz); $pos++ )
  { 
    my ( undef, undef, undef, undef, $checkY ) = split " ", $lineArr[$pos];
    $avgSize += $checkY;
  }#for each position dataSz before and after
  
  $avgSize = $avgSize / (($dataSz*2)+1);
  $avgSize = abs($avgSize - $currY);
  
  return(0) if( $avgSize <  $lowOrder );
  return(1);

}#highOrderWave

リスト 5 に、highOrderWave での振幅変調チェックの詳細を示します。もう 1 つの基本的な平均チェック・アルゴリズムとして実装する highOrderWave は、データ・サンプルのすべての項目と現行の項目との偏差を計算するに過ぎません。偏差が lowOrder パラメーターの値より大きい場合には関数が true を返し、続いてメイン・プログラム・ロジックで変調の極大値または極小値の処理が行われます。小さな振幅の変調が起こっているのは、カフェイン中毒のプログラマーたちの場合は、静止状態の期間中であろうと、歩行動作を開始する前の体重移動の期間中であろうと同じです。findModulation サブルーチンが最も明白な変調だけを検出できるようにするには、上記の lowOrder 変数を以下のように大きくしてください。


リスト 6. findModulation サブルーチン
                
sub findModulation
{ 
  my( $peakType, $startVal, $currY ) = @_;
  my $totalMatch = 0;

  # for selected sample size before and after current position
  for( my $pos = ($startVal-$dataSz); $pos <= ($startVal+$dataSz); $pos++ )
  { 
    # stop checking if a previous modulation found nearby
    return(0) if( $lineArr[$pos] =~ /$peakType/ );

    my ( undef, undef, undef, undef, $checkY ) = split " ", $lineArr[$pos];

    if( $peakType eq "peak" ){     $totalMatch++ if( $checkY <= $currY ); }
    elsif( $peakType eq "nadir" ){ $totalMatch++ if( $checkY >= $currY ); }

  }#for each position dataSz before and after

  return( $totalMatch );

}#findModulation

極大と極小を繰り返す振動パターンを示すデータ・ポイントの集合が与えられれば、極大の値を持つポイントと極小の値を持つポイントはその付近の値を測定することで比較的簡単に抽出することができます。現行のサンプル内の各データ・ポイントに対して、findModulation はまず、前に極大値または極小値と判断されたデータがサンプルの範囲内にあるかどうかをチェックします。このチェックによって、近接したポイントでしゃっくりなどの振動を検出することで変調ポイントが集まってしまうのを防ぎます。「極大値」チェックが指定されている場合、findModulation は現行のデータ・ポイントの信号強度以下の値を持つポイント数をカウントします。極小値チェックの場合はその逆で、現行データ・ポイントの信号強度以上の値を持つポイント数の合計が findModulation サブルーチンによって返されます。findModulation からの戻り値が合計サンプル・サイズと比較されていた、リスト 4 を思い出してください。現行データ・ポイントの信号強度以下の値を持つポイント数がサンプル・サイズと同じであれば極大値と判断され、その現行データ・ポイントの信号強度以上の値を持つポイント数がサンプル・サイズと同じであれば極小値として設定されるというわけです。

歩行の極大値および極小値に関する情報を含めたファイルを生成するには、コマンド cat endFileN | perl findStep.pl 3 5 > stepFileN を実行します。筆者のデータ収集ファイルでは、dataSz には 3、lowOrder には 5 の値が有効に働きます。これで、stepFileN には画像レンダリング・プロセスを開始するのに必要な最終情報が含まれていることになります。




上に戻る


記録されたデータから信号強度をレンダリングする

青写真の選択、通路開始地点の特定

歩行情報とそれに対応する無線信号の情報を切り出したデータ・ファイルは用意できています。このデータを一連の有用な基準ポイント上に表すには、ビルの見取り図が最適です。青写真の画像を手書きの図にしても上手くいきますが、レンダリング・プログラムの場合、サイズは一定にしておく必要があります。この例で使用する図はいずれも長方形をしており、ビルの構成部分は画像全体で同じ形になっています。ビルの形が不規則な場合には (L 字型の見取り図など)、図に表現する部分を、該当する通路のデータ収集に合わせて一定のセクションに分割する必要があります。

見取り図の例については、図 3 の一番左の図を参考にしてください。ここで注目すべき点は、背景と画像を囲む枠です。この 2 つによって、レンダリングと合成が遥かに効果的になります。この画像ではレンダリング・プログラムに渡す、通路の開始地点を特定する必要があります。例えば、Gimp で青写真の画像ファイルを開いて通路データの収集開始地点にカーソルを重ねると、通路は位置 44,30 から始まることがわかります。開始地点のリストは、データを収集した通路ごとに準備してください。

rowRender.pl プログラムと設計決定

rowRender.pl プログラムとその他の例についての説明を続ける前に、この実装に選んだレンダリング手法について触れておかなければなりなりません。C および Perl API には、gd パッケージに対していくつかの制約があるようで、選択したオプションや指定したパラメーターとは関係なく、アルファブレンディングを有効にした円を描画することができません。この制約を取り除く最も簡単な方法は、ImageMagick の convert コマンドを使って、すべての地理的基本情報をコマンド・ラインで描画することです。rowRender.pl プログラムは単純に実行対象である ImageMagick の長々とした convert コマンドを作成し、これらのコマンドを塊で実行して目的の出力を生成します。


リスト 7. rowRender.pl プログラム - メイン・ロジック
                
#!/usr/bin/perl -w
# rowRender.pl - draw alpha blended signal strength circles at each step
use strict;
die "usage: cat steps | rowRender.pl inImg outImg stX stY size" unless @ARGV==5;
my $alpha = 220;      # alpha color blending for signal circles
my @steps = ();       # signal measurements
my $cmd = "convert "; # beginning of ImageMagick command
my ($inFile, $outFile, $startX, $startY, $dotSize) = @ARGV; # input, output files

# pre-compute the number of steps
while(my $line = <STDIN>)
{
  my( undef, undef, $signal, undef, undef) = split " ", $line;
  push @steps, $signal  if( $line =~ /(peak|nadir)/ );
}#while stdin

# assumes consistent width through entire image
my( undef, undef, $width ) = split " ", `identify $inFile`;
$width = substr($width, 0, index($width,"x"));
$width = $width - ($startX * 2);   # right image border compensation

# set stepSize manually for blueprint images with irregular borders, an 'L'
# shaped building for example
my $stepSize = $width / @steps;

for( my $lineNum = 0; $lineNum < @steps; $lineNum++ )
{
  $cmd .= qq{ -fill "rgba(} . computeColor($steps[$lineNum]) . qq{,$alpha)" };
  $cmd .= qq( -draw 'circle $startX,$startY, );
  $cmd .= ($startX + $dotSize) . "," . ($startY + $dotSize) . qq(' \\\n);

  runCommand() if( $lineNum % 50 == 0 );
  $startX += $stepSize;

}#for each step

runCommand();

rowRender.pl は、青写真や図などの入力画像、そして出力画像の名前が指定されることを前提としています。startX パラメーターと startY パラメーターは通路の開始座標で (レンダリングはすべて左から右の方向で行われます)、dotSize パラメーターは一歩ごとに描画するアルファブレンディングを有効にした円の直径です。

合計歩数が計算されると、ImageMagick 識別プログラムによってレンダリングする画像の幅が決定されます。rowRender は各通路の全長を往復すること、そして画像全体にわたって均一に歩行動作が分布されることを前提とします。このように間隔が均一の歩行それぞれに対し、信号強度に基づいてアルファ配合の円を描画するためのコマンドが作成されます。リスト 8 に記載する computeColor は表示する色のレベルを決定し、一方の runCommand が作成されたコマンドをそのまま実行します。


リスト 8. rowRender.pl の computeColor サブルーチン
                
sub computeColor
{ 
  # simplistic computation of custom color range based on signal levels
  my $signal = $_[0];

  my $color = qq(255,140,10); # default orange
  if( $signal >= 197 && $signal < 207  )
  {
    $color = abs( $signal - 207 );
    $color = $color * 8;           # intervals of 10
    $color = $color + 175;         # starting at green 175
    $color = qq(59,$color,10);

  }elsif( $signal >= 189 && $signal < 197 )
  {
    $color = abs( $signal - 197 );
    $color = $color * 18;          # 10 intervals
    $color = $color + 75;          # starting at red 75
    $color = qq($color,234,39);

  }elsif( $signal >= 181 && $signal < 189 )
  {
    $color = abs( $signal - 189 );
    $color = $color * 15;          # 10 intervals
    $color = $color + 124;         # starting at green 124
    $color = qq(255,$color,10);
  }
  return($color);
}#computeColor

sub runCommand
{
  $cmd = `$cmd $inFile $outFile`;
  $inFile = "$outFile"; # use output as input for multi-pass image writing
  $cmd = qq( convert );
}#runCommand

上記に示すように、信号強度の 4 つの範囲が任意に選択され、赤 (<181)、オレンジ (181-188)、黄 (189-196)、緑 (197-207) に対応付けられています。信号レベルがいずれかの色の分類範囲に振り分けられると、それに基づいて該当する色の値が選択されます。これらの値を最初の一歩で収集された信号強度データに基づいて変更しなければならないことは、ほぼ確実でしょう。この例での色の選択アルゴリズムは、信号強度の違いをレンダリングする単純な例です。

最終画像のレンダリング

コマンド cat steps | perl rowRender.pl bluePrint.png out.png 44 20 30 を実行して、単一の通路データをレンダリングした図を作成します。Gimp 画像エディターから決定した開始 X,Y 座標は、その特定の通路に対するデータ収集の開始地点を表すことを思い出してください。複数の通路データがある場合は、以下のような該当通路の開始 X,Y 座標を使用してファイルを作成するのも一考です。


リスト 9. バッチ・コマンドによるレンダリング例
                
cat steps0 |perl rowRender1.pl bluePrint.png out.png 20 44 30
cat steps1 |perl rowRender1.pl out.png out.png       20 74 30
cat steps2 |perl rowRender1.pl out.png out.png       20 99 30
..
cat stepsN |perl rowRender1.pl out.png done.png      X  Y  dotSize

アルファブレンディングのアルファ値を変更して背景図を見やすくするという場合も考えられます。白の背景色で青写真ファイルを作成してあれば、最終的なオーバーレイは ImageMagick で簡単に仕上げることができます。リスト 10 に示すように、convert および composite コマンドを使用すると、青写真の可視の部分だけを信号強度をレンダリングしたものに簡単にオーバーレイすることができます。


リスト 10. ImageMagick コマンドによる最終画像の処理
                
convert -transparent "#FFFFFF" bluePrint.png transparent.png
composite -compose over transparent.png done.png finalImg.png

図 3 に、上記にリストした歩行レンダリングの出力例を記載します。


図 3. 歩行合成画像のレンダリング




上に戻る


まとめとその他の例

この記事で紹介した手法とコードを使えば、今までのように一旦止まってクリックするという方法より遥かに効率的に無線信号の強度を測定することができます。ビルの複数階や広大なオープン・スペース (倉庫、製造施設など) のマップでも、歩く速度とほとんど同じ速さで作成することが可能です。このような信号強度の情報があれば、より効率的にサイト・アクセス・ポイントを分散させることで、ワイヤレス・ネットワークの速度とカバレッジを改善できるはずです。

さらに踏み込んで調査するには、gpsd と kismet を使用して歩行動作を検出するコードを統合し、一段と詳細な広域ネットワークのマッピングを設定することも考えられます。無線カードの機能を最大限に活用して、複数のアクセス・ポイントから同時に信号強度をマッピングしてください。





上に戻る


ダウンロード

内容ファイル名サイズダウンロード形式
Sample codeos-wirelesssitesurveyofficeSignalMaps0.1.zip17KBHTTP
ダウンロード形式について


参考文献

学ぶために

製品や技術を入手するために
  • CPAN から Time::HiRes モジュールを入手してください。

  • Linux カーネル・ダウンロード・ミラーの詳細を読んで HDAPS を入手してください。

  • Gimp 画像処理ソフトウェアをダウンロードして、その詳細を学んでください。Windows®、Mac OS X、そしてさまざまな UNIX® フレーバーに対応したダウンロードが用意されています。

  • ImageMagick は、ビットマップ画像を作成、編集、合成するためのソフトウェア・スイートです。Windows、Mac OS X、さらに多数の UNIX フレーバーに対応します。

  • Perl.org から Perl を入手してください。

  • IBM ソフトウェアの試用版を使用して、次のオープン・ソース開発プロジェクトを革新してください。ダウンロード、あるいは DVD で入手できます。

  • IBM 製品の評価版をダウンロードして、DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を使ってみてください。


議論するために


著者について

Nathan Harrington

Nathan Harrington は IBM のプログラマーで、現在は Linux とリソース探索技術に取り組んでいます。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



はいいいえわからない
 


 


12345
不充分・不完全である大変素晴らしい
 


上に戻る


    日本IBMについて プライバシー お問い合わせ