<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;A0QFR3g6fyp7ImA9WhFTFUQ.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244</id><updated>2013-06-07T12:01:56.617+02:00</updated><category term="linux" /><category term="driver" /><category term="xenomai" /><category term="control" /><category term="opencv" /><category term="vehicle" /><category term="toolchain" /><category term="omap" /><category term="stream" /><category term="localization" /><category term="example" /><category term="startup" /><category term="robot" /><category term="remote" /><category term="streaming" /><category term="innorobo" /><category term="beagleboard" /><category term="real-time" /><category term="conference" /><category term="u-boot" /><category term="servo" /><category term="kinect" /><category term="anaglyph" /><category term="cross-compile" /><category term="presentation" /><category term="pwm" /><category term="rtdm" /><category term="python" /><category term="stereo" /><category term="investor" /><category term="nfsroot" /><category term="exhibition" /><category term="kernel" /><category term="veterobot" /><category term="video" /><category term="wheeled" /><category term="veter" /><category term="gstreamer" /><title>Veterobot.org</title><subtitle type="html">Robot controlled over the internet.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/veter-project" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="blogspot/veter-project" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CEAFSXk9fyp7ImA9WhBXEkw.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-4545110503315791282</id><published>2013-03-25T12:57:00.000+01:00</published><updated>2013-03-25T12:58:38.767+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-25T12:58:38.767+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="innorobo" /><category scheme="http://www.blogger.com/atom/ns#" term="veterobot" /><category scheme="http://www.blogger.com/atom/ns#" term="conference" /><category scheme="http://www.blogger.com/atom/ns#" term="veter" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="robot" /><category scheme="http://www.blogger.com/atom/ns#" term="exhibition" /><category scheme="http://www.blogger.com/atom/ns#" term="investor" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>Veterobot at InnoRobo2013</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-gZb04Vh-Uu4/UVAwdhCMUxI/AAAAAAAAAbs/h6kOutj7Ny8/s1600/wall-ye-real.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;
From 19-th to 21-st of March we were presenting our BeagleBoard-based &lt;a href="http://veterobot.com/" target="_blank"&gt;Veter robot&lt;/a&gt; at &lt;a href="http://innorobo.com/index.php?option=com_k2&amp;amp;view=item&amp;amp;id=518:exhibitor-1&amp;amp;Itemid=221&amp;amp;lang=en" target="_blank"&gt;InnoRobo2013&lt;/a&gt;.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-jlEEfGdbagI/UVAwfqnnffI/AAAAAAAAAb0/BZS7dIfcbR0/s1600/booth.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp; &lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ehToyBaMsZE/UVAwYNoN9RI/AAAAAAAAAbk/CTRrdq07vhE/s1600/veterobot_blue-1024.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="451" src="http://1.bp.blogspot.com/-ehToyBaMsZE/UVAwYNoN9RI/AAAAAAAAAbk/CTRrdq07vhE/s640/veterobot_blue-1024.jpg" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;With this large poster we presented the Veterobot project.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
In this year, there was a fist &lt;a href="http://innorobo.com/index.php?option=com_k2&amp;amp;view=item&amp;amp;layout=item&amp;amp;id=234&amp;amp;Itemid=357&amp;amp;lang=en" target="_blank"&gt;start-up competition&lt;/a&gt; organized by InnoRobo. As one of the five finalists, we got an opportunity to present our project at exhibition and make a short talk by the panel discussion with investors. It was a great success for us. We have made a lot of new promising contacts and this was our main goal.&lt;br /&gt;
&lt;br /&gt;
We have got the small booth (but do not mind, it was for free ;-) ) and have made our best out of it.&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-jlEEfGdbagI/UVAwfqnnffI/AAAAAAAAAb8/ZYRHvTIlNPk/s1600/booth.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="480" src="http://3.bp.blogspot.com/-jlEEfGdbagI/UVAwfqnnffI/AAAAAAAAAb8/ZYRHvTIlNPk/s640/booth.jpg" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Anna at the booth.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
There were a lot of interesting robots presented at the exhibition. However, most of them are still extremely expensive. For example, we were looking for the decent robotics arm for the next generation of our robot, but the one I found interesting has $30K price tag! Lots of robots comparable with ours were also much more expensive than our offer. The main conclusion we have made after the exhibition is - target &lt;i&gt;consumer market&lt;/i&gt; and try to &lt;i&gt;solve concrete problem&lt;/i&gt; with your robot.&lt;br /&gt;
&lt;br /&gt;
With this respect, I found the robot presented by our booth neighbors, the French company called &lt;a href="http://wall-ye.com/" target="_blank"&gt;Wall-Ye&lt;/a&gt;, one of the most impressive and useful robot of the whole exhibition.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-zbreteNcxuM/UVAwgHg010I/AAAAAAAAAcA/s8BOvjUPQb4/s1600/wall-ye-render.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-zbreteNcxuM/UVAwgHg010I/AAAAAAAAAcA/s8BOvjUPQb4/s200/wall-ye-render.jpg" width="200" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-gZb04Vh-Uu4/UVAwdhCMUxI/AAAAAAAAAbw/0qG7JBtewVg/s1600/wall-ye-real.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="151" src="http://2.bp.blogspot.com/-gZb04Vh-Uu4/UVAwdhCMUxI/AAAAAAAAAbw/0qG7JBtewVg/s200/wall-ye-real.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This is autonomous robot for cutting vine. Nice mechanical design. We did not get a chance to find out more about software, but it is rather impressive if the robot can drive autonomously in outdoor conditions and find the parts to cut out based on the image processing! Hat off guys!&lt;br /&gt;
&lt;br /&gt;
Despite some minor organizational problems (no single date for competition-related announcements were held, there was rather big delay and no words of excuse) we still think that organization committee has made a great job. The organizers were really nice and ready to help. The bus tour through the night Lyon was really impressive! So we want to expose our great appreciation for the possibility to participate in InnoRobo. We will try our best to be there next year also (hopefully with huge booth in the middle of the hall :-) ).&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/4545110503315791282/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2013/03/veterobot-at-innorobo2013.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/4545110503315791282?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/4545110503315791282?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2013/03/veterobot-at-innorobo2013.html" title="Veterobot at InnoRobo2013" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-ehToyBaMsZE/UVAwYNoN9RI/AAAAAAAAAbk/CTRrdq07vhE/s72-c/veterobot_blue-1024.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0UFRHk9cCp7ImA9WhBREEs.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-2689915731165001191</id><published>2013-02-22T15:25:00.000+01:00</published><updated>2013-02-28T17:33:35.768+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-28T17:33:35.768+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="veterobot" /><category scheme="http://www.blogger.com/atom/ns#" term="conference" /><category scheme="http://www.blogger.com/atom/ns#" term="veter" /><category scheme="http://www.blogger.com/atom/ns#" term="startup" /><category scheme="http://www.blogger.com/atom/ns#" term="robot" /><category scheme="http://www.blogger.com/atom/ns#" term="exhibition" /><category scheme="http://www.blogger.com/atom/ns#" term="investor" /><title>We are among finalists by "Call for Robotics Start-ups" at InnoRobo'13</title><content type="html">&lt;a href="http://veterobot.com/" target="_blank"&gt;Veterobot team&lt;/a&gt; is among five finalists by "&lt;a href="http://innorobo.com/index.php?option=com_k2&amp;amp;view=item&amp;amp;layout=item&amp;amp;id=234&amp;amp;Itemid=357&amp;amp;lang=en" target="_blank"&gt;Call for Robotics Start-ups&lt;/a&gt;"
 issued by &lt;a href="http://innorobo.com/" target="_blank"&gt;InnoRobo&lt;/a&gt;. It looks like we will get an area to demonstrate 
