2009年12月30日 星期三

2009年12月22日 星期二

FLARToolKit Multi Marker Detector & Cube type Marker 實作

ARis... 
ARis 是日本一間公司出品的產品,應用了 ARToolKit 技術。
展示影片在這…
http://www.youtube.com/watch?v=yCCx7zANsGE
YouTube上可以找到更多類似的影片。

這邊是我用 FLARToolKit 自己作的 DEMO,當然,不止是能運用在這方面( 指宅男專用 ),像是商業產品的3D 展示也可以這樣用,在全像投影真正普及化實現之前,我想 AR 技術或許是最快實現類似體驗的方法吧? ( 配合 AR 眼鏡 )

DEMO VIDEO...
http://www.youtube.com/watch?v=W9s2ldmd9Vc

DEMO ONLINE...
http://www.asn.com.tw/flex/FlarMikuDemo/PV3DFlarTest.html 

要線上執行需要列印出上列 Marker 檔,將其中的方塊組合起來,並且準備一台 Webcam,程式運行後再將 Webcam 對準方塊就會出現人偶嘍~(還有牛)!!!

Markers...
ARis Marker : http://www.asn.com.tw/flex/FlarMikuDemo/Data/ARisMarker.jpg
Cube Marker : http://www.asn.com.tw/flex/FlarMikuDemo/Data/CubeMarker.jpg
要自建 Marker 檔可以到…
http://flash.tarotaro.org/blog/2008/12/14/artoolkit-marker-generator-online-released/


======== 底下給有興趣寫 AR 程式的人作參考 ========

MultiMarker...
這個程式等於是 FLARToolKit 複數 Marker 的應用,在 FLARToolKit 中有個 FLARMultiMarkerDetector 的類別,是用來同時偵測多個 Marker 用的,MultiMarker 的偵測需要管理多個 Maeker 的 ARCode。
網路上有現成的多偵測點 Marker 管理函式庫 FLARManager
這個 MultiMarker 管理類別功能蠻強大的,包含多點偵測、圖形二元化閥值最佳化、座標位置 smooth 及動態點預測…。


FlarDetetor...
不過我沒有實際去用 FLARManager,而是自己寫了個簡化版的 FlarDetetor,一樣是 MultiMarker Detect,還蠻好用的,我的 ARis 就是利用這個類別作出來的。

FlarDetetor 特色:
一、多個 Marker 同時偵測。
二、事件觸發 ( MARKER_ADDED、MARKER_UPDATED、MARKER_REMOVED )。
三、完全獨立的一個類別,低耦合,只用到原始的 FLARToolKit 類別。
四、俱備簡易 smooth 功能。

如何使用:
一、初始化,跟一般 FLARToolKit 應用程式一樣代入 FLARParam 跟 Webcam 的 Bitmapdata。

            FlarDetector.init(_capture);

二、 建立 FlarObject 物件並載入 Marker 檔,然後加入 PV3D scene 中。

            var cube:FlarCube = new FlarCube ();
            cube.detector.loadCode( 'cube.pat',16,100 ); /// 注意後面二個 width 參數要與當初存 patern 時一致,否則測不出來唷。
            this.scene.addChild( cube );

三、最後只要在 PV3D Render 的時候 detect 即可自動分派事件。

            FlarDetector.detectMarkerLite();


FlarObject...
這個類別便是拿來裝你的 PV3D 子物件的容器,繼承自 FLARToolKit 的 FLARBaseNode 類別,並且有基本的一個 FlarDetector 及預設的事件反應,當 FlarDetector偵測到時便進行座標方位的轉換。
比較特別的地方在於我使用了一個 _pivot:DisplayObject3D 作為內容器,好方便底下延伸類別的座標軸轉換,所有子物件都放在 pivot中,就可以自由在程式控制相對位置跟方向,而不會受 Node Transform 的影響。
當然,其實 FlarDetector 是蠻低耦合的一個類別,你也可以直接使用 FlarDetector 在任何的場合,創造你自己的類別,也不一定要配合 PV3D 來使用,把 FlarDetector 當成一個單純的 Sensor 來使用即可。


FlarARisCube...

至於六面體 Marker 的偵測,網路上可以找到 Tarotaro 的 5 面立方體範例…
http://flash.tarotaro.org/blog/2009/04/06/cube-type-marker-in-flar/
 他的演算法是將水平的四個面用二個 Marker 解決,一個偵測用,一個判斷面向用,再加上上面一個 Marker 總共三個,真聰明丫,詳細的演算法可以參考…
http://flash.tarotaro.org/blog/2009/06/10/about-cube-detection-algorithm/

但是可惜是這個方法只能作 5 面偵測,從底下往上看沒有(要幹嘛?!),而且水平的四個面的 Marker 必需有一定的規則,Marker 的設計要比較注意。

這 個函式庫我也沒實際去用,於是又寫了個 FlarARisCube 的類別,這個類別其實只是在一個類別中放了六個 FlarDetector,再在偵測到時轉換一下座標而己,只是在轉換座標時搞的有點暈頭轉向,我的方法是比較直接的方式,效能沒 Tarotaro 的好,只能說是比較容易實現的方法。

最後則是六面體方塊在上仰角度時,會有遮罩的效果,讓六面體看起來更直實(能遮到人偶),我是參考 FLARToolKit 的原作者 saqoosha 的這篇文章…
http://saqoosha.net/en/2009/01/08/1676/
文章是介紹地上打洞的效果,不過原理一樣 ( 地上打洞很酷丫,下回再來作 ^ ^ )。


