<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>LAB^180</title>
	<atom:link href="http://lab.180hb.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://lab.180hb.com</link>
	<description>Eksperymenty i gotowe biblioteki opracowane przez 180hb i udostępniane za darmo również do celów komercyjnych.</description>
	<lastBuildDate>Fri, 23 Mar 2012 12:53:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Prezentacja Check-In</title>
		<link>http://lab.180hb.com/2012/03/prezentacja-check-in/</link>
		<comments>http://lab.180hb.com/2012/03/prezentacja-check-in/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 09:05:34 +0000</pubDate>
		<dc:creator>Szymon Piotr Pepliński</dc:creator>
				<category><![CDATA[Dyskusje]]></category>

		<guid isPermaLink="false">http://lab.180hb.com/?p=866</guid>
		<description><![CDATA[Prezentacja Check-In zrealizowana na potrzeby Warsztatów Innowacji Lab^180. Checkin&#8217;owanie przy pomocy NFC (Near Field Communication), czyli szybkie meldowanie się w Internecie z każdego miejsca.]]></description>
			<content:encoded><![CDATA[<p>Prezentacja Check-In zrealizowana na potrzeby Warsztatów Innowacji <b>Lab^180</b>.<br />
Checkin&#8217;owanie przy pomocy NFC (Near Field Communication), czyli szybkie meldowanie się w Internecie z każdego miejsca.<br />
<span id="more-866"></span><br />
<iframe src="http://player.vimeo.com/video/37665812?title=0&amp;byline=0&amp;portrait=0" width="520" height="292" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://lab.180hb.com/2012/03/prezentacja-check-in/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reportaż z warsztatów</title>
		<link>http://lab.180hb.com/2012/02/reportaz-z-warsztatow/</link>
		<comments>http://lab.180hb.com/2012/02/reportaz-z-warsztatow/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 10:32:57 +0000</pubDate>
		<dc:creator>Szymon Piotr Pepliński</dc:creator>
				<category><![CDATA[Dyskusje]]></category>
		<category><![CDATA[Wideo]]></category>

		<guid isPermaLink="false">http://lab.180hb.com/?p=855</guid>
		<description><![CDATA[Reportaż z Warsztatów Innowacji Lab^180 edycja druga.]]></description>
			<content:encoded><![CDATA[<p>Reportaż z Warsztatów Innowacji <b>Lab^180</b> edycja druga.<br />
<span id="more-855"></span><br />
<iframe src="http://player.vimeo.com/video/36280921?title=0&amp;byline=0&amp;portrait=0" width="520" height="292" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://lab.180hb.com/2012/02/reportaz-z-warsztatow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Śledzenie ruchu ciała</title>
		<link>http://lab.180hb.com/2012/02/sledzenie-ruchu-ciala/</link>
		<comments>http://lab.180hb.com/2012/02/sledzenie-ruchu-ciala/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 22:24:41 +0000</pubDate>
		<dc:creator>Szymon Piotr Pepliński</dc:creator>
				<category><![CDATA[Kinect]]></category>
		<category><![CDATA[Physical Computing]]></category>
		<category><![CDATA[Urządzenia]]></category>

		<guid isPermaLink="false">http://lab.180hb.com/?p=796</guid>
		<description><![CDATA[Jedną z najprostszych a jednocześnie najdokładniejszych metod służących do śledzenia ruchu ciała, jest użycie sensora Kinect. &#160; Kinect został początkowo zaprojektowany jako sensor dla konsoli XBOX 360, który pozwala na interaktywną rozrywkę bez potrzeby wykorzystywania dodatkowych kontrolerów. Takie rozwiązanie pozwala użytkownikom grać w gry (i nie tylko) bez potrzeby używania padów i innych powszechnie do [...]]]></description>
			<content:encoded><![CDATA[<p>Jedną z najprostszych a jednocześnie najdokładniejszych metod służących do śledzenia ruchu ciała, jest użycie sensora Kinect.<br />
<span id="more-796"></span><a name="msdn">&nbsp;</a><br />
Kinect został początkowo zaprojektowany jako sensor dla konsoli XBOX 360, który pozwala na interaktywną rozrywkę bez potrzeby wykorzystywania dodatkowych kontrolerów. Takie rozwiązanie pozwala użytkownikom grać w gry (i nie tylko) bez potrzeby używania padów i innych powszechnie do tej pory stosowanych urządzeń manipulacyjnych. [<a href="#msdn_ref">1</a>]</p>
<p><img src="http://lab.180hb.com/wp-content/uploads/2012/02/Kinect.jpg" border="0" /></p>
<p>Dane, pobierane przez sensor, dostarczają informacji o położeniu 20 części ciała, pozwalają one na określenie ich współrzędnych względem sensora. Punkty te tworzą szkielet postaci. Za pomocą tych punktów jesteśmy w stanie rozpoznać aktualne położenie człowieka względem sensora oraz jego pozę w pozycji &#8222;En face&#8221;, czyli przodem do sensora.</p>
<p>Cały proces odbywa się z wykorzystaniem kamery głębokości i emitera promieni podczerwonych. Znaczy to mniej więcej tyle, że dla sensora Kinect nie ma znaczenia ilość światła, która dociera do pomieszczenia.</p>
<p>Wykorzystując kamerę głębokości, możemy stworzyć trójwymiarowy model pomieszczenia i obiektów znajdujących się w nim.</p>
<p>Należy jednak uświadomić sobie, że dane, pochodzące ze strumienia pobieranego z kamery odległości, nie niosą ze sobą informacji, dotyczących samego obrazu, ale mają zapisane w sobie odległości pojedynczych pikseli. </p>
<p>Postanowiliśmy wykorzystać powyższe rozwiązanie przy projekcie interaktywnej podłogi na bazie gry &#8222;<a href='http://180hb.com/projects/id/HL1ZE9uJKyk' target='_blank'>LEDerzy Ewolucji</a>&#8221; stworzonej dla Samsung Electronics Polska.</p>
<p>Do śledzenia ruchu postaci (widok z góry), użyliśmy kamery głębokości.<br />
Uzyskaliśmy w ten sposób oczekiwany rezultat w postaci zarysu sylwetki.</p>
<p><iframe src="http://player.vimeo.com/video/36250643?title=0&amp;byline=0&amp;portrait=0" width="400" height="300" frameborder="0"></iframe></p>
<p>Poniżej przykład implementacji w C++ z użyciem <a href="http://www.openframeworks.cc" target="_blank">openFrameworks</a>.
<p>&nbsp;</p>
<p>Plik <b>testApp.h</b><br />
<code>#include "ofMain.h"<br />
#include "ofxOpenCv.h"<br />
#include "ofxKinect.h"<br />
#define KINECT_GAME_WIDTH 800<br />
#define KINECT_GAME_HEIGHT 600<br />
class testApp : public ofBaseApp<br />
{<br />
public:<br />
    void setup();<br />
    void update();<br />
    void draw();<br />
    ofxKinect           kinect;<br />
    ofxCvGrayscaleImage grayImage;<br />
    ofxCvContourFinder  contourFinder;<br />
    int                 nearThreshold;<br />
    int                 farThreshold;<br />
};</code></p>
<p>Plik <b>testApp.cpp</b><br />
<code>#include "testApp.h"<br />
void testApp::setup()<br />
{<br />
    // enable depth-&gt;rgb image calibration<br />
    kinect.setRegistration( true );<br />
    kinect.init();<br />
    kinect.open();<br />
    grayImage.allocate( kinect.width, kinect.height );<br />
    nearThreshold = 255;<br />
    farThreshold = 100;<br />
}<br />
void testApp::update()<br />
{<br />
    kinect.update();<br />
    // there is a new frame and we are connected<br />
    if ( kinect.isFrameNew() )<br />
    {<br />
        // load grayscale depth image from the kinect source<br />
        grayImage.setFromPixels(<br />
            kinect.getDepthPixels(),<br />
            kinect.width, kinect.height<br />
        );<br />
        unsigned char * pixels = grayImage.getPixels();<br />
        int numPixels = grayImage.getWidth() * grayImage.getHeight();<br />
        for ( int i = 0; i &lt; numPixels; i++ )<br />
        {<br />
            if ( pixels[ i ] &lt; nearThreshold<br />
                 &amp;&amp; pixels[ i ] &gt; farThreshold )<br />
            {<br />
                pixels[ i ] = 255;<br />
            }<br />
            else<br />
            {<br />
                pixels[ i ] = 0;<br />
            }<br />
        }<br />
        // update the cv image<br />
        grayImage.flagImageChanged ();<br />
        contourFinder.findContours(<br />
            grayImage, 10,<br />
            ( kinect.width * kinect.height ) / 2,<br />
            20, false<br />
        );<br />
    }<br />
}<br />
void testApp::draw()<br />
{<br />
    grayImage.draw( 320, 0, 320, 240 );<br />
    contourFinder.draw( 320, 0, 320, 240 );<br />
    if ( contourFinder.nBlobs &gt; 0 )<br />
    {<br />
        ofxCvBlob blob = contourFinder.blobs [ 0 ];<br />
        ofRectangle rect = blob.boundingRect;<br />
        ofSetColor( 255, 0, 0 );<br />
        ofCircle(<br />
            320 + ( rect.x * 0.5 ) + ( rect.width * 0.25 ),<br />
            0   + ( rect.y * 0.5 ) + ( rect.height * 0.25 ),<br />
            10<br />
        );<br />
        float currentX = ofMap(<br />
            rect.x + ( rect.width  * 0.5 ),<br />
            0, 640,<br />
            0, KINECT_GAME_WIDTH<br />
        );<br />
        float currentY = ofMap(<br />
            rect.y + ( rect.height * 0.5 ),<br />
            0, 480,<br />
            0, KINECT_GAME_HEIGHT<br />
        );<br />
        cout &lt;&lt; currentX &lt;&lt; " x " &lt;&lt; currentY &lt;&lt; endl;<br />
    }<br />
}</code></p>
<p>Efekt finalny wygląda tak:</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0210.Interactvie-Floor-1.jpg" border="0" /></p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0220.Interactvie-Floor-2.jpg" border="0" /></p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0230.Interactvie-Floor-3.jpg" border="0" /><br />
<a name="msdn_ref">&nbsp;</a><br />
[<a href="#msdn">1</a>] Źródło: <a href="http://msdn.microsoft.com" target="_blank">http://msdn.microsoft.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://lab.180hb.com/2012/02/sledzenie-ruchu-ciala/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kreujemy jutro</title>
		<link>http://lab.180hb.com/2012/01/kreujemy-jutro/</link>
		<comments>http://lab.180hb.com/2012/01/kreujemy-jutro/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 15:02:26 +0000</pubDate>
		<dc:creator>Szymon Piotr Pepliński</dc:creator>
				<category><![CDATA[Dyskusje]]></category>

		<guid isPermaLink="false">http://lab.180hb.com/?p=755</guid>
		<description><![CDATA[I stało się. Warsztat innowacji Lab^180 edycja druga jest już historią. Osobom, które mogły wziąć udział w tym wydarzeniu &#8211; dziękujemy. Pozostałych zapewniamy, że w kolejnej edycji zrobimy tyle, ile się da, aby wszyscy chętni mogli w organizowanych przez nas warsztatach uczestniczyć. Dla jednych i drugich przygotowaliśmy fotoreportaż. Tegoroczny plan warsztatów był ambitny. Jak zawsze. [...]]]></description>
			<content:encoded><![CDATA[<p>I stało się. <a href="http://lab.180hb.com/kreujemyjutro/" target="_blank">Warsztat innowacji Lab^180</a> edycja druga jest już historią. Osobom, które mogły wziąć udział w tym wydarzeniu &#8211; dziękujemy. Pozostałych zapewniamy, że w kolejnej edycji zrobimy tyle, ile się da, aby wszyscy chętni mogli w organizowanych przez nas warsztatach uczestniczyć.</p>
<p>Dla jednych i drugich przygotowaliśmy fotoreportaż.<br />
<span id="more-755"></span></p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0000.Lab-4.jpg" /></p>
<p>Tegoroczny plan warsztatów był ambitny. Jak zawsze.<br />
Goście rodzimi i zagraniczni. Atmosfera twórcza.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0010.Interactions-3.jpg" /></p>
<p>Miejsce &#8211; dobrze znane &#8211; Cybernetyki 2.2.2.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0020.Lab-2.jpg" /></p>
<p>Myśl przewodnia &#8211; interakcja.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0030.Lab-1.jpg" /></p>
<p>Już od samego wejścia silna grupa wsparcia. Pomocne dłonie dla wszystkich zagubionych.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0035.Peoples-12.jpg" /></p>
<p>Ostatnie testy i&#8230; zaczynamy.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0040.Peoples-2.jpg" /></p>
<p>Przy stanowiskach zaangażowane osoby. Doświadczone i kompetentne.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0050.Presentation-1.jpg" /></p>
<p>Otwarcie warsztatów. Zaczyna Marcin Gaworski &#8211; Managing Director w 180heartbeats.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0060.Presentation-4.jpg" /></p>
<p>Jan Szarras przedstawia koncepcję tegorocznego spotkania oraz opisuje przygotowane przez nas rozwiązania.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0065.Peoples-5.jpg" /></p>
<p>Przestrzeń zapełniona. Jakby zainteresowana tym, co mówimy.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0070.Presentation-2.jpg" /></p>
<p>Szymon P. Pepliński opowiada o idei Lab^180.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0075.Peoples-6.jpg" /></p>
<p>Wszystko wydaje się być jasne..</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0080.Presentation-3.jpg" /></p>
<p>Jan Szarras opisuje projekty przygotowane na potrzeby warsztatów.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0090.Lab-3.jpg" /></p>
<p>Szczegółowa mapa interakcji. </p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0150.Presentation-6.jpg" /></p>
<p>Todd Brown &#8211; Creative Director z Jung von Matt opowiada o technologiach, które &#8222;making the big idea bigger&#8221;.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0155.Peoples-4.jpg" /></p>
<p>Rozmowa na temat fascynujących rozwiązań marketingowych.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0160.Presentation-5.jpg" /></p>
<p>Szczegóły realizacji projektów dla globalnych marek.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0170.Peoples-13.jpg" /></p>
<p>Dużo trudnych słów, więc wsparcie tłumaczy.. bezcenne.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0190.Presentation-7.jpg" /></p>
<p>Czas szybko płynie&#8230;</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0200.Interactions-2.jpg" /></p>
<p>Pora na checkiny, interakcje, rozmowy.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0210.Interactvie-Floor-1.jpg" /></p>
<p>Interaktywna podłoga, czyli jesteś kursorem w grze LEDerzy Ewolucji.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0220.Interactvie-Floor-2.jpg" /></p>
<p>Próbujemy, gramy, wygrywamy.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0230.Interactvie-Floor-3.jpg" /></p>
<p>Game Over. Ale zawsze można spróbować jeszcze raz..</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0240.Interactvie-Floor-4.jpg" /></p>
<p>Z niewiadomych powodów, organizatorzy zdobywają więcej punktów.. ;-p</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0250.Peoples-7.jpg" /></p>
<p>A dookoła następuje wymiana wiedzy i doświadczeń.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0260.Wii-1.jpg" /></p>
<p>Tak też można. Produkt testowany na ludziach.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0270.Wii-2.jpg" /></p>
<p>Wii on Board.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0280.Wii-3.jpg" /></p>
<p>Łapiemy równowagę.. a czas leci.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0290.Users-11.jpg" /></p>
<p>Jedni próbują inni komentują.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0300.Peoples-10.jpg" /></p>
<p>Nikt nie siedzi.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0310.Checkin-3.jpg" /></p>
<p>Publikujemy twórczość tworzoną przy użyciu stołu dotykowego.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0320.Checkin-5.jpg" /></p>
<p>Kolejny checkin i&#8230;</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0330.Checkin-1.jpg" /></p>
<p>.. pojawia się nowa praca.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0340.Users-10.jpg" /></p>
<p>W międzyczasie rozmawiamy z uczestnikami i pytamy o ich spostrzeżenia.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0350.Users-4.jpg" /></p>
<p>Jak zwykle, przy tego typu rozmowach, pojawia się cała masa interesujących idei.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0360.Peoples-11.jpg" /></p>
<p>Czas płynie. Pora na kolejnych gości.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0370.Dodecaudion-8.jpg" /></p>
<p>panGenerator &#8211; hacking bits&#038;atoms</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0380.Dodecaudion-7.jpg" /></p>
<p>Prezentacja projektów najprężniej działającego kolektywu nowomedialnego w Polsce.<br />
Opowiada Jakub Koźniewski.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0390.Dodecaudion-4.jpg" /></p>
<p>Krzysztof Cybulski z panGenerator&#8217;a.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0400.Dodecaudion-5.jpg" /></p>
<p>Dodecaudion live.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0410.Dodecaudion-2.jpg" /></p>
<p>Cisza na sali. Wszyscy zasłuchani w dźwiękach generowanych przez Dodecaudion&#8217;a.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0420.Dodecaudion-6.jpg" /></p>
<p>Twórca i tworzywo.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0425.Peoples-8.jpg" /></p>
<p>Prezentacja działania za nami. Czas na doświadczanie.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0430.Dodecaudion-1.jpg" /></p>
<p>Chętnych nie brakuje.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0440.Dodecaudion-3.jpg" /></p>
<p>Jak to na warsztatach. Można posłuchać, podotykać, etc..</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0445.Users-3.jpg" /></p>
<p>Czas na interakcję z pozostałymi pracami.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0450.Like'o'Meter.jpg" /></p>
<p>Olga Górnicka z SWPS przygotowała Like&#8217;o'meter. Urządzenie wizualizujące poziom zadowolenia.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0460.Users-2.jpg" /></p>
<p>Kolejne rozmowy i opinie.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0470.Users-9.jpg" /></p>
<p>Nie brakuje również autorefleksji..</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0480.Table-1.jpg" /></p>
<p>Robert Lechowicz z Lab^180 prezentuje zasadę funkcjonowania interfejsu multi-touch stołu dotykowego.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0490.Table-2.jpg" /></p>
<p>Pora na autorską twórczość.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0500.Table-3.jpg" /></p>
<p>Klika chwil i mamy dzieło gotowe, by je uwiecznić na ścianie..</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0510.Peoples-9.jpg" /></p>
<p>Nie brakuje również &#8222;starych znajomych&#8221;. Piotr Mederak &#8211; osoba, która zapoczątkowała Lab^180.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0520.Interactions-1.jpg" /></p>
<p>W miarę upływu czas poziom interakcji wzrasta.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0530.Snake-3.jpg" /></p>
<p>Kiedy jedni usiłują utrzymać równowagę, inni w zaciszu kanapy grają w Nokia Snake.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0540.Snake-2.jpg" /></p>
<p>Specjalna wersja multiplayer przeznaczona na urządzenia mobilne &#8211; smartfony, tablety, etc.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0550.Snake-4.jpg" /></p>
<p>Jeszcze chwila i poznamy zwycięzcę..</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0560.Snake-1.jpg" /></p>
<p>Dobra pozycja w rankingu &#8211; to jest coś! Tym bardziej, że dla najlepszych mamy nagrody..</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0560.Users-7.jpg" /></p>
<p>Uczestnicy opowiadają o swoich doznaniach.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0570.Peoples-3.jpg" /></p>
<p>Trochę tego jest. Czasem trzeba odpocząć.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0580.Users-1.jpg" /></p>
<p>Ale tylko na chwilę, bo czas nieubłaganie płynie..</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0590.Interactive-Cloth-1.jpg" /></p>
<p>A trzeba jeszcze coś narysować.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0600.Interactive-Cloth-2.jpg" /></p>
<p>Może jakiś emotikon albo napis. Może logo?</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0610.Interactive-Cloth-4.jpg" /></p>
<p>A potem wyświetlić to coś zdalnie na ubraniu.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0640.Interactive-Cloth-3.jpg" /></p>
<p>Wszystko po to, aby było zabawnie. Umiemy się śmiać z samych siebie.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0620.Users-5.jpg" /></p>
<p>Teraz tylko trzeba tą całą wiedzę przetrawić. A potem zacząć stosować w projektach.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0630.Users-6.jpg" /></p>
<p>Ostatnie rozmowy..</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0650.Interactive-Cloth-5.jpg" /></p>
<p>.. i to już. Lab^180 edycja druga zbliża się do końca.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0660.Interactive-Cloth-6.jpg" /></p>
<p>Raz jeszcze dziękujemy za kreatywną atmosferę i za to, że byliście.</p>
<p><img src="http://lab.180hb.com/kreujemyjutro/images/event/0700.Lab180-Team.jpg" /></p>
<p>No i do zobaczenia na kolejnych warsztatach!<br />
Zespół Lab^180.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.180hb.com/2012/01/kreujemy-jutro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PS3 Eye Camera</title>
		<link>http://lab.180hb.com/2011/11/ps3-eye-camera/</link>
		<comments>http://lab.180hb.com/2011/11/ps3-eye-camera/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 10:56:27 +0000</pubDate>
		<dc:creator>Szymon Piotr Pepliński</dc:creator>
				<category><![CDATA[Physical Computing]]></category>
		<category><![CDATA[Urządzenia]]></category>
		<category><![CDATA[Wideo]]></category>

		<guid isPermaLink="false">http://lab.180hb.com/?p=720</guid>
		<description><![CDATA[Kamera cyfrowa Niezbędnym elementem podczas prototypowania jest kamera podłączana bezpośrednio do komputera. Jej celem jest transmisja obrazów płynnych (odbywająca się w sposób ciągły) lub obrazów statycznych (pojedynczy obraz przesyłany co pewien czas). Kamera, jako interfejs, zmienia swoją funkcję z urządzenia rejestrującego obraz na instrument do interakcji. Analiza obrazu pozwala na śledzenie ruchu obiektów postrzeganych przez [...]]]></description>
			<content:encoded><![CDATA[<h3>Kamera cyfrowa</h3>
<p>Niezbędnym elementem podczas prototypowania jest kamera podłączana bezpośrednio do komputera.</p>
<p>Jej celem jest transmisja obrazów płynnych (odbywająca się w sposób ciągły) lub obrazów statycznych (pojedynczy obraz przesyłany co pewien czas).</p>
<p><span id="more-720"></span>Kamera, jako interfejs, zmienia swoją funkcję z urządzenia rejestrującego obraz na instrument do interakcji.</p>
<p>Analiza obrazu pozwala na śledzenie ruchu obiektów postrzeganych przez kamerę, w tym również ruchu człowieka.</p>
<p>Ekstrakcja tych ruchów za pomocą oprogramowania nie jest prosta i polega na analizie zmian w sekwencji przekazywanych przez kamerę klatek.</p>
<p>Przetworzony przez komputer obraz, może posiadać elementy realistyczne lub może być kompletną wirtualną abstrakcją.</p>
<p>Badanie ruchu człowieka z informacji przekazywanych przez kamerę, jest analizą bardzo trudną do zrealizowania.</p>
<p>Wynika to z faktu interpretowania ruchu w przestrzeni trójwymiarowej z płaskiego obrazu.</p>
<p>Aby kamera dobrze spełniała swoje zadania, należy zwrócić uwagę na jakość przesyłanego obrazu oraz szybkość działania nawet w słabszym oświetleniu.</p>
<h3>SONY Playstation 3 Eye Camera</h3>
<p>Po przetestowaniu wielu kamer dostępnych na rynku, najlepsza okazała się <b>SONY Playstation 3 Eye Camera</b>.</p>
<p><br /><img border="0" src="http://lab.180hb.com/wp-content/uploads/2011/11/ps3eye.jpg" alt="Sony Playstation 3 Eye Camera" title="Sony Playstation 3 Eye Camera" width="480" height="530" /></p>
<p>PS3 Eye pozwala na analizę obrazu w rozdzielczości 320&#215;240 pikseli przy szybkości transmisji danych na poziomie 125 klatek na sekundę, lub 640&#215;480 pikseli przy 75 klatkach na sekundę.</p>
<p>Sterowniki pod Windows można pobrać ze strony <a href="http://codelaboratories.com/products/eye/" target="_blank">Code Laboratories</a>.<br />
Dla Mac OS X można użyć <a href="http://webcam-osx.sourceforge.net/" target="_blank">macam</a>.</p>
<p>Dodatkowym czynnikiem jest cena. Obecnie PS3 Eye można nabyć już za 10EUR.</p>
<h3>Rejestracja podczerwieni.</h3>
<p>Praktycznie każda kamera cyfrowa widzi podczerwień, ale niemal wszystkie posiadają filtr, który ją blokuje.</p>
<p>Po usunięciu filtra matryca kamery reaguje na zakres światła widzialnego (czyli takiego, na które reaguje siatkówka oka w procesie widzenia) i podczerwonego.</p>
<p>W sieci dostępnych jest <a href="http://codelaboratories.com/research/view/ps3-eye-disassembly" target="_blank">wiele przykładów</a> na to, jak należy zmodyfikować PS3 Eye, aby usunąć filtr podczerwieni.</p>
<p>Należy zwrócić jednak uwagę, że po usunięciu tego filtra, przekazywany przez kamerę <u>obraz staje się nieostry</u>, gdyż filtr jest jednocześnie soczewką!</p>
<p>Można użyć standardowego mocowania do obiektywów m12x0.5 oraz obiektywów M12 (S Mount).</p>
<p><img border="0" src="http://lab.180hb.com/wp-content/uploads/2011/11/ps3eye-m12.jpg" alt="PS3 Eye Camera m12 Mount" title="PS3 Eye Camera m12 Mount" width="480" height="270" /></p>
<p>Zmodyfikowaną w ten sposób kamerę możemy użyć na przykład do budowy <a href="http://lab.180hb.com/2011/09/lab-surface-laser-light-plane/" target="_self">ekranu dotykowego</a>.</p>
<h3>Kilka kamer.</h3>
<p>Sterownik do Playstation 3 Eye Camera umożliwia podłączenia kilku kamer do jednego komputera i analizy obrazu z każdej z nich w czasie rzeczywistym.</p>
<p><img border="0" src="http://lab.180hb.com/wp-content/uploads/2011/11/ps3eye-4cameras.jpg" alt="PS3 Eye - 4 Cameras" title="PS3 Eye - 4 Cameras" width="480" height="360" /></p>
<p>Przykład implementacji o OpenFrameworks.</p>
<pre>
<code>void testApp::setup()
{
	camWidth = 320;
	camHeight = 240;

	vidGrabber = new ofVideoGrabber[ 6 ];

	// (unavailable) device[0] DV Video
	// (unavailable) device[1] IIDC FireWire Video

	for ( int i = 2; i &lt; 6; i++ )
	{
		vidGrabber[ i ].listDevices();
		vidGrabber[ i ].setVerbose( true );
		vidGrabber[ i ].initGrabber( camWidth, camHeight );
	}
}

void testApp::update()
{
	ofBackground( 100, 100, 100);

	for ( int i = 2; i &lt; 6; i++ )
	{
		vidGrabber[ i ].grabFrame();
	}
}

void testApp::draw()
{
	ofSetHexColor( 0xffffff );

	int offsetX = 0;
	int offsetY = 0;

	for( int i = 2; i &lt; 6; i++ )
	{
		vidGrabber[ i ].draw(
			20 + ( offsetX * camWidth ),
			20 + ( offsetY * camHeight )
		);

		if ( offsetX++ == 1 )
		{
			offsetX = 0;
			offsetY++;
		}
	}
}</code>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://lab.180hb.com/2011/11/ps3-eye-camera/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalacja Debiana na Intel SS4000-e</title>
		<link>http://lab.180hb.com/2011/10/instalacja-debiana-na-intel-ss4000-e/</link>
		<comments>http://lab.180hb.com/2011/10/instalacja-debiana-na-intel-ss4000-e/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 14:23:20 +0000</pubDate>
		<dc:creator>Dominik Drążyk</dc:creator>
				<category><![CDATA[Urządzenia]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Intel SS400-e]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://lab.180hb.com/?p=589</guid>
		<description><![CDATA[Intel SS4000-e to NAS typu &#8222;entry level&#8221;. W opisie możliwości mamy udostępnianie plików przez CIFS/NFS/iSCSI, wsparcie dla RAID 0,1,5, wysyłanie powiadomień o stanie systemu e-mailem &#8211; jednym słowem wszystko co wydawałoby się niezbędne w małym urządzeniu dla firm. Dodatkowym atutem był fakt, że po wymianie urządzeń w serwerowni mały Intel stał bezczynnie na półce :) NAS [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Intel SS4000-e to NAS typu &#8222;entry level&#8221;. W opisie możliwości mamy udostępnianie plików przez CIFS/NFS/iSCSI, wsparcie dla RAID 0,1,5, wysyłanie powiadomień o stanie systemu e-mailem &#8211; jednym słowem wszystko co wydawałoby się niezbędne w małym urządzeniu dla firm. Dodatkowym atutem był fakt, że po wymianie urządzeń w serwerowni mały Intel stał bezczynnie na półce :)</p>
<p><span id="more-589"></span></p>
<p style="text-align: justify;"><a rel="attachment wp-att-591" href="http://lab.180hb.com/2011/10/instalacja-debiana-na-intel-ss4000-e/img_20110929_160802-2/"><img class="alignnone size-thumbnail wp-image-591" title="IMG_20110929_160802" src="http://lab.180hb.com/wp-content/uploads/2011/10/IMG_20110929_1608021-240x240.jpg" alt="" width="240" height="240" /></a></p>
<p style="text-align: justify;">NAS ma zainstalowanego w sobie Linuksa z oprogramowaniem IP Stor, jednak jego funkcjonalność pozostawia wiele do życzenia. Między innymi nie można skorzystać z iSCSI na innej platformie niż Windows i występują problemy z podłączeniem NFS-a na Linuksie. W czasie bezowocnych poszukiwań rozwiązania wspomnianych problemów znalazłem kilka stron z informacją, że na SS4000-e można zainstalować Debiana (istnieje specjalna wersja dla tych urządzeń).</p>
<p style="text-align: justify;">Aby móc w pełni wykorzystać potencjał małego NAS-a należy:</p>
<ul>
<li><strong>zaopatrzyć się w lutownicę (warunek konieczny)</strong></li>
<li>pobrać pliki ze strony projektu Debian: <a href="http://d-i.debian.org/daily-images/armel/daily/iop32x/netboot/ss4000e/">http://d-i.debian.org/daily-images/armel/daily/iop32x/netboot/ss4000e/</a></li>
<li>zaopatrzyć się w złącze portu szeregowego z kostką 10-pinową z jednej strony i DB9 z drugiej (takie jak w starszych komputerach)</li>
<li>posiadać kabel szeregowy NULL MODEM</li>
</ul>
<p><a rel="attachment wp-att-596" href="http://lab.180hb.com/2011/10/instalacja-debiana-na-intel-ss4000-e/kabel-dil10-db9/"><img class="alignleft size-thumbnail wp-image-596" style="margin-left: 10px; margin-right: 10px;" title="kabel-dil10-db9" src="http://lab.180hb.com/wp-content/uploads/2011/10/kabel-dil10-db9-240x240.jpg" alt="" width="240" height="240" /></a><a rel="attachment wp-att-597" href="http://lab.180hb.com/2011/10/instalacja-debiana-na-intel-ss4000-e/zlacze-szeregowe/"><img class="alignleft size-thumbnail wp-image-597" title="zlacze-szeregowe" src="http://lab.180hb.com/wp-content/uploads/2011/10/zlacze-szeregowe-240x240.jpg" alt="" width="240" height="240" /></a></p>
<p>Teraz musimy przerobić kabel z kostką (rozmieszczenie pinów na płycie Intela nie jest standardowe albo mój kabel miał nieodpowiednie wyprowadzenia) zgodnie z poniższym schematem:</p>
<ul>
<li>3 &#8211; 2</li>
<li>5 &#8211; 3</li>
<li>9 &#8211; 5</li>
</ul>
<p><a rel="attachment wp-att-598" href="http://lab.180hb.com/2011/10/instalacja-debiana-na-intel-ss4000-e/przerobiony-kabel-dil10-db9/"><img class="alignnone size-thumbnail wp-image-598" title="przerobiony-kabel-dil10-db9" src="http://lab.180hb.com/wp-content/uploads/2011/10/przerobiony-kabel-dil10-db9-240x240.jpg" alt="" width="240" height="240" /></a></p>
<p style="text-align: justify;">Pozostałe kable pozostawiamy bez zmian, odlutowane nie są potrzebne i wystarczy je zabezpieczyć izolacją, aby nie zwierały z żadnym z elementów. Teraz trzeba:</p>
<ul>
<li>podłączyć kostkę do złącza na płycie głównej (jak na zdjęciu powyżej)</li>
<li>podłączyć kabel NULL MODEM do komputera i złącza DB9</li>
<li>wgrać plik pkg jako aktualizację firmware&#8217;u urządzenia</li>
<li>zmienić nazwę pliku initrd.gz na ramdisk.gz</li>
</ul>
<p style="text-align: justify;">
<p style="text-align: justify;">Po wykonaniu powyższych czynności możemy uruchomić minicom (bądź Windowsowy hyperterminal) i ustawić:</p>
<ul>
<li>szybkość połączenia na 115200</li>
<li>8 bitów na słowo</li>
<li>bez bitów stopu</li>
<li>jeden bit parzystości</li>
</ul>
<p style="text-align: justify;">
<p style="text-align: justify;">Możemy teraz zrestartować Intela i obserwować komunikaty w terminalu. Po restarcie mamy mało czasu, aby anulować ładowanie standardowego oprogramowania. Dlatego należy szybko zacząć wciskać Ctrl+C, aby przerwać proces rozruchu.</p>
<p><a rel="attachment wp-att-607" href="http://lab.180hb.com/2011/10/instalacja-debiana-na-intel-ss4000-e/redboot/"><img class="size-thumbnail wp-image-607 alignnone" title="redboot" src="http://lab.180hb.com/wp-content/uploads/2011/10/redboot-240x240.png" alt="" width="240" height="240" /></a></p>
<p style="text-align: justify;">Jeśli mamy znak zachęty RedBoota to możemy wydać następujące polecenia:</p>
<p style="text-align: justify;"><em>load -v -r -b 0&#215;01800000 -m ymodem ramdisk.gz</em><br />
<em>load -v -r -b 0&#215;01008000 -m ymodem zImage</em><br />
<em>exec -c &#8222;console=ttyS0,115200 rw root=/dev/ram mem=256M@0xa0000000&#8243; -r 0&#215;01800000</em></p>
<p style="text-align: justify;">Po wykonaniu ostatniego polecenia powinien odpalić się standardowy instalator Debiana. Po zakończeniu instalacji i restarcie wciskamy Ctrl+C, aby przerwać standardowe uruchomienie systemu (jeśli tego nie zrobimy to macierz zawiesi się przy ładowaniu kernela). Jak pojawi się znak zachęty RedBoota wpisujemy poniższe polecenia:</p>
<p style="text-align: justify;"><em>fconfig boot_script_data</em><br />
<em>fis load -b 0&#215;01800000 ramdisk.gz</em><br />
<em>fis load -b 0&#215;01008000 zImage</em><br />
<em>exec -c “console=ttyS0,115200 rw root=/dev/ram mem=256M@0xa0000000″ -r 0×01800000</em></p>
<p style="text-align: justify;">Aby zakończyć wystarczy zostawić pustą linię i wcisnąć Enter. W ten sposób RedBoot zapisze skrypt startowy z nowymi parametrami i system uruchomi się poprawnie.</p>
<p><a rel="attachment wp-att-617" href="http://lab.180hb.com/2011/10/instalacja-debiana-na-intel-ss4000-e/debian-loading/"><span style="color: #000000; -webkit-text-decorations-in-effect: none;"> </span></a><a rel="attachment wp-att-616" href="http://lab.180hb.com/2011/10/instalacja-debiana-na-intel-ss4000-e/screenshot-ddrazyk180hb-nlin001-corp-180hb-com/"><img class="size-thumbnail wp-image-616 alignnone" style="border-style: initial; border-color: initial;" title="Screenshot-ddrazyk@180hb-nlin001.corp.180hb.com:~" src="http://lab.180hb.com/wp-content/uploads/2011/10/Screenshot-ddrazyk@180hb-nlin001.corp_.180hb.com_-240x240.png" alt="" width="240" height="240" /></a> <span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal;"><br />
<img class="size-thumbnail wp-image-617 alignnone" style="border-style: initial; border-color: initial;" title="debian-loading" src="http://lab.180hb.com/wp-content/uploads/2011/10/debian-loading-240x240.png" alt="" width="240" height="240" /></span></p>
<p style="text-align: justify;">Po całej operacji mamy do dyspozycji w pełni konfigurowalne urządzenie z Debianem i możemy z nim zrobić rzeczy zarezerwowane dla urządzeń z górnej półki. Należy tutaj zaznaczyć, że Intel SS4000-e nie jest zbyt wydajnym urządzeniem i prędkość zapisu danych na dysk to około 6 MB/s co skutecznie ogranicza jego wykorzystanie. Jednak jako macierz iSCSI przeznaczona do backupów sprawdza się znakomicie.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.180hb.com/2011/10/instalacja-debiana-na-intel-ss4000-e/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lab Surface &#8211; Laser Light Plane</title>
		<link>http://lab.180hb.com/2011/09/lab-surface-laser-light-plane/</link>
		<comments>http://lab.180hb.com/2011/09/lab-surface-laser-light-plane/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 21:10:20 +0000</pubDate>
		<dc:creator>Szymon Piotr Pepliński</dc:creator>
				<category><![CDATA[Physical Computing]]></category>
		<category><![CDATA[Urządzenia]]></category>

		<guid isPermaLink="false">http://lab.180hb.com/?p=569</guid>
		<description><![CDATA[Lab Surface (LLP) Tydzień temu testowaliśmy działanie rozwiązania, które nosi nazwę LED Light Plane. Tym razem, zamiast nadajników podczerwieni LED, użyliśmy modułów laserowych podczerwonych z generatorami linii. Prezentowane rozwiązanie jest bardzo precyzyjne i pozwala w pełni kontrolować punkty przecięcia pola. Podstawowym elementem układu są 4 moduły laserowe podczerwone (780nm 25mW) oraz kamera USB (Logitech QuickCam [...]]]></description>
			<content:encoded><![CDATA[<h3>Lab Surface (LLP)</h3>
<p>Tydzień temu testowaliśmy działanie rozwiązania, które nosi nazwę LED Light Plane.<br />
Tym razem, zamiast nadajników podczerwieni LED, użyliśmy modułów laserowych podczerwonych z generatorami linii.<br />
<span id="more-569"></span></p>
<p><br /><img border="0" src="http://lab.180hb.com/wp-content/uploads/2011/09/Laser-LP.png" alt="Zasada działania Laser Light Plane" /></p>
<p>Prezentowane rozwiązanie jest bardzo precyzyjne i pozwala w pełni kontrolować punkty przecięcia pola.</p>
<p>Podstawowym elementem układu są 4 moduły laserowe podczerwone (780nm 25mW) oraz kamera USB (Logitech QuickCam Pro 4000 lub Sony PS3 Eye z filtrem podczerwieni &#8211; zakres 780nm).</p>
<p><br /><img border="0" src="http://lab.180hb.com/wp-content/uploads/2011/09/Laser-LP-Simon.png" alt="Pierwsze testy" /><br />
<br /><img border="0" src="http://lab.180hb.com/wp-content/uploads/2011/09/Laser-LP-Webcam.png" alt="Logitech QuickCam Pro 4000" /></p>
<p>W celu uzyskania płaszczyzny, (laser emituje skupioną wiązkę) zastosowaliśmy generatory linii laserowej o kącie 120 stopni (w praktyce wystarczą generatory 90 stopniowe). Takie rozwiązanie sprawia, że kamera widzi punkty styku palców z polem.</p>
<p>Zastosowanie w kamerze filtru podczerwieni powoduje zignorowanie rzucanego obrazu projekcyjnego.</p>
<p><br /><img border="0" src="http://lab.180hb.com/wp-content/uploads/2011/09/Laser-LP-CCV.png" alt="Analiza obrazu" /></p>
<p>Prezentowane rozwiązanie ma posłużyć do budowy interaktywnej powierzchnii dotykowej (stołu, ściany, itp.).</p>
<p><br /><img border="0" src="http://lab.180hb.com/wp-content/uploads/2011/09/Laser-LP-Mario.png" alt="Prototyp LLP" /></p>
<p>Tak naprwadę to dopiero połowa drogi. Stworzyliśmy sprzęt (hardware). Teraz pora na oprogramowanie (software). Jak zwyle &#8222;Sky&#8217;s the Limit&#8221;..</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.180hb.com/2011/09/lab-surface-laser-light-plane/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LAB^180 na GitHubie</title>
		<link>http://lab.180hb.com/2011/09/lab180-na-githubie/</link>
		<comments>http://lab.180hb.com/2011/09/lab180-na-githubie/#comments</comments>
		<pubDate>Fri, 16 Sep 2011 10:22:12 +0000</pubDate>
		<dc:creator>Szymon Piotr Pepliński</dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://lab.180hb.com/?p=538</guid>
		<description><![CDATA[github.com/lab180 Pliki źródłowe naszych projektów udostępniamy na GitHubie. Serwis GitHub to system kontroli wersji Git połączony z mechanizmami społecznościowymi, takimi jak kanały informacyjne, śledzenie czy grafy wizualizujące pracę deweloperów nad repozytoriami.]]></description>
			<content:encoded><![CDATA[<h3><a href="https://github.com/lab180" target="_blank">github.com/lab180</a></h3>
<p>Pliki źródłowe naszych projektów udostępniamy na <a href="https://github.com/lab180" target="_blank">GitHubie</a>.<br />
<span id="more-538"></span></p>
<p><br /><a href="https://github.com/lab180" target="_blank" border="0"><img src="http://lab.180hb.com/wp-content/uploads/2011/09/GitHub_Logo.png" /></a></p>
<p>Serwis <a href="https://github.com/" target="_blank">GitHub</a> to system kontroli wersji Git połączony z mechanizmami społecznościowymi, takimi jak kanały informacyjne, śledzenie czy grafy wizualizujące pracę deweloperów nad repozytoriami.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.180hb.com/2011/09/lab180-na-githubie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prototyp ekranu dotykowego (LED-LP)</title>
		<link>http://lab.180hb.com/2011/09/prototyp-ekranu-dotykowego-led-lp/</link>
		<comments>http://lab.180hb.com/2011/09/prototyp-ekranu-dotykowego-led-lp/#comments</comments>
		<pubDate>Fri, 02 Sep 2011 12:13:47 +0000</pubDate>
		<dc:creator>Szymon Piotr Pepliński</dc:creator>
				<category><![CDATA[Physical Computing]]></category>
		<category><![CDATA[Urządzenia]]></category>

		<guid isPermaLink="false">http://lab.180hb.com/?p=497</guid>
		<description><![CDATA[LED Light Plane (LED-LP) Testowaliśmy wczoraj z Robertem rozwiązanie, które nosi nazwę LED Light Plane (LED-LP). Podstawowym elementem były nadajniki podczerwieni LED (użyliśmy 950nm 34º) oraz zwykła kamera USB (w naszym przypadku Logitech QuickCam Pro 4000). Praktycznie każda kamera cyfrowa widzi podczerwień, ale wszystkie posiadają filtr, który ją blokuje. Dla człowieka światło widzialne, czyli promieniowanie [...]]]></description>
			<content:encoded><![CDATA[<h3>LED Light Plane (LED-LP)</h3>
<p>Testowaliśmy wczoraj z Robertem rozwiązanie, które nosi nazwę LED Light Plane (LED-LP). Podstawowym elementem były nadajniki podczerwieni LED (użyliśmy 950nm 34º) oraz zwykła kamera USB (w naszym przypadku Logitech QuickCam Pro 4000).<br />
<span id="more-497"></span><br />
<br/><img src="http://lab.180hb.com/wp-content/uploads/2011/09/LED-LP.png" alt="Idea działania LED-LP" title="LED-LP" width="480" height="300" class="size-full wp-image-500" /><br />
<br/></p>
<p>Praktycznie każda kamera cyfrowa widzi podczerwień, ale wszystkie posiadają filtr, który ją blokuje.</p>
<p>Dla człowieka światło widzialne, czyli promieniowanie elektromagnetyczne, na które reaguje siatkówka oka w procesie widzenia, zawiera się w przybliżeniu w zakresie długości fal 380-780 nm.</p>
<p>Po usunięciu filtra matryca kamery reaguje na zakres światła widzialnego i podczerwonego.<br />
Gdy już tak się stanie, analizujemy obraz z kamery i przetwarzamy go na dane cyfrowe.</p>
<p><br/><img src="http://lab.180hb.com/wp-content/uploads/2011/09/LED-LP-Prototype.jpg" alt="Prototyp ekranu dotykowego (LED-LP)" title="LED-LP-Prototype" width="480" height="360" class="size-full wp-image-498" /><br />
<br/></p>
<p>Kamera widzi punkt styku palca z płaszczyzną (szkło, plexiglas, etc.), gdyż diody oświetlają ten palec.<br />
Dopasowanie progu (threshold), umożliwia przekształcanie obrazu kolorowego w obraz czarno-białe z wysokim kontrastem. Piksele jaśniejsze od progu są przekształcane na biel, a ciemniejsze — na czerń.</p>
<p><br/><img src="http://lab.180hb.com/wp-content/uploads/2011/09/LED-LP-Threshold.jpg" alt="Dopasowanie progu (threshold)" title="LED-LP-Threshold" width="480" height="360" class="size-full wp-image-499" /><br />
<br/></p>
<p>Oczywiście dużo lepszym rozwiazaniem jest zastosowanie filtra, który przepuszcza fale o określonej długości (np. tylko 950 nm). Prezentowane rozwiązanie może posłużyć do budowy ekranu dotykowego.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.180hb.com/2011/09/prototyp-ekranu-dotykowego-led-lp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Odtwarzanie poklatkowe</title>
		<link>http://lab.180hb.com/2011/08/odtwarzanie-poklatkowe/</link>
		<comments>http://lab.180hb.com/2011/08/odtwarzanie-poklatkowe/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 13:25:28 +0000</pubDate>
		<dc:creator>Szymon Piotr Pepliński</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Wideo]]></category>

		<guid isPermaLink="false">http://lab.180hb.com/?p=464</guid>
		<description><![CDATA[Problem Naszym zadaniem było stworzenie rozwiązania, bazującego na obrazie płynnym (wideo), umożliwiającego modyfikację poszczególych klatek filmu przez użytkowników. Efekt zmiany miał być widoczny natychmiast, bez konieczności renderowania całej sekwencji od początku. Projekt zakładał, że film zbudowany jest z około trzydziestosekundowej, powtarzalnej (zapetlonej), sekwencji. Dodatkowo wiedzieliśmy, że długość odtwarzanego materiału będzie się zmieniać w czasie, gdyż [...]]]></description>
			<content:encoded><![CDATA[<h3>Problem</h3>
<p>Naszym zadaniem było stworzenie rozwiązania, bazującego na obrazie płynnym (wideo), umożliwiającego modyfikację poszczególych klatek filmu przez użytkowników. Efekt zmiany miał być widoczny natychmiast, bez konieczności renderowania całej sekwencji od początku.<br />
<span id="more-464"></span></p>
<p>Projekt zakładał, że film zbudowany jest z około trzydziestosekundowej, powtarzalnej (zapetlonej), sekwencji. Dodatkowo wiedzieliśmy, że długość odtwarzanego materiału będzie się zmieniać w czasie, gdyż zależy od ilości zmodyfikowanych klatek filmu. Mieliśmy dać również możliwość wyświetlenia dowolnie wskazanego ujęcia (kardu). Ostatnim założeniem była możliwa zmiana szybkości odtwarzanego materiału, podczas jego oglądania.</p>
<h3>Idea</h3>
<p>Najbardziej oczywistym byłoby użycie poszczególnych kadrów w formie obrazów (plików graficznych).</p>
<div style="width:100%"><strong>Symulacja działania odtwarzania poklatkowego</strong><br />
<i>(Sallie Gardner at a Gallop &#8211; Eadweard J. Muybridge)</i></p>
<p><object style="height: 230px; width: 300px"><param name="movie" value="http://lab.180hb.com/wp-content/uploads/2011/08/FrameByFramePlayer.swf"><embed src="http://lab.180hb.com/wp-content/uploads/2011/08/FrameByFramePlayer.swf" type="application/x-shockwave-flash" width="300" height="230"></object>
</div>
<p>Wydajność takiego rozwiązania jest jednak odpowiednia wyłącznie dla krótkich sekwencji, dyskwalifikując dłuższy obraz płynny.</p>
<p>Z uwagi na zmienną długość filmu (poszczególne kadry są generowane przez użytkowników) nie jest również możliwe osadzenie go bezpośrednio na listwie czasowej.</p>
<h3>Rozwiązanie</h3>
<p>Początkowo podjęliśmy próby generowania filmu po stronie serwera z poszczególnych klatek animacji.<br />
Do testów użyliśmy takich rozwiązań jak Adobe Media Server, Red5, FFserver.<br />
Wszystkie z nich miały swoje wady i zalety. Niemniej żadne z powyższych nie spełniło jednego z podstawowych założeń &#8211; nie dawało możliwości odtwarzania filmu poklatkowo. Najlepiej radził sobie FFserver, ale był dość niestabilny (co jakiś czas się zawieszał &#8211; na CentOS 5.7 i FFmpeg 0.6.1 z repozytorium ATRPMS-testing).</p>
<p>Postanowiliśmy więc z każdego rozwiązania wziąć to, co najlepsze i stworzyć własne, idealnie odpowiadające naszym założeniom. </p>
<p>Po stronie serwera generowaliśmy krótkie (50 klatek) filmy Adobe Flash (SWF) z zaszytymi wewnątrz klatkami zakodowanymi jako wideo (FLV).</p>
<p>Użyliśmy FFmpeg 0.6.1, programowanie w powłoce BASH, curl 7.19.7 oraz PHP 5.3.2 (cli).</p>
<p>Na początku następowała rezerwacja danej klatki filmu.</p>
<p>Plik &#8222;<strong>reserveFrame.sh</strong>&#8222;</p>
<p><code>#!/bin/bash

HOST="http://host/reserveFrameComplete";
SHARED_DIR="/home/project/shared";
DURATION=643; # maksymalna ilość klatek filmu

if [ -n "$1" ]; then

  FRAME_ID=$1;

  LOOP_ID=$((FRAME_ID / DURATION));
  LOOP_ID=${LOOP_ID/.*}; # Zaokrąglenie w dół (floor)

  MODULO=$((FRAME_ID % DURATION));

  cp $SHARED_DIR/frames/$MODULO.jpg $SHARED_DIR/drafts/$FRAME_ID.jpg;

  curl --data "frameId=$FRAME_ID" $HOST &gt; /dev/null 2&gt;&amp;1;

fi;
</code></p>
<p>Wykonanie skryptu następowało z kontrolera w PHP:</p>
<p><code>shell_exec($shared_path."/reserveFrame.sh $frame_id");
</code></p>
<p>Po ukończeniu tworzenia przez użytkownika określonej klatki z filmu, obraz był przesyłany do aplikacji. Następnie wywoływany był skrypt tworzący określoną sekwencję. Zdecydowaliśmy się na dzielenie filmu na krótkie, dwusekundowe ujęcia, które następnie były doczytywane w trakcje odtwarzania filmu, przy zachowaniu odpowiedniego bufora. Jeśli się zdarzyło że bufor jest pusty (np. na skutek wolnego łącza), następowało doładowywanie kolejnych sekwencji, analogicznie jak przy strumieniowym obrazie wideo.<br />
Jeśli ktoś przerwał oglądanie w trakcie odtwarzania, kolejne sekwencje nie były ładowane. Rozwiązanie takie pozwala na oszczędzanie transferu, co jest ważne zwłaszcza przy dużej ilości odtworzeń.</p>
<p>Plik &#8222;<strong>renderMovie.sh</strong>&#8222;</p>
<p><code>#!/bin/bash

HOST="http://host/makeMovieComplete"
DRAFT_DIR="/home/project/shared/drafts"
STREAMS_DIR="/home/project/shared/streams"
KEYFRAME=50
DURATION=643

if [ -n "$3" ]
then

  FRAME_HASH=$3

  if [ -n "$1" ] &amp;&amp; [ -n "$2" ]
  then

    FRAME_ID=$1
    TOTAL_LOOPS=$2

    LOOP_ID=$(( FRAME_ID / DURATION ))
    LOOP_ID=${LOOP_ID/.*} # floor

    LOOP_MODULO=$(( FRAME_ID % DURATION ))

    KEYFRAME_ID=$(( FRAME_ID / KEYFRAME ))
    KEYFRAME_ID=${KEYFRAME_ID/.*} # floor

    KEYFRAME_MODULO=$(( FRAME_ID % KEYFRAME ))

    START_FRAME=$(( DURATION + LOOP_MODULO - KEYFRAME_MODULO ))
    START_FRAME=$(( START_FRAME % DURATION ))

    if [ $KEYFRAME_ID -lt $TOTAL_LOOPS ]
    then
      KEYFRAME_LENGTH=$(( KEYFRAME - 1 ))
    else
      KEYFRAME_LENGTH=$KEYFRAME_MODULO
    fi

    START_FRAME=$(( DURATION + LOOP_MODULO - KEYFRAME_MODULO ))
    START_FRAME=$(( START_FRAME % DURATION ))

    TEMP_DIR=$(mktemp -d /tmp/ffmpeg_XXXXXXXXXXXXXXXXXXXXXXXX) || { 
      echo "Failed to create temp file"
      exit 1
    }

    KEYFRAME_INDEX=0 

    while [ $KEYFRAME_INDEX -le $KEYFRAME_LENGTH ]
    do
        FILE=$(( START_FRAME + KEYFRAME_INDEX ))
        FILE=$(( FILE % DURATION ))

        if [ ! -f $DRAFT_DIR/$FILE.jpg  ]
        then
          break
        else
          cp $DRAFT_DIR/$FILE.jpg $TEMP_DIR/$KEYFRAME_INDEX.jpg
        fi

        KEYFRAME_INDEX=$(( KEYFRAME_INDEX + 1 ))
    done

    #ffmpeg bug: fps 24 drop frames!
    ffmpeg -y -i $TEMP_DIR/%d.jpg -r 25 -s 640x360 -b 1536k -an -vcodec flv -f avm2 $STREAMS_DIR/$KEYFRAME_ID.swf #1&gt;/dev/null 2&gt;/dev/null

    rm -rf $TEMP_DIR

    curl --data "frameHash=$FRAME_HASH" $HOST #&gt; /dev/null 2&gt;&amp;1

  fi

fi
</code></p>
<p>Wywołania z PHP były odpalane &#8222;w tle&#8221;. Dodatkowo była napisana obsługa kolejkowania, która działała w taki sposób, że jeśli w tym samym czasie było wysłanych kilka, kilkanaście obrazów, generowane były tylko te, które się nie powtarzają w tej samej sekwencji.</p>
<p><code>exec($shared_path."/renderMovie.sh $frame_id $num_loops $pending_data &gt; /dev/null 2&gt;/dev/null &amp;");
</code></p>
<p>Czas wykonywania renderowania wynosił poniżej sekundy.<br />
Użytkownik mógł zaraz po wysłaniu swojego kadru zobaczyć, jak jego praca prezentuje się w całej sekwencji.</p>
<p>Aplikacja była częścią szerszych działań promocyjnych organizowanych przez miasto stołeczne Warszawa wraz ze sponsorami globalnymi UEFA oraz PKP Polskie Koleje Państwowe.</p>
]]></content:encoded>
			<wfw:commentRss>http://lab.180hb.com/2011/08/odtwarzanie-poklatkowe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