our robot. So if you are attending this conference or collocated 
exhibition, we will be glad to meet you there.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-iYR4EUcFlbo/USdvqL6lP7I/AAAAAAAAAas/KeuVx1BzHDo/s1600/innorobo-logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-iYR4EUcFlbo/USdvqL6lP7I/AAAAAAAAAas/KeuVx1BzHDo/s1600/innorobo-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/2689915731165001191/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2013/02/we-are-among-five-finalists-by-call-for.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/2689915731165001191?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/2689915731165001191?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2013/02/we-are-among-five-finalists-by-call-for.html" title="We are among finalists by &quot;Call for Robotics Start-ups&quot; at InnoRobo'13" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-iYR4EUcFlbo/USdvqL6lP7I/AAAAAAAAAas/KeuVx1BzHDo/s72-c/innorobo-logo.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkMMQnw-fyp7ImA9WhBTFkU.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-4854856666638366608</id><published>2013-02-12T16:52:00.004+01:00</published><updated>2013-02-12T16:54:43.257+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-12T16:54:43.257+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="veter" /><category scheme="http://www.blogger.com/atom/ns#" term="robot" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="control" /><category scheme="http://www.blogger.com/atom/ns#" term="wheeled" /><category scheme="http://www.blogger.com/atom/ns#" term="remote" /><category scheme="http://www.blogger.com/atom/ns#" term="xenomai" /><category scheme="http://www.blogger.com/atom/ns#" term="stream" /><category scheme="http://www.blogger.com/atom/ns#" term="real-time" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>Testing the wheeled version</title><content type="html">&lt;div class="separator" style="clear: both; text-align: left;"&gt;
As &lt;a href="http://veter-project.blogspot.com/2013/01/kinect-and-wheeled-versions-under.html"&gt;announced in our previous post&lt;/a&gt;, we are working on wheeled version of &lt;a href="http://veterobot.com/"&gt;our robot&lt;/a&gt;. Tires and shaft adapters are arrived today and we mount them to conduct first test drive. Here are some photos:&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SRvx5e3ZDFo/URphPdj0L7I/AAAAAAAAAaE/okT2No1nkBs/s1600/20130212_002.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-SRvx5e3ZDFo/URphPdj0L7I/AAAAAAAAAaE/okT2No1nkBs/s400/20130212_002.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Wheeled version of the "Shark" model&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-SZ3CM-VOGco/URphPIJbivI/AAAAAAAAAZ8/zQu36scde0o/s1600/20130212_003.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-SZ3CM-VOGco/URphPIJbivI/AAAAAAAAAZ8/zQu36scde0o/s400/20130212_003.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The first test drive was more or less successful. However, there are still some problems we need to solve:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Shafts are too long for adapters we are using and as a results wheels are sitting to wide. The simplest way to fix it would be just to cut about 10mm out. The front wheels on the second picture illustrate how it would be.&lt;/li&gt;
&lt;li&gt;While turning with one wheel stopped works reasonably well. However, the on-place turn where wheels are rotating in different directions does not work as it should be. It happens because we are using two-wheel drive version of the chassis. I hope that four-wheel drive chassis will fix the problem.&lt;/li&gt;
&lt;/ul&gt;
Except of issues mentioned above, it works well and makes a lot of fun to drive because the robot can go faster than tracked version! Please feel free to visit &lt;a href="http://veterobot.com/"&gt;our project web-site&lt;/a&gt; to learn more about the robot.&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/4854856666638366608/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2013/02/testing-wheeled-version.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/4854856666638366608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/4854856666638366608?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2013/02/testing-wheeled-version.html" title="Testing the wheeled version" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-SRvx5e3ZDFo/URphPdj0L7I/AAAAAAAAAaE/okT2No1nkBs/s72-c/20130212_002.jpg" height="72" width="72" /><thr:total>6</thr:total></entry><entry gd:etag="W/&quot;D0cAQX4zeCp7ImA9WhBTEEw.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-5959622701245359554</id><published>2013-01-30T11:03:00.000+01:00</published><updated>2013-02-04T22:57:20.080+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-04T22:57:20.080+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vehicle" /><category scheme="http://www.blogger.com/atom/ns#" term="omap" /><category scheme="http://www.blogger.com/atom/ns#" term="robot" /><category scheme="http://www.blogger.com/atom/ns#" term="kinect" /><category scheme="http://www.blogger.com/atom/ns#" term="localization" /><category scheme="http://www.blogger.com/atom/ns#" term="real-time" /><category scheme="http://www.blogger.com/atom/ns#" term="opencv" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>Kinect and wheeled versions under development</title><content type="html">Sungreen has made the 3D model for wheeled version of the "Shark". We were pointed out that tracked version might have problems on thick carpet or wet tiles. That is why we want to try the wheeled version and compare the performance on different surfaces. Any thoughts whether it will drive 
better then tracked version? Some pros/cons of wheels vs. tracks?&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-0aTFaD4IbZE/UQjqBM-OPCI/AAAAAAAAAYg/o4R6hR1mCn0/s1600/shark_mars_edition_20130127a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="225" src="http://4.bp.blogspot.com/-0aTFaD4IbZE/UQjqBM-OPCI/AAAAAAAAAYg/o4R6hR1mCn0/s400/shark_mars_edition_20130127a.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;"Shark" with wheels.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
In addition we are thinking about adding Kinect sensor. It is rather big and it is not 100% clear 
yet what is the best way to do it. We can try to mount it on the 
existing "Shark" model or modify the alternative model.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://3.gvt0.com/vi/DS2G6HVFccc/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/DS2G6HVFccc&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/DS2G6HVFccc&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/-bAHmoOR809g/UQjr65W0WnI/AAAAAAAAAZE/V6_utGNbzsA/s1600/alternative-kinect.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="250" src="http://1.bp.blogspot.com/-bAHmoOR809g/UQjr65W0WnI/AAAAAAAAAZE/V6_utGNbzsA/s400/alternative-kinect.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Alternative body with Kinect mounted on it. &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/-MYFzLODfEsI/UQjr7y3SsZI/AAAAAAAAAZI/K_dvVsu85gc/s1600/shark-kinect.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="250" src="http://3.bp.blogspot.com/-MYFzLODfEsI/UQjr7y3SsZI/AAAAAAAAAZI/K_dvVsu85gc/s400/shark-kinect.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Wheeled "Shark" with Kinnect mounted on it.&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Any comments on 
it are very welcome. For more details about the whole project, please visit &lt;a href="http://veterobot.com/"&gt;our web-site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/5959622701245359554/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2013/01/kinect-and-wheeled-versions-under.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/5959622701245359554?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/5959622701245359554?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2013/01/kinect-and-wheeled-versions-under.html" title="Kinect and wheeled versions under development" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-0aTFaD4IbZE/UQjqBM-OPCI/AAAAAAAAAYg/o4R6hR1mCn0/s72-c/shark_mars_edition_20130127a.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkIASH4yfyp7ImA9WhNbFkQ.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-2773929445870115436</id><published>2013-01-19T15:30:00.000+01:00</published><updated>2013-01-20T15:02:29.097+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-20T15:02:29.097+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vehicle" /><category scheme="http://www.blogger.com/atom/ns#" term="omap" /><category scheme="http://www.blogger.com/atom/ns#" term="robot" /><category scheme="http://www.blogger.com/atom/ns#" term="localization" /><category scheme="http://www.blogger.com/atom/ns#" term="real-time" /><category scheme="http://www.blogger.com/atom/ns#" term="opencv" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>The new "Shark" model of our robot</title><content type="html">Last year we spend considerable amount of time building the new version of our robotics vehicle. Here is the result - the small tracked vehicle which might be interesting for researchers in robotics, AI, computer vision as well as for DIY enthusiasts. All the CAD models, assembling instructions and software are open source.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://raw.github.com/wiki/veter-team/veter/images/shark-small.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="https://raw.github.com/wiki/veter-team/veter/images/shark-small.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The "Shark" model&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
We are using &lt;a class="postlink" href="http://www.pololu.com/catalog/product/1551"&gt;Dagu's tracked chassis&lt;/a&gt;. The body of the vehicle is &lt;a class="postlink" href="https://github.com/veter-team/veter/wiki/printing-body"&gt;3D printed&lt;/a&gt;. The &lt;a class="postlink" href="http://www.beagleboard.org/"&gt;BeagleBoard-xM&lt;/a&gt;
 is used as on-board computer to control wide range of sensors (such as 
ultrasonic range finders, compass, cameras, etc.). If you are 
interested, please check &lt;a class="postlink" href="http://veterobot.com/"&gt;out our web-site&lt;/a&gt; for more details.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/bSEoQOExiMw/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/bSEoQOExiMw?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/bSEoQOExiMw?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/2773929445870115436/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2013/01/the-new-shark-model-of-our-robot.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/2773929445870115436?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/2773929445870115436?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2013/01/the-new-shark-model-of-our-robot.html" title="The new &quot;Shark&quot; model of our robot" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEAFRX05fip7ImA9WhVaFk0.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-5273439522378735322</id><published>2012-05-13T21:06:00.000+02:00</published><updated>2012-06-13T18:58:34.326+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-13T18:58:34.326+02:00</app:edited><title>3D printed enclosure</title><content type="html">We are currently working on the new version of our &lt;a href="http://veter-project.blogspot.com/2011/11/how-to-build-beagleboard-based-wifi.html"&gt;BeagleBoard-xM based robot&lt;/a&gt;. The main reason for redesign was the lack of wheel encoders which prevent us from developing more sophisticated navigation algorithms. That is why we decide to use &lt;a href="http://www.pololu.com/catalog/product/1551"&gt;Dagu Rover tracked chassis&lt;/a&gt;. However, not all our electronic could be fit in to the chassis, hence the need for additional enclosure on top of it.&lt;br /&gt;
After couple of &lt;a href="https://github.com/veter-team/veter/wiki/Hardware-design-en"&gt;experiments with standard plastic boxes&lt;/a&gt;, we decide to design and &lt;b&gt;3D print&lt;/b&gt; our own custom enclosure. The following pictures are the very first concept ideas developed by great 3D designer Sungreen, who &lt;a href="http://blender-3d.ru/forum/index.php/topic,171.0.html"&gt;also developed 3D model for our cockpit application&lt;/a&gt;.&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-YhirlQ0MLmM/T9jFpRyGHJI/AAAAAAAAAQU/GNH74bLWDHc/s1600/chassis.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-YhirlQ0MLmM/T9jFpRyGHJI/AAAAAAAAAQU/GNH74bLWDHc/s320/chassis.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;3D model of the Dagu chassis&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Nl2KLPbwBd4/T9jGMd2FOcI/AAAAAAAAAQc/_O5Xt-zr9H8/s1600/20120520c.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="http://4.bp.blogspot.com/-Nl2KLPbwBd4/T9jGMd2FOcI/AAAAAAAAAQc/_O5Xt-zr9H8/s320/20120520c.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Concept enclosure on top of chassis&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-AT6kqaz_GIY/T9jGiBscMrI/AAAAAAAAAQk/_0BTqb_-vCM/s1600/20120520d.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="http://1.bp.blogspot.com/-AT6kqaz_GIY/T9jGiBscMrI/AAAAAAAAAQk/_0BTqb_-vCM/s320/20120520d.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;We need to place BeagleBoard and other parts inside&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
It is surprising how hard it is to find precise mechanical drawings for typical hobby electronic parts. Neither BeagleBoard, nor ultra-sonic range finders as well as many other components have mechanical drawings which are easy to find in the Internet. So currently we are measuring and drawing sketches for all our mechanical and electronic components. As soon as we are done, we hope that our 3D printer will arrive and we can start experimenting with it. So stay tuned if you like to see how the enclosure will finally looks like.
&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/5273439522378735322/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2012/05/3d-printed-encosure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/5273439522378735322?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/5273439522378735322?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2012/05/3d-printed-encosure.html" title="3D printed enclosure" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-YhirlQ0MLmM/T9jFpRyGHJI/AAAAAAAAAQU/GNH74bLWDHc/s72-c/chassis.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkADQXk5fCp7ImA9WhVWEkw.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-689233544526128124</id><published>2012-04-23T02:29:00.000+02:00</published><updated>2012-04-24T00:06:10.724+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-24T00:06:10.724+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rtdm" /><category scheme="http://www.blogger.com/atom/ns#" term="pwm" /><category scheme="http://www.blogger.com/atom/ns#" term="xenomai" /><category scheme="http://www.blogger.com/atom/ns#" term="servo" /><category scheme="http://www.blogger.com/atom/ns#" term="kernel" /><category scheme="http://www.blogger.com/atom/ns#" term="real-time" /><category scheme="http://www.blogger.com/atom/ns#" term="driver" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>Precise PWMs with GPIO using Xenomai kernel module</title><content type="html">&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Introduction&lt;/span&gt;&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;
This article is the follow up to &lt;a href="http://veter-project.blogspot.com/2011/09/real-time-enough-about-pwms-and-shaky.html"&gt;our previous post&lt;/a&gt; on &lt;a href="http://en.wikipedia.org/wiki/Pulse-width_modulation"&gt;PWM&lt;/a&gt; generation with GPIO using &lt;a href="http://www.xenomai.org/"&gt;Xenomai&lt;/a&gt; real-time Linux extension. Despite clear improvements with Xenomai, the results were not good enough for us. In particular, under the heavy system load, PWMs were generated with jitter which was high enough that our servo motor starts shaking. So we decide to continue our search for the better solutions now in the kernel space.&lt;br /&gt;
&lt;br /&gt;
This article represents the results we obtained after implementing Xenomai RTDM kernel module. It also compares performance of the kernel-based solution with our previous user-space based approach. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Problem&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Our previous solution performs well if the system load is low to moderate. However, under heavy load, we were unable to keep the servo motor stable. We believe, that one of the main reasons for it was increased jitter which results in the in-precise pulse length. To check this hypothesis, we connect the oscilloscope to the signal (GPIO) pin to see what is really going on there. The following video illustrates what we have seen:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/DK3E6kBYh9A/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/DK3E6kBYh9A?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;





&lt;param name="bgcolor" value="#FFFFFF" /&gt;