Finally…
一連串的學習QQ",總算成功,出現人偶嘍~(還有牛)~呵呵呵。


Source Code...
原始程式下載:( 包含 papervision3d 及 flartoolkit )-原始版本
http://www.asn.com.tw/flex/FlarMikuDemo/FlarMikuDemo.zip


2009/12/22 - 最新的 source 改放在 google code,http://code.google.com/p/flardetector/ 
( 不包含 papervision3d 及 flartoolkit )

2009年12月10日 星期四

Flartoolkits - Load DAE & Make your own Marker Online

在網路上即時載入 DAE 3D 模型,透過視訊即時的在線上建立 Flar 物件的 Marker。

操作方式:
1. Load DAE file,預設己經載入三個模組。
2. 下拉選單點選你要操作的FLAR物件。
3. 用麥克筆或印表機畫出你自訂的圖樣(正方形黑色邊框+裡面塗上簡易圖示)。
4. 按下 Detect Pattern,把視訊對準圖樣。
5. 當紅色標示出現在正確的位置時按下 Set Pattern。
6. 下方操控面板可以控制物件的大小及角度。
(亦可直接點選畫面上的物件操作)


DEMO VIDEO:
http://www.youtube.com/watch?v=Hp2qY4_Ez_Y

ONLINE DEMO:
http://www.asn.com.tw/flex/PV3DFlar/MarkerGeneratorOnline.html

2009年12月8日 星期二

紅外線發射程式

最近用微處理器(MCU)寫了個紅外線發射的程式…
原本的想法太過於複雜,程式寫久了會想要把東西寫的更靈活,於是會自己加了很多動態的計算、即時的判斷程式碼,沒想到對系統資源有限、時序要求非常嚴苛的 MCU 卻是一種負擔,這在多核的MCU如FPPA下不是什麼大問題,但在傳統的 MCU 如 EMC 或 PIC 卻會讓你越靈活就越難以控制(尤其是當你用C而不用組合語言來寫的時候)。
在重新思考及嘗試後才發現原來程式很簡單…

/// 這邊的編碼是以 SM5032 為例…
void IR_Bit0( void )
{
/// 產生1/4週期的38KHZ載波
}

void IR_Bit1( void )
{
/// 產生3/4週期的38KHZ載波
}

void IR_Empty( void )
{
/// 空周期延時
}

void IR_Head( void ){
      IR_Bit1();
      IR_Bit1();
      IR_Bit0();
}

void IR_Custom( void )
{
      IR_Bit1();
      IR_Bit1();
}

void IR_Tail( void )
{
      IR_Empty();
      IR_Empty();
      IR_Empty();
      IR_Empty();
}

#define _0 IR_Bit0();   
#define _1 IR_Bit1();
#define _H IR_Head();    /// HEAD code
#define _C IR_Custom();/// Custom code
#define _T IR_Tail(); /// End code
   
void main()
{
    Initial();
    Initial_IO();
   
    while(1)
    {
        if( BTN0 == 0 )
        {
            _H _C _0 _0 _0 _0 _0 _0 _1 _T                       
        } else if( BTN1 == 0 )
        {
            _H _C _0 _0 _0 _0 _0 _1 _0 _T     
        } else if( BTN2 == 0 )
        {
            _H _C _0 _0 _0 _1 _0 _0 _0 _T                       
        } else if( BTN3 == 0 )
        {
            _H _C _1 _0 _0 _0 _0 _1 _1 _T                       
        } else if( BTN4 == 0 )
        {
            _H _C _0 _0 _0 _0 _1 _0 _0 _T                       
        } else if( BTN5 == 0 )
        {
            _H _C _0 _0 _1 _0 _0 _0 _0 _T                       
        } else if( BTN6 == 0 )
        {
            _H _C _0 _1 _0 _0 _0 _0 _0 _T                       
        }
    }
}






另外有一點要特別注意,一般紅外線發射會使用455KHZ的晶振,算是比較低頻,各家 MCU 特性不同,有可能會需要在 OSCO 串上個串聯電組 (5-10K)才會正常起振。

2009年12月6日 星期日

有趣的 FLARToolKIT

 結合 webcam 產生像是虛擬+實境融合的效果(Augmented Reality)~
http://blog.papervision3d.org/2009/01/07/augmented-reality-with-flartoolkit/
網路上有一大堆很酷的作品唷。

FLARToolKit 是一位日本人將 ARToolKit  改寫成 AS3版本,再配合 3D 引擎 (如 Papervision3D ) 作成的。

主要的原理是利用事先製作好的圖像(marker)作為辨識它在現實環境中的 3D 位置、角度…等等的資料,再套用到螢幕這個 marker 所代表的 3D 物件,結合 webcam 畫面就造成這樣的視覺效果了。

底下是自己練習的成果影片…
http://www.youtube.com/watch?v=tyQWHQH28iM
可以想像一下整個房間貼滿 marker 或 全身穿上有 marker 的衣服會是怎樣的情景~^ ^,有很多發揮創意的空間。


線上 Demo 在這…
http://www.asn.com.tw/flex/PV3DFlar/PV3DFlar.html
*要使用線上 Demo 必須準備 webcam,再列印我使用的二種 marker,到這個網址後會提示啟用 webcam,再把 marker 對著  webcam 鏡頭晃,就會在螢幕上看到效果了。
*我的 marker 可以在這下載

更高效處理 micro second 的方式

更高效處理 micro second 的方式…  以 STM32 為例… __IO unsigned long sys_tick = 0; void SysTick_Handler(void) {     HAL_IncTick();     sys_tick += (SysTi...