<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Kosaka laboratory Interactive System　tips</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/" />
    <link rel="self" type="application/atom+xml" href="http://www.kosaka-lab.com/tips/atom.xml" />
    <id>tag:www.kosaka-lab.com,2009-01-08:/tips//11</id>
    <updated>2012-01-24T12:25:14Z</updated>
    <subtitle>このページではインタラクティブシステムを制作する上の技術的要素を紹介します。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Commercial 4.22-ja</generator>

<entry>
    <title>WPF XPスタイルを有効にする</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2012/01/wpf-xp.php" />
    <id>tag:www.kosaka-lab.com,2012:/tips//11.899</id>

    <published>2012-01-24T12:16:21Z</published>
    <updated>2012-01-24T12:25:14Z</updated>

    <summary>せっかくWPFのデザインをカスタマイズしても標準コントロールの見た目は変わってく...</summary>
    <author>
        <name>笹山裕輔</name>
        
    </author>
    
        <category term="WPF" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[せっかくWPFのデザインをカスタマイズしても標準コントロールの見た目は変わってくれません。<br />それどころかWPFではXPスタイル（ルナ）すら標準では適応されていません。<br /><br />XPスタイルを有効にする方法を解説します。<br /><br />

<img src="http://www.kosaka-lab.com/tips/wpf/wpf_02_00.jpg" />

<h6><br /></h6><p>XPスタイルを有効にするにはマニフェストファイルを編集する必要があるので、これを開きます。</p><p><br /></p><p>ソリューションエクスプローラーで、ファイルをすべて表示するボタンを押してから、MyProjectのapp.manifestを開きます。</p><p><br /></p>
<br /> <img src="http://www.kosaka-lab.com/tips/wpf/wpf_02_01.jpg" /><br /><br />下記のエリアのコメントアウトを解除します。<br /><br /><br />
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">   &lt;dependency&gt;
    &lt;dependentAssembly&gt;
      &lt;assemblyIdentity
          type=<span class="str">"win32"</span>
          name=<span class="str">"Microsoft.Windows.Common-Controls"</span>
          version=<span class="str">"6.0.0.0"</span>
          processorArchitecture=<span class="str">"*"</span>
          publicKeyToken=<span class="str">"6595b64144ccf1df"</span>
          language=<span class="str">"*"</span>
        /&gt;
    &lt;/dependentAssembly&gt;
  &lt;/dependency&gt;</pre>
<img src="http://www.kosaka-lab.com/tips/wpf/wpf_02_02.jpg" /><br /><br />これでXPスタイルが適応されます。<br /><br />標準状態のメッセージボックス<br /><br /><img src="http://www.kosaka-lab.com/tips/wpf/wpf_02_03.jpg" /><br /><br /><br />XPスタイルを適応<br /><br /><img src="http://www.kosaka-lab.com/tips/wpf/wpf_02_00.jpg" />]]>
        
    </content>
</entry>

<entry>
    <title>WPF アニメーション 1フレームごとの処理</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2012/01/wpf-1.php" />
    <id>tag:www.kosaka-lab.com,2012:/tips//11.898</id>

    <published>2012-01-24T10:11:03Z</published>
    <updated>2012-01-25T10:39:10Z</updated>

    <summary>WPFでアニメーションを扱う際にはthicknessanimationやdoub...</summary>
    <author>
        <name>笹山裕輔</name>
        
    </author>
    
        <category term="WPF" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[WPFでアニメーションを扱う際にはthicknessanimationやdoubleanimation等を使用するのが一般的ですが、これらは開始地点から終了地点まで一定の速度でカウントするアニメーションです。<br /><br />例 ウインドウのフェードイン<br /><br /><br />

<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">        <span class="kwrd">Dim</span> da = <span class="kwrd">New</span> System.Windows.Media.Animation.DoubleAnimation
        da.From = 0.0
        da.<span class="kwrd">To</span> = 1.0
        da.Duration = <span class="kwrd">New</span> TimeSpan(0, 0, 0, 0, 300)
        <span class="kwrd">Me</span>.BeginAnimation(Window.OpacityProperty, da)</pre>

ある時点では別の値を出したり、公式を与えて数値を出すようなアニメーションには使用できません。
そこで1フレームごとに処理を行うイベントを使用します。<br /><h6 id="page-title-date">サンプル</h6><br /><br />
WPFFrameAnimationというWPFアニメーションを作成し、適当な画像ファイルをプロジェクトに追加します。
<h6 id="page-title-date">XAML</h6>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">&lt;Window x:<span class="kwrd">Class</span>=<span class="str">"WPFFrameAnimation.MainWindow"</span>
        xmlns=<span class="str">"http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span>
        xmlns:x=<span class="str">"http://schemas.microsoft.com/winfx/2006/xaml"</span>
        Title=<span class="str">"MainWindow"</span> Height=<span class="str">"350"</span> Width=<span class="str">"525"</span> Loaded=<span class="str">"Window_Loaded"</span>&gt;
    &lt;Grid Name=<span class="str">"gridMain"</span>&gt;
        &lt;Image HorizontalAlignment=<span class="str">"Left"</span> Name=<span class="str">"Image1"</span> Stretch=<span class="str">"Uniform"</span> VerticalAlignment=<span class="str">"Top"</span> Source=<span class="str">"/WPFFrameAnimation;component/kosaka_logo.jpg"</span> Margin=<span class="str">"106,80,0,0"</span> Width=<span class="str">"100"</span> Height=<span class="str">"100"</span> /&gt;
    &lt;/Grid&gt;
&lt;/Window&gt;</pre>

<h6 id="page-title-date">C#</h6>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.Collections.Generic;
<span class="kwrd">using</span> System.Linq;
<span class="kwrd">using</span> System.Text;
<span class="kwrd">using</span> System.Windows;
<span class="kwrd">using</span> System.Windows.Controls;
<span class="kwrd">using</span> System.Windows.Data;
<span class="kwrd">using</span> System.Windows.Documents;
<span class="kwrd">using</span> System.Windows.Input;
<span class="kwrd">using</span> System.Windows.Media;
<span class="kwrd">using</span> System.Windows.Media.Imaging;
<span class="kwrd">using</span> System.Windows.Navigation;
<span class="kwrd">using</span> System.Windows.Shapes;
 
<span class="kwrd">namespace</span> WPFFrameAnimation
{
    <span class="rem">/// &lt;summary&gt;</span>
    <span class="rem">/// MainWindow.xaml の相互作用ロジック</span>
    <span class="rem">/// &lt;/summary&gt;</span>
    <span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> MainWindow : Window
    {
        <span class="kwrd">private</span> System.Diagnostics.Stopwatch Sw = <span class="kwrd">new</span> System.Diagnostics.Stopwatch();
 
        <span class="kwrd">public</span> MainWindow()
        {
            InitializeComponent();
        }
 
        <span class="kwrd">private</span> <span class="kwrd">void</span> Window_Loaded(<span class="kwrd">object</span> sender, RoutedEventArgs e)
        {
            <span class="kwrd">this</span>.Sw.Start();
            <span class="rem">//イベント登録</span>
            CompositionTarget.Rendering += <span class="kwrd">new</span> EventHandler(CompositionTarget_Rendering);
        }
 
        <span class="kwrd">void</span> CompositionTarget_Rendering(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="rem">//---------------------</span>
            <span class="rem">//回転</span>
            <span class="rem">//---------------------</span>
            <span class="rem">//原点</span>
            <span class="rem">//Gridの描画サイズから中心点の計算</span>
            <span class="kwrd">int</span> GenX = (<span class="kwrd">int</span>)gridMain.RenderSize.Width / 2;
            <span class="kwrd">int</span> GenY = (<span class="kwrd">int</span>)gridMain.RenderSize.Height / 2;
 
            <span class="rem">//最初の位置</span>
            <span class="kwrd">double</span> P_X = 0;
            <span class="kwrd">double</span> P_Y = 100;<span class="rem">//回転半径になる</span>
            <span class="rem">//最終的な座標を入れる変数</span>
            <span class="kwrd">double</span> X, Y;
 
            <span class="rem">//回転角度</span>
            <span class="rem">//1秒で1回転</span>
            <span class="kwrd">double</span> Rot = (Sw.Elapsed.TotalMilliseconds / 1000.0 * 360.0) * Math.PI / 180.0;
 
            <span class="rem">//回転</span>
            X = (P_X * Math.Cos(Rot)) - (P_Y * Math.Sin(Rot));
            Y = P_X * Math.Sin(Rot) + P_Y * Math.Cos(Rot);
 
 
            <span class="rem">//原点分をプラスする</span>
            X = X + GenX;
            Y = Y + GenY;
 
 
            <span class="rem">//座標を指定</span>
            <span class="rem">//画像のサイズ分位置を減らす</span>
            Thickness tk = <span class="kwrd">new</span> Thickness(X - Image1.RenderSize.Width / 2.0, Y - Image1.RenderSize.Height / 2.0, 0, 0);
 
            Image1.Margin = tk;
        }
    }
}</pre>
<h6 id="page-title-date">VB.NET</h6>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><span class="kwrd">Namespace</span> WPFFrameAnimation
 
 
    <span class="kwrd">Class</span> MainWindow
        <span class="kwrd">Private</span> Sw <span class="kwrd">As</span> <span class="kwrd">New</span> Stopwatch
 
        <span class="kwrd">Private</span> <span class="kwrd">Sub</span> MainWindow_Loaded(<span class="kwrd">ByVal</span> sender <span class="kwrd">As</span> <span class="kwrd">Object</span>, <span class="kwrd">ByVal</span> e <span class="kwrd">As</span> System.Windows.RoutedEventArgs) <span class="kwrd">Handles</span> <span class="kwrd">Me</span>.Loaded
            <span class="kwrd">Me</span>.Sw.Start()
            <span class="rem">'イベント登録</span>
            <span class="kwrd">AddHandler</span> CompositionTarget.Rendering, <span class="kwrd">AddressOf</span> CompositionTarget_Rendering
        <span class="kwrd">End</span> <span class="kwrd">Sub</span>
 
 
        <span class="kwrd">Public</span> <span class="kwrd">Sub</span> CompositionTarget_Rendering(<span class="kwrd">ByVal</span> sender <span class="kwrd">As</span> <span class="kwrd">Object</span>, <span class="kwrd">ByVal</span> e <span class="kwrd">As</span> EventArgs)
            <span class="rem">'---------------------</span>
            <span class="rem">'回転</span>
            <span class="rem">'---------------------</span>
            <span class="rem">'原点</span>
            <span class="rem">'Gridの描画サイズから中心点の計算</span>
            <span class="kwrd">Dim</span> GenX <span class="kwrd">As</span> <span class="kwrd">Integer</span> = gridMain.RenderSize.Width / 2
            <span class="kwrd">Dim</span> GenY <span class="kwrd">As</span> <span class="kwrd">Integer</span> = gridMain.RenderSize.Height / 2
 
            <span class="rem">'最初の位置</span>
            <span class="kwrd">Dim</span> P_X <span class="kwrd">As</span> <span class="kwrd">Double</span> = 0
            <span class="kwrd">Dim</span> P_Y <span class="kwrd">As</span> <span class="kwrd">Double</span> = 100 <span class="rem">'回転半径になる</span>
 
            <span class="rem">'最終的な座標を入れる変数</span>
            <span class="kwrd">Dim</span> X <span class="kwrd">As</span> <span class="kwrd">Double</span>
            <span class="kwrd">Dim</span> Y <span class="kwrd">As</span> <span class="kwrd">Double</span>
 
            <span class="rem">'回転角度</span>
            <span class="rem">'1秒で1回転</span>
            <span class="kwrd">Dim</span> Rot <span class="kwrd">As</span> <span class="kwrd">Double</span> = (Sw.Elapsed.TotalMilliseconds / 1000.0 * 360.0) * Math.PI / 180.0
 
            <span class="rem">'回転</span>
            X = (P_X * Math.Cos(Rot)) - (P_Y * Math.Sin(Rot))
            Y = P_X * Math.Sin(Rot) + P_Y * Math.Cos(Rot)
 
            <span class="rem">'原点分をプラスする</span>
            X = X + GenX
            Y = Y + GenY
 
            <span class="rem">'座標を指定</span>
            <span class="rem">'画像のサイズ分位置を減らす</span>
            <span class="kwrd">Dim</span> tk <span class="kwrd">As</span> <span class="kwrd">New</span> Thickness(X - Image1.RenderSize.Width / 2.0, Y - Image1.RenderSize.Height / 2.0, 0, 0)
            Image1.Margin = tk
        <span class="kwrd">End</span> <span class="kwrd">Sub</span>
    <span class="kwrd">End</span> <span class="kwrd">Class</span>
<span class="kwrd">End</span> Namespace</pre>

<h6 id="page-title-date">解説</h6>

<img src="http://www.kosaka-lab.com/tips/wpf/wpf_anime1.jpg" /><br /><br />1秒でウインドウの内部を画像が一周するサンプルです。<br />三角関数を用いて2次元の点を回転させる際は<br />X' = X cos θ - y sin θ<br />Y' = Y sinθ + y cosθ<br /><br />の計算を行う必要があります。<br />これをdoubleanimationで実装するのは無理なので、CompositionTarget.Renderingイベントを用います。<br />CompositionTarget.RenderingはWPFアプリケーションの画面が更新されるごとに発生するイベントです。タイマーを用いて定期的に描画を繰り返すとWPFではカクカクな動作になってしまいますが、このイベントではそのようなことは起こりません。<br />Stopwatchを用いて経過時間を計測し、位置を計算、ImageのMarginに座標を指定しています。<br />]]>
        
    </content>