&lt;embed width="320" height="266"  src="http://www.youtube.com/v/DK3E6kBYh9A?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
We start our xenomai-based user-space application with no system load and after about 5 seconds run &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;tar jcf lib.tar.bz2 /usr/lib&lt;/span&gt; command which leads to the top showing about 95% CPU usage. The distance between two horizontal lines around the falling edge of the signal corresponds to 50uSecs (as also shown in the bottom of the scope's screen). So the very rough estimation of the jitter (just visually) is about 40uSec. So with the whole pulse length of 1500uS (50% duty or middle servo position) it would be little less then 1%. This result roughly correlate with observable servo motor movements described in the &lt;a href="http://veter-project.blogspot.com/2011/09/real-time-enough-about-pwms-and-shaky.html"&gt;previous post&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Solution - Xenomai RTDM kernel module&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
It is well known, that moving into the kernel space could provide much better timing. We were trying to avoid this step as long as possible (because it is easier to develop and debug in the user space), but based on the results mentioned above it looks like we can not improve timing any more from the user space. So we decide to write kernel module. Xenomai offers convenient API to write real-time kernel space drivers which is called RTDM - Real-Time Driver Model (please see &lt;a href="http://www.xenomai.org/documentation/branches/v2.3.x/pdf/xenomai.pdf"&gt;introduction paper&lt;/a&gt; and &lt;a href="http://www.xenomai.org/documentation/xenomai-2.6/html/api/index.html"&gt;API documentation&lt;/a&gt; for more details).&lt;br /&gt;
&lt;br /&gt;
The result of these efforts &lt;a href="https://github.com/andreynech/rtdm-pwm"&gt;(source code) could be found on git-hub&lt;/a&gt;.This repository contains the kernel driver and user-space test application. There are some instructions about compilation and how to run the test available in the README file. If you decide to compile and run everything yourself, we recommend to read &lt;a href="http://veter-project.blogspot.com/2012/03/comfortable-kernel-workflow-on.html"&gt;the post about how we set-up our development and cross-compilation environment&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The core part of the driver is the 20mSec periodic task (function) which is toggling the GPIO pin in the endless loop:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&lt;span style="font-size: x-small;"&gt;void pwm_task_proc(void *arg) {&lt;br /&gt;&amp;nbsp; const int which = (int)arg;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; // Toggling the pins&lt;br /&gt;&amp;nbsp; for(;;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set_data_out has offset 0x94&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set gpio pin to 1 (up)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iowrite32(0x40000000, gpio + 0x6094);&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait requested pulse width time (duty)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(0 != rtdm_task_sleep(up_period[which]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtdm_printk("PWM: rtdm_task_sleep() returns error\n");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //clear_data_out has offset 0x90&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set gpio pin to 0 (down)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iowrite32(0x40000000, gpio + 0x6090);&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // wait until the next pulse should start (20mS interval)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(0 != rtdm_task_wait_period())&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtdm_printk("PWM: rtdm_task_wait_period() returns error\n");&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
This loop essentially sets the pin to 1, then waits requested amount of time (pulse width length), then sets the pin to 0 and waits until the next period starts.&lt;br /&gt;
&lt;br /&gt;
Running driver-based solution under the same heavy load conditions shows considerable improvements compared to the user-space solution. The following video illustrates the performance of this solution:&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/5p89toS8mS8/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/5p89toS8mS8?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;





&lt;param name="bgcolor" value="#FFFFFF" /&gt;





&lt;embed width="320" height="266"  src="http://www.youtube.com/v/5p89toS8mS8?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt; &lt;/div&gt;
Similar to the case with user-space application, there are two lines around falling edge with 50uS distance between them. Here we add the system load after about 8-th second on the video. The jitter is smaller then in the previous test and as a result, servo motor is also much more stable.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Still not perfect&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Unfortunately, developed kernel module does not solve the problem completely. Despite clear improvement, servo is still shaking. Much less than before, but still shaking under the heavy CPU load. So we conclude that there might be two potential sources of the problem.&lt;br /&gt;
&lt;br /&gt;
The first one, is rather obvious - the jitter observed in the video above. But taking in account, the simple generation loop mentioned above, we do not see how it could be improved. &lt;i&gt;So the question is - did we reach the limit of Xenomai+Linux abilities to provide real-time behavior&lt;/i&gt;? If yes, then it is rather sad news. BeagleBoard xM we are using for this experiment is rather powerful computer running at 800MHz. Yet we still can not control servo motor as precise as the one can easily do with micro-controller. It is clear that there is much more going on with real OS then with single application on micro-controller. Yet our hope was (and still) that 800MHz with real-time supervisor (Xenomai) running Linux kernel as a separate preempt-able task could provide better performance (much smaller jitter).&lt;br /&gt;
&lt;br /&gt;
Looking for further possible reasons for shaking servos, we notice somewhat strange behavior which we could not explain. To check what we are generating, we decide to display 20mS (similar as our signal) square wave generated by the oscilloscope near our PWM signal. We also instruct the scope to synchronize on the rising edge of this reference square wave. Our expectation was that we would see our PWM signal staying still with respect to the test square wave (because they have the same period of 20mS). That is why, we were surprised to see the following:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/NOSbGWT_tyo/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/NOSbGWT_tyo?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;





&lt;param name="bgcolor" value="#FFFFFF" /&gt;





&lt;embed width="320" height="266"  src="http://www.youtube.com/v/NOSbGWT_tyo?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;
Here, the yellow (bottom) signal is the square wave generate by the scope. The blue one (up) is our PWM signal which is &lt;i&gt;drifting to the right&lt;/i&gt;. Currently, we do not know what might be the reason for such behavior. The only idea is that &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;rtdm_task_wait_period()&lt;/span&gt;function does not work precise enough and the process is systematically waked up later (hence the drift). If yes, the again, the question is &lt;i&gt;did we reach the limit of Xenomai+Linux abilities to provide real-time behavior&lt;/i&gt;?&lt;br /&gt;
&lt;br /&gt;
Of course, there is a chance that we just misunderstood some programming concept and there is a bug in our code :-)&lt;br /&gt;
&lt;br /&gt;
Anyway, it seams that we are not done with this problem yet and there still open questions which can not answer right now. That is why, we would highly appreciate any hints and suggestions about what might be wrong with our implementation and how to improve it. So your comments are very welcome!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UPDATE&lt;/b&gt;: please see &lt;a href="http://comments.gmane.org/gmane.linux.real-time.xenomai.users/14026"&gt;the following discussion thread&lt;/a&gt; for the promising idea how to fix the jitter problem.&lt;br /&gt;
&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/689233544526128124/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2012/04/precise-pwms-with-gpio-using-xenomai.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/689233544526128124?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/689233544526128124?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2012/04/precise-pwms-with-gpio-using-xenomai.html" title="Precise PWMs with GPIO using Xenomai kernel module" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;Dk4MQXc7eSp7ImA9WhBTEEw.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-4044283287824268096</id><published>2012-03-30T19:44:00.002+02:00</published><updated>2013-02-04T22:56:20.901+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-04T22:56:20.901+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="nfsroot" /><category scheme="http://www.blogger.com/atom/ns#" term="cross-compile" /><category scheme="http://www.blogger.com/atom/ns#" term="toolchain" /><category scheme="http://www.blogger.com/atom/ns#" term="u-boot" /><category scheme="http://www.blogger.com/atom/ns#" term="xenomai" /><category scheme="http://www.blogger.com/atom/ns#" term="kernel" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>Comfortable kernel workflow on Beagleboard XM with nfsroot</title><content type="html">&lt;span style="font-size: large;"&gt;&lt;b&gt;Overview&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
For the last couple of days, I wanted to concentrate on reducing time required to boot &lt;a href="http://veterobot.com/"&gt;our robot&lt;/a&gt;. The first action I did was to find out minimum configuration for kernel. After couple of rounds of getting SD card between computer and Beagleboard XM, which is the base for our robot, I decided to check how other people are developing kernel on embedded systems. The standard approach is to boot kernel from network.&lt;br /&gt;
&lt;br /&gt;
Fortunately, the hard part was already done: u-boot support for network chip is already implemented. Here I wanted to document steps, required to get it working. Most of the information is available somewhere on the Internet, here is just place to get it all together.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, I could not configure DHCP server to get required parameters for TFTP boot, so...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;The mission&lt;/span&gt;: u-boot loads kernel from nfs and kernel mounts nfs root.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Assumptions&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Network configuration: I will be using static IP addresses to minimize influence of "bad" DHPC server. It will be good for many additional reasons. The beagleboard connected with ethernet cable to switch :)&lt;br /&gt;
&lt;br /&gt;
beagleboard 192.168.0.9&lt;br /&gt;
server&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 192.168.0.2&lt;br /&gt;
router&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 192.168.0.1&lt;br /&gt;
&lt;br /&gt;
The configuration is done on Debian stable (6.0), but should work on Ubuntu as well without major changes.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Preparation&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Create user &lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
In order to isolate work on this project, I created new user on the system and granted corresponding rights:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ sudo adduser maker
$ sudo vigr
&lt;/code&gt;
&lt;/pre&gt;
with the last step, add user maker to sudo group, as we need to use sudo pretty often.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Setup networking&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
as mentioned above, we are using static addressing, so first add beagleboard to /etc/hosts&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ sudo vi /etc/hosts

and add following line
192.168.0.9 beagleboard

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
in order to minimize hassle with regenerated rsa_key for ssh, add following to your ssh_config&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ sudo vi /etc/ssh/ssh_config

and add following
Host 192.168.0.9 beagleboard
  CheckHostIP no
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
then we need to grant permission for nfs clients, for easy configuration, just allow everyone. Obviously, if the server is used in some sort of public environment, this should correspondingly changed.&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ sudo vi /etc/hosts.allow

and add following
ALL: LOCAL

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
now we are ready to install nfs server, if it's not installed yet&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ sudo apt-get install nfs-kernel-server

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Create local folder for remote root file system and export this with nfs server&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ mkdir ~/rootfs
$ sudo vi /etc/exports

add following line
/home/maker/rootfs  beagleboard(rw,fsid=0,no_root_squash,no_subtree_check)

and restart nfs-server
$ sudo /etc/init.d/nfs-kernel-server restart

check if export is ok
$ sudo exportfs

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Setup toolchain&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
While, obviously, the toolchain could be compiled from sources, there is no need, as Angstrom distribution provides well tested and configured toolchain. There are plenty of versions, but I tested with &lt;a href="http://www.angstrom-distribution.org/toolchains/next/" target="_blank"&gt;Angstrom next toolchain&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
As I'm on x86_64, the file is&amp;nbsp;&lt;a href="http://www.angstrom-distribution.org/toolchains/next/angstrom-v20110117-x86_64-linux-armv7a-linux-gnueabi-toolchain.tar.bz2" target="_blank"&gt;angstrom-v20110117-x86_64-linux-armv7a-linux-gnueabi-toolchain.tar.bz2&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
download the file, extract and remove unnecessary structure&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ wget http://www.angstrom-distribution.org/toolchains/next/angstrom-v20110117-x86_64-linux-armv7a-linux-gnueabi-toolchain.tar.bz2
$ tar xjf angstrom-v20110117-x86_64-linux-armv7a-linux-gnueabi-toolchain.tar.bz2
$ mv usr/local/angstrom/arm .
$ rm -rf var usr

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
The installation of Angstrom toolchain, theoretically, should be done in root folder (/), but I don't like to have something in the root, which belongs to one user only. Thus, installation in the HOME folder.
&lt;br /&gt;
Now, let's add some useful aliases and setup PATH correspondingly&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ vi ~/.bashrc

and add following to the end
export PATH=$PATH:${HOME}/arm/bin
alias cross='ARCH=arm CROSS_COMPILE=arm-angstrom-linux-gnueabi- CFLAGS=" -march=armv7-a -fno-tree-vectorize -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -mtune=cortex-a8 " LOCALVERSION="" '
alias sudo_cross='sudo ARCH=arm CROSS_COMPILE=arm-angstrom-linux-gnueabi- LOCALVERSION="" INSTALL_MOD_PATH=${HOME}/rootfs'

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Pick the changes with . ~/.bashrc or logout and loging again.&lt;br /&gt;
&lt;br /&gt;
Check, that cross compiler is available "arm-angstrom-linux-gnueabi-gcc -v".&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Extract root filesystem&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
In order to boot from nfs root, we need a root file system. The easiest is to build required file system with &lt;a href="http://www.angstrom-distribution.org/builder/%0A" target="_blank"&gt;Angstrom Narcissus&lt;/a&gt; or download demo root system from &lt;a href="http://www.angstrom-distribution.org/demo/beagleboard/" target="_blank"&gt;Angstrom beagleboard demo images&lt;/a&gt; . Required MLO and u-boot could be taken from there as well. The u-boot version already contains required code to boot from nfs. So, downloading following files:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ wget http://www.angstrom-distribution.org/demo/beagleboard/Angstrom-Beagleboard-demo-image-glibc-ipk-2011.1-beagleboard.rootfs.tar.bz2
$ wget http://www.angstrom-distribution.org/demo/beagleboard/MLO
$ wget http://www.angstrom-distribution.org/demo/beagleboard/u-boot.img

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
note: we don't need uImage as we will be building our own kernel&lt;br /&gt;
&lt;br /&gt;
now, extract root file system in ~/rootfs&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ sudo tar -C ~/rootfs/ -xjf Angstrom-Beagleboard-demo-image-glibc-ipk-2011.1-beagleboard.rootfs.tar.bz2

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Prepare kernel sources&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I don't put the link to kernel sources, as everyone knows where they are.&amp;nbsp; We will be compiling 2.6.38.8 as this is the last version which is supported with latest Xenomai. Additionally, as example, we will be patching source with xenomai 2.6.0 patch and we need working defconfig, which could be taken from our source code at &lt;a href="https://github.com/veter-team/veterlayer/tree/master/recipes/linux/linux-xenomai-arm-2.6.38.8" target="_blank"&gt;Veter project on Github&lt;/a&gt;. Download following files:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.8.tar.bz2
$ wget https://github.com/veter-team/veterlayer/raw/master/recipes/linux/linux-xenomai-arm-2.6.38.8/defconfig
$ wget https://github.com/veter-team/veterlayer/raw/master/recipes/linux/linux-xenomai-arm-2.6.38.8/linux-xenomai-arm-2.6.38.8.patch

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
now, let's unpack sources, setup privileges and patch files, with optional git in between&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ cd ~/rootfs/usr
$ sudo mkdir src
$ sudo chown maker src
$ cd src
$ tar xjf ~/linux-2.6.38.8.tar.bz2
$ ln -s linux-2.6.38.8 linux
$ cd linux
$ git init 
$ git add .
$ git commit -m "vanilla linux 2.6.38.8"
$ patch -p1 &amp;lt;~/linux-xenomai-arm-2.6.38.8.patch
$ cp ~/defconfig ./.config
$ git add .
$ git commit -m "xenomai 2.6.0 for arm"

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Compiling initial kernel&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
now we have everything ready to cross-compile kernel for arm:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ cross make -j16 uImage modules
$ sudo_cross make -j16 modules_install

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;
Time for coffee !&lt;/div&gt;
&lt;br /&gt;
let's fix some links to get it right from the beagleboard perspective&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ cd ~/rootfs/lib/modules/2.6.38.8
$ sudo ln -s ../../../usr/src/linux build
$ sudo ln -s ../../../usr/src/linux source
$ cd ~/rootfs/boot
$ sudo rm uImage
$ sudo ln -s ../usr/src/linux/arch/arm/boot/uImage .

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
For the above-mentioned image, which is still based on 2.6.32 kernel, we need to change console&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ sudo vi ~/rootfs/etc/inittab

change console line from ttyS2 to
S:2345:respawn:/sbin/getty 115200 ttyO2

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
and remove NetworkManager. Its "smart" logic is not smart enough to deal with nfsroot&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ sudo rm ~/rootfs/etc/rc5.d/S28NetworkManager

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Prepare card&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: small;"&gt;The &lt;/span&gt;micro SD card need to have only 1 partition. The exercise of creating partitions and formatting with fat is left for reader. Then copy MLO and u-boot.img to the root of the card. And the most important create uEnv.txt file with instructions as to where to look for a kernel and nfs file system. Assuming card is mounted on /media/boot/&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ cp ~/MLO /media/boot/
$ sync
$ cp ~/u-boot.img /media/boot/
$ vi /media/boot/uEnv.txt

