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

<channel>
	<title>Roomba Robot Upgrade</title>
	<atom:link href="http://groklab.org/searchandrescuerobot/feed/" rel="self" type="application/rss+xml" />
	<link>http://groklab.org/searchandrescuerobot</link>
	<description>Building Robots and Engineers</description>
	<lastBuildDate>Fri, 20 Feb 2009 07:16:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Its Done!</title>
		<link>http://groklab.org/searchandrescuerobot/2009/02/20/its-done/</link>
		<comments>http://groklab.org/searchandrescuerobot/2009/02/20/its-done/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 07:08:52 +0000</pubDate>
		<dc:creator>howard chen</dc:creator>
				<category><![CDATA[Laser Rangefinder]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2009/02/20/its-done/</guid>
		<description><![CDATA[The Webcam Laser Rangefinder portion of the USAR Sim robot is all wrapped up for the time being. Sorry that the source code is saved as a PDF. There is no other way to upload it. 
Final Report- This is the final report which has been submitted as a honors project thesis. 
Image Processing API [...]]]></description>
			<content:encoded><![CDATA[<p>The Webcam Laser Rangefinder portion of the USAR Sim robot is all wrapped up for the time being. Sorry that the source code is saved as a PDF. There is no other way to upload it. </p>
<p><a href="http://groklab.org/searchandrescuerobot/files/2009/02/honors_paper_small_final.pdf" onclick="javascript:pageTracker._trackPageview('/downloads/searchandrescuerobot/files/2009/02/honors_paper_small_final.pdf');">Final Report</a>- This is the final report which has been submitted as a honors project thesis. </p>
<p><a href="http://groklab.org/searchandrescuerobot/files/2009/02/final-code.pdf" onclick="javascript:pageTracker._trackPageview('/downloads/searchandrescuerobot/files/2009/02/final-code.pdf');">Image Processing API Source Code</a>- Please note that the distance was calculated using a power regression line, not the method outlined in the final report.</p>
<p><a href="http://groklab.org/searchandrescuerobot/files/2009/02/vb_motor_control.pdf" onclick="javascript:pageTracker._trackPageview('/downloads/searchandrescuerobot/files/2009/02/vb_motor_control.pdf');">Robot Interface</a>- This is the source code written in the VB scripting module of Roborealm to maintain a distance of 50 inches away from an object. </p>
<p>-Howard</p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2009/02/20/its-done/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Final Image Processing Code for Laser Rangfinder</title>
		<link>http://groklab.org/searchandrescuerobot/2009/02/19/final-image-processing-code-for-laser-rangfinder/</link>
		<comments>http://groklab.org/searchandrescuerobot/2009/02/19/final-image-processing-code-for-laser-rangfinder/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 22:13:09 +0000</pubDate>
		<dc:creator>gthomas</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2009/02/19/final-image-processing-code-for-laser-rangfinder/</guid>
		<description><![CDATA[Below the bump.  If you use this, you might want to update it with the power law calibration used in their paper.

package image_processing;
/******************************************************************************
History:
	5/24/2006 &#8211; Original Version by Janahan Thevaseelan
	7/11/2006 &#8211; Updated by Roborealm to be more in sync with other extensions
Notes:
	You should be able to run this just using
	java Extension
	The default socket extension should [...]]]></description>
			<content:encoded><![CDATA[<p>Below the bump.  If you use this, you might want to update it with the power law calibration used in their paper.<br />
<span id="more-31"></span><br />
package image_processing;</p>
<p>/******************************************************************************<br />
History:<br />
	5/24/2006 &#8211; Original Version by Janahan Thevaseelan<br />
	7/11/2006 &#8211; Updated by Roborealm to be more in sync with other extensions</p>
<p>Notes:<br />
	You should be able to run this just using</p>
<p>	java Extension</p>
<p>	The default socket extension should be added in RoboRealm. Pressing<br />
	connect in that module should connect to this running program and<br />
	swap the blue and red colors. You may want to disable the running<br />
	image count that is printed to the console to increase processing<br />
	speed. See *1* below.</p>
<p>	Please send comments, suggestions, etc to contact@roborealm.com</p>
<p>Copyright 2006 Cyte.com. All rights reserved.</p>
<p>******************************************************************************/</p>
<p>import java.net.*;<br />
import java.io.*;<br />
import java.io.BufferedInputStream;<br />
//import java.math;<br />
/////////////////////////////// Data Structures ///////////////////////////////</p>
<p>//hold the image data received from RR<br />
class ImageDataType<br />
{<br />
// hold the name used in RR to identify this module<br />
public String name;<br />
// image processed count &#8230; sent back to RR<br />
public int count;<br />
// dimensions of the received image<br />
public int width, height;<br />
// holds the image data<br />
public byte pixels[] = null;<br />
// holds image data length to test if image size changes and buffer becomes too small<br />
int allocLen;<br />
public int max_val=0;<br />
public int max_x=0;<br />
public int max_y=0;<br />
public int pfc=0;<br />
public double distance=0;<br />
public int laser=0;<br />
};</p>
<p>/////////////////////////////// Image processing //////////////////////////////</p>
<p>class Extension<br />
{<br />
	// buffer size used when reading in variable data<br />
	public final static int DATA_BUFFER = 1024;</p>
<p>	// the maximum length of a variable name to read<br />
	public final static int MAX_VARNAME_SIZE = 64;</p>
<p>	// the port number to listen on &#8230; needs to match that used in RR interface<br />
	public final static int SERVER_PORTNUM = 5050;</p>
<p>	// buffer returned by intToByte<br />
	private byte intToByteBuffer[] = new byte[4];</p>
<p>	// Performs the image conversion/processing/etc that you want to perform<br />
	void ProcessImage(ImageDataType imageData)<br />
	{<br />
		byte pixels[] = imageData.pixels;<br />
		int width = imageData.width;<br />
		int height = imageData.height;</p>
<p>		// sanity check<br />
		if ((pixels==null)||(width==0)||(height==0)) return;</p>
<p>		// you could use imageData.getName() to perform different analysis in the same<br />
		// program &#8230;.</p>
<p>//**************************IMAGE PROCESSING**********************<br />
		int buffer=0;<br />
		int vertical_gap=40;<br />
		int max_val=0;<br />
		int max_x=0;<br />
		int max_y=0;<br />
		int pfc=0;<br />
		double distance=0; </p>
<p>		if (imageData.count%2==0)<br />
		{<br />
			imageData.laser=1;<br />
		}<br />
		else<br />
		{<br />
			imageData.laser=0;<br />
		}</p>
<p>		//finds pixel with maximum brightness in red image array</p>
<p>		for (int i=0; i&lt;height; i++)<br />
		{<br />
			for (int j=0; j&lt;width; j++)<br />
			{<br />
				for (int k=0;k&lt;3;k++)<br />
				{<br />
					//Area of image to search for the brightest red pixel<br />
					if (i&lt;(height/2) &amp;&amp; ((width/2)-(vertical_gap/2)&lt; j &amp;&amp; j&lt; (width/2)+(vertical_gap/2)))<br />
					{<br />
						//pixel buffer<br />
						buffer=pixels[j*3+i*3*width+2];</p>
<p>						//converts from signed byte to unsigned byte<br />
						if (buffermax_val)<br />
						{<br />
							max_val=buffer;<br />
							max_x=j;<br />
							max_y=i;<br />
						}<br />
					}<br />
				}<br />
			}<br />
		}</p>
<p>		pfc=(height/2)-max_y;</p>
<p>		if(max_val&gt;100)<br />
		{<br />
			imageData.max_x=max_x;<br />
			imageData.max_y=max_y;<br />
			imageData.max_val=max_val;<br />
			imageData.pfc=pfc;<br />
			distance=Math.pow(pfc, -1.1757381081481);<br />
			imageData.distance=distance*10202.343966972;<br />
		}</p>
<p>		//prints lines on image<br />
		for (int i=0;i&lt;height;i++)<br />
		{<br />
			for (int j=0; j&lt;width;j++)<br />
			{<br />
				for (int k=0;k&lt;3;k++)<br />
				{<br />
					//centerline<br />
					pixels[j*3+(height/2)*3*width+k]=-1;</p>
<p>					//horizontal line<br />
					pixels[j*3+(imageData.max_y)*3*width+k]=-1;</p>
<p>					//vertical line<br />
					pixels[imageData.max_x*3+i*3*width+k]=-1;</p>
<p>					//vertical band lines<br />
					if (i&lt;height/2)<br />
					{<br />
						pixels[3*((width/2)-(vertical_gap/2))+3*i*width+k]=-1;<br />
						pixels[3*((width/2)+(vertical_gap/2))+3*i*width+k]=-1;<br />
					}<br />
				}<br />
			}<br />
		}</p>
<p>//*************************************************</p>
<p>		// note this this is an inplace filter so you don&#8217;t need an additional image array<br />
		// but you&#8217;ve now corrupted the original image &#8230;<br />
	}</p>
<p>	/////////////////////////////// Data Handling /////////////////////////////////</p>
<p>	int byteToInt(byte data[])<br />
	{<br />
		return (data[0]&amp;255)|((data[1]&amp;255)&lt;&lt;8)|((data[2]&amp;255)&lt;&lt;16)|((data[3]&amp;255)&lt;&gt;8)&amp;255);<br />
		intToByteBuffer[2] = (byte)((num&gt;&gt;16)&amp;255);<br />
		intToByteBuffer[3] = (byte)((num&gt;&gt;24)&amp;255);<br />
		return intToByteBuffer;<br />
	}</p>
<p>	// returns an error message to RR. This message is displayed in the &#8220;messages&#8221; list within<br />
	// the RR Pipe Program interface.<br />
	void ReturnError(BufferedOutputStream writer, String txt) throws IOException<br />
	{<br />
		writer.write(intToByte(5));<br />
		writer.write(&#8221;error&#8221;.getBytes());<br />
		writer.write(intToByte(txt.length()));<br />
		writer.write(txt.getBytes(),0,txt.length());<br />
	}</p>
<p>	// returns a byte string variable to RR. The returned variables can be used<br />
	// elsewhere in RR for continued processing.<br />
	void ReturnBytesVariable(BufferedOutputStream writer, String name, byte data[], int len) throws IOException<br />
	{<br />
		writer.write(intToByte(name.length()));<br />
		writer.write(name.getBytes());</p>
<p>		writer.write(intToByte(len));<br />
		writer.write(data,0,len);<br />
	}</p>
<p>	// returns an int variable to RR<br />
	void ReturnIntVariable(BufferedOutputStream writer, String name, int num) throws IOException<br />
	{<br />
		String strTmp = new String(Integer.toString(num));</p>
<p>		writer.write(intToByte(name.length()));<br />
		writer.write(name.getBytes());</p>
<p>		writer.write(intToByte(strTmp.length()));<br />
		writer.write(strTmp.getBytes());<br />
	}</p>
<p>	//returns a double variable to RR<br />
	void ReturnDoubleVariable(BufferedOutputStream writer, String name, double num) throws IOException<br />
	{<br />
		String strTmp = new String(Double.toString(num));</p>
<p>		writer.write(intToByte(name.length()));<br />
		writer.write(name.getBytes());</p>
<p>		writer.write(intToByte(strTmp.length()));<br />
		writer.write(strTmp.getBytes());<br />
	}</p>
<p>	/////////////////////////////// Data Processing ///////////////////////////////</p>
<p>	int readBytes(byte data[], BufferedInputStream reader, int len) throws IOException<br />
	{<br />
		int res;<br />
		int index=0;</p>
<p>		while (len&gt;0)<br />
		{<br />
			if ((res=reader.read(data, index, len))&lt;0)<br />
				return -1;</p>
<p>			index+=res;<br />
			len-=res;<br />
		}<br />
		return index;<br />
	}</p>
<p>	// Parses the variables sent by RR into the appropriate structure. You can add<br />
	// your own processing routines here to handle other variables that may get sent.<br />
	int ProcessVariable(BufferedOutputStream writer, BufferedInputStream reader, ImageDataType imageData, String name, byte data[], int len) throws IOException<br />
	{<br />
		// determine what we&#8217;ve got<br />
		if (name.equalsIgnoreCase(&#8221;name&#8221;))<br />
		{<br />
			imageData.name = name;<br />
		}<br />
		else<br />
		// determine what we&#8217;ve got<br />
		if (name.equalsIgnoreCase(&#8221;width&#8221;))<br />
		{<br />
			imageData.width = byteToInt(data);<br />
		}<br />
		else<br />
		if (name.equalsIgnoreCase(&#8221;height&#8221;))<br />
		{<br />
			imageData.height = byteToInt(data);<br />
		}<br />
		else<br />
		if (name.equalsIgnoreCase(&#8221;image&#8221;))<br />
		{<br />
			if ((imageData.width==0)||(imageData.height==0))<br />
			{<br />
				ReturnError(writer, &#8220;Error &#8211; missing image dimensions before image data!&#8221;);<br />
				System.out.println(&#8221;Error &#8211; missing image dimensions before image data!&#8221;);<br />
				return -1;<br />
			}</p>
<p>			if (len!=(imageData.width*imageData.height*3))<br />
			{<br />
				ReturnError(writer, &#8220;Error &#8211; length of data and dimensions of image\n        disagree! (width:&#8221;+imageData.width+&#8221; height:&#8221;+imageData.height+&#8221; len:&#8221;+len+&#8221;)\n&#8221;);<br />
				System.out.println(&#8221;Error &#8211; length of data and dimensions of image\n        disagree! (width:&#8221;+imageData.width+&#8221; height:&#8221;+imageData.height+&#8221; len:&#8221;+len+&#8221;)\n&#8221;);<br />
				return -1;<br />
			}</p>
<p>			// we only need to allocate once! The program will remain<br />
			// active for as long as processing continues &#8230;<br />
			if (imageData.pixels==null)<br />
			{<br />
				imageData.pixels = new byte[len];<br />
				imageData.allocLen = len;<br />
			}<br />
			else<br />
			{<br />
				// but we need to check to see if the image size has changed that we have<br />
				// enough room to load it in<br />
				if (imageData.allocLen 1024 ..<br />
			int res;<br />
			if ((res=readBytes(imageData.pixels, reader, len))!=len)<br />
			{<br />
				System.out.println(&#8221;Error &#8211; read failed. Wanted &#8220;+len+&#8221; bytes but got &#8220;+res+&#8221;\n&#8221;);<br />
				return -1;<br />
			}<br />
		}<br />
		else<br />
		{<br />
			// skip this variable<br />
			if (len&gt;DATA_BUFFER)<br />
			{<br />
				reader.skip(len);<br />
			}<br />
		}</p>
<p>		return 1;<br />
	}</p>
<p>	/////////////////////////////// Main //////////////////////////////////////////</p>
<p>	public void handler(String[] args)<br />
	{<br />
		// holds the variable name being sent by RR<br />
		String varName = new String();<br />
		// holds the received and prehaps processed image data<br />
		byte varData[] = new byte[DATA_BUFFER];<br />
		// variables data length<br />
		//int varLen;<br />
		// byte array for incoming integer number<br />
		byte number[] = new byte[4];</p>
<p> 		ImageDataType imageData = new ImageDataType();</p>
<p>		if (args.length&gt;1)<br />
		{<br />
			System.out.println(&#8221;Started with \&#8221;");<br />
			int i;<br />
			for (i=1;i1) System.out.println(&#8221; &#8220;);<br />
				System.out.println(args[i]);<br />
			}<br />
			System.out.println(&#8221;\&#8221;\n&#8221;);<br />
		}<br />
		else<br />
			System.out.println(&#8221;Started.\n&#8221;);</p>
<p>  		ServerSocket server = null;</p>
<p>		try<br />
		{<br />
			server = new ServerSocket(SERVER_PORTNUM);<br />
			System.out.println(&#8221;RoboRealm Java Socket Server v0.0.1 Listening On Port &#8220;+SERVER_PORTNUM+&#8221;&#8230;.\n&#8221;);<br />
		}<br />
		catch (Exception e)<br />
		{<br />
			System.out.println(&#8221;Caught exception &#8221; + e.toString() );<br />
			e.printStackTrace( System.out );<br />
			return;<br />
		}</p>
<p>		// only handle one accept thread at a time &#8230;<br />
		while(true)<br />
		{<br />
			try<br />
			{<br />
				System.out.println(&#8221;Waiting &#8230;\n&#8221;);</p>
<p>				Socket client = server.accept();</p>
<p>				System.out.println(&#8221;Connected.\n&#8221;);</p>
<p>				BufferedInputStream  bufferedReader = new BufferedInputStream(client.getInputStream());<br />
				BufferedOutputStream bufferedWriter = new BufferedOutputStream(client.getOutputStream());</p>
<p>				imageData.count=0;</p>
<p>				int len=0;</p>
<p>				while (true)<br />
				{<br />
					imageData.count++;</p>
<p>					// *1* Comment the next line out after debugging is done!!<br />
					System.out.println(&#8221;Processing &#8220;+imageData.count+&#8221;\r&#8221;);</p>
<p>					while (true)<br />
					{<br />
						// read in variable length<br />
						bufferedReader.read(number, 0, 4);<br />
						len = byteToInt(number);<br />
						// if length &lt;=0 on the variable name then we&#8217;re done<br />
						if (len&lt;=0) break;<br />
						// read in variable name but if the name is longer than 64 characters<br />
						// then grab the first 64 chars only<br />
						byte varNameChar[] = new byte[len];<br />
						bufferedReader.read( varNameChar );<br />
						varName = new String(varNameChar);</p>
<p>						// read in the variable&#8217;s data length<br />
						bufferedReader.read(number, 0, 4);<br />
						len = byteToInt(number);<br />
						// if the data is less than 1024 read it in now ..<br />
						if (len&lt;DATA_BUFFER)<br />
						{<br />
							bufferedReader.read(varData, 0, len);<br />
						}</p>
<p>						// handle this variable<br />
						if (ProcessVariable(bufferedWriter, bufferedReader, imageData, varName, varData, len)&lt;0)<br />
						{<br />
							len=-1;<br />
							break;<br />
						}<br />
					}</p>
<p>					//Done collecting variables.</p>
<p>					// termination signal -1 on attribute length<br />
					if (len==-1) break;</p>
<p>					// process image<br />
					ProcessImage(imageData);</p>
<p>					//Returning variables.</p>
<p>					// Write out the processed image back to RoboRealm using stdout.<br />
					// You can also write back any other variables to use in<br />
					// other parts of the program.<br />
					// The format is the same as the input.</p>
<p>					ReturnBytesVariable(bufferedWriter, &#8220;image&#8221;, imageData.pixels, imageData.width*imageData.height*3);</p>
<p>					//Returned image;</p>
<p>					// Send back the count as an example of how to feed back variables into RoboRealm<br />
					ReturnIntVariable(bufferedWriter, &#8220;count&#8221;, imageData.count);</p>
<p>					//Send back information from image processing algorithm<br />
					ReturnIntVariable(bufferedWriter, &#8220;max_val&#8221;, imageData.max_val);<br />
					ReturnIntVariable(bufferedWriter, &#8220;max_x&#8221;,imageData.max_x);<br />
					ReturnIntVariable(bufferedWriter, &#8220;max_y&#8221;,imageData.max_y);<br />
					ReturnIntVariable(bufferedWriter, &#8220;pfc&#8221;,imageData.pfc);<br />
					ReturnDoubleVariable(bufferedWriter, &#8220;distance&#8221;, imageData.distance);<br />
					ReturnIntVariable(bufferedWriter, &#8220;laser&#8221;,imageData.laser);</p>
<p>					// write out end of message<br />
					bufferedWriter.write(intToByte(0));</p>
<p>					// flush all data back to RR<br />
					bufferedWriter.flush();<br />
					// continue by waiting for next image request<br />
				}</p>
<p>				System.out.println(&#8221;\nDisconnected.\n&#8221;);</p>
<p>				bufferedReader.close();<br />
				bufferedWriter.close();<br />
				client.close();</p>
<p>				if (len==-1) break;<br />
			}<br />
			catch (Exception e)<br />
			{<br />
				System.out.println(&#8221;Caught exception &#8221; + e.toString() );<br />
				e.printStackTrace( System.out );<br />
			}<br />
		}</p>
<p>		try<br />
		{<br />
			server.close();<br />
		}<br />
		catch (Exception e)<br />
		{<br />
			System.out.println(&#8221;Caught exception &#8221; + e.toString() );<br />
			e.printStackTrace( System.out );<br />
			return;<br />
		}</p>
<p>		System.out.println(&#8221;Exiting\n&#8221;);<br />
	}</p>
<p>	// This is where the program first starts<br />
	public static void main(String[] args)<br />
	{<br />
		Extension ext = new Extension();<br />
		ext.handler(args);<br />
	}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2009/02/19/final-image-processing-code-for-laser-rangfinder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Howard and Eric&#8217;s Honors Report</title>
		<link>http://groklab.org/searchandrescuerobot/2009/02/19/howard-and-erics-honors-report/</link>
		<comments>http://groklab.org/searchandrescuerobot/2009/02/19/howard-and-erics-honors-report/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 21:59:37 +0000</pubDate>
		<dc:creator>gthomas</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2009/02/19/howard-and-erics-honors-report/</guid>
		<description><![CDATA[Howard and Eric explain how they set up the laser range finder, calibrated and tested it.  Here is their final report.
]]></description>
			<content:encoded><![CDATA[<p>Howard and Eric explain how they set up the laser range finder, calibrated and tested it.  Here is <a href="http://groklab.org/searchandrescuerobot/files/2009/02/honors_paper_small_final.pdf" onclick="javascript:pageTracker._trackPageview('/downloads/searchandrescuerobot/files/2009/02/honors_paper_small_final.pdf');">their final report</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2009/02/19/howard-and-erics-honors-report/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Happy Halloween!</title>
		<link>http://groklab.org/searchandrescuerobot/2008/10/31/happy-halloween/</link>
		<comments>http://groklab.org/searchandrescuerobot/2008/10/31/happy-halloween/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 19:38:10 +0000</pubDate>
		<dc:creator>howard chen</dc:creator>
				<category><![CDATA[Laser Rangefinder]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2008/10/31/happy-halloween/</guid>
		<description><![CDATA[The rangerfinder algorithm was calibrated. Measurements of pixel from center were taken every five inches from around 2 to eight feet. A power curve was fitted to the data and produced error that was less than 10%. Code should be released sometime next week. 
]]></description>
			<content:encoded><![CDATA[<p>The rangerfinder algorithm was calibrated. Measurements of pixel from center were taken every five inches from around 2 to eight feet. A power curve was fitted to the data and produced error that was less than 10%. Code should be released sometime next week. </p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2008/10/31/happy-halloween/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Image Processing Algorithm</title>
		<link>http://groklab.org/searchandrescuerobot/2008/10/31/image-processing-algorithm/</link>
		<comments>http://groklab.org/searchandrescuerobot/2008/10/31/image-processing-algorithm/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 06:08:16 +0000</pubDate>
		<dc:creator>howard chen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2008/10/31/image-processing-algorithm/</guid>
		<description><![CDATA[The image processing algorithm has been written and tested. It does a reasonably good job at finding the brightest pixel from center, but reflections off the metal tool chest still gives it problems. We&#8217;ll try to calibrate the vision system to get some distance measurements off it. Look for the finished code sometime soon. 
]]></description>
			<content:encoded><![CDATA[<p>The image processing algorithm has been written and tested. It does a reasonably good job at finding the brightest pixel from center, but reflections off the metal tool chest still gives it problems. We&#8217;ll try to calibrate the vision system to get some distance measurements off it. Look for the finished code sometime soon. </p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2008/10/31/image-processing-algorithm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft Excel Macros</title>
		<link>http://groklab.org/searchandrescuerobot/2008/10/29/microsoft-excel-macros/</link>
		<comments>http://groklab.org/searchandrescuerobot/2008/10/29/microsoft-excel-macros/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 08:41:59 +0000</pubDate>
		<dc:creator>howard chen</dc:creator>
				<category><![CDATA[Laser Rangefinder]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2008/10/29/microsoft-excel-macros/</guid>
		<description><![CDATA[I never knew that one could write code for Microsoft Excel until last year. The macros are mostly used to automate repetitive tasks and perform complex calculations. (It could also be used to make music videos. Check out http://www.youtube.com/watch?v=h9_YkXHCkgA) 
Since a spreadsheet is made out of individual cells, the spreadsheet itself could be looked upon [...]]]></description>
			<content:encoded><![CDATA[<p>I never knew that one could write code for Microsoft Excel until last year. The macros are mostly used to automate repetitive tasks and perform complex calculations. (It could also be used to make music videos. Check out http://www.youtube.com/watch?v=h9_YkXHCkgA) </p>
<p>Since a spreadsheet is made out of individual cells, the spreadsheet itself could be looked upon as an array. Programming in VBA could be done very quick and dirty. All the good programming practices learned in introductory computer programming courses could be thrown out the window (Sorry to make you cry, Prof. Thomas) Heck, variables besides arrays do not need to be defined. More importantly, numbers could be seen exactly where they go when cells are being manipulated, and the code could be stepped through with ease. Once the algorithm has been developed, then it could be re-written in whatever language that is needed. </p>
<p>-Howard</p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2008/10/29/microsoft-excel-macros/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Socket Interface</title>
		<link>http://groklab.org/searchandrescuerobot/2008/10/27/socket-interface/</link>
		<comments>http://groklab.org/searchandrescuerobot/2008/10/27/socket-interface/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 18:50:27 +0000</pubDate>
		<dc:creator>howard chen</dc:creator>
				<category><![CDATA[Laser Rangefinder]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2008/10/27/socket-interface/</guid>
		<description><![CDATA[The java version of the sample code was downloaded and recompiled and works like a charm after some initial compiling issues. Since it is a socket connection, it allows the image to be processed on another computer if needed. Now all that is needed is to modify the program to do what we needed. The [...]]]></description>
			<content:encoded><![CDATA[<p>The java version of the sample code was downloaded and recompiled and works like a charm after some initial compiling issues. Since it is a socket connection, it allows the image to be processed on another computer if needed. Now all that is needed is to modify the program to do what we needed. The image comes as one gigantic one-dimensional array.. i.e. image_array(1st pixel blue, 1st pixel green, first pixel red, 2nd pixel blue, 2nd pixel green, 2nd pixel red,..) so the array might need to be converted into a 2d array to make coding the algorithm less challenging. But adding this addition step might slow down the processing.</p>
<p>-Howard</p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2008/10/27/socket-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Laser Rangefinder progress</title>
		<link>http://groklab.org/searchandrescuerobot/2008/10/26/laser-rangefinder-progress/</link>
		<comments>http://groklab.org/searchandrescuerobot/2008/10/26/laser-rangefinder-progress/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 17:55:31 +0000</pubDate>
		<dc:creator>howard chen</dc:creator>
				<category><![CDATA[Laser Rangefinder]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2008/10/26/laser-rangefinder-progress/</guid>
		<description><![CDATA[The plan is to use the webcam and a laser to determine how far an object is from the robot. We wanted to use a horizontal laser line so multiple distance measurements could be made from each frame. The laser line proved to be too faint for the camera to detect it, even when various [...]]]></description>
			<content:encoded><![CDATA[<p>The plan is to use the webcam and a laser to determine how far an object is from the robot. We wanted to use a horizontal laser line so multiple distance measurements could be made from each frame. The laser line proved to be too faint for the camera to detect it, even when various sets of filters are applied. A budget of 30 dollars was given to find a new laser that is bright enough  for our purposes. A quick search proved that there were two options available, 5mW lasers, which is the one being used, or a 200mW laser diode off a DVD burner with no options in between. After further research, a 200mW laser proved to be a little too dangerous for our needs. If you&#8217;re curious on the capabilities of a 200mW laser, check out http://www.instructables.com/id/Laser-Flashlight-Hack!!/</p>
<p>For now, the line generating lens is removed from the laser so initial development of the image processing algorithm could begin. </p>
<p>We currently trying to implement the &#8220;webcam based DIY laser rangefinder&#8221; available at http://www.pages.drexel.edu/~twd25/webcam_laser_ranger.html The algorithm for finding the red dot is to detect the brightest-colored red pixel in the picture. Since there are no filters in Roborealm that fit our needs, a separate filter must to be created. Writing a program for roborealm allows us to focus on image processing and not worry about the webcam interface. </p>
<p>-Howard</p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2008/10/26/laser-rangefinder-progress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slowly but surely&#8230;</title>
		<link>http://groklab.org/searchandrescuerobot/2008/10/26/slowly-but-surely/</link>
		<comments>http://groklab.org/searchandrescuerobot/2008/10/26/slowly-but-surely/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 17:14:02 +0000</pubDate>
		<dc:creator>howard chen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2008/10/26/slowly-but-surely/</guid>
		<description><![CDATA[Realizing that no one seemed to post on the front page of the blog in 10 months, I figured that I should provide a brief upgrade on the robot. 
Roborealm is currently used as the backbone of this project. In addition to providing a substantial list of image processing capabilities, it also has the ability [...]]]></description>
			<content:encoded><![CDATA[<p>Realizing that no one seemed to post on the front page of the blog in 10 months, I figured that I should provide a brief upgrade on the robot. </p>
<p>Roborealm is currently used as the backbone of this project. In addition to providing a substantial list of image processing capabilities, it also has the ability to use custom-made filters and to transfer images over the network. It has capabilities to control the pan/tilt/zoom of the Creative Live! webcam and the iRobot Create robotic platform.  Roborealm itself can also be controlled via a network connection. This is essentially a one-stop shop for everything that we needed. Best of all, its free!</p>
<p>Since the discovery of Roborealm, we have been trying to get individual components to work properly with the software. </p>
<p>Creative Live! Webcam-<br />
          -Zoom can be controlled with precision<br />
          -There are six increments (three from center on each side) that the motor could pan to</p>
<p>iRobot Create-<br />
          -Interface is much cleaner and easier to use than the Roombacomm software package that was used before<br />
          -All the sensor data could be taken with ease since the VB scripting module operates in a polling mode</p>
<p>Laser-<br />
          -Laser is powered directly off the iRobot create and could be turned on and off using the iRobot Create module. </p>
<p>Roborealm Networking Capabilities-<br />
          -Good question!</p>
<p>The goal right now is to get the image processing capabilities to work, the last piece of the puzzle.</p>
<p>-Howard</p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2008/10/26/slowly-but-surely/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pictures</title>
		<link>http://groklab.org/searchandrescuerobot/2007/12/19/pictures/</link>
		<comments>http://groklab.org/searchandrescuerobot/2007/12/19/pictures/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 07:24:00 +0000</pubDate>
		<dc:creator>howard chen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2007/12/19/pictures/</guid>
		<description><![CDATA[Well&#8230; this is the completed prototype&#8230; (One can only hope&#8230;)

]]></description>
			<content:encoded><![CDATA[<p>Well&#8230; this is the completed prototype&#8230; (One can only hope&#8230;)</p>
<p><img src="http://groklab.org/searchandrescuerobot/files/2007/12/img_0511.JPG" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2007/12/19/pictures/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