</entry>

<entry>
    <title>座標変換と角度の話</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/12/post-10.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.890</id>

    <published>2011-12-22T12:11:13Z</published>
    <updated>2011-12-22T14:27:52Z</updated>

    <summary>    このエントリはKINECT SDK Advent Calendar : ...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="KINECT SDK Advent Calendar 2011" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="座標変換と角度の話" label="座標変換と角度の話" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[    <font class="Apple-style-span" style="font-size: 1.25em; ">このエントリは<a href="http://atnd.org/events/22723">KINECT SDK Advent Calendar : ATND</a>の12月22分です。</font><div><font class="Apple-style-span" size="3"><br /></font></div><div><font size="3"><br /></font></div><div><div>Kinectで得られる骨格情報は三次元座標です。</div><div>3Dのアプリケーションを作る場合は３次元の情報でなければいけませんが、</div><div>2Dのアプリケーションを作る場合は２次元の情報だけで十分です。</div><div><br /></div><div>３次元から２次元座標への変換は簡単です。Z座標を捨てるだけで問題ありません。</div><div>しかし、Kinectで得られた実画像とのマッチングなどを行いたい場合、</div><div>原点(0,0)が左上の座標系に変換する必要があります。</div><div><br /></div><div>ここでは３次元座標を2次元座標への変換方法について解説します。</div><div><br /></div><div>Kinecで得られる３次元座標の(X,Y）は -1.0～+1.0の範囲です。</div><div>X軸の -1.0～+1.0の範囲を変換画像の横幅(0～320)に変換し</div><div>Y軸の -1.0～+1.0の範囲を変換画像の横幅(0～240)に変換する必要があります。</div><div><!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">    <span class="kwrd">float</span> vx,vy;
    <span class="rem">//座標取得</span>
    nui.SkeletonEngine.SkeletonToDepthImage(joint.Position, <span class="kwrd">out</span> vx, <span class="kwrd">out</span> vy);
    <span class="rem">//座標変換</span>
    <span class="rem">//convert to 320, 240 space</span>
    vx = Math.Max(0, Math.Min(vx * 320, 320));
    vy = Math.Max(0, Math.Min(vy * 240, 240));</pre>
これだけで、簡単に変換することが可能になります。</div><div>変換後のサイズを640x480にしたければ</div><div><br /></div>


<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">    vx = Math.Max(0, Math.Min(vx * 640, 640));
    vy = Math.Max(0, Math.Min(vy * 480, 480));
</pre>
<div>にするだけです。</div><div><br /></div><div><br /></div><div>　次に、各関節の角度を求めたいと想います。</div><div>例えば首の傾きの角度を求めることもでききます。</div><div>角度を求めるには、２点間のX,Yの差を求め、その値を逆正接（アークタンジェント）を求めれば２点間の角度を求めることができます。</div><div><br /></div>


<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><span class="rem">//角度を求める</span>
 Vector2 V_A; <span class="rem">//Aの座標</span>
 Vector2 V_B; <span class="rem">//Bの座標</span>
 <span class="kwrd">float</span> dx = V_A.X - V_B.X; <span class="rem">//X座標の差を求める</span>
 <span class="kwrd">float</span> dy = V_A.Y - V_B.Y; <span class="rem">//Y座標の差を求める</span>
 
 <span class="kwrd">double</span> angle = Math.Atan2(dx,dy); <span class="rem">//角度が求まる</span></pre>




<div><br /></div><div>これだけです。簡単ですね。</div><div>中学校の教科書を見たら乗ってますし、改めて復習しなくても、「こういうもんだ」と覚えてしまっても良いです。</div><div><br /></div></div>]]>
        
    </content>
</entry>

<entry>
    <title>Kinect制御　Kinectの角度を変更する</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/12/kinect-kinect.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.889</id>

    <published>2011-12-15T06:56:31Z</published>
    <updated>2011-12-15T07:07:29Z</updated>

    <summary>   このエントリはKINECT SDK Advent Calendar : A...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="KINECT SDK Advent Calendar 2011" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="kinect制御kinectの角度を変更する" label="Kinect制御 Kinectの角度を変更する" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[   <font class="Apple-style-span" style="font-size: 1.25em; ">このエントリは<a href="http://atnd.org/events/22723">KINECT SDK Advent Calendar : ATND</a>の12月15分です。</font><div><font class="Apple-style-span" size="3"><br /></font>　Kinectには上下のみですが首振り機能があります。</div><div>&nbsp;XBOXを持っていないので詳細は分かりませんが、ゲーム起動時にキャリブレーションとして上下に動くとのことです。&nbsp;
</div><div><br /></div><div>　この機能を用いることで、ユーザがKinectの前に寄り過ぎた時などに、上下方向に動かすことによって計測精度を上げることができます。&nbsp;
</div><div><br /></div><div>　ElevationAngle関数を用いることでKinectの上下方向を任意の角度に変更することができます。</div><div><br /></div><div><br /></div><div>&nbsp;カメラの角度を0度。水平にしたければ、</div><div>

<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">
<span class="kwrd">this</span>.kinect.NuiCamera.ElevationAngle= 0;  <span class="rem">// 0度に設定 </span>

</pre>
</div><div><br /></div><div>&nbsp;カメラの角度を方向20度にしたければ、&nbsp;</div><div>

<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"> 
<span class="kwrd">this</span>.kinect.NuiCamera.ElevationAngle= 20; <span class="rem">// 20度に設定 </span>

</pre></div><div><br /></div><div>&nbsp;カメラの角度を下方向-20度にしたければ、&nbsp;</div><div>


<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">
<span class="kwrd">this</span>.kinect.NuiCamera.ElevationAngle= -20; <span class="rem">//-20度に設定</span>

</pre></div><div>&nbsp;&nbsp;</div><div>但し、可動できる角度は-27度～+27度の範囲までです。</div><div>&nbsp;それ以外の角度を入力すると、例外「System.ArgumentOutOfRangeException」が発生します。&nbsp;
</div><div><br /></div><div>また、角度を設定して、その角度に到達する前に次の角度を設定すると、例外「System.InvalidOperationException」が発生します。&nbsp;</div><div><br /></div><div>そのため、設定後、一定の時間、次の入力を受け付けないようにするか、try～cathで例外を無視する方法をおすすめします。&nbsp;</div><div><br /></div><div>&nbsp; この上下方向の角度を用いると
<a href="http://www.kosaka-lab.com/tips/2011/06/kinect-sdk-xna-3.php">常に左手を追跡するようなプログラム</a>なども簡単に作ることができます。&nbsp;また、Kinectの下にサーボモータで動く雲台を作ることによって左右方向にもKinectを移動させることもできます。&nbsp;</div><div>　さらに、<a href="http://www.kosaka-lab.com/tips/2011/07/kinect-sdkkinecttank.php">車に搭載</a>したり、ルンバに搭載することで自走するKinectなども作ることができます。</div>]]>
        
    </content>