and copy this content

serverip=192.168.0.2
ipaddr=192.168.0.9
netmask=255.255.255.0
gatewayip=192.168.0.1
hostname=beagleboard
console=ttyO2,115200n8
optargs=mem=80M@0x80000000 mem=384M@0x88000000 xeno_hal.cpufreq=800000000
mpurate=800
root=/dev/nfs rw
rootpath=/home/maker/rootfs
nfsdevice=usb0:off
nfsrootargs=vers=3
usbethaddr=6E:58:95:1B:82:65
nfsargs=setenv bootargs console=${console} mpurate=${mpurate} ${optargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:${nfsdevice} nfsroot=${serverip}:${rootpath},${nfsrootargs} root=${root} 
uenvcmd=echo Initializing net ...; dcache off; usb start; echo Loading kernel ...; nfs ${loadaddr} ${serverip}:${rootpath}/boot/uImage ; echo Booting from nfs ...; run nfsargs; bootm ${loadaddr}

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
The content is self-explanatory. Now we are ready for a big moment !
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Booting&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
now, unmount card, insert it into beagle and enjoy you kernel from nfsroot !!!&lt;br /&gt;
&lt;br /&gt;
After this moment, all files are on the server, there is almost nothing on the beagleboard itself and you could just press the reset on board at any moment, the content is save on nfs.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Rebuilding kernel on server&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
Obviously, you want to change the kernel configuration and rebuild kernel couple of time, otherwise, all this effort is for nothing. Having set the links above, it's super easy, almost as it would be on the native system&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
$ cd ~/rootfs/usr/src/linux
$ cross make mrproper
$ cross make clean
$ cross make menuconfig
$ cross make -j16 uImage modules
$ sudo_cross make -j16 modules_install

&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
And press reset on the beagleboard.
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Building modules on beagleboard&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
After you made you perfect kernel, you may want to develop some kernel modules. Building them with cross-compiler is possible, but not very effective. On the beagleboard you have already tree compiled exactly for your version of the kernel. Why don't use them and compile modules natively ?&lt;br /&gt;
&lt;br /&gt;
Sure you can do this. One thing you should just take care of is scripts in the kernel source. They were compiled on the server with x86_64 architecture and they don't work on the beagleboard. You just need to rebuild scripts.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Caution:&lt;/b&gt; now as a root on beagleboard !
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code style="color: black; word-wrap: normal;"&gt;
root@beagleboard $ cd /usr/src/linux
root@beagleboard $ make scripts
root@beagleboard $ mkdir ../test
root@beagleboard $ cd ../test
root@beagleboard $ vi Makefile

and put this content in the Makefile
obj-m += hello.o
 
all:
 make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
 
clean:
 make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

root@beagleboard $ vi hello.c

and create simple module
#include &lt;linux module.h=""&gt;
#include &lt;linux kernel.h=""&gt;
 
int init_module(void)
{
 printk(KERN_INFO "init_module() called\n");
 return 0;
}
 
void cleanup_module(void)
{
 printk(KERN_INFO "cleanup_module() called\n");
}

root@beagleboard $ make
root@beagleboard $ modinfo hello.ko
filename:       hello.ko
srcversion:     4F856ABA1F3290D5F81D961
depends:        
vermagic:       2.6.38.8+ preempt mod_unload modversions ARMv7 
root@beagleboard $ insmod hello.ko
root@beagleboard $ rmmod hello


&lt;/linux&gt;&lt;/linux&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Now all combination of compiling on server and beagleboard is possible, you could press reset at any time and reboot beagle, network is configured and working.
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Congratulations: MISSION COMPLETED !!!&lt;/b&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/4044283287824268096/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2012/03/comfortable-kernel-workflow-on.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/4044283287824268096?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/4044283287824268096?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2012/03/comfortable-kernel-workflow-on.html" title="Comfortable kernel workflow on Beagleboard XM with nfsroot" /><author><name>Maxim Parkachov</name><uri>http://www.blogger.com/profile/08364684703549311765</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0QCRn4zfCp7ImA9WhVaFks.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-3142661752071214682</id><published>2012-02-29T03:27:00.001+01:00</published><updated>2012-06-14T10:09:27.084+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-14T10:09:27.084+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vehicle" /><category scheme="http://www.blogger.com/atom/ns#" term="example" /><category scheme="http://www.blogger.com/atom/ns#" term="robot" /><category scheme="http://www.blogger.com/atom/ns#" term="control" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="localization" /><title>One-dimensional robot localization example</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
Here is my first example for the Unit 1 of the &lt;a href="http://www.udacity.com/overview/Course/cs373"&gt;CS373 free online class&lt;/a&gt;. Please see &lt;a href="http://veter-project.blogspot.com/2012/02/remotely-control-robotics-vehicle-with.html"&gt;this post for the introduction of this example series.&lt;/a&gt; This example illustrates how to perform one-dimensional localization using histogram filter we have learned in Unit 1 of the class. I will be using our &lt;a href="https://github.com/veter-team/veter/wiki/Hardware-design-en"&gt;Veter vehicle&lt;/a&gt; to illustrate how to control real robotics vehicle. To illustrate the one-dimensional localization algorithm, I have made the following test environment:&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-j4edI14p7I4/T9mcIAoF8cI/AAAAAAAAAS0/mqr0u8XdRxM/s1600/testsetup.jpeg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="94" src="http://2.bp.blogspot.com/-j4edI14p7I4/T9mcIAoF8cI/AAAAAAAAAS0/mqr0u8XdRxM/s320/testsetup.jpeg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Figure 1: Test set up for the one-dimensional localization test&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
The Figure 1 illustrates our vehicle and the line of A4 paper sheets which represents the "wall". Each sheet is labeled with the number (0, 2, 3, etc., from right to left) which is the position within the line. Sheets with numbers 1 and 4 are removed to simulate the "door". We assume here, that robot can make discrete movement one position left or right. &lt;span style="background-color: yellow;"&gt;So the localization problem is to determine current position of the robot&lt;/span&gt;, i.e. in front of which sheet the robot currently is. So it roughly corresponds to the following situation :-) :&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-zD4QcRVU9vY/T9jRNbhriRI/AAAAAAAAAQ8/qNQ4xcOSsRg/s1600/localization.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="126" src="http://1.bp.blogspot.com/-zD4QcRVU9vY/T9jRNbhriRI/AAAAAAAAAQ8/qNQ4xcOSsRg/s320/localization.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;I hope I am not violating any copyrights here by re-posting this picture
 from Unit 1 Notes. Otherwise, please let me know and I will remove it.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
For demonstration purposes, we decide to perform measurements using on-board ultrasonic range finder (aka. sonar). Since our robot has only one sonar on the front panel, we need to turn towards the "wall" (or "door", we do not know...) to make measurements, then turn back and drive forward to the next adjustment position. We assume, that we start at the arbitrary unknown position facing towards the wall. So the motion step is: turn left, drive forward, turn right back to the wall, query and process new measurement. For simplicity, I assume that if sonar shows distance less then 50cm, than we are in front of wall. Otherwise, if distance is bigger, then there is nothing in front of us, i.e. we are facing the door.&lt;br /&gt;
&lt;br /&gt;
To perform precise motions, like for example turning exactly 90 degrees, additional sensor data required (for example compass) as well as control algorithms such as PID or whatever else. However, to keep this example as simple as possible and make sure that focus stays on the localization topic, I decide to implement the control in very naive way. I turn corresponding motors on, wait some period of time and then turn them off. For example, turning the left track clockwise and the right counter-clockwise will rotate the robot to the left. So I just measure the time needed to make ~90 degrees turn and turning motors off after this amount of time. It works only for concrete surface, varies when battery gets discharged and very imprecise. But again, it was not a purpose of this example and I want to keep it as simple as possible. There is control algorithms topic in the course syllabus, so hopefully I will be able to address issues mentioned above with following examples for the corresponding units. &lt;br /&gt;
&lt;br /&gt;
The whole program, which is in &lt;a href="https://github.com/andreynech/udacity-cs373/tree/master/unit1"&gt;localization.py, &lt;/a&gt;defines two classes &lt;a href="https://github.com/andreynech/udacity-cs373/blob/master/unit1/localization.py#L34"&gt;SensorDataReceiverI&lt;/a&gt; which is a callback interface to receive sensor data pushed from the vehicle. The &lt;a href="https://github.com/andreynech/udacity-cs373/blob/master/unit1/localization.py#L45"&gt;nextSensorFrame&lt;/a&gt;() method is invoked every time the new sensor data arrives. I store just the last received measurement for compass and sonar to read them later. The second class is &lt;a href="https://github.com/andreynech/udacity-cs373/blob/master/unit1/localization.py#L55"&gt;Client&lt;/a&gt; which is derived from &lt;a href="http://doc.zeroc.com/display/Ice/The+Server-Side+main+Program+in+Python#TheServer-SidemainPrograminPython-The%7B%7BIce.Application%7D%7DClassinPython"&gt;Ice.Application class&lt;/a&gt;. Client class defines &lt;a href="https://github.com/andreynech/udacity-cs373/blob/master/unit1/localization.py#L65"&gt;sense()&lt;/a&gt; and &lt;a href="https://github.com/andreynech/udacity-cs373/blob/master/unit1/localization.py#L76"&gt;move()&lt;/a&gt; methods which perform sensor data and movement processing steps of the localization algorithm. &lt;span style="background-color: yellow;"&gt;They are copy/pasted from the Unit1 lecture&lt;/span&gt;. The &lt;a href="https://github.com/andreynech/udacity-cs373/blob/master/unit1/localization.py#L131"&gt;run() &lt;/a&gt;method is the application entry point. It connects to the remote vehicle, set up the callback interface and then executes five sense/move steps to update position estimation probabilities. In addition, it also invoke corresponding commands to control the vehicle. In particular, there is a function &lt;a href="https://github.com/andreynech/udacity-cs373/blob/master/unit1/localization.py#L101"&gt;makeMotionStep()&lt;/a&gt; defined in the Client class to perform turn-left/move/drive-forward/turn-right motion sequence mentioned above. Finally, for each step, the location probability array is printed out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All sources are &lt;a href="https://github.com/andreynech/udacity-cs373/tree/master/unit1"&gt;available on GitHub&lt;/a&gt;. .ice 
files over there are interface definition for remote communication. They will be 
automatically processed by &lt;a href="http://doc.zeroc.com/pages/viewpage.action?pageId=3900863"&gt;Ice.loadSlice&lt;/a&gt;("--all vehicle.ice") command. 
More details on how to use ICE middleware &lt;a href="http://doc.zeroc.com/display/Ice/Ice+Manual"&gt;could be found here&lt;/a&gt;. Documentation for the Python language binding for ICE &lt;a href="http://doc.zeroc.com/display/Ice/Python+Mapping"&gt;is available here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The following video shows the test set-up and robotics vehicle made five motion steps.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/6YhUJnj8sWE/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6YhUJnj8sWE?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;




&lt;param name="bgcolor" value="#FFFFFF" /&gt;




