<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Nonpolynomial Labs</title>
 
 <link href="http://www.nonpolynomial.com/" />
 <updated>2010-06-15T21:24:35-07:00</updated>
 <id>http://www.nonpolynomial.com/</id>
 <author>
   <name>Kyle Machulis</name>
   <email>kyle at nonpolynomial dot com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/nonpolynomiallabs" /><feedburner:info uri="nonpolynomiallabs" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>Nonpolynomial Labs Roboexotica Projects</title>
   <link href="http://feedproxy.google.com/~r/nonpolynomiallabs/~3/-8LwPhkmBxE/" />
   <updated>2009-12-03T01:32:20-08:00</updated>
   <id>http://www.nonpolynomial.com/2009/12/03/nonpolynomial-labs-roboexotica-projects</id>
   <content type="html">&lt;p&gt;For the past month, I've been living in Vienna as part of as artist residency with &lt;a href="http://www.monochrom.at"&gt;monochrom&lt;/a&gt;. The main goal of this residency was to complete some projects for &lt;a href="http://www.roboexotica.org"&gt;roboexotica&lt;/a&gt;, the robotics cocktail party held each year here in Vienna. This year, &lt;a href="http://www.roboexotica.org"&gt;roboexotica&lt;/a&gt; is being held December 3-6, and now that I've actually seen my projects pour some drinks, I figured it's time to present them to the world.&lt;/p&gt;

&lt;p&gt;First off, there's Adult Mario, the mario game that drinks and vibrates!&lt;/p&gt;

&lt;CENTER markdown='1'&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/7kiKE3lif8Q&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/7kiKE3lif8Q&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/CENTER&gt;


&lt;p&gt;Then there's Bartris, the tetris that's also a bartender.&lt;/p&gt;

&lt;CENTER markdown='1'&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/qafivdcSekM&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/qafivdcSekM&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/CENTER&gt;


&lt;p&gt;I'll have a post next week that goes into the implementation specifics of these projects, but for now, all of the code is available at &lt;a href="http://www.github.com/qdot/bartris"&gt;http://www.github.com/qdot/bartris&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nonpolynomiallabs/~4/-8LwPhkmBxE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.nonpolynomial.com/2009/12/03/nonpolynomial-labs-roboexotica-projects/</feedburner:origLink></entry>
 
 <entry>
   <title>A Day at the Ports</title>
   <link href="http://feedproxy.google.com/~r/nonpolynomiallabs/~3/QPNptcrUdec/" />
   <updated>2009-09-08T00:11:32-07:00</updated>
   <id>http://www.nonpolynomial.com/2009/09/08/a-day-at-the-ports</id>
   <content type="html">&lt;p&gt;While I was out flying my stunt kites this weekend, the wind ended up being a little iffy. So, after flying a bit, I decided to see what kind of things I could put together using just my iPhone. Thus, the 'Day at the Ports' project was born.&lt;/p&gt;

&lt;p&gt;This is consists of 2 and a half videos (the half being a test one I took just to see if looping was going to work correctly). all of these were taken using viewfinders around the park I was at, Middle Harbor park in Oakland.&lt;/p&gt;

&lt;p&gt;Both videos use a combinations of tracks generated by &lt;a href="http://www.rjdj.me"&gt;rjdj&lt;/a&gt;, mixed with the wind and environment sounds taken from the iphone mic while recording the video.&lt;/p&gt;

&lt;p&gt;The first one is "Construction from Far Away".&lt;/p&gt;

&lt;center markdown='1'&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6451349&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6451349&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/6451349"&gt;Construction from Far Away&lt;/a&gt; from &lt;a href="http://vimeo.com/user154518"&gt;qDot&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/center&gt;


&lt;p&gt;&lt;a href="http://www.rjdj.me/user/qdot/recording/22612/"&gt;rjdj page for original audio clip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was really happy with this one. The quality of the viewfinder along with my shakey cinematography ended up inducing a bit of a dreamlike state in the video, and the soundtrack matched up just perfectly.&lt;/p&gt;