</entry>

<entry>
    <title>Kinectを騙す　赤外線ウォール</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/12/kinect-2.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.888</id>

    <published>2011-12-14T03:14:21Z</published>
    <updated>2011-12-13T04:12:44Z</updated>

    <summary> このエントリはKINECT SDK Advent Calendar : ATN...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="KINECT SDK Advent Calendar 2011" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="kinectを騙す　赤外線ウォール" label="Kinectを騙す　赤外線ウォール" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[ <font class="Apple-style-span" style="font-size: 1.25em; ">このエントリは<a href="http://atnd.org/events/22723">KINECT SDK Advent Calendar : ATND</a>の12月14日分です。</font><br />



&nbsp;<div>&nbsp;ノイズの少ない固定空間でKinectを使っている場合は良いでしょうが、狭い場所や、展示会などでKinectの作品を展示するには注意が必要です。背景や照明環境などでKinectの認識精度が低下します。</div><div>&nbsp;展示会場を想像してください。Kinectを展示会場に設置した場合、大抵、ユーザは通路側に立ちます。ブースにに人が少なければ良いのですが、混んでくると見学者や体験待ちの人がワラワラと、体体験者と共にKinectに映ることになります。Kinectはどのユーザを認識するでしょうか？かならず手前のユーザから認識してくれるとは言えません。また、体験者を認識していても、ちょっとした瞬間に後ろのユーザにボーン情報を奪われるということも考えられます。</div><div>　展示中にそうなった時、どうしますか？後ろの見学者に「邪魔だからどいてください」なんて言えませんよね？</div><div><br /></div><div>　そこで、赤外線ウォールの登場です。</div><div>Kinectは赤外線プロジェクタを用いて奥行き情報を取得しています。赤外線プロジェクタで投影した赤外線タグが、物体に投影されます。その投影された赤外線タグを赤外線カメラで取得して、奥行き情報を取得しています。その投影された赤外線タグを消してしまうことができれば、Kinectを騙すことができます。</div><div><br /></div><div>　光とは電磁波とされています。</div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="KinectIR.jpg" src="http://www.kosaka-lab.com/tips/2011/12/13/KinectIR.jpg" width="640" height="121" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div>光の波長の長さによって、X線、紫外線、可視光、赤外線、マイクロ波・・・に分類されます。</div><div>個人差はありますが、おおよそ380nm～780nmが私たち人間が見える色「可視光」になります。そして、380nmより小さい値、つまり紫の領域より外の領域を「紫外線」。780nmより大きい値、つまり赤の領域より外の領域を「赤外線」と呼んでいます。</div><div><br /></div><div>　赤外線にも２つに分けることができます。近赤外と遠赤外です。Kinectの赤外線プロジェクタ（左のレンズ）を覗いてみると、ほんのり赤く光っているのが見えるかと思います。見える光に近いということでKinectの赤外線は近赤外であるということがわかります。調べてみると、Kinectの赤外線は830nm付近だということが分かりました。</div><div><br /></div><div><br /></div><div><br /></div><div>　Kinectの赤外線プロジェクタで投影されたタグを、この830nm付近の赤外線で打ち消す消すことができれば、「そこには何もない」とKinectを騙すことができます。</div><div><br /></div><div><br /></div><div>　近赤外の赤外線投光機を<a href="http://www.kosaka-lab.com/tips/2011/09/kinect-sdkled2.php">作ってみました</a>。</div><div><br /></div>
<center>
<img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/IIR02.jpg" width="300" />
<img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/IIR03.jpg" width="300" />
</center>

<div><br /></div><div>　実際に投影してみると</div>
<center>

<iframe width="425" height="349" src="http://www.youtube.com/embed/C87VcCYVBr0?hl=ja&amp;fs=1" frameborder="0" allowfullscreen=""></iframe></center>

<div><br /></div><div>　赤外線投光機で投影した部分が白くなっているのが分かると思います。これでKinectには「何も無い」と誤認識させることができます。この投光機を対象物以外（見学者などの非検出領域）に投影することで、Kinectの誤認識率を軽減させることができます。</div><div><br /></div><div>　近赤外線を出せるものであれば、このような投光機でなくても問題はないと思います。おそらく、ハロゲンライトや、白熱球でも可能かと思います。</div><div><br /></div><div><br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Kinectを騙す　楽々Kinect hack</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/12/kinect-1.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.886</id>

    <published>2011-12-06T04:00:36Z</published>
    <updated>2011-12-13T04:14:03Z</updated>

    <summary>このエントリはKINECT SDK Advent Calendar : ATND...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="KINECT SDK Advent Calendar 2011" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="kinectsdkadventcalendar2011　1206" label="KINECT SDK Advent Calendar 2011　12/06" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[<font class="Apple-style-span" style="font-size: 1.25em; ">このエントリは<a href="http://atnd.org/events/22723">KINECT SDK Advent Calendar : ATND</a>の12月6日分です</font><br />

&nbsp;<div>Kinectプログラムには体力が要求されます。プログラムを打ち込んで、実行してはKinectの前に立ち、何か動作を入力し、動作を確認してから、デバックに戻ります。デバックしてから再びKinctの前に立たなければ行けません。OpenNI環境では、「キネクトポーズ」を毎回行う必要があります。ログラム開発をおこなった次の日には、筋肉痛で腕が上がらないということも・・・・。Kinectプログラマには精神力だけでなく肉体力も要求される時代に来ています。<div><br /></div><div>　このようにパソコンとKinectの前を往復する作業の軽減するために、人形やマネキンを用いることを推奨します。Kinectの前に人形を設置することでKinectは「<b>人として誤認識</b>」してくれます。（※揺らさなくても認識します。）</div><div style="text-align: center;"><br /></div><div style="text-align: center;">
<center>
<img src="http://www.kosaka-lab.com/tips/2011/10/14/Kinect_D7.jpg" alt="Kinect_D7.jpg" /></center>

</div><div><br /></div><div>　Kinectは奥行き情報を元に、背景と人物を割り出します。そして人物情報の輪郭情報を解析して、各ボーンを判定しています。Kinectには無数の輪郭情報が記録されておりマッチした骨格情報を出力しています。</div><div><br /></div><div><br /></div><div>マネキンや人形が手元にない人も多いと思いますが、人形に見えればなんでもOKです。身長100cm程度であれば人と認識します。（場合によっては、もう少し小さくても認識します）</div><div><br /></div><div>　安価な等身大パネルを使うことでも可能です。自分の写真を撮影して、パネルに貼りつけてるだけです。3,000円程度で完成です。市販されているアイドルなどのパネルでも可能かもしれませんが、人物の周りの白いノリシロ部分はカットしたほうが輪郭がはっきりして認識精度が向上します。</div><div><br /></div><div><br /></div><div>　Kinectは人として誤認識しますが、動きません。動きが欲しい場合は、パネルなどに、サーボモータを取り付けることで可動させることができます。</div><div><br /></div><div>　詳細は、こちらを参考にしてください。</div><div><ul><ul><li>Marionect Ver2.0</li></ul></ul></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><a href="http://www.kosaka-lab.com/tips/2011/10/kinect-doll-ver20.php">http://www.kosaka-lab.com/tips/2011/10/kinect-doll-ver20.php</a></div></blockquote></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><br /></div></blockquote></blockquote><div><ul><ul><li>Marionect Ver3.0</li></ul></ul></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><a href="http://www.kosaka-lab.com/tips/2011/10/kinect-doll-ver30.php">http://www.kosaka-lab.com/tips/2011/10/kinect-doll-ver30.php</a></div></blockquote></blockquote><div><br /></div><div><div><br /></div><div>　このパネルや人形やマネキンをKinectの前に設置するだけで、プログラマはパソコンの前から動くことなくプログラム開発を行うことができます。ただでさえ運動不足のプログラマの運動不足を加速することになるかもしれませんが・・・。</div></div><div><br /></div><div><span class="Apple-style-span" style="font-family: メイリオ, serif; line-height: 24px; font-size: medium; ">enjoy kinect hack!!</span></div><div><br /></div></div>]]>
        
    </content>
</entry>

<entry>
    <title>Kinect for Windows SDK Beta2を使う</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/11/kinect-for-windows-sdk-beta2.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.884</id>

    <published>2011-11-30T06:43:07Z</published>
    <updated>2011-11-30T07:37:28Z</updated>

    <summary>　Kinect for Windows SDK Beta2が11月5日に公開され...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="Kinect SDK" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="kinectforwindowssdkbeta2を使う" label="Kinect for Windows SDK Beta2を使う" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[　Kinect for Windows SDK Beta2が11月5日に公開されました。　Beta版とBeta2版では初期化の仕様が変更になりました。<div><br /></div><div><div>Beta2版をインストールするときには、Beta版をアンインストールする必要があります。</div></div><div><br /></div><div>参照設定に追加した[Microsoft.Research.Kinect]を一度削除して、もう一度参照してください。</div><div><br /></div><div>これまでTipsで公開しているプログラムでは「警告<span class="Apple-tab-span" style="white-space: pre; ">	</span>1<span class="Apple-tab-span" style="white-space: pre; ">	</span>'Microsoft.Research.Kinect.Nui.Runtime.Runtime()' は古い形式です」と警告が吐き出されます。問題なく動きますが、警告が出ていると気持ちが悪いですよね。</div><div><br /></div><div><br /></div><div>プログラムですが、変更点は初期化の１点だけです。</div><div><br /></div>

<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><span class="rem">//Beta版 Kinectセンサクラスの初期化</span>
<span class="kwrd">this</span>.kinect = <span class="kwrd">new</span> Runtime();
</pre>


<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode"><span class="rem">//Beta2版 Kinectセンサクラスの初期化</span>
<span class="kwrd">this</span>.kinect =Runtime.Kinects[0]; 
</pre>


以上の記述で警告は出力されなくなります。Beta2版からは複数台のKinectも認識できるようになったようです。おそらく初期化の0は、0番目のKinectという意味だと思います。複数台のKinectが手元にないので試すことはできませんが、この値を変更することで複数台も可能でしょう。]]>
        
    </content>
</entry>

<entry>
    <title>Marionect  Ver3.0 マリオネクト(旧：KINECT DOLL)</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/10/kinect-doll-ver30.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.880</id>

    <published>2011-10-25T14:54:11Z</published>
    <updated>2011-11-27T10:13:16Z</updated>

    <summary>　前々回、Kinectプログラマーから筋肉痛を解放する「KINECT DOLL　...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="Kinect SDK" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="marionectver30マリオネクト旧：kinectdoll" label="Marionect Ver3.0 マリオネクト(旧：KINECT DOLL)" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[　<a href="http://www.kosaka-lab.com/tips/2011/10/kinect-doll-ver10.php">前々回</a>、Kinectプログラマーから筋肉痛を解放する「KINECT DOLL　Ｖｅｒ1.0」を開発。<div>　<a href="http://www.kosaka-lab.com/tips/2011/10/kinect-doll-ver20.php">前回</a>は、サーボを仕込んでみました。&nbsp;</div><div><br /></div><div>&nbsp;　正直なところ、等身大は大きくて邪魔です。可能な限り小さいほうが部屋も圧迫せずに便利です。小学生でも取得できているようです。身長1m程度あればKinectで認識できるようです。</div><div><br /></div><div>　スチレンボードですが、サーボモータを取り付けるのが至難の技でした。強力な両面テープで貼りつけても、次の日の朝には腕がもげ落ちている悲惨な状況です。</div><div>　</div><div>　いきなりですが、弊社の工房に、レーザーカッターなるものがあったので、アクリルで作ってみました。</div><div>Illustratorで作図した設計図をDXFに出力して専門のソフトで出力するとあっという間にカットしてくれました。ピッタリの精度に驚きでした。</div><div><br /></div><div>今回作図した、図面はこちら</div><div>　<a href="http://www.kosaka-lab.com/tips/2011/10/26/KinectDoll.pdf">KinectDoll.pdf</a></div><div><br /></div><div><br /></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_01.jpg" src="http://www.kosaka-lab.com/tips/2011/10/26/Kinect_01.jpg" width="320" height="180" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div style="text-align: center;"><span class="mt-enclosure mt-enclosure-image" style="display: inline;">弊社のレーザーカッター</span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><br /></span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><br /></span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><br /></span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_02.jpg" src="http://www.kosaka-lab.com/tips/2011/10/26/Kinect_02.jpg" width="320" height="540" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div style="text-align: center;"><span class="mt-enclosure mt-enclosure-image" style="display: inline;">図面通り。サーボモータもピッタリ</span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><br /></span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><br /></span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_03.jpg" src="http://www.kosaka-lab.com/tips/2011/10/26/Kinect_03.jpg" width="320" height="360" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div style="text-align: center;"><span class="mt-enclosure mt-enclosure-image" style="display: inline;">組立作業</span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><br /></span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_04.jpg" src="http://www.kosaka-lab.com/tips/2011/10/26/Kinect_04.jpg" width="640" height="427" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div style="text-align: center;"><span class="mt-enclosure mt-enclosure-image" style="display: inline;">完成。ポールに差して自立できるようにしました。</span></div><div style="text-align: center;"><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><br /></span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_05.jpg" src="http://www.kosaka-lab.com/tips/2011/10/26/Kinect_05.jpg" width="320" height="480" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div style="text-align: center;">裏面</div><div><br /></div><div><br /></div><div><span class="Apple-style-span" style="font-family: 'trebuchet ms'; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">　関節は１０関節あります。</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">前回と同じ、秋月で販売されている<a href="http://akizukidenshi.com/catalog/g/gM-01968/">サーボモータ</a>を使用しました。</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">上半身を支える中央の腰のサーボですが、上半身が重すぎるらしく、前回のサーボではパワー不足でしたので、同じく秋月で販売れている</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><ul><ul><li><a href="http://akizukidenshi.com/catalog/g/gM-01721/">ＧＷＳサーボ　ＧＷＳ７７７ＦＣＧ／６ＢＢ／ＪＲタイプ</a>　4400円</li></ul></ul><div>を使いました。</div><div><br /></div><div><br /></div></div></span></div>



<object style="height: 390px; width: 640px" width="640" height="360"><param name="movie" value="http://www.youtube.com/v/syY26n7ponM?version=3&amp;feature=player_detailpage" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://www.youtube.com/v/syY26n7ponM?version=3&amp;feature=player_detailpage" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="360"></object><div><object style="height: 390px; width: 640px" width="640" height="360"><br /></object></div><div><object style="height: 390px; width: 640px" width="640" height="360">　ユーザの動作にあわせて「キネクドル」が動作していますね。現在は、Kienctから取得したデータは生データを送っています。平均化などの処理を現在行なっていないのでデータ取得のタイミングによってはトンデモナイ動きになったします。</object></div><div><object style="height: 390px; width: 640px" width="640" height="360">　</object></div><div><object style="height: 390px; width: 640px" width="640" height="360">　このモーションを記録しておくことも可能です。</object></div><div><object style="height: 390px; width: 640px" width="640" height="360">　特定のモーションに発動するプログラムを作りたいとき、何度も、何度もKinectの前でそのモーションを行うのは大変です。予め、<b>「キネクドル」を用いて、モーションを記録して再生することができます。</b></object></div><div><object style="height: 390px; width: 640px" width="640" height="360">　再生時にKinectの前に設置市ておけば、<b>Kinect</b></object><b>は「マリオネクトを人」として認識して何度でも同じタイミングで同じ動作を繰り返すことが可能です</b>。</div><div><br /></div><div>　これ、売ったら売れるかな？</div><div><br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Marionect  Ver2.0 マリオネクト(旧：KINECT DOLL)</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/10/kinect-doll-ver20.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.878</id>

    <published>2011-10-18T15:16:32Z</published>
    <updated>2011-11-27T10:13:35Z</updated>

    <summary>　前回、Kinectプログラマーから筋肉痛を解放する「KINECT DOLL　Ｖ...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="Kinect SDK" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="marionectver20マリオネクト旧：kinectdoll" label="Marionect Ver2.0 マリオネクト(旧：KINECT DOLL)" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[<div style="text-align: left;">　<a href="http://www.kosaka-lab.com/tips/2011/10/kinect-doll-ver10.php">前回</a>、Kinectプログラマーから筋肉痛を解放する「<a href="http://www.kosaka-lab.com/tips/2011/10/kinect-doll-ver10.php">KINECT DOLL</a>　Ｖｅｒ1.0」を開発しました。これを用いることで椅子から立ち上がることなくデバックが行えるようになりました。</div><div><br /></div><div>　Kinectの勉強用のプログラム程度であれば問題ないかもしれませんが、やはり動きが欲しいですね。前回予告した通りサーボモータを仕込んでみました。</div><div><br /></div><div>秋月で売られているサーボを4つ使用しました。</div><div><ul><li><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: arial, sans-serif; ">　<a href="http://akizukidenshi.com/catalog/g/gM-01968/">ＧＷＳサーボ　Ｓ０３Ｔ／２ＢＢＭＧ／Ｆ（フタバ）</a>　１個1200円です。7.4ｋgのトルクも出せます。</span></li></ul><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif"><br /></font></div></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif"><br /></font></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif">前回のKINECT DOLLを各パーツに切り刻みます。サーボモータを取り付けるので、各パーツの関節部分は重なっている必要がありますので、追加パーツを作ります。</font></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif"><br /></font></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif"><br /></font></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif">各パーツの重なりを確認して、サーボを取り付ける穴を開けます。</font></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif">スチレンボードにサーボを固定するのは難しいです。小さ目の穴をあけて無理やり押し込みましょう。</font></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif">そのたと、余ったスチレンボードでサーボモータをがっちり固定しましょう。</font></div><div><span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: arial, sans-serif; "><img alt="KD01.jpg" src="http://www.kosaka-lab.com/tips/2011/10/19/KD01.jpg" width="640" height="907" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif"><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><br /></span></font></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif"><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="KD02.jpg" src="http://www.kosaka-lab.com/tips/2011/10/19/KD02.jpg" width="640" height="853" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></font></div><div style="text-align: center;"><font class="Apple-style-span" color="#000000" face="arial, sans-serif">４つのサーボモータを設置</font></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif"><br /></font></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif"><br /></font></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif"><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="KD03.jpg" src="http://www.kosaka-lab.com/tips/2011/10/19/KD03.jpg" width="640" height="480" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></font></div><div style="text-align: center;"><font class="Apple-style-span" color="#000000" face="arial, sans-serif">サーボの制御はＡｒｄｕｉｎｏで行います。シリアル通信で各サーボの値を送ります。</font>



<h6 id="page-title-date">●<font class="Apple-style-span" style="font-size: 1.25em; ">ソースコード(Arduino)</font></h6></div>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<pre class="csharpcode">#include <servo.h>

Servo servo01;//サーボのインスタンス
Servo servo02;//サーボのインスタンス
Servo servo03;//サーボのインスタンス
Servo servo04;//サーボのインスタンス

char Read_Data[10];

void setup() {
	//ポート設定
	Serial.begin(9600);
        servo01.attach(3);
        servo02.attach(5);
        servo03.attach(6);
        servo04.attach(9);


        servo01.write(0);
        servo02.write(180);

        servo04.write(180);
        servo03.write(000);
        
} 
void loop() {

	ReadData(); //COM Read
}

void ReadData(){

	//データ受信
	if (Serial.available()) {
		int i=0;
		char c;
		int t;
		while (1) {
			if (Serial.available()) {
				c = Serial.read();
				Read_Data[i] = c;
				if (c == 'z') break; // 文字列の終わりは'z'で判断
				i++;
			}
		}
		Read_Data[i] = '\0';  


		//Right A
                //初期位置000 最大100
		if(Read_Data[0] =='R' &amp;&amp; Read_Data[1] =='A' &amp;&amp; Read_Data[2] ==','){
                   int val = ReturnValue(Read_Data);
                   Serial.println(val);
                   servo01.write(val);
		}

		//Right S
                //初期位置180 最大50
		if(Read_Data[0] =='R' &amp;&amp; Read_Data[1] =='S' &amp;&amp; Read_Data[2] ==','){
                   int val = ReturnValue(Read_Data);
                   Serial.println(val);
                   servo02.write(val);
		}

		//Left A
                //初期位置180 最大100
		if(Read_Data[0] =='L' &amp;&amp; Read_Data[1] =='A' &amp;&amp; Read_Data[2] ==','){
                   int val = ReturnValue(Read_Data);
                   Serial.println(val);
                   servo04.write(val);
		}

		//Left S
                //初期位置000 最大130
		if(Read_Data[0] =='L' &amp;&amp; Read_Data[1] =='S' &amp;&amp; Read_Data[2] ==','){
                   int val = ReturnValue(Read_Data);
                   Serial.println(val);
                   servo03.write(val);
		}

	}
}
/*************************************************************************************************************/
/*************************************************************************************************************/ 

int ReturnValue(char *data){
	char tmp[5];
	tmp[0] =data[3];
	tmp[1] =data[4];
	tmp[2] =data[5];
	tmp[3] ='\0';
	return atoi(tmp);
}

/*************************************************************************************************************/ 
/*************************************************************************************************************/ 

</servo.h></pre>














<div><font class="Apple-style-span" color="#000000" face="arial, sans-serif"><br /></font></div><div><font class="Apple-style-span" color="#000000" face="arial, sans-serif"><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="KD04.jpg" src="http://www.kosaka-lab.com/tips/2011/10/19/KD04.jpg" width="480" height="640" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></font></div><div style="text-align: center;">完成</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div>


<center>

<iframe width="425" height="349" src="http://www.youtube.com/embed/28KkZOAgTiQ?hl=ja&amp;fs=1" frameborder="0" allowfullscreen=""></iframe>
</center>

<div>　どうでしょ？良い感じで動いてますね。Kinectポーズもばっちりできます。スチレンボードなので歪みが生じてしまって、たまに引っかかって腕がもげます。アクリルや鉄板で作ると回避できそうです。</div><div>　</div><div>　今回は４か所しか動かしていません。頭や胴体なども今後行っていく予定です。</div><div><b>ちみに、あらかじめKinectで取得したモーションデータをこのKinectDollで再現することも可能です。なんどでも同じ動きを再現可能です。</b></div><div><b><br /></b></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Marionect  Ver1.0 マリオネクト(旧：KINECT DOLL)</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/10/kinect-doll-ver10.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.877</id>

    <published>2011-10-14T12:57:09Z</published>
    <updated>2011-11-27T10:13:45Z</updated>

    <summary> 　KINECTの発売で人間のモーションを簡単に取得することができるようになりま...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="Kinect SDK" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="（仮）kinectdollver10" label="（仮）KINECT DOLL Ver1.0" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[ 　KINECTの発売で人間のモーションを簡単に取得することができるようになりました。しかし、その開発には<strong>筋肉痛</strong>が伴います。なぜなら、<b><u><font class="Apple-style-span" style="font-size: 1.5625em; ">デバックして、KINECTの前に立ち、デバックしては、KINECTの前に立つという動作</font></u></b>を延々に繰り返す必要があります。特にOpenNIを使っている形は、例の「Kinectポーズ」を毎回行う必要がありますよね。&nbsp;KINECTプログラマは精神的な体力だけでなく、肉体的な体力が必要不可欠です。

　<div><br /></div><div>　小坂研究室では、以前から、このような面倒な作業を効率化するために、人形やマネキンをKINECTの前に置いて開発を行って来ています。KINECT前に設置してプログラムを起動して、軽く揺らすと簡単に人物として検出してくれます。非常にお手軽です。</div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_D7.jpg" src="http://www.kosaka-lab.com/tips/2011/10/14/Kinect_D7.jpg" width="640" height="427" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div><br /></div><div>　一般の形は、一体数万円するマネキンなどお持ちではないと思うので、お手軽にできる「KINECT DOLL」を開発し、筋肉痛からプログラマを開放したいと思います。</div><div><br /></div><div><br /></div><div>骨格情報ですが、ネキンや人形で骨格情報を取得しているので、肌色検出などは行なってなさそうです。おそらく、深度情報から人の輪郭さえ取れてしまえば問題なさそうな気がします。</div><div><br /></div><div><b><font class="Apple-style-span" style="font-size: 1.5625em; ">●ミニチュアバージョン</font></b></div><div><br /></div><div>どこでも購入できるスレンパネルで作ってみました。</div><div>もしかしたら、ミニサイズでも取得できれば「邪魔にならず楽かも」というのことで、</div><div>身長35cmのものを作成してみました。（35cmに意味はありません）</div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_D4.jpg" src="http://www.kosaka-lab.com/tips/2011/10/14/Kinect_D4.jpg" width="640" height="480" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" />小さい</span></div><div><br /></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_D5.jpg" src="http://www.kosaka-lab.com/tips/2011/10/14/Kinect_D5.jpg" width="640" height="853" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div>裏は物差しで固定</div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_D6.jpg" src="http://www.kosaka-lab.com/tips/2011/10/14/Kinect_D6.jpg" width="640" height="480" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div>さっそく計測を試みてみました。</div><div><br /></div><div><br /></div>

<iframe width="425" height="349" src="http://www.youtube.com/embed/FAowa8SE7E4?hl=ja&amp;fs=1" frameborder="0" allowfullscreen=""></iframe>

<div>ダメでしたね。</div><div><br /></div><div>おそらく深度情報から、ある一定の大きさ以上（人物と同じサイズ）でなければ、骨格情報を検出しないのではないかと思います。</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><b><font class="Apple-style-span" style="font-size: 1.5625em; ">●等身大バージョン</font></b></div><div>　ミニサイズでは計測しなかったので、等身大で作り直します。</div><div>まずは、全身が映るような写真を取りましょう。そしてPhotoShopで背景を除去します。この時、顔のシワなんかもとっておくと良いでしょう。</div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_D3.jpg" src="http://www.kosaka-lab.com/tips/2011/10/14/Kinect_D3.jpg" width="640" height="427" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div><br /></div><div><br /></div><div>大型サイズのプリンタで等身大に印刷します。A0サイズより大きくなってしまったので、複数毎に分けて印刷します。つなぎ目が目立たないように各パーツ毎に切り出して、スチレンボードに貼り付けます。</div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_D.jpg" src="http://www.kosaka-lab.com/tips/2011/10/14/Kinect_D.jpg" width="640" height="720" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_D2.jpg" src="http://www.kosaka-lab.com/tips/2011/10/14/Kinect_D2.jpg" width="640" height="360" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div>写真を撮るのを忘れたので写真はありませんが、貼り付けたスチレンボードをカッターで丁寧に切っていきます。</div><div><br /></div><div>完成です。白衣着せてみました。</div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_D8.jpg" src="http://www.kosaka-lab.com/tips/2011/10/14/Kinect_D8.jpg" width="640" height="853" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></div><div><br /></div><div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Kinect_D9.jpg" src="http://www.kosaka-lab.com/tips/2011/10/14/Kinect_D9.jpg" width="480" height="390" class="mt-image-center" style="text-align: left;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 20px; margin-left: auto; " /></span></div><div style="text-align: center;">二人で並んでみました。どっちが本物か分からない。</div><div><br /></div><div><br /></div><div>さっそく、計測してみましょう。</div>
<iframe width="425" height="349" src="http://www.youtube.com/embed/OrtKh7C2BIk?hl=ja&amp;fs=1" frameborder="0" allowfullscreen=""></iframe>

<div>薄っぺらい板なのに、難なく骨格情報が取得できました。</div><div>ちなみに左手は可動式になってます。</div><div><br /></div><div>おそらくです、KINECTは背景と人物の切り離しに関して奥行き情報を使っているだけで、骨格情報に関しては、人物の輪郭で行なっているようです。たぶん・・・。</div><div><br /></div><div>　さて、今回の映像を見ていただいても分かるように、初回、揺らさないと骨格情報を計測できません。毎回揺らすのは面倒です。<b>次回は、サーボモータを用いてこの人形を動かしてみましょう</b>。</div><div><br /></div><div><br /></div><div>12月の<span class="Apple-style-span" style="font-family: arial, 'helvetica neue', helvetica, sans-serif; font-size: 12px; ">Make: Tokyo Meeting 07にこのサーボモータ版を展示する予定です。</span></div><div><span class="Apple-style-span" style="font-family: arial, 'helvetica neue', helvetica, sans-serif; font-size: 12px; "><br /></span></div><div><br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>ミニ電光掲示板を作る</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/10/post-9.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.876</id>

    <published>2011-10-13T09:53:31Z</published>
    <updated>2011-10-13T09:58:19Z</updated>

    <summary>ArduinoとLEDマトリックスを使って、ミニ電光掲示板を作ってみましょう。弊...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="Arduino" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ミニ電工掲示板を作る" label="ミニ電工掲示板を作る" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[ArduinoとLEDマトリックスを使って、ミニ電光掲示板を作ってみましょう。<div><br /></div><div>弊社のオープンキャンパスで、開催した資料をアップしておきます。</div><div><br /></div><div><ul><li><b>マニュアル</b></li></ul></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><a href="http://www.kosaka-lab.com/kosaka_laboratory/data/arduino_open.pdf">http://www.kosaka-lab.com/kosaka_laboratory/data/arduino_open.pdf</a></div><div><br /></div></blockquote><div><ul><li><b>Matrix_Editer</b></li></ul></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><a href="http://www.kosaka-lab.com/kosaka_laboratory/data/Matrix_Editer.zip">http://www.kosaka-lab.com/kosaka_laboratory/data/Matrix_Editer.zip</a></div></blockquote><div><br /></div><div><br /></div><div><br /></div><div><a href="http://kousaku-kousaku.blogspot.com/2008/07/arduino.html">建築発明工作ゼミ2008</a>さんのページを参考にさせて頂きました。</div><div><br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Kinect SDK　応用編　赤外線LEDで赤外線ウォールを作る　その2</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/09/kinect-sdkled2.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.868</id>

    <published>2011-09-10T14:35:43Z</published>
    <updated>2011-09-10T16:53:15Z</updated>

    <summary>         　前回、「Kinect SDK　応用編　赤外線LEDで赤外線ウ...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="Kinect SDK" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="kinectsdk　応用編　赤外線ledで赤外線ウォールを作る　その2" label="Kinect SDK　応用編　赤外線LEDで赤外線ウォールを作る　その2" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[         <div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/"><img alt="kinect.jpg" src="http://www.kosaka-lab.com/tips/img/kinectSDK" class="mt-image-center" style="text-align: center;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 20px; margin-left: auto; " /></a></span></div>　前回、「<a href="http://www.kosaka-lab.com/tips/2011/09/kinect-sdkled.php">Kinect SDK　応用編　赤外線LEDで赤外線ウォールを作る　その１</a>」　でKinectの赤外線プロジェクタで投射されたマーカーを、別の赤外光で打ち消すというものを試みましたが、見事に失敗しました。<div><br /></div><div><div style="text-align: left; ">　その原因ですが、Kinectの赤外光の波長は830nmですが、打ち消すのに用いた赤外光は940nmでした。波長が合わずに打ち消すことができませんでした。</div><div style="text-align: left; "><br /></div><div style="text-align: left; "><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/IR.jpg" /></div><div style="text-align: left; "><br /></div><div style="text-align: left; "><br /></div><div style="text-align: left; ">　今回、830nmの赤外線LEDを入手しましたので、さっそく試してみました。</div><div style="text-align: left; "><br /></div><div>●<font class="Apple-style-span" style="font-size: 1.25em; ">必要なもの</font></div><div><div><div><div><div><div><div><div><div><div><div><div>　</div><div><a href="http://www.vishay.com/docs/81887/tshg5510.pdf">赤外線LED 830nm</a></div><div>電源。今回は、19VのＡＣアダプタ</div><div>工具</div><div><br /></div></div><div>

<h6 id="page-title-date">●<font class="Apple-style-span" style="font-size: 1.25em; ">組立</font></h6></div>

<div><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/IIR01.jpg" /></div><div style="text-align: center;">iいりなりだけど完成</div><div style="text-align: center;"><br /></div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/IIR02.jpg" />&nbsp;</div></div><div style="text-align: center;">点灯。普通のデジカメで撮影</div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/IIR03.jpg" />&nbsp;</div><div><div style="text-align: center;">改造したデジカメで撮影　まぶし過ぎる！！</div><div style="text-align: center;"><br /></div></div><div><br /></div><div>





 
<div><h6 id="page-title-date">●<font class="Apple-style-span" style="font-size: 1.25em; ">結果</font></h6></div>では、実際に投射して試してみましょう・・・<br />
<center>

<iframe width="425" height="349" src="http://www.youtube.com/embed/C87VcCYVBr0?hl=ja&amp;fs=1" frameborder="0" allowfullscreen=""></iframe></center><center><br /></center><center>赤外線LEDで投影した部分が白くなっているのがわかります。成功ですね。</center><center><br /></center>



</div><div><div><div><div><br /></div></div></div></div></div></div></div></div></div>





<div><h6 id="page-title-date" style="text-align: left;">●<font class="Apple-style-span" style="font-size: 1.25em; ">実行結果</font></h6></div><div style="text-align: left;">　無事に、赤外線LEDで投影した部分が、白くなっています。今回は、僅かな部分しか投影していません。この赤外線LEDマトリックスを複数増やして、ノイズの発生する部分や、指定した部分以上の距離に投射するように行えば、誤認識を減らすことが可能になると思います。</div></div></div></div><div style="text-align: left;"><br /></div><div style="text-align: left;">　この赤外線LEDですが、改造したカメラで見ると、怖いぐらい点灯しています。肉眼では一切見えませんが、あまり直視しないほうが目に良いと思います。</div><div style="text-align: left;"><br /></div>
</div></div>]]>
        
    </content>
</entry>

<entry>
    <title>Kinect SDK　応用編　赤外線LEDで赤外線ウォールを作る　その１</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/09/kinect-sdkled.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.867</id>

    <published>2011-09-07T10:18:54Z</published>
    <updated>2011-09-08T03:45:42Z</updated>

    <summary>        　前回、「Kinect SDK 応用編 赤外線プロジェクタを見る...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="Kinect SDK" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="kinectsdk　応用編　赤外線ledで赤外線ウォールを作る　その１" label="Kinect SDK　応用編　赤外線LEDで赤外線ウォールを作る　その１" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[        <div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/"><img alt="kinect.jpg" src="http://www.kosaka-lab.com/tips/img/kinectSDK" class="mt-image-center" style="text-align: center;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 20px; margin-left: auto; " /></a></span></div>　前回、「<a href="http://www.kosaka-lab.com/tips/2011/09/kinect-sdk.php">Kinect SDK 応用編 赤外線プロジェクタを見る</a>」　で赤外線プロジェクタから出力された赤外線コードを見ました。<div>　</div><div>　今回は、そのコードに赤外線ＬＥＤライトを当てて消し去ることで無効化してみたいと思います。正しく無効化することができれば、背景に移りこんだノイズを除去したり、対象人物以外の人を検出しないようにすることもできるはずです。</div><div><div><div><div><br /></div><div><br /><div><div><div><div><div>


<div><div><h6 id="page-title-date">●<font class="Apple-style-span" style="font-size: 1.25em; ">必要なもの</font></h6>　</div><div><a href="http://akizukidenshi.com/catalog/g/gK-00094/">赤外線発光ダイオード使用（５６個） 赤外線投光器キット</a></div><div>電源。今回は、12VのＡＣアダプタが手元になかったので9Vで作成しています。</div><div>工具</div><div><br /></div></div><div>

<h6 id="page-title-date">●<font class="Apple-style-span" style="font-size: 1.25em; ">組立</font></h6></div>

<div><br /></div><div>ひたすらハンダ付けするだけなので、10分もあれば完成するはずです。</div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/I001.jpg" /></div><div style="text-align: center;">完成</div><div style="text-align: center;"><br /></div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/I002.jpg" />&nbsp;</div></div><div style="text-align: center;">点灯、作った赤外線カメラで見てます。</div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/I003.jpg" />&nbsp;</div><div><div style="text-align: center;">壁に投射</div></div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/I004.jpg" />&nbsp;</div><div style="text-align: center;">電気を消して、壁に投射。かなり明るい</div><div><br /></div><div><br /></div><div>





 
<div><h6 id="page-title-date">●<font class="Apple-style-span" style="font-size: 1.25em; ">結果</font></h6></div>では、実際に投射して試してみましょう・・・<br />
<center>

<iframe width="425" height="349" src="http://www.youtube.com/embed/qsWXoU7wONQ?hl=ja&amp;fs=1" frameborder="0" allowfullscreen=""></iframe></center><center><br /></center><center>ダメですね・・・。まったく奥行きデータに変化は見れられませんでした。</center><center><br /></center>



</div><div><div><div><div><br /></div></div></div></div></div></div></div></div></div>





<div><h6 id="page-title-date" style="text-align: left;">●<font class="Apple-style-span" style="font-size: 1.25em; ">実行結果</font></h6></div><div style="text-align: left;">　失敗でした。奥行きデータが変化しません。赤外線カメラでは、打ち出したコードを間違いなく消しているように見えるのですが・・・・。奥行きは変化しませんでしたね。</div><div style="text-align: left;">　おそらくですが、Kinectの打ち出した赤外線の波長と購入した赤外線LEDの波長が違うのだと思います。購入した秋月の赤外線LEDは940nmとなっています。Kinectで使っている赤外線の波長を調べてそれと同じ波長が出力できる赤外線LEDで試すことができれば、おそらく打ち消すことができるはずです。ｷﾘｯ</div><div style="text-align: left;"><br /></div><div style="text-align: left;">　おそらく、おそらくですが、700nm～940nmだと推測します。Kinectの赤外線プロジェクタから赤い光が肉眼でも確認できるところから、近赤外で700nm側かと思います。たぶん・・・・</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">　追記、Kinectで使われている波長は830nmらしいです。</div><div style="text-align: left;">&nbsp;

<img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/IR.jpg" /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div></div></div></div>

]]>
        
    </content>
</entry>

<entry>
    <title>Kinect SDK　応用編　赤外線プロジェクタを見る</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/09/kinect-sdk.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.866</id>

    <published>2011-09-07T09:40:33Z</published>
    <updated>2011-09-07T10:13:55Z</updated>

    <summary>           　Kinecには赤外線プロジェクタが搭載されています。一番...</summary>
    <author>
        <name>小坂崇之</name>
        
    </author>
    
        <category term="Kinect SDK" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="kinectsdk　応用編　赤外線プロジェクタを見る" label="Kinect SDK　応用編　赤外線プロジェクタを見る" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[       <div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/"><img alt="kinect.jpg" src="http://www.kosaka-lab.com/tips/img/kinectSDK" class="mt-image-center" style="text-align: center;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 20px; margin-left: auto; " /></a></span></div> 
 
　Kinecには赤外線プロジェクタが搭載されています。一番左がソレに当たります。赤外線プロジェクタから赤外線のバーコードを映しだしています。プラネタリュウムの星みたいなものを物体に投射して、その跳ね返りを赤外線カメラで取得して奥行きを判定していると言われています。<div><br /></div><div>　じゃ、どんなコードを吐き出しているの？っと疑問に思う方もいるはずなので、今回は、デジタルカメラで見てみることにしましょう。赤外線は人の目には見えません。赤の波長より外にあるから、赤外線です。詳しくは調べてね。</div><div><br /></div><div>　デジタルカメラや携帯のカメラを通して見ることができます。が、おそらく点にしか見えないかと思います。デジカメなどに使われているCMOSセンサは赤外線を写すことができます。赤外線を写し過ぎるので、センサの前に赤外線カットフィルターなるもので赤外線をカットしています。今回は、その赤外線カットフィルターを取って、投射されたコードを見てみたいと思います。</div><div><br /></div><div>　幸い、SIGGRAPH2011開催中に、MommyTummyの水槽の中にダイブしたデジカメ君がいましたので、それをバラしてみましょう。</div><div><br /></div><div><br /><div><div><div><div><div>


<div><div><h6 id="page-title-date">●<font class="Apple-style-span" style="font-size: 1.25em; ">必要なもの</font></h6>　デジカメ(<b>当たり前ですが、バラすとメーカー保障対象外になります。</b>)</div><div>　工具</div><div><br /></div></div><div>

<h6 id="page-title-date">●<font class="Apple-style-span" style="font-size: 1.25em; ">組立</font></h6></div>


<div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/C001.jpg" />&nbsp;</div></div><div style="text-align: center;">こちらが羊水の海にダイブしたデジカメ君</div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/C002.jpg" />&nbsp;</div><div style="text-align: center;">バラしていきます。</div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/C003.jpg" />&nbsp;</div><div><div style="text-align: center;">外装を剥がしていきます。</div></div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/C004.jpg" />&nbsp;</div><div style="text-align: center;">液晶をめくります。</div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/C005.jpg" />&nbsp;</div><div style="text-align: center;">CMOS部分です。</div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/C006.jpg" />&nbsp;</div><div style="text-align: center;">外れました。右側がＣＭＯＳ</div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/C007.jpg" />&nbsp;</div><div style="text-align: center;">ここに赤外線カットフィルムが入っています。</div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/C008.jpg" />&nbsp;</div><div style="text-align: center;">右側の緑のが赤外線カットフィルムです。</div><div style="text-align: center;"><br /></div><div style="text-align: center;"><img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/C009.jpg" />&nbsp;</div><div style="text-align: center;">元に戻します。５分程度で完了です。</div><div><br /></div><div><br /></div><div>





 
<div><h6 id="page-title-date">●<font class="Apple-style-span" style="font-size: 1.25em; ">結果</font></h6></div>では、実際にどのような映像が撮れたかというと・・・・。<br />
<center>
<img src="http://www.kosaka-lab.com/kosaka_laboratory/2011/08/19/img/C010.jpg" width="425" />

<iframe width="425" height="349" src="http://www.youtube.com/embed/zpChlEfju6A?hl=ja&amp;fs=1" frameborder="0" allowfullscreen=""></iframe></center><center>本当に、プラネタリュウムのように打ち出していますね。</center><center>結構、強い出力ですね。人の目には全く移りませんが、目には大丈夫なんでしょうかね・・・</center><center><br /></center>



</div><div><div><div><div><br /></div></div></div></div></div></div></div></div></div>





<div><h6 id="page-title-date" style="text-align: left;">●<font class="Apple-style-span" style="font-size: 1.25em; ">実行結果</font></h6></div><div style="text-align: left;">　これでなにが出来るかという話です。Kinectはこの打ち出したコードを元に奥行情報を求めています。このコードを消し去ることができれば・・・・。</div><div style="text-align: left;">　つまり、赤外線ＬＥＤなどを投射して、このコードを消し去ることができれば、「余計な部分を消すことができる」はずです。たとえば、展示会などで、体験者の後ろにいる人を誤検知してしまうとか、不必要な部分を除去するなど、そういった使い方ができるはずです。赤外線ＬＥＤのライトを消したい対象物に当てるだけで、検出精度が上がるはずです。</div><div style="text-align: left;">　次回は赤外線ＬＥＤ投射機を使って実際に試してみます。</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>Arduinoで車速を計測する</title>
    <link rel="alternate" type="text/html" href="http://www.kosaka-lab.com/tips/2011/07/arduino.php" />
    <id>tag:www.kosaka-lab.com,2011:/tips//11.856</id>

    <published>2011-07-23T14:17:54Z</published>
    <updated>2011-07-23T15:51:26Z</updated>

    <summary>Arduinoを使って車の速度を取得します。 取得した速度を用いてスピード警報器...</summary>
    <author>
        <name>笹山裕輔</name>
        
    </author>
    
        <category term="Arduino" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="arduino" label="Arduino" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.kosaka-lab.com/tips/">
        <![CDATA[Arduinoを使って車の速度を取得します。<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/0_01.jpg" height="329" width="439" /><br />
取得した速度を用いてスピード警報器や秋月GPSとの連動、速度ロガー、戦闘機のようなHUD（ヘッドアップディスプレイ）の作成など様々な使い道があるかと思います。<br /><br />
Interactive System Tipsとはあんまり関係ない気もしますが・・・<br /><br />


<h6 id="page-title-date">注意</h6>
<font color="red"><b>自己責任</b>でお願いします。最悪ECUを破壊し事故につながりかねません。<br />
本稿に記載されている内容は保証はしません。<br />
運転中にPCの操作・注視は絶対に行わないでください。<br />
本稿はホンダGE型フィットを例にしています。ご自身の車と規格が一致しないこともありますのでしっかり調べてください。</font><br /><br />
<h6 id="page-title-date">車速の計測方法</h6>
車速を計測するには、ナビなどにも利用されている車速パルス（車速信号）を用います。<br /><br />

<h6 id="page-title-date">車速パルス</h6><blockquote>
<i>自動車における車軸の回転数に比例してパルス信号を発生させ、パルス信号の数量に比例した車輌移動が生じたとしてECUにその情報を送り、 カーナビゲーションシステムの作動補助やトラクションコントロールシステム等、自動車の各種制御に供するために使用される。</i><i><br />
機械式スピードメーターの場合、1km走行ごとにメータワイヤは637回転するとJIS規格で策定されている。 このメーターワイヤと接する部分（トランスミッション側かメータ側）にリードスイッチによるパルス発生装置を設け、 信号を発生させている。 信号は、車種やメーカーによっても異なるが、（ワイヤ1回転により）「2パルス」「4パルス」「8パルス」「16パルス」が多く採用されている。 近年の国産車は4パルス設計である。</i><br /></blockquote><br />
Wikipediaより<br /><br />
つまり、速度は車速パルスの周波数から求めることができます。<br />
周波数の測定にはダイレクト方式とレシプロカル方式の2種類の方法があります。<br /><br />
■<b>ダイレクト方式</b><br />
一定時間内にパルスが何回発生したかをカウントし周波数を求める<br /><br />
■<b>レシプロカル方式</b><br />
パルス幅の時間を計測し、周波数を求める方法<br /><br />
それぞれ長所、短所があります。調べてみてください。<br />
今回は特に理由はありませんがレシプロカル方式で実装します。<br /><br />
さて、1km走行することに637回*nパルスが発生する、とあります。<br />
フィットは4パルスなので2548パルスが1km走行するごとに発生します。ほとんどの車が4パルスですが、日産車などは2パルスのようです。<br /><br />
時速1kmで走行した際、パルス幅は「<u><b>3600秒/2548パルス=1.4128728414442・・・秒</b></u>」になります<br />つまり、時速は「<b><u>1.4128728414442・・・/実際に計測したパルス幅</u></b>」で求めることができます。<br /><br />
ちなみにダイレクト方式で実装する場合は1秒間のパルス数*1.4128728414442・・・で周波数が求まります。<br /><br />

<h6 id="page-title-date">回路</h6>

<img src="http://www.kosaka-lab.com/tips/img/carspeed/2_01.jpg" height="410" width="459" /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/2_02.jpg" height="420" width="541" /><br />
上記の回路（というほど大げさな物でもないですが）にECU（エンジンコントロールユニット）からの車速信号とグランドを取り付けます。<br />車速パルスにはプルアップ抵抗とECU保護用のダイオードをかましています。<br />
車速信号をすでにカーナビなどに取り付けている場合は、ナビにプルアップ抵抗が内蔵されているはずなのでいりません。<br />
車速信号の電圧は5Vの場合と12Vの場合があります。GE型フィットは5Vなので1kΩの抵抗を取り付けています。<br /><br />
電源はPCから供給されており不要ですがインターフェースを7セグLEDなどにされる場合は車の12V電源をArduinoに繋いでやる必要があります。ただし車の電源は不安定なので何らかの対策が必要になります。<br /><br />

<h6 id="page-title-date">スケッチ</h6>
プログラムを作成します。<br />
今回作成したプログラムは「MsTimer2」というArduino用のタイマ処理ライブラリを用いているので、MsTimer2をArduinoの開発環境に組み込む必要があります。<br />
http://www.arduino.cc/playground/Main/MsTimer2<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/4_01.jpg" height="387" width="516" /><br />
<br />MsTimer2.zipをクリックし、ダウンロード＆解凍します。<br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/4_02.jpg" height="333" width="577" /><br />
解答してできたフォルダをarduinoのlibraliesフォルダにコピーします。<br /><br />
Processing に下記のプログラムを入力しArduinoに書き込みます。<br /><br />
<br /><img src="http://www.kosaka-lab.com/tips/img/carspeed/4_03.jpg" /><br />

<hr>
#include &lt;MsTimer2.h&gt;<br />#define P_HI 1000<br />#define P_LO 120<br />unsigned long beforeTime;<br />unsigned long elapsedTime;<br />int flagHi;<br /><br />//セットアップ<br />void setup(){<br />&nbsp; //初期化<br />&nbsp; beforeTime&nbsp; = 0;<br />&nbsp; elapsedTime = 0;<br />&nbsp; flagHi = 0;<br />&nbsp; <br />&nbsp; //シリアル設定<br />&nbsp; Serial.begin(9600);&nbsp; <br />&nbsp; <br />&nbsp; //スレッド設定<br />&nbsp; MsTimer2::set(33, send);<br />&nbsp; MsTimer2::start();<br />}<br />//ループ<br />void loop(){<br />&nbsp; unsigned long nowTime;<br />&nbsp; int analog0 = analogRead(0);//AD0取得<br />&nbsp; nowTime = millis();//起動してからの時間取得<br />&nbsp; //パルスHIGH<br />&nbsp; if (analog0 &gt; P_HI &amp;&amp; flagHi == 0){<br />&nbsp;&nbsp;&nbsp; elapsedTime = nowTime - beforeTime;//前回パルスアップからの経過時間<br />&nbsp;&nbsp;&nbsp; beforeTime = nowTime;//今の時間を記録する<br />&nbsp;&nbsp;&nbsp; flagHi = 1;<br />&nbsp; }<br />&nbsp; <br />&nbsp; //パルスLOW<br />&nbsp; if (analog0 &lt; P_LO &amp;&amp; flagHi == 1){<br />&nbsp;&nbsp;&nbsp; flagHi = 0;<br />&nbsp; }<br />&nbsp; <br />&nbsp; //0.5km/h以下<br />&nbsp; if(nowTime - beforeTime&gt;3000){<br />&nbsp;&nbsp;&nbsp; elapsedTime=0.0;<br />&nbsp; }<br />}<br /><br />void send(){<br />&nbsp; float speed=0.0;<br />&nbsp; //時速に変換<br />&nbsp; if(elapsedTime != 0.0)speed = 1412.87284144427/elapsedTime;<br />&nbsp; //送信<br /><br />&nbsp; Serial.print(speed);&nbsp; <br />&nbsp; Serial.print("\n");<br />}<br /><br />&nbsp;<hr>

<h6 id="page-title-date">プログラム解説</h6>
MsTimer2ライブラリを用いて、1秒間に30回（33ミリ秒ごとに1回）速度をシリアル通信でPCに送信しています。<br />
P_HIとP_LOには車速信号のハイ、ローの値を入力します。（後述）。<br />
millis()が返す値はミリ秒なので1.41287・・の値もミリ秒に直してやります。<br /><br /><br />

<h6 id="page-title-date">取り付け</h6>
車速パルスの位置はカーナビの取り付け説明書などから調べることができます。<br />
例：アルパイン<br />http://www.alpine.co.jp/products_info/<br /><br />
<h6 id="page-title-date">車速パルスの確認</h6>
まず車速パルスが正しく取得できるかをチェックします。<br /><br />

インパネを外してナビやオーディオも外します。爪をおらしたりネジを落としたりしないよう気をつけてください。<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/3_01.jpg" height="442" width="589" /><br /><br />
GE型フィットの場合、車速信号とGNDはこの線になります。（ナビ・オーディオ取り付けキットが取り付けられている状態）<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/3_02.jpg" height="418" width="557" /><br /><br />
むき出しの状態ですが、この線に対して<a href="http://www.kosaka-lab.com/tips/img/carspeed/check.txt">車速パルス計測用に作成した簡単なプログラム</a>を実行し、車速パルスを計測してみます。<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/3_03.jpg" height="422" width="563" /><br /><br />
TeraTerm等で値を表示し、試しに走行します。<br />
<font color="red">注意！PC画面を注視したまま走行しないでください。非常に危険です。ログを停車後に確認して下さい。またフィットの場合、インパネを外すとハザードスイッチが押せなくなります。この状態で走行すると道路交通法違反に引っかかる恐れがあります。駐車場など敷地内でテストしください。</font><br /><br /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/3_04.jpg" /><br /><br />

LOWで約112～118、HIGHで1023の値が送られてきました。取得できています。<br />
この値を少し狭めたものを、車速を計測するプログラムのP_HI、P_LOWにセットします。<br /><br />

<h6 id="page-title-date">配線</h6>
インパネむき出しのまま走行するわけにはいかないのできちんと配線します。<br />
圧着端子などを使って信号を繋いで、線を表に持ってきます。<br /><br /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/3_05.jpg" height="404" width="539" /><br /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/3_06.jpg" /><br /><br />
表に出した車速パルス、GNDを先ほど作成した回路とArduinoに取り付けます。パルス計測用のプログラムに書き換えた場合、元のプログラムに戻すのを忘れないでください。<br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/3_07.jpg" height="406" width="541" /><br /><br />
今回はダッシュボードの上に置いています、ここは非常に高温になるため本来あまりオススメはしません。<br /><br /><br />
ついでに隣にPCを起きます。<br /><br /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/3_08.jpg" height="402" width="536" /><br /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/3_09.jpg" height="410" width="547" /><br /><br />

<h6 id="page-title-date">インターフェース</h6>


適当にインターフェースを作成します。<br /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/5_02.jpg" height="386" width="624" /><br />
<img src="http://www.kosaka-lab.com/tips/img/carspeed/5_01.jpg" height="387" width="626" /><br />
<br /><a href="http://www.kosaka-lab.com/tips/img/carspeed/Speed.zip">プロジェクトダウンロード</a><br /><br />今回はスペックの低いEeePCで表示するためシンプルにフォームで作ってありますが、XNAを用いてタコメーター風のIFを作成したり、音声による警告を作成すると面白いかと思います。<br /><br />
またPCを使わず7セグLEDやドット・マトリックスLEDなどに表示させてもいいでしょう。<br />
世間では7セグLEDをフロントガラスに反射させヘッドアップディスプレイ風のIFにするのが流行っているようです。<br /><br /><br />

<h6 id="page-title-date">動作</h6>
街中、高速道路などを実際に走行しテストした車載動画です。<br />
<iframe src="http://www.youtube.com/embed/68FxWreEcNY" allowfullscreen="" frameborder="0" height="390" width="640"></iframe>
<br /><br />
データにかなりのブレ・誤差があります。このままだとちょっと使い物になりませんね。値の平均化を行ったほうがいいでしょう。<br />
＊法定速度を超えて走行しているようなシーンがありますが、誤差による物であり実際には法定速度厳守で走行しています。<br /><br />

実際の車のスピードメーターは予測アルゴリズムを用いて非常に精密な速度を表示しているようです。（そのかわり、ほぼ停止寸前からの急加速等の動作で表示に遅れがあるようです）<br /><br /><br />
<h6 id="page-title-date">リンク</h6>
<a href="http://www.asahi-net.or.jp/%7Ese1m-nitu/html/Speed_Meter.htm">http://www.asahi-net.or.jp/~se1m-nitu/html/Speed_Meter.htm</a><br />
<a href="http://d.hatena.ne.jp/kwt514/">http://d.hatena.ne.jp/kwt514/</a><br />
<a href="http://wikiwiki.jp/disklessfun/?speed-warning">http://wikiwiki.jp/disklessfun/?speed-warning </a>]]>
        
    </content>
</entry>

</feed>