&lt;embed width="320" height="266"  src="http://www.youtube.com/v/6YhUJnj8sWE?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
Finally, the set of graphs below illustrate the position estimation (probability of being at certain position) for each of five steps. This graphs are made based on the output produced by the python control program described above. It is easy to see, that after the step 5, there is much higher probability of being at the second position from the left then somewhere else. &lt;span style="background-color: yellow;"&gt;So, we solve the localization problem.&lt;/span&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-kQUwA1uyLlI/T9mZ1m0J_zI/AAAAAAAAASE/_Yx_OZr2OxM/s1600/est0.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-kQUwA1uyLlI/T9mZ1m0J_zI/AAAAAAAAASE/_Yx_OZr2OxM/s1600/est0.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Step 1&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-gNdORD5hThE/T9mZ2dyT0JI/AAAAAAAAASI/oaolhIr2blg/s1600/est1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-gNdORD5hThE/T9mZ2dyT0JI/AAAAAAAAASI/oaolhIr2blg/s1600/est1.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Step 2&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span id="goog_1893294747"&gt;&lt;/span&gt;&lt;span id="goog_1893294748"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ABQSSv3YRJY/T9mZ3GY3VKI/AAAAAAAAASQ/87QFVbiouZk/s1600/est2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-ABQSSv3YRJY/T9mZ3GY3VKI/AAAAAAAAASQ/87QFVbiouZk/s1600/est2.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Step3&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-rmwegKZS_Sc/T9mZ35Z__2I/AAAAAAAAASY/liaDcxQb1Bo/s1600/est3.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-rmwegKZS_Sc/T9mZ35Z__2I/AAAAAAAAASY/liaDcxQb1Bo/s1600/est3.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Step 4&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gSZIUTKXO2Y/T9mZ4dxzbJI/AAAAAAAAASg/F7hlAwsJYf4/s1600/est4.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-gSZIUTKXO2Y/T9mZ4dxzbJI/AAAAAAAAASg/F7hlAwsJYf4/s1600/est4.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Step 5&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/3142661752071214682/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2012/02/here-is-my-first-example-for-unit-1-of.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/3142661752071214682?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/3142661752071214682?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2012/02/here-is-my-first-example-for-unit-1-of.html" title="One-dimensional robot localization example" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-j4edI14p7I4/T9mcIAoF8cI/AAAAAAAAAS0/mqr0u8XdRxM/s72-c/testsetup.jpeg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0ANSXw_eCp7ImA9WhVaFk0.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-352007920629241065</id><published>2012-02-29T01:44:00.000+01:00</published><updated>2012-06-13T19:49:58.240+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-13T19:49:58.240+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="example" /><category scheme="http://www.blogger.com/atom/ns#" term="robot" /><category scheme="http://www.blogger.com/atom/ns#" term="control" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="localization" /><title>Remotely control robotics vehicle with Python</title><content type="html">After very positive experience with the &lt;a href="https://www.ai-class.com/"&gt;Artificial Intelligence class&lt;/a&gt;, I decide to continue with &lt;a href="http://www.udacity.com/overview/Course/cs373"&gt;Udacities CS373 "Programming a robotic car"&lt;/a&gt; class taught by Professor Sebastian Thrun. Since the beginning of the class, I have seen a lot of question in the discussion forum about the way to try algorithms we are learning with real robotic vehicles. That is why, I decide to start a series of posts where I will try to use exactly the algorithms we have studied in each unit to control &lt;a href="http://veter-project.blogspot.com/2011/11/how-to-build-beagleboard-based-wifi.html"&gt;our robotics vehicle&lt;/a&gt;. In this series I will use Python and try to keep the implementation of the core algorithm as close as possible to what was presented in the lectures. I hope it would be interesting and helpful for the students of the CS373 class like I am.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-EW2evSdD_Ew/T9jSrsvDuJI/AAAAAAAAARM/dNvaYCNoZaA/s1600/assembled2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-EW2evSdD_Ew/T9jSrsvDuJI/AAAAAAAAARM/dNvaYCNoZaA/s1600/assembled2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp;Since it is a pure hobby project and all the activities are conducted in the evenings and over weekends I am not sure whether I will keep the pace and manage to produce the demo for every unit. But I will try hard. All relevant sources will be &lt;a href="https://github.com/andreynech/udacity-cs373%20"&gt;located at GitHub&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I just posted the first examples from the series on&lt;a href="http://veter-project.blogspot.com/2012/02/here-is-my-first-example-for-unit-1-of.html"&gt; localization from Unit 1&lt;/a&gt;.
&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/352007920629241065/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2012/02/remotely-control-robotics-vehicle-with.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/352007920629241065?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/352007920629241065?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2012/02/remotely-control-robotics-vehicle-with.html" title="Remotely control robotics vehicle with Python" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-EW2evSdD_Ew/T9jSrsvDuJI/AAAAAAAAARM/dNvaYCNoZaA/s72-c/assembled2.jpg" height="72" width="72" /><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;Ak4NRng8cCp7ImA9WhBRFkk.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-5770819413513379664</id><published>2011-11-11T14:35:00.001+01:00</published><updated>2013-03-07T10:36:37.678+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-07T10:36:37.678+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vehicle" /><category scheme="http://www.blogger.com/atom/ns#" term="streaming" /><category scheme="http://www.blogger.com/atom/ns#" term="omap" /><category scheme="http://www.blogger.com/atom/ns#" term="gstreamer" /><category scheme="http://www.blogger.com/atom/ns#" term="control" /><category scheme="http://www.blogger.com/atom/ns#" term="pwm" /><category scheme="http://www.blogger.com/atom/ns#" term="remote" /><category scheme="http://www.blogger.com/atom/ns#" term="real-time" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>How to build BeagleBoard based WiFi robot</title><content type="html">As it often happens with typical software developers, we were working hard on implementation of different features but did not spend enough time documenting our development :-) . As a result, there were not too much documentation and details about our project. So with this post we would like to announce the &lt;a href="http://veterobot.com/buildyourself.html" target="_blank"&gt;availability of more detailed project documentation&lt;/a&gt; and make brief overview of some interesting aspects of the project. The whole available documentation could be found at &lt;a href="http://veterobot.org/" target="_blank"&gt;our web-site&lt;/a&gt; and on the &lt;a href="https://github.com/veter-team/veter/wiki/"&gt;project Wiki&lt;/a&gt;. It is, as usual, :) not complete yet, but hopefully good enough to understand how everything works and even rebuild it yourself.&lt;br /&gt;
&lt;br /&gt;
Here is the brief summary (&lt;a href="https://github.com/veter-team/veter/wiki/Hardware-design-en"&gt;details are available here&lt;/a&gt;) of what we have done so far. As a chassis platform we are using the one from Pololu. On top of it we mount the BeagleBoard with connected WiFi adapter, camera and GPS receiver. To control the motors we are using standard PWM-controlled speed regulators. Control PWMs are generated directly from BeagleBoard using available hardware PWM generators as well as &lt;a href="http://veter-project.blogspot.com/2011/09/real-time-enough-about-pwms-and-shaky.html"&gt;using GPIO&lt;/a&gt;. In addition, there are compass and ultrasound range finder connected over I2C available on BeagleBoard.&lt;br /&gt;
&lt;br /&gt;
Here is how it everything looks like now:&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://sites.google.com/site/andreynech/_/rsrc/1316617362012/hobby/robots/assembled2.jpg?height=320&amp;amp;width=284" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://sites.google.com/site/andreynech/_/rsrc/1316617983258/hobby/robots/chassis-power-builtin.jpg?height=240&amp;amp;width=320" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://sites.google.com/site/andreynech/_/rsrc/1316617375797/hobby/robots/ubbox-beagle-usb.jpg?height=240&amp;amp;width=320" /&gt;&lt;br /&gt;
&lt;br /&gt;
Or like this, depending on what chassis are used:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-70L8qK0pvuE/T9jLVUEt_TI/AAAAAAAAAQw/tD-76vSztng/s1600/monster.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-70L8qK0pvuE/T9jLVUEt_TI/AAAAAAAAAQw/tD-76vSztng/s320/monster.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Video is compressed in to h264 stream using OMAP's DSP in real-time. TI's DSP optimized codecs integrated with &lt;a href="http://gstreamer.freedesktop.org/"&gt;GStreamer &lt;/a&gt;are used for video compression. After that, the h264 stream is sent to the driver console over WiFi. We also solved a lot of problems related to firewall and NAT traversing.&lt;br /&gt;
&lt;br /&gt;
Experimentally we found out that maintain constant video frame rate is the very important to provide comfortable driving experience. It is not a trivial goal to achieve if the video is transmitted over the Internet because available bandwidth changes permanently. To solve this problem we developed our own adaptive video streaming infrastructure. We have presented our adaptive streaming on the &lt;a href="http://gstreamer.freedesktop.org/conference/2010"&gt;Gstreamer 2010 conference&lt;/a&gt;. There is &lt;a href="http://gstconf.ubicast.tv/videos/adaptive-video-streaming-with-ice-and-gstreamer/"&gt;presentation video&lt;/a&gt; and &lt;a href="https://docs.google.com/leaf?id=0BzV4szKbuvKwYzQwZDlhNjktMTVlOC00ZDczLThiZjQtZTRlMjcyYzRlZWIy&amp;amp;sort=name&amp;amp;layout=list&amp;amp;num=50"&gt;slides available&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
In addition to the video stream, driver console also receives data collected from on-board sensors. It makes it possible, for example, to display robots current location on the map which is downloaded from the openstreetmap.org also in real-time.&lt;br /&gt;
&lt;br /&gt;
The following picture illustrates how the driver "cockpit" looks like:&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://myrobot.ru/forum/uploads/_cockpit1.jpg" /&gt;&lt;br /&gt;
&lt;br /&gt;
This is real screenshot (not a photoshop :-) ). Driver console application is written using OpenGL and works on Linux and Windows (should also work on Mac but I did not test it). The whole 3D model is made in Blender and exported in to the standard .DAE (&lt;a href="http://www.khronos.org/collada/"&gt;COLLADA&lt;/a&gt;) format. So the project also contains rather evolved COLLADA visualisation library which supports animation and some other advanced features. Every time the new video frame is received and decoded to the raw RGB data block, the corresponding OpenGL texture is updated in 3D scene. The middle panel is then used as such textured surface. Panels to the left and right are to visualize additional information such as for example map with current location or to constantly scroll unreadable cool looking logs :-) .&lt;br /&gt;
&lt;br /&gt;
I want to say special thanks to Sungreen (aka. Nikolay :-) )! He is kindly respond to my &lt;a href="http://blender-3d.ru/forum/index.php/topic,171.0.html"&gt;call for help on blender-3d.ru site&lt;/a&gt; and created different 3D cockpit models. If you are interested, you can take a look at this link. The site is in Russian but on the 2-nd page there are several examples of the alternative cockpit models.&lt;br /&gt;
&lt;br /&gt;
All the software for this project (including recipes for OpenEmbedded/Angstrom to build Linux image for flash card) are &lt;a href="https://github.com/veter-team"&gt;available on github.com&lt;/a&gt;. We are currently in process of migrating from gitorious.org to github, so if some pieces are missing on github, chances are that they could be found in&lt;a href="https://gitorious.org/+veter"&gt; old repository&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Also, for some additional information about the project I would suggest to check &lt;a href="http://veter-project.blogspot.com/"&gt;our Blog&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I would really appreciate any comments about the project!