&lt;p&gt;The second one is called "A Headless Sutro".&lt;/p&gt;

&lt;center markdown='1'&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6451589&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6451589&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/6451589"&gt;A Headless Sutro&lt;/a&gt; from &lt;a href="http://vimeo.com/user154518"&gt;qDot&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/center&gt;


&lt;p&gt;&lt;a href="http://rjdj.me/recording/22606/"&gt;rjdj page for original audio clip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This one ended up a little harsher than I think I originally meant it to be. The viewfinders I was using for it seemed to move very quickly, so I decided to use an audio scene that was a little choppier. However, it came out also... schizophrenic in the end.&lt;/p&gt;

&lt;p&gt;To show what I was using the take the video, and also to just remind myself where all the buttons were in the video software, I made a little sample video. Uses &lt;a href="http://www.last.fm/music/William+Basinski/_/The+River,+Part+2"&gt;William Besinski's The River&lt;/a&gt;, because, well, water. I'm original like that.&lt;/p&gt;

&lt;center markdown='1'&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6450294&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6450294&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/6450294"&gt;Test Water Loop&lt;/a&gt; from &lt;a href="http://vimeo.com/user154518"&gt;qDot&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/center&gt;


&lt;p&gt;All in all, I'm really happy with how everything turned out. Managed to make something relatively neat while just screwing around waiting for the wind to adjust its attitude (which it never did. Stupid nature.).&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nonpolynomiallabs/~4/QPNptcrUdec" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.nonpolynomial.com/2009/09/08/a-day-at-the-ports/</feedburner:origLink></entry>
 
 <entry>
   <title>New Software Project Icons and Pages</title>
   <link href="http://feedproxy.google.com/~r/nonpolynomiallabs/~3/CI-6Z8cLr40/" />
   <updated>2009-07-18T10:21:20-07:00</updated>
   <id>http://www.nonpolynomial.com/2009/07/18/new-software-project-icons-and-pages</id>
   <content type="html">&lt;p&gt;After a couple of months of work, lots of poking at &lt;a href="http://www.github.com/mojombo/jekyll"&gt;jekyll&lt;/a&gt; and &lt;a href="http://www.github.com"&gt;github&lt;/a&gt;, and very little work on the actual projects themselves, I've finally gotten the webpages for all of my software projects together. They come with nice new spiffy icons from &lt;a href="http://www.counter-productive.com"&gt;Counter Productive Productions&lt;/a&gt;.&lt;/p&gt;

&lt;CENTER markdown="1"&gt;&lt;div class="NPCenteredImg" markdown="1"&gt;[![libnifalcon][4]][5][![libambx][6]][7][![liblightstone][8]][9][![libomron][10]][11][![libtrancevibe][12]][13]&lt;/div&gt;&lt;/CENTER&gt;


&lt;p&gt;From right to left:
* &lt;a href="http://qdot.github.com/libnifalcon"&gt;libnifalcon&lt;/a&gt; - Cross platform driver for Novint Falcon haptics controller
* &lt;a href="http://qdot.github.com/libambx"&gt;libambx&lt;/a&gt; - Cross platform driver for amBX ambient environment system
* &lt;a href="http://qdot.github.com/liblightstone"&gt;liblightstone&lt;/a&gt; - Cross platform driver for lightstone biometrics system
* &lt;a href="http://qdot.github.com/libomron"&gt;libomron&lt;/a&gt; - Cross platform driver for Omron USB Blood Pressure Monitor and Pedometer
* &lt;a href="http://qdot.github.com/libtrancevibe"&gt;libtrancevibe&lt;/a&gt; - Cross platform driver for the Rez Trancevibrator&lt;/p&gt;

