<?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 &#187; Uncategorized</title>
	<atom:link href="http://groklab.org/searchandrescuerobot/category/uncategorized/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>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>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>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>
		<item>
		<title></title>
		<link>http://groklab.org/searchandrescuerobot/2007/12/18/15/</link>
		<comments>http://groklab.org/searchandrescuerobot/2007/12/18/15/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 00:37:18 +0000</pubDate>
		<dc:creator>mperret</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2007/12/18/15/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><a href='http://groklab.org/searchandrescuerobot/files/2007/12/laser_holder_assembly.jpg' title='Laser Holding Wand'><img src='http://groklab.org/searchandrescuerobot/files/2007/12/laser_holder_assembly.jpg' alt='Laser Holding Wand' width="600/"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2007/12/18/15/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Masthead Image</title>
		<link>http://groklab.org/searchandrescuerobot/2007/10/19/new-masthead-image/</link>
		<comments>http://groklab.org/searchandrescuerobot/2007/10/19/new-masthead-image/#comments</comments>
		<pubDate>Fri, 19 Oct 2007 11:51:01 +0000</pubDate>
		<dc:creator>cdaniels</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://groklab.org/searchandrescuerobot/2007/10/19/new-masthead-image/</guid>
		<description><![CDATA[The new image at the top of the page was taken by the Creative pan and tilt camera stitched together.  Nice work, Mike, for getting that going.  Now if we can just figure out how to get the images and control the pan/tilt with our own code.
]]></description>
			<content:encoded><![CDATA[<p>The new image at the top of the page was taken by the Creative pan and tilt camera stitched together.  Nice work, Mike, for getting that going.  Now if we can just figure out how to get the images and control the pan/tilt with our own code.</p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2007/10/19/new-masthead-image/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hello world!</title>
		<link>http://groklab.org/searchandrescuerobot/2007/07/05/hello-world/</link>
		<comments>http://groklab.org/searchandrescuerobot/2007/07/05/hello-world/#comments</comments>
		<pubDate>Thu, 05 Jul 2007 15:00:52 +0000</pubDate>
		<dc:creator>max</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Welcome to Groklab.org. This is your first post. Edit or delete it, then start blogging!
]]></description>
			<content:encoded><![CDATA[<p>Welcome to <a href="http://groklab.org/" >Groklab.org</a>. This is your first post. Edit or delete it, then start blogging!</p>
]]></content:encoded>
			<wfw:commentRss>http://groklab.org/searchandrescuerobot/2007/07/05/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