&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/5770819413513379664/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2011/11/how-to-build-beagleboard-based-wifi.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/5770819413513379664?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/5770819413513379664?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2011/11/how-to-build-beagleboard-based-wifi.html" title="How to build BeagleBoard based WiFi robot" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-70L8qK0pvuE/T9jLVUEt_TI/AAAAAAAAAQw/tD-76vSztng/s72-c/monster.png" height="72" width="72" /><thr:total>9</thr:total></entry><entry gd:etag="W/&quot;Ak4HQ3Y5fSp7ImA9WhVWEkw.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-7367732185553164166</id><published>2011-09-05T19:36:00.000+02:00</published><updated>2012-04-24T00:08:52.825+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-24T00:08:52.825+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vehicle" /><category scheme="http://www.blogger.com/atom/ns#" term="omap" /><category scheme="http://www.blogger.com/atom/ns#" term="control" /><category scheme="http://www.blogger.com/atom/ns#" term="pwm" /><category scheme="http://www.blogger.com/atom/ns#" term="xenomai" /><category scheme="http://www.blogger.com/atom/ns#" term="servo" /><category scheme="http://www.blogger.com/atom/ns#" term="real-time" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>Real-time enough? About PWMs and shaky servos</title><content type="html">We are currently working on the next incarnation of our &lt;a href="http://veter-project.blogspot.com/"&gt;software and hardware platform for vehicles controlled over the Internet&lt;/a&gt;. Among others, we decide to investigate the way to control our robot without micro-controllers. In fact, BeagleBoard has a lot of GPIOs available. In addition, three hardware PWM generators and I2C bus should be enough at least to control the tank with camera, compass, GPS, and sonar. We believe that BeagleBoard is also powerful enough to accomplish all these tasks (including DSP-based real time video encoding) without additional micro controllers.If this claim is true, than it could be an advantage from the price, space and complexity point of view.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Hardware setup&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
There is a lot of devices can be controlled using Pulse Width Modulation (PWM). The very typical example is the standard servo motor. Also, it is very typical to use PWMs to talk to motor controllers which in turn control DC motors. That is why we decide to test the real-time performance of our whole system by implementing PWM generator using one of the available GPIO pins. Standard PWM signal (what we need to generate) is represented in the following picture:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.ermicro.com/blog/wp-content/uploads/2009/02/servo_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://www.ermicro.com/blog/wp-content/uploads/2009/02/servo_01.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Pulses has 20ms distance (50Hz) and servo position is encoded by the pulse width with ~0.7ms to ~2.0ms meaning left and right most positions respectively (actual values typically vary a little depending on the servo model and vendor).&lt;br /&gt;
&lt;br /&gt;
From the hardware point of view, level shifting is necessary because GPIO pins on BeagleBoard have 1.8V output but we need 5V to control the servo. For these purposes we used &lt;a href="http://www.ti.com/product/txs0108e"&gt;TI's TXS0108E voltage-level translator&lt;/a&gt; with &lt;a href="http://www.sparkfun.com/products/498"&gt;corresponding SSOP to DIP adapter&lt;/a&gt; (a little bit difficult to solder but is doable if you did not drink a lot of bear the day before :-) ).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Software setup&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Pins on the output connector on BeagleBoard can be configured to play different roles. This configuration process is called PinMuxing. For me personally it was and still a little bit confusing where and how to do it. There are in general three places where you can do it: in u-boot, in kernel and in your application with direct memory access over /dev/mem.&lt;br /&gt;
&lt;br /&gt;
The first two ways will give you file system interface with&amp;nbsp;/sys/class/gpio/gpio* entries in file system. Standard read() and write() functions could be used with these files to control GPIO direction and output.&lt;br /&gt;
&lt;br /&gt;
The third way will require to map the physical memory using /dev/mem and then read/write to special addresses to control the output of the GPIO pin. To make it work properly, the kernel config option CONFIG_OMAP_RESET_CLOCKS, which is enabled in the default BeagleBoard defconfigs (and is also enabled in the kernel used by &lt;a href="http://www.angstrom-distribution.org/"&gt;Angstrom distribution&lt;/a&gt; we are using) should be switched off. This is a kernel power saving feature and somehow it leads to the kernel oops in this scenario.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Let's trigger GPIO&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
The obvious and straightforward approach to generate PWM signals mentioned above could be described with the following pseudo-code:&lt;br /&gt;
&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; for(;;) {&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set_gpio_output_to_high();&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sleep(something_between_0.7_and_2.0ms);&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set_gpio_outout_to_low();&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sleep(20ms);} &lt;/span&gt;&lt;br /&gt;
This loop can be actually implemented even &lt;a href="http://blog.makezine.com/archive/2009/02/blinking-leds-with-the-beagle-board.html"&gt;as a shell script&lt;/a&gt;. As an alternative, it is possible to use read() and write() function in C to implement&amp;nbsp;set_gpio_output_to_high() and&amp;nbsp;set_gpio_output_to_low(). What is important however, is to ensure that the pulse width remains exactly the same as long as you want the servo to stay in certain position. This is the place where the problem arise - Linux is not a real-time system and that is why there is no guarantee that sleep() function will return &lt;u&gt;exactly&lt;/u&gt; after requested amount of time. Context switching between kernel and user space (as happens when using kernel functions such as read() and write()) may also add to the unpredictable timing. As a result the servos will become "nervous". They will shake periodically instead of staying in the desired position.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Problem&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
In order to achieve stable servo positioning two sources of the undeterministic timing behavior should be eliminated:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Unpredictable delays caused by context switching between kernel and user space.&lt;/li&gt;
&lt;li&gt;Unpredictable thread sleep time with standard sleep() function&lt;/li&gt;
&lt;/ol&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Solution 1 - eliminating context switches&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Inspired by &lt;a href="http://linuxjunk.blogspot.com/2009/01/beagleboard-gpio-input-driverless.html"&gt;this&lt;/a&gt; and &lt;a href="http://x4350.blogspot.com/2011/01/digital-io-on-beagleboard-using-gpio.html"&gt;this&lt;/a&gt; postings, we decide to go the way with direct memory access made from our application to trigger the GPIO. As a result, we write very simple test program which implements PWM generation loop as following:&lt;br /&gt;
&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;nbsp; for(;;) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set_data_out has offset 0x94&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gpio[OFFSET(0x6094)]=0x40000000;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sleep(up_period);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //clear_data_out has offset 0x90&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gpio[OFFSET(0x6090)]=0x40000000;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sleep(20 * 1000); }&lt;/span&gt;&lt;br /&gt;
Here we replace the call to write() kernel function with direct memory access to trigger&amp;nbsp;GPIO158. This solution should solve the problem with undeterministic timing resulted by context switching. So let us see what we can achieve with this implementation. To make this post not so boring, instead of showing typical oscilloscope measurements, we decide to place a video of our current testing vehicle where the video camera is mounted on the servo we are controlling with our PWM generation application.&lt;br /&gt;
&lt;br /&gt;
The following video fragment illustrates the servo behavior when running the PWM generation with direct memory writes. No other load was put on the system (~99% system idle).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/Z-f6GfVqwHQ/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Z-f6GfVqwHQ?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;  &lt;param name="bgcolor" value="#FFFFFF" /&gt;  &lt;embed width="320" height="266"  src="http://www.youtube.com/v/Z-f6GfVqwHQ?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;Initially, the servo is turned away from the camera. After a couple of seconds, we run the test application which rotates the servo towards the camera to illustrate that we are actually controlling the servo. What can be clearly observed is that servo is shaking. In addition, there is a typical noise from the servo could be heard which is also a sign that the position is constantly changing.&lt;br /&gt;
&lt;br /&gt;
The situation become much worth if we put considerable load on the system. In this case we run another process in background which creates about 98% system load (~1% system idle shown by top).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/Ok1rAPYTmQc/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Ok1rAPYTmQc?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;  &lt;param name="bgcolor" value="#FFFFFF" /&gt;  &lt;embed width="320" height="266"  src="http://www.youtube.com/v/Ok1rAPYTmQc?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
In fact, those results were easy to predict. It is also obvious that, the version with write() function (not speaking about corresponding shell script) would show even worth results. That is why we decide even not to test this configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Solution 2 - predictable timing with Xenomai&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
So now it becomes clear that we need deterministic sleep() function behavior to achieve stable servo positioning. There are two options we were consideing: &lt;a href="https://rt.wiki.kernel.org/index.php/Main_Page"&gt;PREEMPT_RT kernel patches&lt;/a&gt; and &lt;a href="http://www.xenomai.org/"&gt;Xenomai&lt;/a&gt;. Speeking about preempt_rt, we did not manage to find such configuration of the Linux kernel used by Angstrom/OpenEmbedded which works on BeagleBoard and has preempt_rt patches for it.&lt;br /&gt;
&lt;br /&gt;
Installing Xenomai was also not a straightforward task. There were problems applying patch to the kernel we were using. However, we were able to solve them. In addition, according to our understanding, Xenomai is considered as "more real-time" then preempt_rt because it runs whole Linux kernel as one of it's task in parallel with other real-time tasks and can preempt it almost at any point if necessary. So we decide to continue our experiments with Xenomai. At the time of writing, we were using kernel version &lt;span dir="ltr" id=":w2"&gt;2.6.35.9 &lt;/span&gt;with Xenomai version 2.5.6.&lt;br /&gt;
&lt;br /&gt;
After getting Xenomai running, we rewrite the test PWM generation application. The core generation loop was running as a real-time thread with high priority (99). We also replace sleep() function invocations with corresponding Xenomai functions:&lt;br /&gt;
&lt;span style="font-family: 'Courier New',Courier,monospace; font-size: x-small;"&gt;&amp;nbsp; for(;;) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set_data_out has offset 0x94&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gpio[OFFSET(0x6094)]=0x40000000;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rt_task_sleep(up_period);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //clear_data_out has offset 0x90&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gpio[OFFSET(0x6090)]=0x40000000;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rt_task_wait_period(NULL); }&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Test results were &lt;u&gt;much&lt;/u&gt; better! Actually, without system load, servos controlled by Xenomai application was perfectly stable. That is why there is no video for this case - there is nothing to see :-) because servo just remains at the defined position. No shaking, no noise.&lt;br /&gt;
&lt;br /&gt;
As the next test, we put the system under heavy load either by running xeno-test program in background (puts 100% load on the system) or running our own vehicle control software which performs real-time video compression using DSP-enabled h264 codec and communicates intensively over the network with vehicle operator software (puts about 60% load on the system). Under these conditions, unfortunately, servo starts shaking again as illustrated by the following video fragment:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/SJizUTmB_jc/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SJizUTmB_jc?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt; &lt;param name="bgcolor" value="#FFFFFF" /&gt; &lt;embed width="320" height="266"  src="http://www.youtube.com/v/SJizUTmB_jc?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;
Nevertheless, this behavior is better then the one without Xenomai and in fact the best we were able to achieve so far. According to our (non formal) observations, what is typically causing increasing shaking is extensive console IO (connected with SSH over the USB WLan adapter on the BeagleBoard) or in general network activity.&lt;br /&gt;
&lt;br /&gt;
Running the Xenomai's &lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;latency&lt;/span&gt; application in parallel with our test program reveals the latency of around 40 microseconds. Based on what we read in Internet, 40 microseconds is considered "normal/OK" latency for Linux/Xenomai running on ARM at 600MHz. Taking in account typical pulse width of about 1 millisecond, 40 microseconds is about 4%. Is this 4% in fact what we actually see on the video? If yes,&lt;b&gt; &lt;/b&gt;does it mean that even with Xenomai it is not possible to control servos reliably even under moderate system load?!&lt;br /&gt;
&lt;br /&gt;
We would really appreciate any feedback if someone familiar with the matter can provide some thoughts about the way to improve the situation. We are somehow do not want to accept the fact that Linux running on such a powerful system such as BeagleBoard can not be enough real-time to generate 1-2ms wide pulses at 50Hz with latency considerably less then 40us? We are really hope that there are some tweaks can be made to achieve much better real-time performance.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Software availability&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Our whole software (including Xenomai-based control module) is open-source and available online &lt;a href="https://www.gitorious.org/veter/"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The relevant Xenomai-based servo control sources could be found &lt;a href="https://www.gitorious.org/veter/vehicle/blobs/master/src/xenopwm.c"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The whole source code repository contains the OE layer for Angstrom to generate image with all patches and dependencies to run our on-board software. This software, among others, illustrates how to control servo motors with direct memory access and Xenomai, how to communicate over I2C not using Linux kernel (for better real-time), how to work with I2C sensors such as compass and sonar, how to receive location from GPS sensor, how to compress video in real-time using DSP-enabled codecs with Gstreamer, how to send video and other sensor data over the network in real-time and much more.&lt;br /&gt;
At the client (driver) side we are using OpenGL and high performance GLSL-based rendering to display 3D driver console with live video applied as a texture to the defined surface, displaying map for received GPS position in real-time using openstreetmap.org and much more.&lt;br /&gt;
We are currently working hard on documenting all the software and hardware we have made so far. There is already some documentation for the project available &lt;a href="https://www.gitorious.org/veter/pages/Home"&gt;here&lt;/a&gt; and &lt;a href="https://www.gitorious.org/veter/pages/BuildingImage"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
We would be very glad to receive any comments regarding question about Linux/Xenomai real-time performance stated in this post above, our project in general and of course, contributions are also very welcome.
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/7367732185553164166/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2011/09/real-time-enough-about-pwms-and-shaky.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/7367732185553164166?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/7367732185553164166?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2011/09/real-time-enough-about-pwms-and-shaky.html" title="Real-time enough? About PWMs and shaky servos" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><thr:total>6</thr:total></entry><entry gd:etag="W/&quot;CEIDRng_cCp7ImA9WhVaFk8.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-4943252639341748632</id><published>2010-12-15T02:25:00.000+01:00</published><updated>2012-06-13T23:22:57.648+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-13T23:22:57.648+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="vehicle" /><category scheme="http://www.blogger.com/atom/ns#" term="streaming" /><category scheme="http://www.blogger.com/atom/ns#" term="omap" /><category scheme="http://www.blogger.com/atom/ns#" term="anaglyph" /><category scheme="http://www.blogger.com/atom/ns#" term="gstreamer" /><category scheme="http://www.blogger.com/atom/ns#" term="control" /><category scheme="http://www.blogger.com/atom/ns#" term="remote" /><category scheme="http://www.blogger.com/atom/ns#" term="stereo" /><category scheme="http://www.blogger.com/atom/ns#" term="opencv" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>Stereo video stream from on-board cameras</title><content type="html">After completing &lt;a href="http://veter-project.blogspot.com/2010/10/new-mechanical-design.html"&gt;our BeagleBoard based car&lt;/a&gt;, we decide to build the quad-copter which also could be controlled over the Internet. In addition, we set as our goal to implement adaptive live stereo video streaming from two on-board cameras based on&lt;a href="https://docs.google.com/leaf?id=0BzV4szKbuvKwYzQwZDlhNjktMTVlOC00ZDczLThiZjQtZTRlMjcyYzRlZWIy&amp;amp;sort=name&amp;amp;layout=list&amp;amp;num=50"&gt; our previous work presented at Gstreamer conference 2010.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.pandaboard.org/"&gt;PandaBoard&lt;/a&gt; folks from TI offered the opportunity to win the PandaBoard at Gstreamer conference. To participate, it was necessary to submit description of the intended project. We did participate and were very glad to get notification that we will receive the PandaBoard for our stereo video streaming project (the board is already arrived). However, hardware accelerated video encoders are not yet released by TI. That is why we decide to make an iteration using BeagleBoard xM to check some new software ideas and make more integrated (more compact, less weight) hardware design as a preparation for the quad-copter development.&lt;br /&gt;
&lt;br /&gt;
For these purposes we develop small (approx. 200×140mm) vehicle based on &lt;a href="http://www.dfrobot.com/index.php?route=product/product&amp;amp;keyword=rp5&amp;amp;category_id=48&amp;amp;product_id=96"&gt;DFRobot's RP5 tracked platform&lt;/a&gt;. Two standard model motor controllers were used to drive motors. Control signals are standard PWMs used in modeling. On top of the platform we mount plastic box where BeagleBoard xM and level shifters are hidden. And finally on top of the vehicle we mount two Logitech 9000Pro USB cameras. The following pictures illustrate the whole mechanical design.&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-5R0meEKWptE/T9kDka1XCrI/AAAAAAAAARs/gtbEe5Cht6w/s1600/two-cameras.jpeg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-5R0meEKWptE/T9kDka1XCrI/AAAAAAAAARs/gtbEe5Cht6w/s1600/two-cameras.jpeg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Complete vehicle: RP5 tracked platform, box with BeagleBoard xM and 
soldered level shifters, TP-Link WLan N stick and two Logitech 9000Pro 
USB camera&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-1a4WGKmmcc0/T9kDjndsKrI/AAAAAAAAARk/Lqskq0z1E2c/s1600/inside.jpeg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-1a4WGKmmcc0/T9kDjndsKrI/AAAAAAAAARk/Lqskq0z1E2c/s1600/inside.jpeg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;There is a plenty of space remains within the box. We will need this space later when we will move to PandaBoard.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-tBPEWwdSvpk/T9kDiyg9b7I/AAAAAAAAARc/VTJvLaVQUTE/s1600/closer-inside.jpeg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-tBPEWwdSvpk/T9kDiyg9b7I/AAAAAAAAARc/VTJvLaVQUTE/s1600/closer-inside.jpeg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;More detailed view of the BeagleBoard xM inside&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-gfiVpVaux6o/T9kEUoQyQtI/AAAAAAAAAR4/ZORk9ohksh0/s1600/basement.jpeg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-gfiVpVaux6o/T9kEUoQyQtI/AAAAAAAAAR4/ZORk9ohksh0/s1600/basement.jpeg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;In the "basement": NiMh battery, two standard PWM motor controllers and power regulator module.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
We are quite happy with overall design. However it could not be considered as a final yet. There are two problems:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Very unstable camera mounts. In fact we did not decide yet which cameras we will use in the future. Current 9000Pro has great optic, UVC compliant and as a result works out of the box on the BeagleBoard with Angstrom. However, it is rather large and is very inconvenient to mount. That is why we are also considering the option to use much smaller analog cameras with corresponding USB grabber.&lt;/li&gt;
&lt;li&gt;Only two motors could be currently controlled directly from BeagleBoard. The reason is that only two hardware PWM generators are available on the expansion slot. Since our final goal is to build quad-copter, it is not an issue because we will be using I2C to communicate with motor controllers instead of PWM. However, more sensors will be necessary and not all of them are I2C devices (such as for example gyro and accelerometers). So most probably we will use the &lt;a href="http://arduino.cc/en/Main/ArduinoBoardNano"&gt;Arduino Nano&lt;/a&gt; micro-controller board to interface with sensors. As a side effect, it would be very easy to add more PWM channels to control additional motors and servos from Arduino for this particular vehicle.&lt;/li&gt;
&lt;/ol&gt;
We are currently working on these two issues and will post an update soon.&lt;br /&gt;
&lt;br /&gt;
Now to software part of the project. This vehicle is currently running Angstrom with modified and extended version of &lt;a href="http://www.gitorious.org/veter/pages/Home"&gt;our control applications&lt;/a&gt;. Similar to our previous vehicle we are using Angstrom Linux distribution, Gstreamer to work with video data, ZeroC Ice for communication and OpenGL for user interface. As a result, we can control the vehicle over the Internet and there is solution for firewall/NAT traversal problem and video adaptation for changing networking conditions.&lt;br /&gt;
&lt;br /&gt;
As mentioned at the very beginning of this post, our goal was to provide stereo vision for vehicle drivers. We are mixing left and right frame from two cameras in one large frame, compress it using Gstreamer and corresponding DSP-accelerated h264 encoder. Then, video is transmitted using Ice middleware to the client computer where we use &lt;a href="http://opencv.willowgarage.com/wiki/"&gt;OpenCV computer vision library&lt;/a&gt; to generate anaglyph stereo image. The result of this process is&lt;br /&gt;
illustrated on the following picture.&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-uQJp00OhG14/T9kDiFRm9aI/AAAAAAAAARY/7Pr9EoRA8P8/s1600/anaglyph.jpeg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-uQJp00OhG14/T9kDiFRm9aI/AAAAAAAAARY/7Pr9EoRA8P8/s1600/anaglyph.jpeg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Driver cockpit with anaglyph stereo video generated from two on-board 
cameras. Corresponding glasses (red/cyan) are required to see stereo 
effect.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
It might be possible to generate anaglyph image directly on BeagleBoard but we decide against it and instead transmit two whole left and right frames to the client. There are several reasons for it. First, using anaglyphs to achieve stereo effects leads to the partial lost of color information and as a result rather poor image quality. The more sophysticated approaches to display stereo images such as for example polarized glasses are available. They can display both images without losses. To utilize this approach it is necessary to transmit complete left and right frames to the visualization application (and this is what we are doing). Second reason is limited computation power available on on-board computer. As a result it is not feasible to implement computation intensive algorithms (such as for example &lt;a href="http://www.vis.uky.edu/%7Eliaomiao/GPUstereo.htm"&gt;real-time depth map calculation&lt;/a&gt;) on on-board computer. Instead it might be beneficial to run such algorithms on more powerful driver computer or even on high performance cluster (with GPUs, SPEs, FPGA or whatever might be most appropriate). For this purposes it is again necessary to transmit complete left and right frame to the driver's computer. Moreover, some widely-used computer vision libraries such as OpenCV are highly optimized for x86 platform and pretty slow on BeagleBoard. That is why, we decide against doing image processing on on-board computer and instead perform such calculation on driver's computer.&lt;br /&gt;
&lt;br /&gt;
This is our very first experiments with stereo vision and the code base is not as clean and stable as we want it to be. There are also some issues with camera calibration and positioning. That is why the stereo appearance of the image above is not as good as it could be. We are currently working very actively on it and will push the update to our &lt;a href="http://www.gitorious.org/veter/veter"&gt;git repository&lt;/a&gt; very soon.