&lt;p&gt;All drivers, no applications. Maybe I should actually write something to use this stuff someday...&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nonpolynomiallabs/~4/CI-6Z8cLr40" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.nonpolynomial.com/2009/07/18/new-software-project-icons-and-pages/</feedburner:origLink></entry>
 
 <entry>
   <title>New Projects at NP Labs</title>
   <link href="http://feedproxy.google.com/~r/nonpolynomiallabs/~3/DsGixhH6Uik/" />
   <updated>2009-05-03T13:44:51-07:00</updated>
   <id>http://www.nonpolynomial.com/2009/05/03/new-projects-at-np-labs</id>
   <content type="html">&lt;CENTER&gt;&lt;a href="http://www.flickr.com/photos/qdot76367/3497299795/" title="Workin on new toys by qdot76367, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3316/3497299795_6293533843_m.jpg" width="240" height="180" alt="Workin on new toys" /&gt;&lt;/a&gt;&lt;/CENTER&gt;


&lt;p&gt;Well, another 6 months have come and gone, and I've got a few new projects on the radar here.&lt;/p&gt;

&lt;p&gt;&lt;A HREF='http://www.github.com/qdot/libomron'&gt;libomron&lt;/A&gt;&lt;/p&gt;

&lt;p&gt;This is a framework for accessing the USB capabilities of Omron medical equipment, specifically the &lt;A HREF='http://www.amazon.com/Omron-HEM-790IT-Automatic-Pressure-Management/dp/B000O58QM0'&gt;Omron 790IT Blood Pressure Monitor&lt;/A&gt; at the moment. There has been some talk online about accessing their pedometers in a cross platform manner (reference: &lt;A HREF='http://www.dullest.com/blog/my-favorite-pedometer-omron-hj-720itc/'&gt;dullest.com&lt;/A&gt;), and I'm hoping the protocol for that and their other blood pressure monitors are basically the same, so I can extend the protocol parsing to the whole family of products.&lt;/p&gt;

&lt;p&gt;&lt;A HREF='http://www.github.com/qdot/libambx'&gt;libambx&lt;/A&gt;&lt;/p&gt;

&lt;p&gt;libambx is an open source, cross platform library for the &lt;A HREF='http://www.ambx.com'&gt;Ambx ambient environment feedback system&lt;/A&gt; that I'm working on in conjunction with the people at &lt;A HREF='http://electrosthetics.blogspot.com/'&gt;Electrosthetics&lt;/A&gt;. I'm currently working on reversing the ambx communications protocol (&lt;A HREF='http://qdot.github.com/libambx'&gt;document available here&lt;/A&gt;). It's nice to work with someone else on this stuff for once.&lt;/p&gt;

&lt;p&gt;&lt;A HREF='http://www.github.com/qdot/libnifalcon'&gt;libnifalcon updates&lt;/A&gt;&lt;/p&gt;

&lt;p&gt;libnifalcon is still coming along nicely, if a bit slow at the moment since I'm stuck on some rather difficult problems with firmware loading and kinematics. It's been used in a couple of papers (&lt;A HREF='http://insectbot.rsise.anu.edu.au/pub/doc/papers/virtual_force_feedback_teleoperation_of_the_insectbot_using_optic_flow-acra08.pdf'&gt;including this one on teleoperation of an insectbot&lt;/A&gt;), and there's also been some work on &lt;A HREF='http://www.chai3d.org'&gt;porting it to Chai3d&lt;/A&gt; for use in the &lt;A HREF='http://idmil.org/software/dimple'&gt;Dimple environment for physical interaction with sound&lt;/A&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nonpolynomiallabs/~4/DsGixhH6Uik" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.nonpolynomial.com/2009/05/03/new-projects-at-np-labs/</feedburner:origLink></entry>
 
 <entry>
   <title>NP Labs Projects Update</title>
   <link href="http://feedproxy.google.com/~r/nonpolynomiallabs/~3/dgxPHU3PSyM/" />
   <updated>2008-11-02T21:21:20-08:00</updated>
   <id>http://www.nonpolynomial.com/2008/11/02/np-labs-projects-update</id>
   <content type="html">&lt;p&gt;Wow. Almost 5 months between posts. I've been so busy on my projects that I have no time to write about them anymore. :)&lt;/p&gt;

