<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>NXT time</title>
	<atom:link href="http://nxttime.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://nxttime.wordpress.com</link>
	<description>A blog with personal NXT projects</description>
	<lastBuildDate>Wed, 01 May 2013 19:20:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='nxttime.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/ee2ed7541781a8b90c90d0241cc48ab0?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>NXT time</title>
		<link>http://nxttime.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://nxttime.wordpress.com/osd.xml" title="NXT time" />
	<atom:link rel='hub' href='http://nxttime.wordpress.com/?pushpress=hub'/>
		<item>
		<title>The gyro sensor</title>
		<link>http://nxttime.wordpress.com/2013/04/19/the-gyro-sensor/</link>
		<comments>http://nxttime.wordpress.com/2013/04/19/the-gyro-sensor/#comments</comments>
		<pubDate>Fri, 19 Apr 2013 08:54:22 +0000</pubDate>
		<dc:creator>Aswin</dc:creator>
				<category><![CDATA[NXT]]></category>
		<category><![CDATA[Gyro sensor]]></category>
		<category><![CDATA[Sensors]]></category>
		<category><![CDATA[Drift]]></category>
		<category><![CDATA[Integration]]></category>
		<category><![CDATA[Offset]]></category>
		<category><![CDATA[Offset and drift correction]]></category>

		<guid isPermaLink="false">http://nxttime.wordpress.com/?p=1534</guid>
		<description><![CDATA[This time I will discuss the gyro sensor (again). What it measures. How to cope with offset and drift. And how to use it. Gyro sensors are among the most widely used sensors in robots. They are often used in self balancing robots for keeping upright. They are also used  in autonomous robots for keeping [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=1534&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>This time I will discuss the gyro sensor (<a href="http://nxttime.wordpress.com/2010/11/03/gyro-offset-and-drift/">again</a>). What it measures. How to cope with offset and drift. And how to use it.</p>
<p>Gyro sensors are among the most widely used sensors in robots. They are often used in self balancing robots for keeping upright. They are also used  in autonomous robots for keeping track of orientation. But also game controllers might use them to detect angular motion. A gyro sensor measures the angular velocity. In other words they measure how fast the sensor is rotating. This is most often expressed as degrees per second or radians per second. Some gyro sensors measure the angular velocity over one axis, others take measurements over two or three axes.</p>
<p>One should be aware that a  rotating object always rotates over just one axis. This axis however can have any orientation. Compare this to speed. An object can move in just one direction at any given time. This direction however can be any direction in a three dimensional space. Most often we do express the speed of an object over three perpendicular axes. A landing plane might fly at a speed of 600 km/s and descent at a rate of 5 m/sec. Wind might blow it off course at a rate of 0.5 m/sec. But still this plane goes in one direction only. The same is true for  angular velocity, an object rotates just with one speed, but we express its speed over three separate axes.</p>
<p>Let us take a look at the output of a typical gyro sensor. The graph below shows the output of a digital three axis gyro sensor (<a href="http://www.sparkfun.com/products/9801" target="_blank">ITG-3200</a>) over a period of 17 seconds. The X-axis is the time axis, the Y-axis shows the angular velocity expressed in degrees per second. After five seconds from the start of the measurement I rotated the gyro sensor clockwise for about 180 degrees. This took me about 3 seconds. After about 11.5 seconds I rotated the sensor back (counter clockwise).</p>
<p><a href="http://nxttime.files.wordpress.com/2013/04/gyro-1.png"><img class="aligncenter size-large wp-image-1536" alt="gyro-1" src="http://nxttime.files.wordpress.com/2013/04/gyro-1.png?w=460&#038;h=217" width="460" height="217" /></a></p>
<p>This graph tells us quite a lot. First, we notice that the sensor is a three axis sensor. It returns three different signals at any given time. Second, we can see that the rotation I made took place of the third axis, this is the Z-axis. It means that I rotated the sensor in the XY-plane. This is true, I had the sensor flat on my desk and I rotated it while keeping it flat. Third, a clockwise rotation is expressed as a negative angular velocity and a counter-clockwise rotation as a positive angular velocity. This is a matter of convention and is called the <a href="http://en.wikipedia.org/wiki/Right-hand_rule" target="_blank">right-handed</a> orientation system. Fourth, we can see that  when at rest the gyro signal is close to, but not exactly, zero. This is because the sensor is not perfect, it has a bit of an error. We&#8217;ll look into this error and ways to compensate for this later. And finaly, we cannot read the change of 180 degrees in orientation from the graph. This is because the sensor does not measure the orientation, instead it measures the angular velocity (speed of rotation). It is however possible to calculate the (change in) orientation from the angular velocity as I&#8217;ll explain later.</p>
<h2>Offset and drift correction</h2>
<p>Let us concentrate on the error in the sensor signal right now. Below is a graph taken over a period of ten minutes while the sensor was at stand still all the time.<a href="http://nxttime.files.wordpress.com/2013/04/gyro-22.png"><img class="aligncenter size-large wp-image-1540" alt="gyro-2" src="http://nxttime.files.wordpress.com/2013/04/gyro-22.png?w=460&#038;h=217" width="460" height="217" /></a></p>
<p>A perfect sensor would output a rate of velocity of zero for all three axes all the time. Obviously this sensor does not.  The X-axis signal is around 2 instead of zero. This error is called the offset error. Every axis has its own offset error. For the X-asis this is around 2, for the Y-axis it is about 3.3 and for the Z-axis it is about -1.5. It is easy to correct for the offset error once you know how big it is. You just substract the offset error from the sensor signal to get a corrected value. The offset error itself can be calculated by taking the mean of a number of samples, take 100 for example.</p>
<p>The offset itself may seem constant, but in reality it is not. The offset of a sensor  is influenced by several factors and can change over time as a result. This is called sensor drift. One of the biggest factors contributing to sensor drift is temperature. You can notice this when one starts using a sensor. When being used, the temperature of a sensor rises a bit. It gets hotter then the ambient temperature. As a result the offset of the sensor changes. If you need a very good signal you should take this into account and let the sensor warm up before calculating the offset.<br />
Some gyro sensors, like the <a href="http://www.hitechnic.com/cgi-bin/commerce.cgi?preadd=action&amp;key=NGY1044" target="_blank">Hitechnic gyro</a> for example,  are seriously affected by changes in input voltage. As the NXT is battery powered this is a serious problem. Starting the motors of the NXT will result in a power drop and thus in a change in offset. There is a trick to avoid this if you have a sensor mux with an external power supply. Like <a href="http://mindsensors.com/index.php?module=pagemaster&amp;PAGE_user_op=view_page&amp;PAGE_id=179">this one</a> from Mindsensors. In general I advise you to choose another gyro.<br />
Even when temperature and power are constant the offset of a gyro will still vary a bit over time. This variation is called random walk.</p>
<p>There is a very elegant technique to deal with sensor drift. This is to constantly but slowly update the offset error of the sensor. Instead of treating the offset as a constant you  treat it as a value that can change over time. To calculate the offset you now use the <a href="http://en.wikipedia.org/wiki/Running_average" target="_blank">moving average</a> of the most recent samples as the offset. Then you always have an up-to-date offset. Calculating the moving average however is CPU intensive and you also need a lot of memory to store the samples. Therefore it is better to use a <a href="http://en.wikipedia.org/wiki/Low-pass_filter" target="_blank">low-pass </a>filter instead of a moving average. This does not use extra memory and little computing power but the effect is the same.<br />
This technique will work very well when the sensor is at stand still. But will it work well when it is rotating? Any rotation will  influence the calculated offset. So of possible one should pause updating the offset while the sensor rotates? Sometimes another sensor can help to detect a rotation. A compass, an accelerometer or  motor encounters can all be off help.<br />
However, there is also another solution. This one is based on the notion that a rotation in one direction is very often compensated with a rotation in another direction. A balancing robot for example stays upright, so in the long term it does not rotate. It might lean forward and backward for short moments of time. But this forward and backward rotations cancel each other out on the long run. So in the long run the average signal of the sensor equals the offset of the sensor, even when there are rotations from time to time. This means that even under dynamic circumstances one can constantly update the sensor offset. One only has to make sure to use enough samples so that there is enough time for rotations to cancel each other out. This technique is useful for balancing robots where rotations are short. It is less useful for slow turning robots where rotations have a long duration.</p>
<h2>Converting angular velocity to direction</h2>
<p>There are situations where one needs to know the direction of the sensor. In navigation for example one needs to know in what direction a robot is heading. A gyro can provide this kind of information. There are some limitations though. So how do you transform angular velocity into direction? This is done by <a href="http://en.wikipedia.org/wiki/Integral">integration</a>. This might seem difficult. But it really is not. If a robot rotates for 2 seconds at a speed of 90 degrees per second, it has rotated for 180 degrees. So integration is nothing more than time multiplied with speed. The graph below shows both the (offset corrected) angular velocity and the direction. During the test I rotated the sensor four times with 90 degrees clockwise, 360 degrees counter clockwise, 90 degrees counter clockwise and 90 degrees clockwise. After this the sensor was back at its start direction.</p>
<p><a href="http://nxttime.files.wordpress.com/2013/04/gyro-31.png"><img class="aligncenter size-large wp-image-1544" alt="gyro-3" src="http://nxttime.files.wordpress.com/2013/04/gyro-31.png?w=460&#038;h=217" width="460" height="217" /></a>The  line representing the direction, labeled Rotation 2, clearly shows the steps of 90 degrees that I made. Careful examination of the data shows that according to the sensor the robot rotated with -358.8 degrees at max, where as I tried to rotate it with -360 degrees. This makes the sensor, and the integration, pretty accurate. However, after turning the sensor back to its start direction the calculated direction is not zero as is to be expected. Instead, it is about 5.7 degrees. This is not so good. What makes it even worse, there is no way to correct this. At least, not without the aid of another sensor of user intervantion. This is the main drawback of integration. Over time small errors (in the offset corrected) signal build up to become a large error in the integrated data.</p>
<p>But integration can be very useful nevertheless. Suppose a robot that needs to make exact turns. Using integration you can do so. But you need to reset the initial direction to zero just before making the term. This way the error in each turn will only be equal to the integration error that built up during this turn. This is small as making a turn does not last that long. In other words, you can make your individual turns accurate but not the overall direction of the robot.</p>
<p>But wait, there is one more thing. Integration only gives a <span style="text-decoration:underline;">change</span> in direction. To know the real direction one should also know the direction before the changes took place. Quite often this initial direction can be assumed to be zero. But this is arbitrary and does not relate to the world. Although it might be all you need. If you need to relate the orientation of your sensor to the real world you need to align the sensor with the real world (make it point north) or you need another sensor that can do this for you. This could be a compass sensor.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nxttime.wordpress.com/1534/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nxttime.wordpress.com/1534/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=1534&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nxttime.wordpress.com/2013/04/19/the-gyro-sensor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/37d0207eb24f0e5789ab53d7d43d5305?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Aswin</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/04/gyro-1.png?w=460" medium="image">
			<media:title type="html">gyro-1</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/04/gyro-22.png?w=460" medium="image">
			<media:title type="html">gyro-2</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/04/gyro-31.png?w=460" medium="image">
			<media:title type="html">gyro-3</media:title>
		</media:content>
	</item>
		<item>
		<title>Lego technic sports car</title>
		<link>http://nxttime.wordpress.com/2013/04/05/1476/</link>
		<comments>http://nxttime.wordpress.com/2013/04/05/1476/#comments</comments>
		<pubDate>Fri, 05 Apr 2013 14:24:41 +0000</pubDate>
		<dc:creator>Aswin</dc:creator>
				<category><![CDATA[NXT]]></category>

		<guid isPermaLink="false">https://nxttime.wordpress.com/?p=1476</guid>
		<description><![CDATA[I Proudly present my first Lego Technic sports car. My son and I built it together. It features a working 6 cylinder engine, moving bonnet, scissor doors, working steering, 2-tone interior and several body kits. Amongst the body kits is one that allows the car to fly!<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=1476&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I Proudly present my first Lego Technic sports car. My son and I built it together.  It features a working 6 cylinder engine, moving bonnet, scissor doors, working steering, 2-tone interior and several body kits. Amongst the body kits is one that allows the car to fly!</p>
<p><a href="http://nxttime.files.wordpress.com/2013/04/20130405-162432.jpg"><img src="http://nxttime.files.wordpress.com/2013/04/20130405-162432.jpg?w=460" alt="20130405-162432.jpg" class="alignnone size-full" /></a></p>
<p><a href="http://nxttime.files.wordpress.com/2013/04/20130405-162501.jpg"><img src="http://nxttime.files.wordpress.com/2013/04/20130405-162501.jpg?w=460" alt="20130405-162501.jpg" class="alignnone size-full" /></a></p>
<p><a href="http://nxttime.files.wordpress.com/2013/04/20130405-162513.jpg"><img src="http://nxttime.files.wordpress.com/2013/04/20130405-162513.jpg?w=460" alt="20130405-162513.jpg" class="alignnone size-full" /></a></p>
<p><a href="http://nxttime.files.wordpress.com/2013/04/20130405-162553.jpg"><img src="http://nxttime.files.wordpress.com/2013/04/20130405-162553.jpg?w=460" alt="20130405-162553.jpg" class="alignnone size-full" /></a></p>
<p><a href="http://nxttime.files.wordpress.com/2013/04/20130405-162612.jpg"><img src="http://nxttime.files.wordpress.com/2013/04/20130405-162612.jpg?w=460" alt="20130405-162612.jpg" class="alignnone size-full" /></a></p>
<p><a href="http://nxttime.files.wordpress.com/2013/04/20130405-162634.jpg"><img src="http://nxttime.files.wordpress.com/2013/04/20130405-162634.jpg?w=460" alt="20130405-162634.jpg" class="alignnone size-full" /></a></p>
<p><a href="http://nxttime.files.wordpress.com/2013/04/20130405-162649.jpg"><img src="http://nxttime.files.wordpress.com/2013/04/20130405-162649.jpg?w=460" alt="20130405-162649.jpg" class="alignnone size-full" /></a></p>
<p><a href="http://nxttime.files.wordpress.com/2013/04/20130405-162700.jpg"><img src="http://nxttime.files.wordpress.com/2013/04/20130405-162700.jpg?w=460" alt="20130405-162700.jpg" class="alignnone size-full" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nxttime.wordpress.com/1476/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nxttime.wordpress.com/1476/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=1476&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nxttime.wordpress.com/2013/04/05/1476/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/37d0207eb24f0e5789ab53d7d43d5305?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Aswin</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/04/20130405-162432.jpg" medium="image">
			<media:title type="html">20130405-162432.jpg</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/04/20130405-162501.jpg" medium="image">
			<media:title type="html">20130405-162501.jpg</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/04/20130405-162513.jpg" medium="image">
			<media:title type="html">20130405-162513.jpg</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/04/20130405-162553.jpg" medium="image">
			<media:title type="html">20130405-162553.jpg</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/04/20130405-162612.jpg" medium="image">
			<media:title type="html">20130405-162612.jpg</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/04/20130405-162634.jpg" medium="image">
			<media:title type="html">20130405-162634.jpg</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/04/20130405-162649.jpg" medium="image">
			<media:title type="html">20130405-162649.jpg</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/04/20130405-162700.jpg" medium="image">
			<media:title type="html">20130405-162700.jpg</media:title>
		</media:content>
	</item>
		<item>
		<title>Winner of the dLight giveaway</title>
		<link>http://nxttime.wordpress.com/2013/04/01/winner-of-the-dlight-giveaway/</link>
		<comments>http://nxttime.wordpress.com/2013/04/01/winner-of-the-dlight-giveaway/#comments</comments>
		<pubDate>Mon, 01 Apr 2013 12:48:30 +0000</pubDate>
		<dc:creator>Aswin</dc:creator>
				<category><![CDATA[dLight]]></category>
		<category><![CDATA[NXT]]></category>

		<guid isPermaLink="false">https://nxttime.wordpress.com/?p=1369</guid>
		<description><![CDATA[Today I am proud to announce the winner of the dLight giveaway. There were 30 participants. I want to thank them for their kind words about my blog. This positive feedback is really important to me and keeps me writing. I was also very pleased with the enthusiasm for the dLights in the reactions. Most [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=1369&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Today I am proud to announce the winner of the <a href="http://www.dexterindustries.com/dLight.html">dLight</a> giveaway.<br />
There were 30 participants. I want to thank them for their kind words about my blog. This positive feedback is really important to me and keeps me writing. I was also very pleased with the enthusiasm for the dLights in the reactions. Most people said the dLights were cool. I hope we&#8217;ll see some nice applications of the dLights in the future.</p>
<p>The winner of this contest was drawn by my son from a basket containing 30 small papers, each with the name of one of the participants. And the winner is <strong>Leon Overweel</strong>! Congratulations Leon!<br />
Leon is a talented NXT builder and you might know him from his website <a href="http://www.leonoverweel.com">World of Mindstorms</a>. I am curious to see what creative uses he&#8217;ll come up with.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nxttime.wordpress.com/1369/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nxttime.wordpress.com/1369/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=1369&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nxttime.wordpress.com/2013/04/01/winner-of-the-dlight-giveaway/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/37d0207eb24f0e5789ab53d7d43d5305?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Aswin</media:title>
		</media:content>
	</item>
		<item>
		<title>dLights, some cool LEDs for your NXT robot</title>
		<link>http://nxttime.wordpress.com/2013/03/23/dlights-some-cool-leds-for-your-nxt-robot/</link>
		<comments>http://nxttime.wordpress.com/2013/03/23/dlights-some-cool-leds-for-your-nxt-robot/#comments</comments>
		<pubDate>Fri, 22 Mar 2013 23:22:04 +0000</pubDate>
		<dc:creator>Aswin</dc:creator>
				<category><![CDATA[dLight]]></category>
		<category><![CDATA[Holonomic wheels]]></category>
		<category><![CDATA[NXT]]></category>
		<category><![CDATA[Omniwheel robot]]></category>
		<category><![CDATA[rotacaster]]></category>

		<guid isPermaLink="false">http://nxttime.wordpress.com/?p=1245</guid>
		<description><![CDATA[Today Dexter Industries launched their latest product, an all-color LED called the dLight. I was involved in the development of the dLights so I got them early. I can also give away one set of dLights to one of my readers. More on that later. Let&#8217;s take a look at the dLights firs in this [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=1245&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Today Dexter Industries launched their latest product, an all-color LED called the dLight. I was involved in the development of the dLights so I got them early. I can also give away one set of dLights to one of my readers. More on that later. Let&#8217;s take a look at the dLights firs in this video.</p>
<p><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='460' height='289' src='http://www.youtube.com/embed/inF5gVfMN3o?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span></p>
<p>I mounted three dLights underneath Agilis, one under each leg pointing to the wheel. I programmed the dLights to give a color that corresponds to the wheel speed of the particular leg. I think the result looks cool.</p>
<p>If you look closely to the sensor ports in the video, you&#8217;ll notice that only one is in use. This is one of the great benefits of the dLights, you can daisy chain them. So one free port is all you need to give a robot multiple lights. One set contains four dLights plus the cables to chain them.</p>
<p>As said, I can give away one set of dLights. If you want this set you just have to reply to this message before the first of April.</p>
<p>You&#8217;ll find more info about the dLights on the website of <a href="http://www.dexterindustries.com/blog/2013/03/21/new-product-dlights-for-your-robot/">Dexter Industries</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nxttime.wordpress.com/1245/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nxttime.wordpress.com/1245/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=1245&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nxttime.wordpress.com/2013/03/23/dlights-some-cool-leds-for-your-nxt-robot/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/37d0207eb24f0e5789ab53d7d43d5305?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Aswin</media:title>
		</media:content>
	</item>
		<item>
		<title>Agilis, Speed and accuracy</title>
		<link>http://nxttime.wordpress.com/2013/03/03/agilis-speed-and-accuracy/</link>
		<comments>http://nxttime.wordpress.com/2013/03/03/agilis-speed-and-accuracy/#comments</comments>
		<pubDate>Sun, 03 Mar 2013 22:31:50 +0000</pubDate>
		<dc:creator>Aswin</dc:creator>
				<category><![CDATA[Holonomic wheels]]></category>
		<category><![CDATA[Omniwheel robot]]></category>
		<category><![CDATA[rotacaster]]></category>
		<category><![CDATA[Agilis]]></category>
		<category><![CDATA[dead reckoning]]></category>
		<category><![CDATA[holonomic]]></category>
		<category><![CDATA[Lego]]></category>
		<category><![CDATA[NXT]]></category>
		<category><![CDATA[odometry]]></category>
		<category><![CDATA[omniwheel]]></category>

		<guid isPermaLink="false">http://nxttime.wordpress.com/?p=817</guid>
		<description><![CDATA[In case you might wonder how fast or accurate Agilis is, here are some numbers. Setup The gear ratio of the motors to the wheels is 1:2, making the wheels rotate twice as fast as the motors. (It is possible to change the gear ratio to 1:3). Prototype orange Rotacaster wheels. This is the hard [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=817&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>In case you might wonder how fast or accurate Agilis is, here are some numbers.</p>
<p><strong>Setup</strong></p>
<ul>
<li>The gear ratio of the motors to the wheels is 1:2, making the wheels rotate twice as fast as the motors. (It is possible to change the gear ratio to 1:3).</li>
<li>Prototype orange Rotacaster wheels. This is the hard compound. There isalso a medium compound (gray) and soft compound (black) available.</li>
<li>The batteries were rechargeable NiMH, 2500 mAh batteries. These were not fully charged.</li>
<li>The test surface was a clean linoleum floor.</li>
</ul>
<p><strong>Speed</strong></p>
<ul>
<li><span style="line-height:13px;">Reliable top speed is about 60 cm/sec, equivalent to 2.16 km/h or 1.35 mph. At this speed the robot is still accurate as there is ample margin for the PID controllers of the motors.</span></li>
<li><span style="line-height:13px;">Unreliable top speed is about 75 cm/sec, equivalent to 2.7 kmh or 1.68 mph. At this speed the robot is not very accurate, especially the heading.</span></li>
</ul>
<p><strong>Accuracy</strong></p>
<ul>
<li><span style="line-height:13px;">The test track is a square with sides of one meter each. During each run the test track is traveled 4 times. Making the total distance of the test track 16 meters.</span></li>
<li><span style="line-height:13px;">The robot finishes the test track on average within 10 cm of its starting position. Expressed as a percentage of the total distance the error is about 0.6%.</span></li>
<li>The movement error is systematic. The robot always ends up above and to the right of the starting position.</li>
<li>The robot is more accurate at slower speed and acceleration settings.</li>
</ul>
<p>The images shows the result of the accuracy testing. For each test the robot was placed exactly on the origin (bottom left in the picture). It then traveled a square with sides of one meter for four times, making the total distance traveled 16 meters. The finish location of the robot was then marked on the floor. This test was repeated three times for a single set of settings of speed and acceleration. Three different dynamic sets were used,  speed: 50 cm/sec and  acceleration at 100 cm/sec^2, speed 50 cm/sec and acceleration at 750 cm/sec^2 and speed 30 cm/sec and acceleration 60 cm/sec^2.</p>
<p><a href="http://nxttime.files.wordpress.com/2013/03/foto-7.jpg"><img class="size-thumbnail wp-image-818 alignnone" alt="foto (7)" src="http://nxttime.files.wordpress.com/2013/03/foto-7.jpg?w=112&#038;h=150" width="112" height="150" /></a></p>
<p>&nbsp;</p>
<p>I want to repeat the tests with a 1:3 gear ratio and also with the black Rotacaster wheels.</p>
<p>&nbsp;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nxttime.wordpress.com/817/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nxttime.wordpress.com/817/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=817&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nxttime.wordpress.com/2013/03/03/agilis-speed-and-accuracy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/37d0207eb24f0e5789ab53d7d43d5305?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Aswin</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/03/foto-7.jpg?w=112" medium="image">
			<media:title type="html">foto (7)</media:title>
		</media:content>
	</item>
		<item>
		<title>Agilis, how it moves smoothly</title>
		<link>http://nxttime.wordpress.com/2013/02/15/agilis-how-it-moves-smoothly/</link>
		<comments>http://nxttime.wordpress.com/2013/02/15/agilis-how-it-moves-smoothly/#comments</comments>
		<pubDate>Fri, 15 Feb 2013 22:00:46 +0000</pubDate>
		<dc:creator>Aswin</dc:creator>
				<category><![CDATA[NXT]]></category>

		<guid isPermaLink="false">https://nxttime.wordpress.com/?p=814</guid>
		<description><![CDATA[If you ever made an autonomous robot, differential or holonomic, you&#8217;ll have experienced that they most often don&#8217;t move very elegant. Agilis, my current robot didn&#8217;t move smoothly either. This is because it&#8217;s movements are composed of different actions. Each action, driving, turning and all the other fancy movements it can make, is very smooth [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=814&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>If you ever made an autonomous robot, differential or holonomic, you&#8217;ll have experienced that they most often don&#8217;t move very elegant. Agilis, my current robot didn&#8217;t move smoothly either. This is because it&#8217;s movements are composed of different actions. Each action, driving, turning and all the other fancy movements it can make, is very smooth by itself as you could see in previous video. But, when going from one action to the other, the robot experiences violent changes in wheel speed. This leads to wheel spin, sliding and large errors in positioning. The robot tries to go from one speed (one action) to a different speed (second action) in a moment.</p>
<p>One way to solve this problem, is to make the robot accelerate and decelerate at the beginning and ending of each action. This will get rid of the positioning errors and violent accelerations. But it will mean that there is a stop between each action, and that is not what I want for a fast moving robot like Agilis.</p>
<p>The way I made Agilis move smoothly is by action blending (as I call it). By this I mean that I let an action fade out while the next one fades in. Just like a DJ mixes tracks or a painter mixes colors. This works very well as you can see in this video. We see Agilis cutting corners when instructed to drive a square. The cutting of a corner is the result of blending in two actions, one saying, go forward , the other saying, go left. The blending also depends on the speed of the robot, a faster moving robot needs a bigger corner to turn. But also on it&#8217;s capability to brake and accelerate. The quicker it can do this, the smaller the turns it can make. I fiddled with this in the video.</p>
<p><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='460' height='289' src='http://www.youtube.com/embed/uOe76u2qCSE?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span></p>
<p>There were a lot of technical and logical considerations when implementing action blending in code. I think most of you can&#8217;t be bothered by this, so I won&#8217;t discuss them unless there proves to e a demand for this. To facilitate further developments and overcome errors if needed I made action blending optional in my code.</p>
<p>Two things bother me. One is that with short actions or low values for acceleration more than two actions can overlap in time. I can only handle two. The other is that I haven&#8217;t got angle (between two actions) in the equation, so the results are angle specific. Giving good results with square angles only.</p>
<p>I have been using Premiere Elements 11 for the last two video&#8217;s and obviously still need to learn a lot. Sorry for the vague green texts, I don&#8217;t know how to fix that. They were perfectly sharp when I wrote them on the floor.</p>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nxttime.wordpress.com/814/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nxttime.wordpress.com/814/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=814&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nxttime.wordpress.com/2013/02/15/agilis-how-it-moves-smoothly/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/37d0207eb24f0e5789ab53d7d43d5305?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Aswin</media:title>
		</media:content>
	</item>
		<item>
		<title>Agilis, how it moves</title>
		<link>http://nxttime.wordpress.com/2013/02/03/agilis-how-it-moves/</link>
		<comments>http://nxttime.wordpress.com/2013/02/03/agilis-how-it-moves/#comments</comments>
		<pubDate>Sun, 03 Feb 2013 00:20:44 +0000</pubDate>
		<dc:creator>Aswin</dc:creator>
				<category><![CDATA[NXT]]></category>

		<guid isPermaLink="false">https://nxttime.wordpress.com/?p=806</guid>
		<description><![CDATA[Last post I introduced Agilis, and I discussed the calculations needed for driving the motors and for doing odometry. This time I&#8217;ll discuss how it moves. But first, let us take a look at a video. In the video we see that Agilis can make some amazing movements. It circles around while facing in one [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=806&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Last post I introduced Agilis, and I discussed the calculations needed for driving the motors and for doing odometry. This time I&#8217;ll discuss how it moves. But first, let us take a look at a video. </p>
<p><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='460' height='289' src='http://www.youtube.com/embed/c-lEjVsoiGo?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span></p>
<p>In the video we see that Agilis can make some amazing movements. It circles around while facing in one direction for example. It&#8217;s movements are not constraint in heading nor in direction, it can make any movement. This makes Agilis a holonomic robot. Any movement a holonomic robot can possibly make,  can be described as a combination of two functions. One function describes the robots location (X and Y coordinates) in time. The second describes its heading (H) in time. The two functions together give the robots pose at a given moment. </p>
<p>For the above example the function for location is<br />
<code>x=cos(t)*radius;<br />
Y=sin(t)*radius;</code><br />
The function for heading is<br />
<code>h=aConstantValue</code></p>
<p>As I discussed in my previous post, Agilis accepts a speed vector {x,y,h} as input for its drive system. The speed vector is the derivative of pose. So we need to use the derivative of the above functions if we want to use these to make Agilis move. This might sound complicated, but what it means is that we need functions that give a speed at moment in time. For our example these functions are </p>
<p><code><br />
x=-sin(t)*radius;<br />
Y=cos(t)*radius;<br />
</code><br />
The function for h is<br />
<code>h=0</code></p>
<p>There are two important remarks to the above.<br />
First, it seems arbitrary to say that x and y are bundled together in one function and h is calculated in another function. This is for a good reason, it is how we think. We think of a robot driving in circles, this is x and y together. We think of a robot facing north. Also, if we have to independent functions in the program than we can make very interesting combinations of location and heading functions.<br />
Second, you might wonder why I discussed the two forms of the formulas. Well, in most cases it is best to use the speed (or derivative) form of a function. In some cases though, there is no (obvious) derivate of a function. This is especially the case when a function relates to the outside world. An example of this would be a function that makes the robot &#8220;look&#8221; at a fixed point in space, no matter where it is going. That leaves us with a problem though. If there is no derivative of a function, how do you get a speed from such a function? The way to go is to calculate the difference between the desired position or heading and the actual position or heading and then to translate this difference into speed. I use a PID controller to make this translation.</p>
<p>This brings me to the way this is implemented for Agilis. In the code I created a pilot. This pilot is responsible for performing movements. It must be instructed which movements to make so it can execute them. While executing a movement the pilot periodically queries the two movements for the desired speed and location. If it is a location that the movement returns then pilot translates this into speed using the PID controller. It then transforms this speed vector from a global coordinate system into the local coordinate system of the robot and then passes the speed vector on to the chassis. The chassis is a logical part in my program that should be envisioned just below the pilot. It accepts a speed vector, translates this to speed of the motors and then drives the motors. </p>
<p>The pilot handles two functions in parallel, one for location and one for heading. Each of the functions can return either speed or location. In any combination. A function can have an end to it, like go straight for one meter. But this is not obliged, like keep facing north.</p>
<p>I have implemented or <em>planned</em> these functions for location.</p>
<ul>
<li>stand still</li>
<li>drive a straight line</li>
<li>drive an arc</li>
</ul>
<p> I have implemented or <em>planned</em> these functions for heading.</p>
<ul>
<li>rotate</li>
<li>hold still</li>
<li>look to a fixed direction</li>
<li><em>look around (from left to right and back and so on)</em></li>
<li><em>look where you&#8217;re going</em></li>
</ul>
<p>This is basically all there is to it. This program allows Agilis to perform all the movements you see in the video. But as you can notice the transition from one movement to another isn&#8217;t smooth yet. I plan to make it smooth with a technique I call maneuver blending. What it should do is to blend two maneuvers so that a transition between the two appears to be natural. As said, I haven&#8217;t programmed this jet. If I succeed I will dedicate a post to it. If not, it is most unlikely that i&#8217;ll write about it <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nxttime.wordpress.com/806/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nxttime.wordpress.com/806/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=806&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nxttime.wordpress.com/2013/02/03/agilis-how-it-moves/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/37d0207eb24f0e5789ab53d7d43d5305?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Aswin</media:title>
		</media:content>
	</item>
		<item>
		<title>Agilis! My new robot</title>
		<link>http://nxttime.wordpress.com/2013/01/14/agilis-my-new-robot/</link>
		<comments>http://nxttime.wordpress.com/2013/01/14/agilis-my-new-robot/#comments</comments>
		<pubDate>Mon, 14 Jan 2013 15:20:26 +0000</pubDate>
		<dc:creator>Aswin</dc:creator>
				<category><![CDATA[Holonomic wheels]]></category>
		<category><![CDATA[LEJOS]]></category>
		<category><![CDATA[NXT]]></category>
		<category><![CDATA[Omniwheel robot]]></category>
		<category><![CDATA[Holonomic robot]]></category>
		<category><![CDATA[odometry]]></category>
		<category><![CDATA[robot kinematics]]></category>

		<guid isPermaLink="false">http://nxttime.wordpress.com/?p=771</guid>
		<description><![CDATA[This Christmas holiday I started working on a new robot, called Agilis. This robot should be a very agile and elegantly moving robot. The frame is based on a triangle equipped with holonomic wheels. So you might think, &#8220;What&#8217;s new, it is like your last robot?&#8221;. From the outside this is true, but it gets [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=771&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>This Christmas holiday I started working on a new robot, called Agilis. This robot should be a very agile and elegantly moving robot. The frame is based on a triangle equipped with holonomic wheels. So you might think, &#8220;What&#8217;s new, it is like your last robot?&#8221;. From the outside this is true, but it gets new and better brains on the inside. Let me tell you what I envision.</p>
<p>Most robots I built went from point A to point B, only then to decide what to do next. Others just drove around avoiding obstacles. This one should be able to do both at the same time. Agilis must be able to perform complex manouvres, like driving in a straight line while rotating around its centre, or like driving an arc while keeping pointed at an arbitrary spot. It should constantly use sensory input to stay on course, or to alter its course if needed. And all this must go fluently, just like a cat walking through the room.</p>
<p>Over the next several posts I will discuss the different aspects of Agilis. This first post deals with the drive system.</p>
<h2>the chassis</h2>
<p><a href="http://nxttime.files.wordpress.com/2013/01/img_8702.jpg"><img class="alignright size-thumbnail wp-image-800" alt="geartrain" src="http://nxttime.files.wordpress.com/2013/01/img_8702.jpg?w=150&#038;h=100" width="150" height="100" /></a> <a href="http://nxttime.files.wordpress.com/2013/01/img_8701.jpg"><img class="size-thumbnail wp-image-801 alignleft" title="Agilis" alt="IMG_8701" src="http://nxttime.files.wordpress.com/2013/01/img_8701.jpg?w=150&#038;h=100" width="150" height="100" /></a>Agilis is a three wheeled holonomic platform. This means it can drive in any direction without turning. It can turn around any point, even around its own center. Each wheel is driven by a NXT motor via a gear train that has a 1:2 ratio, the wheels rotate twice as fast as the motors. This makes Agilis a relatively fast robot. The gear train has to be very sturdy to handle the torque of the motors. It also has to be precise to allow for odometry. I used the same setup that I developed for my last robot, Koios the Guard bot.</p>
<h2>From robot speed to motor speed</h2>
<p>It is not very easy to control a holonomic robot, it  takes some math. I created a kinematic model that does just that. The model takes robot speed as input and gives motor speed as output. Robot speed is expressed as speed in x-direction, y-direction and rotational speed. Motor speed is expressed as encoder ticks per second.</p>
<p>So how does this kinematic model look like? For a single wheel this looks like a function that takes the three robot speeds as input. For the three wheels together it looks like a matrix multiplication that multiplies a robot speed vector {xSpeed,ySpeed,angularSpeed} with a kinematic matrix. The resulting vector containers the speed of each of the three wheels. Let&#8217;s take a look at the single wheel function first.</p>
<p>To translate robot speed into motor speed one needs to know some physical aspects of the robot, the wheel and the motor. How big is the wheel, how far is it from the center of the robot, under what angle is it mounted, what is the gear ratio of the gear train and what is the number of encoder ticks per full cycle of the motor? With all this information one can write a formula to calculate motor speed from robot speed. Here is the formula.</p>
<pre>motorSpeed = 
xSpeed * (cosine(wheelAngle) * nEncoderTicks / ( gearRatio * 2 * PI * wheelRadius) - 
ySpeed * (sinus(wheelAngle) * nEncoderTicks / (gearRatio * 2 * PI * wheelRadius) + 
angularSpeed * distanceToCenter * nEncoderTicks / (gearRatio * 2 * PI * wheelRadius)</pre>
<p>This formula might look daunting at first, but on second glance you might notice that there are a lot of constants in it. If you substitute the constants with their respective values you will end up with a much simpler formula.</p>
<pre>motorSpeed = xSpeed * aConstantValue - ySpeed * anotherConstantValue + angularSpeed * yetAnotherConstantValue</pre>
<p>This formula is not only much simpler, it is also very efficient to calculate, just three multiplications and two additions. A NXT can do this in no time. But remember, these constants are not the same for all the motors because each of the wheels has a different wheelAngle. But, you could also have wheels of different sizes, or differences in any of the other aspects. This means that you will have a formula for each of the motors, each formula is the same in structure but has its own constants. These constants can be stored in a matrix where each row in the matrix contains the 3 constants belonging to a single wheel. The matrix has a row for each of the wheels. If you then take the speed vector and multiply this with the matrix then all formulas are calculated at once and the result, the motorSpeed, is stored in a new vector. Each row in this vector holds the speed of a single motor. In java this matrix multiplication would look like this:</p>
<pre>Matrix motorSpeed = kinematicModel.times(robotSpeed);</pre>
<p>Wow, now things look simple at last! This is the beauty of matrix algebra.</p>
<p>The same kinematic model can be used to transform robot acceleration into motor acceleration. I use this to make my robot accelerate very smoothly. (the regulated motor class of Lejos supports regulated acceleration).</p>
<h2>From tacho counter to robot position</h2>
<p>To drive a robot this kinematic model works perfect. But I also want to be able to do things the other way around. I want to be able to calculate robot position from encoder values. At first I couldn&#8217;t figure this out at all. The math was just too complex for my mind. That is, until I realized that I just needed to use the inverse of the kinematic model.</p>
<pre>deltaRobotPose = deltaMotorPosition * inverseKinematicModel</pre>
<p>Here deltaMotorPosition is a vector containing the change in encoder value of each of the motors since the previous measurement. The inverseKinematicModel is the kinematic model inverted. And deltaRobotPose is the change in pose (x and y position and heading) of the robot. Looks simple, doesn&#8217;t it? The problem is how to calculate the inverse matrix of the kinematic model. I can&#8217;t tell you, because I don&#8217;t know. But hey, somebody else already programmed this in Java. I just used the inverse method of the Matrix class.</p>
<h2>From the robots coordinates to the worlds coordinates</h2>
<p>There is just one more thing to it. The robot can have any heading, this means that x and y coordinates of the robot are not aligned with the x and y coordinates of the world. To be able to steer the robot to a certain position in a room one must be able to convert this location to a location as the robot sees it. The same goes for keeping track of pose. We have seen the formula to calculate change in pose from the wheel encoders. This change however is a change as the robot sees it, not a change in the robots position it the world. The translation from world coordinates to robot coordinates can also be done with a simple matrix multiplication using a rotation matrix. The rotation matrix itself can be calculated from the heading of the robot.</p>
<pre><img alt="" src="http://latex.codecogs.com/gif.latex?\begin{bmatrix}%20cos(heading)%20&amp;%20-sin(heading)%20&amp;%200\\%20sin(heading))%20&amp;%20cos(heading)%20&amp;%200\\%200&amp;%200%20&amp;%201%20\end{bmatrix}" /></pre>
<p>Suppose you want to drive your robot to the left side of the room. The speed matrix in world frame would look like {0, speed, 0}. this can be multiplied with the rotation matrix to get a speed matrix as the robot sees it.</p>
<pre>RobotSpeed =worldSpeed *  rotationMatrix</pre>
<p>If we want to go the other way around, to get the change in pose in world frame we multiply the change in robot frame with the (you guessed it) inverse of the rotation matrix. For rotation matrices the inverse is the same as the transpose of the matrix, the transpose is far more efficient to calculate.</p>
<h2>Wrap up</h2>
<p>This really is all there is to driving a robot. To sum it up. You have a kinematic model to translate robot speed into motor speed. You have a rotation matrix to translate things from world coordinates to robot coordinates.<br />
The same goes for odometry. You have the inverse of the kinematic model to translate change in encoder values to change in robot pose expressed in robot coordinates. You have the inverse of the rotation matrix to translate change robot pose in robot coordinates into world coordinates.<br />
The kinematic model is a constant, it has to be calculated only once (unless your robot changes shape). The rotation matrix on the other hand has to be updated every time the heading of he robot changes.</p>
<h2>The implementation</h2>
<p>the robot uses lejos as its brains. Lejos has some excellent classes to drive the NXT motors. The regulated motor class that I used is able to rotate a motor at any given speed. This speed is maintained no matter what the conditions are. It also supports setting an acceleration rate. This is very good for my robot, as for most movements the wheel speed of the three motors is different. If all wheels would accelerate equally, then the slower moving motors would reach their target speed sooner than the faster spinning motors. This results in a robot that shivers and shakes during acceleration (or breaking).  All this can be avoided by setting an acceleration value for each of the motors. The ratio of the acceleration values must be the same as the ratio between the (difference between current speed and) target speed of each of the motors. If done properly the robot accelerates very smoothly without jerky movements.</p>
<p>Lejos also has a Matrix class that helps to perform matrix algebra. I used this class to store the (inverse) kinematic models and the rotation matrix. I subclassed it to make a Pose Class that can be used together with the matrix class.</p>
<p>To create the kinematic model I developed a Builder class. This class has all kinds of methods to describe the robot, the wheels the motors and the gear train. When you are done describing the robot, the builder class delivers you a kinematic model and an inverse kinematic model.</p>
<p>To drive the robot I made a kind of pilot class. I plan to discuss it in a future post. This pilot accepts the kinematic model in its constructor.</p>
<p>For odometry I made another class, the Odometer. This class uses the inverse kinematic model.</p>
<h2></h2>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nxttime.wordpress.com/771/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nxttime.wordpress.com/771/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=771&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nxttime.wordpress.com/2013/01/14/agilis-my-new-robot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/37d0207eb24f0e5789ab53d7d43d5305?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Aswin</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/01/img_8702.jpg?w=150" medium="image">
			<media:title type="html">geartrain</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2013/01/img_8701.jpg?w=150" medium="image">
			<media:title type="html">Agilis</media:title>
		</media:content>

		<media:content url="http://latex.codecogs.com/gif.latex?beginbmatrix%20cos(heading)%20&#38;%20-sin(heading)%20&#38;%200%20sin(heading))%20&#38;%20cos(heading)%20&#38;%200%200&#38;%200%20&#38;%201%20endbmatrix" medium="image" />
	</item>
		<item>
		<title>Triangulation with two Ultrasonic sensors</title>
		<link>http://nxttime.wordpress.com/2012/11/25/triangulation-with-two-ultrasonic-sensors/</link>
		<comments>http://nxttime.wordpress.com/2012/11/25/triangulation-with-two-ultrasonic-sensors/#comments</comments>
		<pubDate>Sun, 25 Nov 2012 21:08:04 +0000</pubDate>
		<dc:creator>Aswin</dc:creator>
				<category><![CDATA[Sensors]]></category>
		<category><![CDATA[ultrasonic]]></category>
		<category><![CDATA[cosine rule]]></category>
		<category><![CDATA[Lego]]></category>
		<category><![CDATA[NXT]]></category>
		<category><![CDATA[triangulation]]></category>
		<category><![CDATA[ultrasonic sensor]]></category>

		<guid isPermaLink="false">https://nxttime.wordpress.com/?p=746</guid>
		<description><![CDATA[This weekend I was wondering if it is possible to use triangulation to pinpoint the position of an object using two ultrasonic sensors. So I made a simple robot and wrote a small program to find out. It proves this can be done. Triangulation is a technique that uses angles or distances between points to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=746&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>This weekend I was wondering if it is possible to use triangulation to pinpoint the position of an object using two ultrasonic sensors. So I made a simple robot and wrote a small program to find out. It proves this can be done.</p>
<p><img class="alignright" alt="" src="http://upload.wikimedia.org/wikipedia/commons/4/49/Triangle_with_notations_2.svg" height="115" width="197" /><a href="http://en.wikipedia.org/wiki/Triangulation">Triangulation</a> is a technique that uses angles or distances between points to calculate the position of these points. GPS localization for example uses triangulation. The technique is based on the <a href="http://en.wikipedia.org/wiki/Law_of_cosines">law of cosines</a>. This law allows you to calculate the angles of a triangle given the lengths of its sides. But also to calculate the length of one side given the length of the two other sides and the angle of the opposite corner. This might sound complicated, but they teach it in high school, so you might know it.</p>
<p>This means that a robot equipped with two US sensors can calculate the exact position of an object, provided it is in sight of these two sensors. Potentially, this could be a huge benefit. Because a single sensor has a wide (30 degrees) detection beam, giving much uncertainty about the exact location of an object. But a single sensor also deforms the apparent shape of an object. Practically this means that constructing maps using a single US sensor is impossible. Maybe, with two sensors and some triangulation a map can be constructed, as the position of the objects can be calculated.</p>
<p><a href="http://nxttime.files.wordpress.com/2012/11/img_8697.jpg"><img class="alignleft size-medium wp-image-755" title="IMG_8697" alt="" src="http://nxttime.files.wordpress.com/2012/11/img_8697.jpg?w=300&#038;h=200" height="200" width="300" /></a>Here is a picture of the setup I used to test if it is practically possible to do this with two Lego US sensors. The sensors can be rotated as they are mounted on the shaft of a NXT motor. The sensors are constantly pointing to the object in sight. If no object is in sight the sensors point straight ahead, waiting for an object. It is clear to see from the rotation of the sensors where they are &#8220;looking&#8221; at. The effectiveness of the setup is clear to everyone.</p>
<p>After some tests I am pleased with the effectiveness of this setup. It is accurate up to 2-4 cm. If this is enough to produce good maps I don&#8217;t know. But it is at least effective for a whole range of other tasks. I&#8217;m thinking of shooting cannons, search missions and object avoidance. The video gives you an impression.</p>
<p><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='460' height='289' src='http://www.youtube.com/embed/do2vzlPjbkM?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span></p>
<p><img class="alignright size-medium wp-image-768" title="IMG_8699" alt="" src="http://nxttime.files.wordpress.com/2012/11/img_8699.jpg?w=200&#038;h=300" height="300" width="200" /></p>
<p>The effective range of the setup is limited as the picture to the right shows. I put a piece of Lego on every spot I got a successful hit. (The eleven hole beam is there for reference). It is not as wide or long as you might think. I think there are two reasons for that. the main reason is because of the low resolution of the sensor,  just one cm. This causes numerical errors whose effects are  small along the forward pointing axis, but that get larger to the sides. Offset error of the sensors is the second cause that limit the sideways effectiveness. Scale errors of the sensors limit the length of the effective range.</p>
<p>You might wonder how good a rigid setup works. Then the sensors are not allowed to rotate and home in on the object. Well, obviously the field of view is much smaller, and the sensors should be placed facing inward to maximize field of view. But I noticed that the result is less accurate and stable.</p>
<p>The program I wrote is very simple. It is just <a href="http://en.wikipedia.org/wiki/Law_of_cosines#Applications">these two forms</a> of the law of cosines embedded in some control structures. <img class="alignnone" alt="" src="http://upload.wikimedia.org/math/5/f/b/5fb96ece636c260714618844e32210db.png" height="31" width="213" /></p>
<p><img class="alignnone" alt="" src="http://upload.wikimedia.org/math/3/6/6/36630193028e4ef714b66789b3820619.png" height="51" width="233" /></p>
<pre class="brush: java; title: ; notranslate">
package lejos.nxt.sensor.example;

import lejos.nxt.Button;
import lejos.nxt.LCD;
import lejos.nxt.Motor;
import lejos.nxt.NXTRegulatedMotor;
import lejos.nxt.SensorPort;
import lejos.nxt.sensor.filter.AdditionFilter;
import lejos.nxt.sensor.sensor.LcUltrasonic;
import lejos.util.Delay;

public class TwoUSSensors {

	static final int P=5;							// P component of the P-controller
	static final double MARGIN=0.8;		// Sets the margin of max distance for two measurements to assume a single object in sight
	static final float MAXRANGE=150;	// sets the macimum range of the sensor
	static final int MINANGLE=25;			// sets the minimum angle a sensor can rotate to(o means the two sensors are facing each other
	static final double b=20.5;				// sets the distance between the two sensors, measured from shaft to shaft
	static final float SENSOROFFSET=2.5f;

	static final LcUltrasonic sensorA=new LcUltrasonic(SensorPort.S1);
	static final LcUltrasonic sensorC=new LcUltrasonic(SensorPort.S4);
	static final AdditionFilter corrrectedA=new AdditionFilter(sensorA,SENSOROFFSET);  // to correct offset from shaft
	static final AdditionFilter corrrectedC=new AdditionFilter(sensorC,SENSOROFFSET);

	static final NXTRegulatedMotor C=Motor.C;
	static final NXTRegulatedMotor A=Motor.A;

	public static void main(String[] args) {

		Object run=new TwoUSSensors();

	}

	public TwoUSSensors() {
		double targetC=0, targetA=0;
		double  a,c;
		sensorA.setMode(LcUltrasonic.MODE_PING);
		sensorC.setMode(LcUltrasonic.MODE_PING);

		C.rotateTo(90, true);
		A.rotateTo(90, false);
		Delay.msDelay(500);

		while(!Button.ESCAPE.isDown()) {

			c=corrrectedA.fetchSample();
			a=corrrectedA.fetchSample();

			LCD.clear();
			LCD.drawString(&quot;       A     C&quot;, 0, 0);
			LCD.drawString(&quot;dist&quot;, 0, 1);
			LCD.drawString(&quot;dist'&quot;, 0, 2);
			LCD.drawString(&quot;target&quot;, 0, 3);
			LCD.drawString(&quot;error&quot;, 0, 4);
			LCD.drawString(&quot;state&quot;, 0, 5);

			LCD.drawInt((int) c, 7, 1);
			LCD.drawInt((int) a, 12, 1);

			if (a&gt;MAXRANGE &amp;&amp; c&gt; MAXRANGE) {
				// it is assumed that there are no objects in sight
				 targetA = Math.PI/2;
				 targetC = Math.PI/2;
					LCD.drawString(&quot;-&quot;, 7, 5);
					LCD.drawString(&quot;-&quot;, 12, 5);
			}
			else {
				// it is assumed there are objects in sight
				if (Math.abs(a-c)&gt;b*MARGIN) {
					// it is assumed that there are two different objects in sight
					if (a&lt;c) {
						// it is assumed there is an object in front of sensorC
						LCD.drawString(&quot;-&quot;, 7, 5);
						LCD.drawString(&quot;+&quot;, 12, 5);
						targetC =Math.toRadians(C.getPosition());
						c=Math.sqrt(a*a+b*b-2*a*b*Math.cos(targetC)); // the distance between sensorA and object;
						targetA =	Math.acos((a*a-b*b-c*c)/(-2*c*b));
					}
					else {
						// it is assumed there is an object in front of sensorA
						LCD.drawString(&quot;+&quot;, 7, 5);
						LCD.drawString(&quot;-&quot;, 12, 5);
						targetA =Math.toRadians(A.getPosition());
						a=Math.sqrt(b*b+c*c-2*b*c*Math.cos(targetA)); // the distance between sensorA and object;
						targetC =Math.acos((c*c-a*a-b*b)/(-2*a*b));
					}
					LCD.drawInt((int) c, 7, 2);
					LCD.drawInt((int) a, 12, 2);
				}
				else {
					LCD.drawString(&quot;+&quot;, 7, 5);
					LCD.drawString(&quot;+&quot;, 12, 5);
					// it is assumed that there is one object in sight
					targetC =Math.acos((c*c-a*a-b*b)/(-2*a*b));
					targetA =Math.acos((a*a-b*b-c*c)/(-2*c*b));
				}
			}

			LCD.drawInt((int) Math.toDegrees(targetA),7,3);
			LCD.drawInt((int) Math.toDegrees(targetC),12,3);

			// set speed
			LCD.drawInt(rotateTo(A, targetA),7,4);
			LCD.drawInt(rotateTo(C, targetC),12,4);
			Delay.msDelay(20);
		}

		// return to start position
		A.setSpeed(200);
		C.setSpeed(200);
		C.rotateTo(0, true);
		A.rotateTo(0, false);
		Delay.msDelay(500);
	}

int rotateTo(NXTRegulatedMotor motor,double target){
	int targetDeg=(int) Math.toDegrees(target);

	if (targetDeg&lt;MINANGLE) target=MINANGLE;
	int error=targetDeg-motor.getPosition();
	if (Math.abs(error)&lt;=1) return error;
	motor.setSpeed(error*P);
	motor.rotateTo(targetDeg, true);
	return error;
}

}

</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nxttime.wordpress.com/746/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nxttime.wordpress.com/746/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=746&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nxttime.wordpress.com/2012/11/25/triangulation-with-two-ultrasonic-sensors/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/37d0207eb24f0e5789ab53d7d43d5305?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Aswin</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/4/49/Triangle_with_notations_2.svg" medium="image" />

		<media:content url="http://nxttime.files.wordpress.com/2012/11/img_8697.jpg?w=300" medium="image">
			<media:title type="html">IMG_8697</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2012/11/img_8699.jpg?w=200" medium="image">
			<media:title type="html">IMG_8699</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/math/5/f/b/5fb96ece636c260714618844e32210db.png" medium="image" />

		<media:content url="http://upload.wikimedia.org/math/3/6/6/36630193028e4ef714b66789b3820619.png" medium="image" />
	</item>
		<item>
		<title>A motorized gearbox</title>
		<link>http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/</link>
		<comments>http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/#comments</comments>
		<pubDate>Mon, 15 Oct 2012 10:54:46 +0000</pubDate>
		<dc:creator>Aswin</dc:creator>
				<category><![CDATA[NXT]]></category>
		<category><![CDATA[NXT Lego technic motorized gearbox]]></category>

		<guid isPermaLink="false">http://nxttime.wordpress.com/?p=713</guid>
		<description><![CDATA[This post I will explain the workings of a special NXT motorized gearbox. The gearbox is unique because it uses two NXT motors both for driving the output and for shifting gears. As such the full power of the two motors is available for propelling a device while there is no need for a dedicated [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=713&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>This post I will explain the workings of a special NXT motorized gearbox. The gearbox is unique because it uses two NXT motors both for driving the output and for shifting gears. As such the full power of the two motors is available for propelling a device while there is no need for a dedicated motor for shifting.</p>
<p>For its inner workings the gearbox uses differentials. Therefore it is good to understand how a differential works. A differential can be used in two ways. In most cases a differential is used to distribute the power of one motor evenly over two wheels. A setup like this isfound in cars for example. A differential can also be used to combine two power of two motors into one output shaft. When used this way the output shaft will have the combined power (torque) of the two motors and the average speed of the two motors. A setup like this is used when the exact speeds of the two motors might be slightly different.</p>
<p>This gearbox uses one differential to combine the output of the two motors. The output shaft of the differential is connected to a simple gearbox having two shifts, the low gear has a ratio of 1:1, the high gear has a 1:3 ratio. The gear shifter is controlled by the motors via a second differential. But this time the direction of one of the motors is reversed before going into the differential. Also this differential outputs the mean speed of the two motors. But as one of the motors is reversed this means that when to motors are turning at the same speed that the output shaft of this differential will not move at all. Also the gear shifter, that is connected to the second differential, will be at rest. If however both motors rotate at different speeds, then the output of this differential will be rotating and also the gear shifter will move. Changing the gearbox to another gear. So gears can be changed by speed differences between the two motors.</p>
<p>Of course you will need to control the speed of the motors exactly for this gearbox to function properly. Luckily the NXT motors have tachometers and can be controlled precisely.</p>
<p>In this example I used speed differences to control a gearbox. The same technique can also be used to drive a steering mechanism for example. Then one would just need two motors both to drive and steer a robot whilst having the full power of both NXT motors available for propulsion. As the NXT only has three motor ports, this can be a good way to free one motor for other purposes, like grabbing, lifting or scanning.</p>
<p>This video shows how the gearbox is working.</p>
<p><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='460' height='289' src='http://www.youtube.com/embed/Yzdd9bwevKI?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span></p>
<p>this video shows the gearbox in action.</p>
<p><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='460' height='289' src='http://www.youtube.com/embed/WNIcaMpAjCM?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span></p>
<p>And here are some detailed pictures:</p>

<a href='http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/img_8575/' title='IMG_8575'><img data-liked='0' data-reblogged='0' data-attachment-id="728" data-orig-file="http://nxttime.files.wordpress.com/2012/10/img_8575.jpg" data-orig-size="3888,2592" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;5.6&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon EOS 400D DIGITAL&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1350316578&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;28&quot;,&quot;iso&quot;:&quot;800&quot;,&quot;shutter_speed&quot;:&quot;0.0125&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_8575" data-image-description="" data-medium-file="http://nxttime.files.wordpress.com/2012/10/img_8575.jpg?w=300" data-large-file="http://nxttime.files.wordpress.com/2012/10/img_8575.jpg?w=460" width="150" height="100" src="http://nxttime.files.wordpress.com/2012/10/img_8575.jpg?w=150&#038;h=100" class="attachment-thumbnail" alt="IMG_8575" /></a>
<a href='http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/img_8578/' title='IMG_8578'><img data-liked='0' data-reblogged='0' data-attachment-id="729" data-orig-file="http://nxttime.files.wordpress.com/2012/10/img_8578.jpg" data-orig-size="3888,2592" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;4.5&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon EOS 400D DIGITAL&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1350316605&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;30&quot;,&quot;iso&quot;:&quot;800&quot;,&quot;shutter_speed&quot;:&quot;0.02&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_8578" data-image-description="" data-medium-file="http://nxttime.files.wordpress.com/2012/10/img_8578.jpg?w=300" data-large-file="http://nxttime.files.wordpress.com/2012/10/img_8578.jpg?w=460" width="150" height="100" src="http://nxttime.files.wordpress.com/2012/10/img_8578.jpg?w=150&#038;h=100" class="attachment-thumbnail" alt="IMG_8578" /></a>
<a href='http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/img_8580/' title='IMG_8580'><img data-liked='0' data-reblogged='0' data-attachment-id="730" data-orig-file="http://nxttime.files.wordpress.com/2012/10/img_8580.jpg" data-orig-size="3888,2592" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon EOS 400D DIGITAL&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1350316631&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;28&quot;,&quot;iso&quot;:&quot;800&quot;,&quot;shutter_speed&quot;:&quot;0.02&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_8580" data-image-description="" data-medium-file="http://nxttime.files.wordpress.com/2012/10/img_8580.jpg?w=300" data-large-file="http://nxttime.files.wordpress.com/2012/10/img_8580.jpg?w=460" width="150" height="100" src="http://nxttime.files.wordpress.com/2012/10/img_8580.jpg?w=150&#038;h=100" class="attachment-thumbnail" alt="IMG_8580" /></a>
<a href='http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/img_8582/' title='IMG_8582'><img data-liked='0' data-reblogged='0' data-attachment-id="731" data-orig-file="http://nxttime.files.wordpress.com/2012/10/img_8582.jpg" data-orig-size="3888,2592" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon EOS 400D DIGITAL&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1350316639&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;28&quot;,&quot;iso&quot;:&quot;800&quot;,&quot;shutter_speed&quot;:&quot;0.02&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_8582" data-image-description="" data-medium-file="http://nxttime.files.wordpress.com/2012/10/img_8582.jpg?w=300" data-large-file="http://nxttime.files.wordpress.com/2012/10/img_8582.jpg?w=460" width="150" height="100" src="http://nxttime.files.wordpress.com/2012/10/img_8582.jpg?w=150&#038;h=100" class="attachment-thumbnail" alt="IMG_8582" /></a>
<a href='http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/img_8584/' title='IMG_8584'><img data-liked='0' data-reblogged='0' data-attachment-id="732" data-orig-file="http://nxttime.files.wordpress.com/2012/10/img_8584.jpg" data-orig-size="3888,2592" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;4.5&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon EOS 400D DIGITAL&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1350316666&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;30&quot;,&quot;iso&quot;:&quot;800&quot;,&quot;shutter_speed&quot;:&quot;0.02&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_8584" data-image-description="" data-medium-file="http://nxttime.files.wordpress.com/2012/10/img_8584.jpg?w=300" data-large-file="http://nxttime.files.wordpress.com/2012/10/img_8584.jpg?w=460" width="150" height="100" src="http://nxttime.files.wordpress.com/2012/10/img_8584.jpg?w=150&#038;h=100" class="attachment-thumbnail" alt="IMG_8584" /></a>
<a href='http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/img_8585/' title='IMG_8585'><img data-liked='0' data-reblogged='0' data-attachment-id="733" data-orig-file="http://nxttime.files.wordpress.com/2012/10/img_8585.jpg" data-orig-size="3888,2592" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;3.5&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon EOS 400D DIGITAL&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1350316687&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;30&quot;,&quot;iso&quot;:&quot;800&quot;,&quot;shutter_speed&quot;:&quot;0.025&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_8585" data-image-description="" data-medium-file="http://nxttime.files.wordpress.com/2012/10/img_8585.jpg?w=300" data-large-file="http://nxttime.files.wordpress.com/2012/10/img_8585.jpg?w=460" width="150" height="100" src="http://nxttime.files.wordpress.com/2012/10/img_8585.jpg?w=150&#038;h=100" class="attachment-thumbnail" alt="IMG_8585" /></a>
<a href='http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/img_8586/' title='IMG_8586'><img data-liked='0' data-reblogged='0' data-attachment-id="734" data-orig-file="http://nxttime.files.wordpress.com/2012/10/img_8586.jpg" data-orig-size="3888,2592" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;4&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon EOS 400D DIGITAL&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1350316696&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;35&quot;,&quot;iso&quot;:&quot;800&quot;,&quot;shutter_speed&quot;:&quot;0.02&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_8586" data-image-description="" data-medium-file="http://nxttime.files.wordpress.com/2012/10/img_8586.jpg?w=300" data-large-file="http://nxttime.files.wordpress.com/2012/10/img_8586.jpg?w=460" width="150" height="100" src="http://nxttime.files.wordpress.com/2012/10/img_8586.jpg?w=150&#038;h=100" class="attachment-thumbnail" alt="IMG_8586" /></a>
<a href='http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/img_8587/' title='IMG_8587'><img data-liked='0' data-reblogged='0' data-attachment-id="735" data-orig-file="http://nxttime.files.wordpress.com/2012/10/img_8587.jpg" data-orig-size="3888,2592" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;3.5&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon EOS 400D DIGITAL&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1350316706&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;38&quot;,&quot;iso&quot;:&quot;800&quot;,&quot;shutter_speed&quot;:&quot;0.033333333333333&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_8587" data-image-description="" data-medium-file="http://nxttime.files.wordpress.com/2012/10/img_8587.jpg?w=300" data-large-file="http://nxttime.files.wordpress.com/2012/10/img_8587.jpg?w=460" width="150" height="100" src="http://nxttime.files.wordpress.com/2012/10/img_8587.jpg?w=150&#038;h=100" class="attachment-thumbnail" alt="IMG_8587" /></a>
<a href='http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/img_8588/' title='IMG_8588'><img data-liked='0' data-reblogged='0' data-attachment-id="736" data-orig-file="http://nxttime.files.wordpress.com/2012/10/img_8588.jpg" data-orig-size="2592,3888" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;3.5&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;Canon EOS 400D DIGITAL&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1350316712&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;38&quot;,&quot;iso&quot;:&quot;800&quot;,&quot;shutter_speed&quot;:&quot;0.02&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="IMG_8588" data-image-description="" data-medium-file="http://nxttime.files.wordpress.com/2012/10/img_8588.jpg?w=200" data-large-file="http://nxttime.files.wordpress.com/2012/10/img_8588.jpg?w=460" width="100" height="150" src="http://nxttime.files.wordpress.com/2012/10/img_8588.jpg?w=100&#038;h=150" class="attachment-thumbnail" alt="IMG_8588" /></a>

<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nxttime.wordpress.com/713/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nxttime.wordpress.com/713/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nxttime.wordpress.com&#038;blog=10436341&#038;post=713&#038;subd=nxttime&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nxttime.wordpress.com/2012/10/15/a-motorized-gearbox/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/37d0207eb24f0e5789ab53d7d43d5305?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Aswin</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2012/10/img_8575.jpg?w=150" medium="image">
			<media:title type="html">IMG_8575</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2012/10/img_8578.jpg?w=150" medium="image">
			<media:title type="html">IMG_8578</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2012/10/img_8580.jpg?w=150" medium="image">
			<media:title type="html">IMG_8580</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2012/10/img_8582.jpg?w=150" medium="image">
			<media:title type="html">IMG_8582</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2012/10/img_8584.jpg?w=150" medium="image">
			<media:title type="html">IMG_8584</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2012/10/img_8585.jpg?w=150" medium="image">
			<media:title type="html">IMG_8585</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2012/10/img_8586.jpg?w=150" medium="image">
			<media:title type="html">IMG_8586</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2012/10/img_8587.jpg?w=150" medium="image">
			<media:title type="html">IMG_8587</media:title>
		</media:content>

		<media:content url="http://nxttime.files.wordpress.com/2012/10/img_8588.jpg?w=100" medium="image">
			<media:title type="html">IMG_8588</media:title>
		</media:content>
	</item>
	</channel>
</rss>