&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/4943252639341748632/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2010/12/stereo-video-stream-from-on-board.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/4943252639341748632?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/4943252639341748632?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2010/12/stereo-video-stream-from-on-board.html" title="Stereo video stream from on-board cameras" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-5R0meEKWptE/T9kDka1XCrI/AAAAAAAAARs/gtbEe5Cht6w/s72-c/two-cameras.jpeg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0cBRX85fyp7ImA9WhVWEkw.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-7506924298799546086</id><published>2010-11-08T15:51:00.006+01:00</published><updated>2012-04-24T00:10:54.127+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-24T00:10:54.127+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="streaming" /><category scheme="http://www.blogger.com/atom/ns#" term="omap" /><category scheme="http://www.blogger.com/atom/ns#" term="conference" /><category scheme="http://www.blogger.com/atom/ns#" term="gstreamer" /><category scheme="http://www.blogger.com/atom/ns#" term="presentation" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>Embedded Linux and GStreamer Conference 2010</title><content type="html">&lt;div&gt;In the last week of October we participated in the &lt;a href="http://embeddedlinuxconference.com/elc_europe10/"&gt;Embedded Linux Conference Europe 2010&lt;/a&gt; (ELC-E) and presented at &lt;a href="http://gstreamer.freedesktop.org/conference/"&gt;GStreamer Conference 2010&lt;/a&gt;. Both conferences took place in the Cambridge, UK and boy, atmosphere in the town is just amazing, you feel history and ideas at every corner. But when you get back to the conference, it's just one level higher. There you see the folks working on real world problems and getting them solved. What was interesting: TI OMAP processors, Beagleboard and Pandaboard were pretty hot topic on both conferences. Introduction of OMAP4 processor and related presentation on enabling GStreamer support for this processor were enlightening.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;On the ELC-E we took part in the Case Study demo with our remotely controlled car and the feedback was great. We drove the car several times during couple of hours of case study and showed all inner electronics. Electronic components and plenty of wires always get attention :)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cJ352iIs1mY/TNxfTpudh5I/AAAAAAAABFc/O_If273jUUA/s1600/IMG_1516-1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 326px; height: 400px;" src="http://2.bp.blogspot.com/_cJ352iIs1mY/TNxfTpudh5I/AAAAAAAABFc/O_If273jUUA/s400/IMG_1516-1.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5538406432981747602" /&gt;&lt;/a&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;     &lt;/span&gt;    &lt;span class="Apple-style-span" style="font-size: small;"&gt;Getting ready to storm&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Everyone could try steering wheel and gas pedal worked great. Unfortunately, we could not allow everyone drive the car, there were way too many people in the room and wireless connection was patchy. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;During GStreamer Conference we presented our solution to the adaptive video streaming using Ice and GStreamer. Generally, adaptive video streaming was one of  the major topic on the conference. Several different approaches were introduced, but most of them are in early development stage. Our answer to the problem with using TCP buffer for monitoring was the only one with working example.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_cJ352iIs1mY/TNxiGiWvvQI/AAAAAAAABFk/kOCTHX3GBMo/s1600/IMG_1464-1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 352px;" src="http://4.bp.blogspot.com/_cJ352iIs1mY/TNxiGiWvvQI/AAAAAAAABFk/kOCTHX3GBMo/s400/IMG_1464-1.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5538409506199813378" /&gt;&lt;/a&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;   &lt;span class="Apple-style-span" style="font-size: small;"&gt;Presentation of adaptive video streaming&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The presentation with slides and demo videos are available in &lt;a href="https://docs.google.com/leaf?id=0BzV4szKbuvKwYzQwZDlhNjktMTVlOC00ZDczLThiZjQtZTRlMjcyYzRlZWIy&amp;amp;sort=name&amp;amp;layout=list&amp;amp;num=50"&gt;pdf&lt;/a&gt; or as a &lt;a href="https://docs.google.com/leaf?id=0BzV4szKbuvKwNTEwYTQwOGUtNzAzNi00NjQ5LTk2MjEtMWIzYTQzNjVkZTRh&amp;amp;sort=name&amp;amp;layout=list&amp;amp;num=50"&gt;zip bundle with screencasts&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Generally, the conference, the atmosphere and the people were simply great, highly recommended experience. &lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/7506924298799546086/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2010/11/embedded-linux-and-gstreamer-conference.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/7506924298799546086?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/7506924298799546086?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2010/11/embedded-linux-and-gstreamer-conference.html" title="Embedded Linux and GStreamer Conference 2010" /><author><name>Maxim Parkachov</name><uri>http://www.blogger.com/profile/08364684703549311765</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_cJ352iIs1mY/TNxfTpudh5I/AAAAAAAABFc/O_If273jUUA/s72-c/IMG_1516-1.JPG" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C08ASH44cCp7ImA9WhVaFks.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-3860877135700107548</id><published>2010-10-13T23:28:00.000+02:00</published><updated>2012-06-14T10:17:29.038+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-14T10:17:29.038+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="vehicle" /><category scheme="http://www.blogger.com/atom/ns#" term="streaming" /><category scheme="http://www.blogger.com/atom/ns#" term="omap" /><category scheme="http://www.blogger.com/atom/ns#" term="gstreamer" /><category scheme="http://www.blogger.com/atom/ns#" term="control" /><category scheme="http://www.blogger.com/atom/ns#" term="remote" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>Support for joysticks (wheels) is implemented</title><content type="html">We just pushed the new version of our cockpit and vehicle application to &lt;a href="http://www.gitorious.org/veter"&gt;our project repository at gitorious&lt;/a&gt;.&lt;br /&gt;
The main new feature in the cockpit application is support for joysticks. In fact, it also means support for steering wheels with pedals devices since they are "joysticks" from the OS point of view. We tested it with Logitech Formula Force RX wheel pictured below.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-De-Nx1LR1bE/T9md33xnqWI/AAAAAAAAAS8/B1TeJG5s2pU/s1600/wheel.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-De-Nx1LR1bE/T9md33xnqWI/AAAAAAAAAS8/B1TeJG5s2pU/s1600/wheel.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp;In addition, we add support for rear-view camera in the capturing and encoding pipeline which runs on the vehicle (BeagleBoard). However, we did not mechanically mount the second camera yet, that is why, by default, the rear view is generated by the videotestsrc element with "snow" pattern. But the tested working pipeline is already &lt;a href="http://www.gitorious.org/veter/veter/blobs/master/misc/car.config"&gt;in repository and can be found in the car configuration file&lt;/a&gt;. The following picture illustrates how it is shown by the cockpit application.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-dXoub1cJw1Y/T9md_GqH13I/AAAAAAAAATE/Sv16f0kJUFY/s1600/cockpit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-dXoub1cJw1Y/T9md_GqH13I/AAAAAAAAATE/Sv16f0kJUFY/s1600/cockpit.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
Please note the rectangle with "snow" patter in the top left corner. This is the place where the video from rear-view camera will be shown as soon as we mount the second camera to the vehicle.