&lt;p&gt;First off, &lt;a href="http://libnifalcon.sourceforge.net"&gt;libnifalcon&lt;/a&gt;, the open source driver for the &lt;a href="http://home.novint.com"&gt;Novint Falcon&lt;/a&gt;, is currently in alpha stage for the v1 release, soon to move to beta after a few more bugs are fixed. It's already seeing some usage, too!&lt;/p&gt;

&lt;p&gt;&lt;CENTER&gt;&lt;object width="400" height="300"&gt;    &lt;param name="allowfullscreen" value="true" /&gt;   &lt;param name="allowscriptaccess" value="always" /&gt;   &lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2138448&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2138448&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2138448?pg=embed&amp;amp;sec=2138448"&gt;Haptic Interfaces for Virtual Instruments using libnifalcon&lt;/a&gt; from &lt;a href="http://vimeo.com/user154518?pg=embed&amp;amp;sec=2138448"&gt;qDot&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;amp;sec=2138448"&gt;Vimeo&lt;/a&gt;.&lt;/CENTER&gt;&lt;/p&gt;


&lt;p&gt;The video above is a demo of a couple of patches for &lt;a href="http://www.puredata.info"&gt;PureData&lt;/a&gt; written by Edgar Berdahl for use in &lt;a href="http://ccrma.stanford.edu/courses/250a/labs/lab6-Falcon/"&gt;Physical Interaction Design for Music&lt;/a&gt; class at the &lt;a href="http://ccrma.stanford.edu"&gt;Center for Computer Research in Music and Acoustics at Stanford University&lt;/a&gt;. The video shows a haptic simulation of a bowed instrument, as well as a training patch for drum rolls. Moving toward the line in the middle of the window causes the falcon to kick back slightly, and the user must hold the end effector steady to keep the sound steady and constant. All of this is running on a beta version of the np_nifalcon external for max and pd, which is available on the libnifalcon site.&lt;/p&gt;

&lt;p&gt;Next up is another project that I decided to throw together today to check out the &lt;a href="http://opensoundcontrol.org/"&gt;OpenSoundControl protocol&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;CENTER&gt;&lt;object width="400" height="300"&gt;    &lt;param name="allowfullscreen" value="true" /&gt;   &lt;param name="allowscriptaccess" value="always" /&gt;   &lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2138821&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" /&gt; &lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2138821&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=01AAEA&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2138821?pg=embed&amp;amp;sec=2138821"&gt;Kitelight w/ iPhone Controls&lt;/a&gt; from &lt;a href="http://vimeo.com/user154518?pg=embed&amp;amp;sec=2138821"&gt;qDot&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;amp;sec=2138821"&gt;Vimeo&lt;/a&gt;.&lt;/CENTER&gt;&lt;/p&gt;


&lt;p&gt;This is the &lt;a href="http://vimeo.com/1392439"&gt;Kitelight system&lt;/a&gt; controlled using the &lt;a href="http://poly.share.dj/projects/#mrmr"&gt;mrmr OSC interface builder for the iPhone&lt;/a&gt;. It's connecting to laptop running python using &lt;a href="liblo.sourceforge.net"&gt;liblo&lt;/a&gt; and &lt;a href="das.nasophon.de/pyliblo/"&gt;pyliblo&lt;/a&gt; for OSC controls. This goes through a &lt;a href="http://digi.com/products/wireless/point-multipoint/xbee-series1-module.jsp"&gt; xbee dev kit board&lt;/a&gt; to &lt;a href="http://arduino.cc"&gt;an arduino&lt;/a&gt; with &lt;a href="nkcelectronics.com/freeduino-arduino-xbee-shield-kit.html"&gt;xbee shield&lt;/a&gt; which is controlling a panel of RGB LEDs attached to the kite.&lt;/p&gt;

&lt;p&gt;Usable range on the zigbee is ~100m, more than enough room for flyer to kite communications. Now that this works, I can also run lighting commands from PureData to do music synchonization or whatever else I might think of.&lt;/p&gt;

&lt;p&gt;For all the URLs listed above, this project came together rather quick, about 90 minutes from start to finish, though obviously all the boards were already built, so it was just a matter of coding it all and learning OSC and mrmr.&lt;/p&gt;

&lt;p&gt;Now, back to working on getting libnifalcon released...&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nonpolynomiallabs/~4/dgxPHU3PSyM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.nonpolynomial.com/2008/11/02/np-labs-projects-update/</feedburner:origLink></entry>
 
 <entry>
   <title>99 Dollar Novint Falcons at TigerDirect</title>
   <link href="http://feedproxy.google.com/~r/nonpolynomiallabs/~3/1qh3pMXK7qU/" />
   <updated>2008-09-05T23:04:31-07:00</updated>
   <id>http://www.nonpolynomial.com/2008/09/05/99-dollar-novint-falcons-at-tigerdirect</id>
   <content type="html">&lt;p&gt;&lt;a href="http://www.tigerdirect.com/applications/searchtools/item-Details.asp?EdpNo=3427255&amp;amp;sku=N128-1000&amp;amp;srkey=novint%20falcon"&gt;&lt;img src="http://images.nonpolynomial.com/nonpolynomial.com/blog/nismall.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.tigerdirect.com/applications/searchtools/item-Details.asp?EdpNo=3427255&amp;amp;sku=N128-1000&amp;amp;srkey=novint%20falcon"&gt;Tiger Direct now has the Novint Falcon for $99&lt;/a&gt;. Only took a little over a year from release for the price to finally drop to the &amp;lt;$100 level they promised 2 years before launch. :D&lt;/p&gt;

&lt;p&gt;So, if you had interest in helping out with the &lt;a href="http://libnifalcon.sourceforge.net"&gt;LibNIFalcon project&lt;/a&gt; but didn't want to throw the cash down, well, now it's less cash to throw down. LibNIF is cranking right along, the C++ version is nearing the first milestone, and we've now got what will hopefully be a much more stable kinematics model in the works.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nonpolynomiallabs/~4/1qh3pMXK7qU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.nonpolynomial.com/2008/09/05/99-dollar-novint-falcons-at-tigerdirect/</feedburner:origLink></entry>
 
 <entry>
   <title>Falcon Uncasing</title>
   <link href="http://feedproxy.google.com/~r/nonpolynomiallabs/~3/8l3iOTKk6eU/" />
   <updated>2008-06-07T23:25:22-07:00</updated>
   <id>http://www.nonpolynomial.com/2008/06/07/falcon-uncasing</id>
   <content type="html">&lt;p&gt;Well, after two months of not getting much done I finally manage to zip a directory and call it v0.4 of &lt;a href="http://www.sourceforge.net/projects/libnifalcon"&gt;libnifalcon&lt;/a&gt;, and the developer responsible for the &lt;a href="http://www.nonpolynomial.com/archives/2008/05/solidedge-simulation-of-the-novint-falco.php"&gt;SolidEdge simulation&lt;/a&gt; &lt;a href="http://picasaweb.google.com/kouellet/FalconProject?authkey=kAvHYd9lo5A"&gt;does a full uncasing of the Falcon, taking a great picture set along the way&lt;/a&gt;. I'm start to feel like I'm falling a bit behind in usefulness here. :)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://picasaweb.google.com/kouellet/FalconProject?authkey=kAvHYd9lo5A"&gt;&lt;img src="http://images.nonpolynomial.com/nonpolynomial.com/blog/deskfalcon.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Image by kouellet of the libnifalcon project&lt;/p&gt;