&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/3860877135700107548/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2010/10/support-for-joysticks-wheels-is.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/3860877135700107548?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/3860877135700107548?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2010/10/support-for-joysticks-wheels-is.html" title="Support for joysticks (wheels) is implemented" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-De-Nx1LR1bE/T9md33xnqWI/AAAAAAAAAS8/B1TeJG5s2pU/s72-c/wheel.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEMMR3Yzeip7ImA9WhVaFks.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-4793078869417104186</id><published>2010-10-13T23:05:00.000+02:00</published><updated>2012-06-14T10:28:06.882+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-14T10:28:06.882+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="vehicle" /><category scheme="http://www.blogger.com/atom/ns#" term="streaming" /><category scheme="http://www.blogger.com/atom/ns#" term="omap" /><category scheme="http://www.blogger.com/atom/ns#" term="gstreamer" /><category scheme="http://www.blogger.com/atom/ns#" term="control" /><category scheme="http://www.blogger.com/atom/ns#" term="remote" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>New mechanical design</title><content type="html">We finally found the hardware design (mechanical and electrical) which we are going to stick with for some time. The main problem was power supply which was affected by the noise from motors. Using SparkFun's &lt;a href="http://www.sparkfun.com/commerce/product_info.php?products_id=9370"&gt;DC/DC converter breakout board&lt;/a&gt; and &lt;a href="http://www.sparkfun.com/commerce/product_info.php?products_id=8745"&gt;logic level converter&lt;/a&gt; we manage to isolate the noise from the main board. Here is how it looks like now:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-PrVh5dzZ-J4/T9mgX3kR55I/AAAAAAAAATM/Mh_yxmdln_4/s1600/beagle3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-PrVh5dzZ-J4/T9mgX3kR55I/AAAAAAAAATM/Mh_yxmdln_4/s1600/beagle3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-UZ1a36BjSLA/T9mgYhvTGoI/AAAAAAAAATQ/kjruB0aTPWo/s1600/chassi-cover.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-UZ1a36BjSLA/T9mgYhvTGoI/AAAAAAAAATQ/kjruB0aTPWo/s1600/chassi-cover.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-1PfezAJ3L58/T9mgaEg-o9I/AAAAAAAAATg/7fk1elmyaTk/s1600/t2-iso.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-1PfezAJ3L58/T9mgaEg-o9I/AAAAAAAAATg/7fk1elmyaTk/s1600/t2-iso.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
As you can see on the first picture, we are not using TrainerBoard for now. Instead we decide to generate two PWM signals to control steering and acceleration directly from BeagleBoard using GPIO pins available on expansion connector. Level converter is used to convert +1.8V to +5V required for standard RC controller and servo.

&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/4793078869417104186/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2010/10/new-mechanical-design.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/4793078869417104186?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/4793078869417104186?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2010/10/new-mechanical-design.html" title="New mechanical design" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-PrVh5dzZ-J4/T9mgX3kR55I/AAAAAAAAATM/Mh_yxmdln_4/s72-c/beagle3.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0cNR3s7cSp7ImA9WhVWEkw.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-3205525451907807977</id><published>2010-09-18T18:13:00.000+02:00</published><updated>2012-04-24T00:11:36.509+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-24T00:11:36.509+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="vehicle" /><category scheme="http://www.blogger.com/atom/ns#" term="streaming" /><category scheme="http://www.blogger.com/atom/ns#" term="gstreamer" /><category scheme="http://www.blogger.com/atom/ns#" term="remote" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>The first version of adaptive video streaming is implemented</title><content type="html">&amp;nbsp;We just pushed the update to &lt;a href="http://gitorious.org/veter"&gt;our repository at gitorious&lt;/a&gt;. This is our first implementation of the adaptive video streaming. To adapt to changing network conditions, we are tracking the size of output queue and adjust the frame size dynamically if the queue exceed certain size.&lt;br /&gt;
This functionality uses scaler element within gstreamer encoding pipeline. Scaler is located between video source element and encoding element. If we detect the Quality Of Service (QoS) condition we need to react (queue size is too large) then we pause the pipeline, adjust corresponding caps to instruct the scaler to reduce or enlarge frame size and then unpause the pipeline again. The implementation of this functionality could be found in &lt;br /&gt;
&lt;a href="http://gitorious.org/veter/veter/blobs/master/src/vehicle/VideoSenderThread.cpp"&gt;src/vehicle/VideoSenderThread.cpp&lt;/a&gt; file. In particular, VideoSenderThread::setFrameSize() function makes pipeline adjustments mentioned above. Starting at line 300 there is a piece of code which illustrates how we react on observed QoS conditions.

&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/3205525451907807977/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2010/09/first-version-of-adaptive-video.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/3205525451907807977?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/3205525451907807977?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2010/09/first-version-of-adaptive-video.html" title="The first version of adaptive video streaming is implemented" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0YFQHw6eCp7ImA9WhVWEkw.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-5239150243917814521</id><published>2010-08-12T11:31:00.000+02:00</published><updated>2012-04-24T00:11:51.210+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-24T00:11:51.210+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="conference" /><category scheme="http://www.blogger.com/atom/ns#" term="gstreamer" /><category scheme="http://www.blogger.com/atom/ns#" term="presentation" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>We will be talking about our project at Gstreamer conference 2010</title><content type="html">Our submission for&amp;nbsp;&lt;a href="http://gstreamer.freedesktop.org/conference/"&gt;Gstreamer conference 2010&lt;/a&gt; is accepted and we will be giving a &lt;a href="http://gstreamer.freedesktop.org/conference/gstreamer-conference-timetable.html"&gt;presentation at 16.30&lt;/a&gt; talking about video streaming related aspects in our BeagleBoard and Gstreamer based &lt;a href="http://www.gitorious.org/veter"&gt;project.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Title:&lt;/b&gt; &lt;br /&gt;
Using ICE middleware with GStreamer to implement real-time QoS-aware video streaming for remotely controlled vehicle.&lt;br /&gt;
&lt;b&gt;Abstract: &lt;/b&gt;&lt;br /&gt;
Typically, remotely controlled vehicles are equipped with video camera to let the remote driver see surrounding environment. To enable precise control of the vehicle over the Internet, it is necessary to assure low video latency and ability to adapt to the changing network conditions. In addition, low power consumption is required to increase the battery-based operation time. In this paper we: a) outline our embedded control system based on BeagleBoard open hardware and Ångström m Linux distribution; b) provide requirements, motivation and describe how we build real-time quality of service (QoS) aware video streaming solution with ICE open-source middleware and GStreamer on this platform; c) we contrast and compare our solution with RTP/RTCP-based streaming alternatives and d) provide performance measurements for our adaptation algorithms.&lt;br /&gt;
&lt;br /&gt;
In addition, we would be glad to make live demo where participants can drive our model car (approx. 30x40 cm size).

&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/5239150243917814521/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2010/08/we-will-be-talking-about-project-on.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/5239150243917814521?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/5239150243917814521?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2010/08/we-will-be-talking-about-project-on.html" title="We will be talking about our project at Gstreamer conference 2010" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CE8MSHY_eCp7ImA9WhVaFks.&quot;"><id>tag:blogger.com,1999:blog-1568445665356514244.post-8428896171266857559</id><published>2010-08-10T00:09:00.000+02:00</published><updated>2012-06-14T10:34:49.840+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-14T10:34:49.840+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="vehicle" /><category scheme="http://www.blogger.com/atom/ns#" term="streaming" /><category scheme="http://www.blogger.com/atom/ns#" term="omap" /><category scheme="http://www.blogger.com/atom/ns#" term="control" /><category scheme="http://www.blogger.com/atom/ns#" term="remote" /><category scheme="http://www.blogger.com/atom/ns#" term="beagleboard" /><title>Sources are published on Gitorious</title><content type="html">Veter project is the set of applications required to control remote vehicles over the Internet to organize races. Vehicles are equipped with on-board embedded computer (like for example BeagleBoard) connected to video camera and WLan adapter. The cockpit application let the driver see the video stream from on-board camera in real-time and control the vehicle over the Internet.&lt;br /&gt;
&lt;br /&gt;
Veter is a hobby project. We are working on it since about three years. A couple of days ago we decide to open our sources and publish the first version on Gitorious: &lt;a href="http://gitorious.org/veter/"&gt;http://gitorious.org/veter/&lt;/a&gt;. The documentation is not complete yet but I am working on it. You can take a look on &lt;a href="http://www.gitorious.org/veter/veter/trees/master/doc/overview" target="_blank"&gt;overview.pdf&lt;/a&gt; for more detailed project overview. Please make sure to check &lt;a href="http://www.gitorious.org/veter/veter/trees/master" target="_blank"&gt;README&lt;/a&gt; if you are going to try to compile it yourself.&lt;br /&gt;
&lt;br /&gt;
From the technology prospective, Veter project is based on the&amp;nbsp;&lt;a href="http://www.zeroc.com/ice.html"&gt;Internet Communication Engine (ICE)&lt;/a&gt;, &lt;a href="http://www.gstreamer.org/"&gt;GStreamer&lt;/a&gt; and OpenGL. It could run on Windows and Linux. Currently, we are using &lt;a href="http://www.beagleboard.org/"&gt;BeagleBoard&lt;/a&gt; and &lt;a href="http://www.tincantools.com/product.php?productid=16149&amp;amp;cat=255&amp;amp;page=1"&gt;TrainerBoard&lt;/a&gt; to control slightly modified RC car. The driver cockpit application is running on PC (Windows or Linux) and uses sophisticated visualization technique where decoded video is placed as a texture on the 3D model of the cockpit designed with Blender (the cockpit does not looks very attractive now because it was made by me :-) we are desperately need 3D artist who can help)&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-_UijewYCM2E/T9mhffCx8wI/AAAAAAAAATw/_-_2EWhdQY0/s1600/t1-side.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-_UijewYCM2E/T9mhffCx8wI/AAAAAAAAATw/_-_2EWhdQY0/s1600/t1-side.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-tno4-7ENaFk/T9mhgFy2WXI/AAAAAAAAAT0/b9H2C-m3E9E/s1600/trainer-connected.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-tno4-7ENaFk/T9mhgFy2WXI/AAAAAAAAAT0/b9H2C-m3E9E/s1600/trainer-connected.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Motor and steering connected to the AVR-s GPIO. AVR is a slave on I2C bus from BeagleBoard.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-wRoYTz9tQco/T9mhegV5jWI/AAAAAAAAATo/qihY_IOd6no/s1600/beagleandhub.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-wRoYTz9tQco/T9mhegV5jWI/AAAAAAAAATo/qihY_IOd6no/s1600/beagleandhub.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The whole sandwich: BeagleBoard, Trainer (on the opposite site), USB HUB with camera and WLan adapter&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license" title="Creative Commons Attribution 3.0 License"&gt;
&lt;img alt="License" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /&gt;
&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;span style="font-size: x-small;"&gt;Content on 
&lt;/span&gt;&lt;span href="http://creativecommons.org" property="cc:attributionName" rel="cc:attributionURL" style="font-size: x-small;"&gt;this site&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; 
is licensed under a 
&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;
Creative Commons Attribution 3.0 License
&lt;/a&gt;.
&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;Visit http://veterobot.org for more details.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://veter-project.blogspot.com/feeds/8428896171266857559/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://veter-project.blogspot.com/2010/08/sources-are-published-on-gitorious.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/8428896171266857559?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1568445665356514244/posts/default/8428896171266857559?v=2" /><link rel="alternate" type="text/html" href="http://veter-project.blogspot.com/2010/08/sources-are-published-on-gitorious.html" title="Sources are published on Gitorious" /><author><name>Andrey Nechypurenko</name><uri>https://plus.google.com/112689657450128289662</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-oqXxXsclGUk/AAAAAAAAAAI/AAAAAAAAAVo/jtQQqg2eleU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-_UijewYCM2E/T9mhffCx8wI/AAAAAAAAATw/_-_2EWhdQY0/s72-c/t1-side.jpg" height="72" width="72" /><thr:total>1</thr:total></entry></feed>