&lt;p&gt;I really like this image for some reason.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nonpolynomiallabs/~4/8l3iOTKk6eU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.nonpolynomial.com/2008/06/07/falcon-uncasing/</feedburner:origLink></entry>
 
 <entry>
   <title>SolidEdge Simulation of the Novint Falcon</title>
   <link href="http://feedproxy.google.com/~r/nonpolynomiallabs/~3/RxRCwoII55U/" />
   <updated>2008-05-24T13:05:32-07:00</updated>
   <id>http://www.nonpolynomial.com/2008/05/24/solidedge-simulation-of-the-novint-falcon</id>
   <content type="html">&lt;p&gt;So, I've actually got some people helping out on &lt;a href="http://www.sourceforge.net/projects/libnifalcon"&gt;libnifalcon&lt;/a&gt; now, and one of them just posted a neat video of a &lt;a href="http://www.plm.automation.siemens.com/en_us/products/velocity/solidedge/"&gt;SolidEdge&lt;/a&gt; simulation of the Falcon hardware.&lt;/p&gt;

&lt;p&gt;&lt;CENTER&gt;&lt;embed style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-1184008318842321491&amp;hl=fr" allowScriptAccess="sameDomain" quality="best" bgcolor="#ffffff" scale="noScale" salign="TL"  FlashVars="playerMode=embedded"&gt; &lt;/embed&gt;&lt;br /&gt;&lt;/CENTER&gt;&lt;/p&gt;



&lt;img src="http://feeds.feedburner.com/~r/nonpolynomiallabs/~4/RxRCwoII55U" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.nonpolynomial.com/2008/05/24/solidedge-simulation-of-the-novint-falcon/</feedburner:origLink></entry>
 
 <entry>
   <title>Video from Futuristic Music Design Contest at Yuri's Night</title>
   <link href="http://feedproxy.google.com/~r/nonpolynomiallabs/~3/RyXIEANijY0/" />
   <updated>2008-05-18T19:49:04-07:00</updated>
   <id>http://www.nonpolynomial.com/2008/05/18/video-from-futuristic-music-design-contest-at-yuris-night</id>
   <content type="html">&lt;p&gt;At Yuri's Night this year, &lt;a href="http://www.createdigitalmusic.com"&gt;CreateDigitalMusic.com&lt;/a&gt; had a futuristic music design competition to see what new an innovative audio interfaces people could come up with. I filmed the competition, and have finally gotten everything edited and up on YouTube. I apologize in advance for the Blair Witch-esque camera work. :)&lt;/p&gt;

&lt;CENTER&gt;&lt;object width="500" height="370"&gt;&lt;param name="movie" value="http://www.youtube.com/p/2EEC7516C6DD5A02"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/p/2EEC7516C6DD5A02" type="application/x-shockwave-flash" width="500" height="370"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/CENTER&gt;



&lt;img src="http://feeds.feedburner.com/~r/nonpolynomiallabs/~4/RyXIEANijY0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.nonpolynomial.com/2008/05/18/video-from-futuristic-music-design-contest-at-yuris-night/</feedburner:origLink></entry>
 
 <entry>
   <title>libusb, libftdi, latency, and my own stupidity</title>
   <link href="http://feedproxy.google.com/~r/nonpolynomiallabs/~3/Xbkqh79fous/" />
   <updated>2008-04-29T22:01:51-07:00</updated>
   <id>http://www.nonpolynomial.com/2008/04/29/libusb-libftdi-latency-and-my-own-stupidity</id>
   <content type="html">&lt;p&gt;When last we left off, I had an OpenGL kinematics simulator for my current OCD fulfillment object, the Novint Falcon. I'll get to the math behind all that in the next post, but for right now, suffice to say, it just works. The kinematics loops can easily hit 40000 iterations per second, which is more than enough for my first few basic projects, including mouse control. However, that really only mattered on windows, because when I finished the simulator, windows still had a 1000hz update rate, while linux and os x were still running at 70-150hz update rate on a good day with the wind going in the right direction. I spent last week trying to get linux and mac up to the same speed as windows. What follows is the story of that week.&lt;/p&gt;

&lt;p&gt;But first off, let's rewind to August of last year. Before Novint put out their own SDK, I was bound and determined to get my own out, just because it seemed like a fun challenge. I managed to document out the firmware download process, but not completely replicate it. My first program worked by starting up one of their test programs to load firmware, then using my own code after that to communicate with the falcon. The hack ended up being successful, if ridiculously unsafe to look at in a normal workplace. The video of the results are at http://www.youtube.com/watch?v=EfrMalBiXuY (NSFW), which is not autolinked because otherwise you'll click it at work, won't you? Yeah. Copy and paste.&lt;/p&gt;

&lt;p&gt;Anyways, while doing this, I took some notes on the startup sequence for firmware loading. Here's a picture of those notes:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/qdot76367/2446569720/" title="Comm Trace notes for the Novint Falcon by qdot76367, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2030/2446569720_27520421f3.jpg" alt="Comm Trace notes for the Novint Falcon" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, fast forward back to last week. Time to make everything equally fast.&lt;/p&gt;

&lt;p&gt;To start, how the falcon communicates. Using the test firmware that came with the disc in the falcon box (currently the only thing I have mapped, and I honestly don't even know if there's other firmware out there), it receives 16 bytes input, and upon receiving that, gives back 16 bytes as output (it's actually 18 bytes, due to ftdi modem status being tacked on the front, but those are negliable). That's it.&lt;/p&gt;

&lt;p&gt;Let's look at the stats that test programs were putting out for each platform (thanks to people on the libnifalcon-devel list for helping out on this):&lt;/p&gt;

&lt;p&gt;Linux:&lt;/p&gt;

&lt;p&gt;Time between I/O Iterations: 0.015991s&lt;/p&gt;

&lt;p&gt;Average Frequency: 62.534351 per second&lt;/p&gt;

&lt;p&gt;Windows:&lt;/p&gt;

&lt;p&gt;Time between I/O Iterations: 0.000942s&lt;/p&gt;

&lt;p&gt;Average Frequency: 980.382853 per second&lt;/p&gt;

&lt;p&gt;Yeah. Bit of a difference, eh? So something was causing I/O iterations on linux to take around 16ms each, while on windows, we were getting 1 iteration per millisecond, and achieving near the 1khz that's mentioned by Novint all the time. This is running on the EXACT same code, up to the point of the FTDI library being used. The Windows version was using the ftd2xx drivers, while linux was using libftdi. ftd2xx on linux seemed to run decently fast, though I don't have the number handy at the moment.&lt;/p&gt;

&lt;p&gt;Now, I'd read a few things around the net about libftdi being ridiculously slow, mostly in terms of bitbanging though. Either way, I figured it was something in either libftdi or libusb that was causing the slowdown. Rebuilt everything with -gp and let gprof at it for a while, just to see that, nope, it was just sitting there waiting during the I/O loop, for 16ms at a time.&lt;/p&gt;

&lt;p&gt;At this point, I start wondering if it's not the synchronousity of libusb-0.1 that's slowing me down. Luckily, &lt;a href="http://libusb.wiki.sourceforge.net/Libusb1.0"&gt;libusb-1.0 is in development right now, which enable asynchronous transfers for usb&lt;/a&gt;. Pulled the dev branch of that, tried it out. Asynchronous sends, writes are superfast, reads... 16ms.&lt;/p&gt;

&lt;p&gt;Damnit.&lt;/p&gt;

&lt;p&gt;So, something in the read is taking 16ms. It's time to start playing with our read transfer and see what else we can change. First off, changing the read request size to 64 bytes, the maximum packet size for the endpoint.&lt;/p&gt;

&lt;p&gt;Time between I/O Iterations: 0.000919s&lt;/p&gt;

&lt;p&gt;Well, that made something happy. The problem there is, we're now sending 1000 input packets, and only getting back ~250 output packets. This means that there was something I was missing about sub-maximal packet sizes.&lt;/p&gt;

&lt;p&gt;Much googling insues. No information found. Finally out of frustration, I just google "ftdi 64 bytes".&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.ftdichip.com/Documents/AppNotes/AN232B-04_DataLatencyFlow.pdf"&gt;And I find the FTDI Addendum on Data Throughput, Latency, and Handshaking for the FT232 Series Chips&lt;/a&gt; (PDF)&lt;/p&gt;

&lt;p&gt;There it is, clear as day. There's a latency timer on the chip that will send bytes to the host assuming one of three conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A serial status line (DTR, RTS, etc...) is flipped&lt;/li&gt;
&lt;li&gt;The buffer reaches maximum capacity (Thus our results with the 64 bytes&lt;/li&gt;
&lt;li&gt;The latency timer overflows&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;We're obviously not playing with the first one. The second one we've seen the effects of, but we don't want to have to wait for 62 user bytes at a time.&lt;/p&gt;

&lt;p&gt;What's the default starting value of the latency timer?&lt;/p&gt;

&lt;p&gt;16ms.&lt;/p&gt;

&lt;p&gt;If you scroll back up and look at my notes again, you'll see there's a line there that says "0x9 (latency timer?) 0x1". This was a control message sent over by the Falcon test program. 0x9 is the control message index, and 0x1 is the value. They set the latency timer to 1ms during the initialization stage. I totally skipped over that when transcribing the code for the initialization sequence, and it meant I was sitting on slow code for many, many months.&lt;/p&gt;

&lt;p&gt;I added that single line of code to the libusb-0.1.12/libftdi based libnifalcon libraries.&lt;/p&gt;

&lt;p&gt;Time between I/O Iterations: 0.002019s&lt;/p&gt;

&lt;p&gt;Yyyaaaaaayyyyyyyy!!waitaminute. 2 ms?&lt;/p&gt;

&lt;p&gt;And thus, the synchronous call issue comes back to bite me in the ass, except this time, it's actually a correct diagnosis.&lt;/p&gt;

&lt;p&gt;You see, when you send a USB message, it's packed into a USB frame. Each USB frame can carry multiple messages, but at a rate of 1 frame per millisecond (we're at USB 2.0 fullspeed here). libusb-0.1.12 only packs one request per frame, so we have 1ms input, 1ms output. 2ms overall, locking our I/O loop to 500hz. DAMNIT.&lt;/p&gt;

&lt;p&gt;So, the solution to this is to either figure out a way to get both input and output in the same frame, which may be possible with libusb-1.0. That remains to be seen, and that code is still very, very alpha. I'll keep working with it, though.&lt;/p&gt;

&lt;p&gt;Anyways, this still leaves a couple of questions. First off, when I was checking the ftd2xx drivers for linux, I decided to check their symbol table for the dynamic library...&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;         U time




         U tolower




         U toupper




00013673 T usb_bulk_read




0001357d T usb_bulk_write




00017d30 B usb_busses




000132ff T usb_claim_interface




00014309 T usb_clear_halt




000120e6 T usb_close
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;HEY! Those are libusb calls! So ftd2xx is at least partially based on libusb. How they're managing the superfast I/O, I'm not sure. Could be threading, could be they've got their own asynch thing going on.&lt;/p&gt;

&lt;p&gt;Secondly, I obviously didn't have the latency timer set on the ftd2xx version of the drivers, either. Why did my drivers run so fast on windows without that? I'm guessing there could be a config file I was missing somewhere, or maybe their drivers just do it themselves on connection or something.&lt;/p&gt;

&lt;p&gt;Anyways, the moral of the story: Read the god damn spec sheet. And all the addendums. And pay attention to your own notes.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/nonpolynomiallabs/~4/Xbkqh79fous" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.nonpolynomial.com/2008/04/29/libusb-libftdi-latency-and-my-own-stupidity/</feedburner:origLink></entry>
 
 
</feed>
