<?xml version="1.0" encoding="iso-8859-1"?><!-- generator="b2evolution/3.3.3" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>killerschafs blog</title>
		<link>http://blog.killerschaf.de/index.php</link>
		<atom:link rel="self" type="application/rss+xml" href="http://blog.killerschaf.de/index.php?tempskin=_rss2" />
		<description></description>
		<language>de-DE</language>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=3.3.3"/>
		<ttl>60</ttl>
				<item>
			<title>Lange nichts passiert</title>
			<link>http://blog.killerschaf.de/index.php/2010/05/23/lange-nichts-passiert</link>
			<pubDate>Sun, 23 May 2010 13:46:48 +0000</pubDate>			<dc:creator>killerschaf</dc:creator>
			<category domain="main">Das Projekt</category>			<guid isPermaLink="false">24@http://blog.killerschaf.de/</guid>
						<description>&lt;p&gt;Heyho&lt;/p&gt;
&lt;p&gt;hier ist lange nichts passiert. Das liegt zum Einen an meinem zweiw&amp;#246;chigen USA-Aufenthalt und zum Anderen am sch&amp;#246;nen Wetter draussen.&lt;/p&gt;
&lt;p&gt;Dennoch: Die n&amp;#228;chsten Schritte sind klar: Tracking der Fahrbefehle, Ansteuern von bestimmten Koordinaten, Rekalibrierung der durch die Akkumulation kleiner Fehler entstehenden Koordinatendifferenzen.&lt;/p&gt;
&lt;p&gt;Die ersten beiden Punkte sind einfach, der letzte nicht.&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.killerschaf.de/index.php/2010/05/23/lange-nichts-passiert&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Heyho</p>
<p>hier ist lange nichts passiert. Das liegt zum Einen an meinem zweiw&#246;chigen USA-Aufenthalt und zum Anderen am sch&#246;nen Wetter draussen.</p>
<p>Dennoch: Die n&#228;chsten Schritte sind klar: Tracking der Fahrbefehle, Ansteuern von bestimmten Koordinaten, Rekalibrierung der durch die Akkumulation kleiner Fehler entstehenden Koordinatendifferenzen.</p>
<p>Die ersten beiden Punkte sind einfach, der letzte nicht.</p>
<p>&#160;</p>
<p>&#160;</p><div class="item_footer"><p><small><a href="http://blog.killerschaf.de/index.php/2010/05/23/lange-nichts-passiert">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://blog.killerschaf.de/index.php/2010/05/23/lange-nichts-passiert#comments</comments>
			<wfw:commentRss>http://blog.killerschaf.de/index.php?tempskin=_rss2&#38;disp=comments&#38;p=24</wfw:commentRss>
		</item>
				<item>
			<title>PC steuert Kyosho Rock Force</title>
			<link>http://blog.killerschaf.de/index.php/2010/04/18/pc-steuert-kyosho-rock-force</link>
			<pubDate>Sun, 18 Apr 2010 19:48:13 +0000</pubDate>			<dc:creator>killerschaf</dc:creator>
			<category domain="main">Das Projekt</category>			<guid isPermaLink="false">23@http://blog.killerschaf.de/</guid>
						<description>&lt;p&gt;Bisher wurde der Kyosho nur mit der originalen Fernbedienung gesteuert. Das Tracking des Fahrzeugs wurde ausschlie&amp;#223;lich &amp;#252;ber die Webcambilder gemacht. Dieses Verfahren allein ist, wie wir gesehen haben, nicht sonderlich geeignet um allein die Positionserfassung zu erm&amp;#246;glichen. Damit das Fahrzeug autonom fahren kann, muss der PC es steuern k&amp;#246;nnen. Die Steuerungsinformationen des Fahrzeugs k&amp;#246;nnen genutzt werden das bisherige Tracking zu erg&amp;#228;nzen. Doch wie kann ein handels&amp;#252;blicher PC ein RC-Fahrzeug steuern?&lt;/p&gt;
&lt;p&gt;M&amp;#246;glichkeit 1. Auf das Fahrzeug kommt ein Mikrokontroller, der &amp;#252;ber WLAN ansprechbar ist und die Servomotoren mit g&amp;#228;ngiger PWM (Pulsweitenmodulation) anspricht. Dagegen spricht: Eine &amp;#228;hnliche Variante hatten wir bereits mit dem ersten LEGO-Auto. Letztlich muss das Auto viel zus&amp;#228;tzliche Hardware transportieren und mit Strom versorgen. Eine TCP/IP Kopplung ist f&amp;#252;r Echtzeitanwendungen auch nicht unbedingt pr&amp;#228;destiniert. Diese Variante scheidet also aus.&lt;/p&gt;
&lt;p&gt;M&amp;#246;glichkeit 2. Man nutzt die vorhandene Fernbedienung, und bringt sie dazu das zu senden, was man m&amp;#246;chte. Wie tut man dies? Ich habe absichtlich eine billige Fernbedienung gekauft, in der Hoffnung, die verbaute Technik ist simpel. Und das ist sie auch. Die Fernbedienung ist ein 40MHz&amp;#160; FM Sender. Gesendet wird ein sogenannter PPM-Code. Dies steht f&amp;#252;r Pulse Position Modulation. &amp;#220;ber die L&amp;#228;nge von Pausen zwischen zwei Impulsen werden die einzelnen Kan&amp;#228;le (und somit Servostellungen) sequentiell &amp;#252;ber eine 40MHz Frequenz gefunkt. Die Impulse selbst&amp;#160;sind immer gleich lang. Synchronisiert wird &amp;#252;ber eine &amp;#252;berlange Pause am Anfang/Ende der Sequenz. Ein Frame ist dabei ca 20ms lang.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://www.killerschaf.de/images/ppm.jpg&quot; width = &quot;75%&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;Hierbei ist zu beachten: In der Literatur findet sich auch eine andere Beschreibung von PPM. Hier wird &amp;#252;ber die L&amp;#228;nge von Pulsen moduliert, ein &amp;#252;berlanger Startpuls dient als Synchronisation und die Abst&amp;#228;nder zweier Pulse ist immer gleich. Diese beiden Beschreibungen sind identisch, wenn man Puls und Pause vertauscht.&lt;/p&gt;
&lt;p&gt;Jeder, der schon einmal eine Windows/Linux-Anwendung programmiert hat und versucht hat dabei einen Timer zu verwenden, der Millisekundengenau aufl&amp;#246;st und dabei kl&amp;#228;glich gescheitert ist, wird sich jetzt fragen: Wie soll so etwas funktionieren? G&amp;#228;ngige Timer unter Windows/Linux l&amp;#246;sen nur 16ms auf. Weiterhin kann das Multitasking einem einen Strich durch die Rechnung machen, in dem es einfach mal einen Prozess ein paar Millisekunden aussetzen l&amp;#228;sst. Die L&amp;#246;sung ist dennoch denkbar einfach: Man nimmt die Soundkarte! Eine Soundkarte feuert bei einer Samplingrate von 44.1kHz (CD-Qualit&amp;#228;t) 44100 Samples in einer Sekunde auf die Lautsprecher. Dabei sind die Soundkarten bestrebt, dies so gut wie m&amp;#246;glich zu machen, damit einem beim H&amp;#246;ren einer CD nicht die Ohren abfallen. Ein PPM-Frame umfasst etwa 20ms. In 20ms kann eine Soundkarte&amp;#160;bei CD-Qualit&amp;#228;t&amp;#160;20ms*44.1Samples/ms = 882 Samples losschicken.&amp;#160; In diesen 882 Samples kann ich nun meine Kan&amp;#228;le modulieren. F&amp;#252;r einen Kanal steht etwa 1ms zur Verf&amp;#252;gung, dies entspricht damit 44.1 Stufen pro Kanal. Dies ist nicht sonderlich gut, aber ausreichend und vor allem in Echtzeit und ohne zus&amp;#228;tzlichen Hardwareaufwand. Also wurde die Fernbedienung kurzerhand auseindergebaut und das PPM Signal auf einem Oszilloskop betrachtet. Dann wurde dieses Signal &amp;#252;ber die Soundkarte nachgebaut.&lt;/p&gt;
&lt;p&gt;Intern habe ich DirectX, bzw genauer XAudio2 (Nachfolger von Direct Sound) verwendet und einen PPM-Frame mit einer Streamingvariante &amp;#252;ber zwei abwechselnde Audiobuffer abgespielt. Soweit so gut, man kann also PPM &amp;#252;ber eine Soundkarte ausgeben. H&amp;#246;ren kann man das somit nat&amp;#252;rlich auch. Aber wie kommt das Signal nun zum Auto? Die FM-Modulation auf die 40MHz Tr&amp;#228;gerfrequenz &amp;#252;bernimmt weiterhin die Fernbedienung. Hierzu musste man lediglich kurz vor der Hochfrequenzeinheit der Fernbedienung das Signal der Soundkarte einspeisen. Damit ich meine Fernbedienung nicht gleich vernichte, hat mein Vater wieder einmal den L&amp;#246;tkolben geschwungen und nun hat meine Ansmann W3 Fernbedienung eine Stereobuchse bekommen. Musik sollte man hier jedoch nicht einspielen, das Auto interpretiert diese Signalfolgen n&amp;#228;mlich ebenfalls als PPM und versucht dann zur Musik passend zu tanzen!&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.killerschaf.de/index.php/2010/04/18/pc-steuert-kyosho-rock-force&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Bisher wurde der Kyosho nur mit der originalen Fernbedienung gesteuert. Das Tracking des Fahrzeugs wurde ausschlie&#223;lich &#252;ber die Webcambilder gemacht. Dieses Verfahren allein ist, wie wir gesehen haben, nicht sonderlich geeignet um allein die Positionserfassung zu erm&#246;glichen. Damit das Fahrzeug autonom fahren kann, muss der PC es steuern k&#246;nnen. Die Steuerungsinformationen des Fahrzeugs k&#246;nnen genutzt werden das bisherige Tracking zu erg&#228;nzen. Doch wie kann ein handels&#252;blicher PC ein RC-Fahrzeug steuern?</p>
<p>M&#246;glichkeit 1. Auf das Fahrzeug kommt ein Mikrokontroller, der &#252;ber WLAN ansprechbar ist und die Servomotoren mit g&#228;ngiger PWM (Pulsweitenmodulation) anspricht. Dagegen spricht: Eine &#228;hnliche Variante hatten wir bereits mit dem ersten LEGO-Auto. Letztlich muss das Auto viel zus&#228;tzliche Hardware transportieren und mit Strom versorgen. Eine TCP/IP Kopplung ist f&#252;r Echtzeitanwendungen auch nicht unbedingt pr&#228;destiniert. Diese Variante scheidet also aus.</p>
<p>M&#246;glichkeit 2. Man nutzt die vorhandene Fernbedienung, und bringt sie dazu das zu senden, was man m&#246;chte. Wie tut man dies? Ich habe absichtlich eine billige Fernbedienung gekauft, in der Hoffnung, die verbaute Technik ist simpel. Und das ist sie auch. Die Fernbedienung ist ein 40MHz&#160; FM Sender. Gesendet wird ein sogenannter PPM-Code. Dies steht f&#252;r Pulse Position Modulation. &#220;ber die L&#228;nge von Pausen zwischen zwei Impulsen werden die einzelnen Kan&#228;le (und somit Servostellungen) sequentiell &#252;ber eine 40MHz Frequenz gefunkt. Die Impulse selbst&#160;sind immer gleich lang. Synchronisiert wird &#252;ber eine &#252;berlange Pause am Anfang/Ende der Sequenz. Ein Frame ist dabei ca 20ms lang.</p>
<p style="text-align: center;"><img src="http://www.killerschaf.de/images/ppm.jpg" width = "75%" alt="" /></p>
<p>&#160;</p>
<p>&#160;Hierbei ist zu beachten: In der Literatur findet sich auch eine andere Beschreibung von PPM. Hier wird &#252;ber die L&#228;nge von Pulsen moduliert, ein &#252;berlanger Startpuls dient als Synchronisation und die Abst&#228;nder zweier Pulse ist immer gleich. Diese beiden Beschreibungen sind identisch, wenn man Puls und Pause vertauscht.</p>
<p>Jeder, der schon einmal eine Windows/Linux-Anwendung programmiert hat und versucht hat dabei einen Timer zu verwenden, der Millisekundengenau aufl&#246;st und dabei kl&#228;glich gescheitert ist, wird sich jetzt fragen: Wie soll so etwas funktionieren? G&#228;ngige Timer unter Windows/Linux l&#246;sen nur 16ms auf. Weiterhin kann das Multitasking einem einen Strich durch die Rechnung machen, in dem es einfach mal einen Prozess ein paar Millisekunden aussetzen l&#228;sst. Die L&#246;sung ist dennoch denkbar einfach: Man nimmt die Soundkarte! Eine Soundkarte feuert bei einer Samplingrate von 44.1kHz (CD-Qualit&#228;t) 44100 Samples in einer Sekunde auf die Lautsprecher. Dabei sind die Soundkarten bestrebt, dies so gut wie m&#246;glich zu machen, damit einem beim H&#246;ren einer CD nicht die Ohren abfallen. Ein PPM-Frame umfasst etwa 20ms. In 20ms kann eine Soundkarte&#160;bei CD-Qualit&#228;t&#160;20ms*44.1Samples/ms = 882 Samples losschicken.&#160; In diesen 882 Samples kann ich nun meine Kan&#228;le modulieren. F&#252;r einen Kanal steht etwa 1ms zur Verf&#252;gung, dies entspricht damit 44.1 Stufen pro Kanal. Dies ist nicht sonderlich gut, aber ausreichend und vor allem in Echtzeit und ohne zus&#228;tzlichen Hardwareaufwand. Also wurde die Fernbedienung kurzerhand auseindergebaut und das PPM Signal auf einem Oszilloskop betrachtet. Dann wurde dieses Signal &#252;ber die Soundkarte nachgebaut.</p>
<p>Intern habe ich DirectX, bzw genauer XAudio2 (Nachfolger von Direct Sound) verwendet und einen PPM-Frame mit einer Streamingvariante &#252;ber zwei abwechselnde Audiobuffer abgespielt. Soweit so gut, man kann also PPM &#252;ber eine Soundkarte ausgeben. H&#246;ren kann man das somit nat&#252;rlich auch. Aber wie kommt das Signal nun zum Auto? Die FM-Modulation auf die 40MHz Tr&#228;gerfrequenz &#252;bernimmt weiterhin die Fernbedienung. Hierzu musste man lediglich kurz vor der Hochfrequenzeinheit der Fernbedienung das Signal der Soundkarte einspeisen. Damit ich meine Fernbedienung nicht gleich vernichte, hat mein Vater wieder einmal den L&#246;tkolben geschwungen und nun hat meine Ansmann W3 Fernbedienung eine Stereobuchse bekommen. Musik sollte man hier jedoch nicht einspielen, das Auto interpretiert diese Signalfolgen n&#228;mlich ebenfalls als PPM und versucht dann zur Musik passend zu tanzen!</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p><div class="item_footer"><p><small><a href="http://blog.killerschaf.de/index.php/2010/04/18/pc-steuert-kyosho-rock-force">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://blog.killerschaf.de/index.php/2010/04/18/pc-steuert-kyosho-rock-force#comments</comments>
			<wfw:commentRss>http://blog.killerschaf.de/index.php?tempskin=_rss2&#38;disp=comments&#38;p=23</wfw:commentRss>
		</item>
				<item>
			<title>Kleines Update</title>
			<link>http://blog.killerschaf.de/index.php/2010/04/18/kleines-update</link>
			<pubDate>Sun, 18 Apr 2010 19:03:27 +0000</pubDate>			<dc:creator>killerschaf</dc:creator>
			<category domain="main">Das Projekt</category>			<guid isPermaLink="false">22@http://blog.killerschaf.de/</guid>
						<description>&lt;p&gt;In den letzten Wochen habe ich hier nicht viel geschrieben. Dies hole ich jetzt hiermit nach. Was ist geschehen?&lt;/p&gt;
&lt;p&gt;Es wurden einige Versuche gemacht, die Fahrzeugbewegungserfassung mit Hilfe des optischen Flusses zu verbessern. Ich habe hierzu noch das ein oder andere Paper gelesen, welche allesamt vielversprechend klangen, aber in der Praxis kaum eine Verbesserung brachten. Optischer Fluss bleibt immer eine Sch&amp;#228;tzung. Eine pr&amp;#228;zise Ableitung einer Bewegung kann nicht alleine mit optischem Fluss realisiert werden. Die Ergebnisse, die es in der Praxis gibt, sind allerdings bereits in der Horn/Schunk Variante so gut, dass die bisherigen Paper, die ich gelesen&amp;#160;und teilweise implementiert habe,&amp;#160;diese kaum verbessern k&amp;#246;nnen. Daher bleibe ich bei dieser Variante, nicht zuletzt weil sie die einfachste Variante ist.&lt;/p&gt;
&lt;p&gt;Folgende Versuche wurden unternommen um die Verfolgung zu optimieren:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;#160;Ein Wohnungsmodell wurde auf Basis eines vorhandenen Grundrisses erstellt. In das Modell wurden absichtlich keine M&amp;#246;belst&amp;#252;cke eingezeichnet, da dies erstens zu viel Aufwand ist, und zweitens sich diese M&amp;#246;belst&amp;#252;cke zum Teil zu verschiedenen Zeiten an verschiedenen Orten befinden k&amp;#246;nnen (z.B. St&amp;#252;hle, Couchtisch etc). Berechnet man nun ein Tiefenmodell dessen, was das Modellfahrzeug in der Modellwohnung sehen m&amp;#252;sste, so kann man die gewonnenen Tiefen mit dem Tiefenbild der Webcam vergleichen. Da in dem Modell allerdings die M&amp;#246;bel fehlen, so hat man es selbst bei einer perfekten Tiefenberechnung der Webcambilder immer mit Abweichungen zwischen Modell und Wirklichkeit zu tun. Eine Situation kann hiermit jedoch halbwegs sinnvoll verbessert werden: Sieht das Fahrzeug mit der Webcam z.B. eine Tiefe von 4m in der Mitte des Bildes, und zeigt das Modell eine Tiefe von 3m an dieser Stelle, so muss das Fahrzeug eine Korrektur nach&amp;#160;hinten erfahren. Andersherum gilt dies nicht, da M&amp;#246;belst&amp;#252;cke einen geringeren Tiefeneindruck als die des Modells bewirken. Einen weiteren Vorteil durch das Modell hat man: Das Fahrzeug kann nicht durch W&amp;#228;nde fahren. F&amp;#228;hrt das Modell durch eine Wand so kann hier vorher eingegriffen werden und das Modell seitlich verschoben werden, in die Richtung, die besser zu dem Tiefenbild der Webcam passt. In der Praxis f&amp;#252;hrt dies zu Spr&amp;#252;ngen des Fahrzeugs innerhalb seiner 3D-Welt. Allerdings k&amp;#246;nnen somit auch l&amp;#228;ngere Fahrten gemacht werden, ohne dass sich das Fahrzeug v&amp;#246;llig verirrt. Dies kann nat&amp;#252;rlich nie ausgeschlossen werden, denn die korrigierenden Eingriffe sind einfachster Natur und k&amp;#246;nnen die Situation durchaus auch verschlechtern.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://www.killerschaf.de/images/wohnunggr.jpg&quot; alt=&quot;&quot; width=&quot;70%&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;Reifentracking. Da der optische Fluss eine Sch&amp;#228;tzung ist und das zu Grunde liegende Material beliebig komplex sein kann, habe ich versucht das zu Grunde liegende Bildmaterial zu vereinfachen. Die Kamera wurde auf die Vorderreifen des Modells ausgerichtet. Der optische Fluss des Stollenprofils der Reifen sollte Testweise genutzt werden um die Fahrzeugbewegung zu verfolgen. Das Tracking gelingt auf Anhieb erstaunlich gut. Der Fluss des Stollenprofils der Reifen ist gut geeignet um verschiedene Geschwindigkeiten und Lenkeinstellungen pr&amp;#228;zise zu ermitteln. Leider gibt es bei diesem Verfahren ein Problem. &amp;#220;berschreitet das Fahrzeug eine bestimmte Geschwindigkeit kehrt sich der optische Fluss des Stollenprofils um und das Fahrzeug invertiert seine Geschwindigkeit. Dies ist ein Ph&amp;#228;nomen,&amp;#160;welches&amp;#160;wohl jedem Zuschauer von Gl&amp;#252;cksrad bekannt sein d&amp;#252;rfte. Die optische Wirkung der Drehrichtung kehrt&amp;#160;sich bei hohen Geschwindigkeiten pl&amp;#246;tzlich um.&amp;#160;Leider liegt diese Kipp-Geschwindigkeit hier bereits bei 1/3 der maximalen Geschwindigkeit des Fahrzeugs. Des weiteren geht sehr viel Bildeindruck verloren, da die Reifen einen Gro&amp;#223;teil des Bildes einnehmen. Aus diesen Gr&amp;#252;nden wurde dieses Verfahren nicht weiter verfolgt.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&amp;#160;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.killerschaf.de/index.php/2010/04/18/kleines-update&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>In den letzten Wochen habe ich hier nicht viel geschrieben. Dies hole ich jetzt hiermit nach. Was ist geschehen?</p>
<p>Es wurden einige Versuche gemacht, die Fahrzeugbewegungserfassung mit Hilfe des optischen Flusses zu verbessern. Ich habe hierzu noch das ein oder andere Paper gelesen, welche allesamt vielversprechend klangen, aber in der Praxis kaum eine Verbesserung brachten. Optischer Fluss bleibt immer eine Sch&#228;tzung. Eine pr&#228;zise Ableitung einer Bewegung kann nicht alleine mit optischem Fluss realisiert werden. Die Ergebnisse, die es in der Praxis gibt, sind allerdings bereits in der Horn/Schunk Variante so gut, dass die bisherigen Paper, die ich gelesen&#160;und teilweise implementiert habe,&#160;diese kaum verbessern k&#246;nnen. Daher bleibe ich bei dieser Variante, nicht zuletzt weil sie die einfachste Variante ist.</p>
<p>Folgende Versuche wurden unternommen um die Verfolgung zu optimieren:</p>
<ul>
<li>&#160;Ein Wohnungsmodell wurde auf Basis eines vorhandenen Grundrisses erstellt. In das Modell wurden absichtlich keine M&#246;belst&#252;cke eingezeichnet, da dies erstens zu viel Aufwand ist, und zweitens sich diese M&#246;belst&#252;cke zum Teil zu verschiedenen Zeiten an verschiedenen Orten befinden k&#246;nnen (z.B. St&#252;hle, Couchtisch etc). Berechnet man nun ein Tiefenmodell dessen, was das Modellfahrzeug in der Modellwohnung sehen m&#252;sste, so kann man die gewonnenen Tiefen mit dem Tiefenbild der Webcam vergleichen. Da in dem Modell allerdings die M&#246;bel fehlen, so hat man es selbst bei einer perfekten Tiefenberechnung der Webcambilder immer mit Abweichungen zwischen Modell und Wirklichkeit zu tun. Eine Situation kann hiermit jedoch halbwegs sinnvoll verbessert werden: Sieht das Fahrzeug mit der Webcam z.B. eine Tiefe von 4m in der Mitte des Bildes, und zeigt das Modell eine Tiefe von 3m an dieser Stelle, so muss das Fahrzeug eine Korrektur nach&#160;hinten erfahren. Andersherum gilt dies nicht, da M&#246;belst&#252;cke einen geringeren Tiefeneindruck als die des Modells bewirken. Einen weiteren Vorteil durch das Modell hat man: Das Fahrzeug kann nicht durch W&#228;nde fahren. F&#228;hrt das Modell durch eine Wand so kann hier vorher eingegriffen werden und das Modell seitlich verschoben werden, in die Richtung, die besser zu dem Tiefenbild der Webcam passt. In der Praxis f&#252;hrt dies zu Spr&#252;ngen des Fahrzeugs innerhalb seiner 3D-Welt. Allerdings k&#246;nnen somit auch l&#228;ngere Fahrten gemacht werden, ohne dass sich das Fahrzeug v&#246;llig verirrt. Dies kann nat&#252;rlich nie ausgeschlossen werden, denn die korrigierenden Eingriffe sind einfachster Natur und k&#246;nnen die Situation durchaus auch verschlechtern.</li>
</ul>
<p style="text-align: center;"><img src="http://www.killerschaf.de/images/wohnunggr.jpg" alt="" width="70%" /></p>
<ul>
<li>
<div style="text-align: left;">Reifentracking. Da der optische Fluss eine Sch&#228;tzung ist und das zu Grunde liegende Material beliebig komplex sein kann, habe ich versucht das zu Grunde liegende Bildmaterial zu vereinfachen. Die Kamera wurde auf die Vorderreifen des Modells ausgerichtet. Der optische Fluss des Stollenprofils der Reifen sollte Testweise genutzt werden um die Fahrzeugbewegung zu verfolgen. Das Tracking gelingt auf Anhieb erstaunlich gut. Der Fluss des Stollenprofils der Reifen ist gut geeignet um verschiedene Geschwindigkeiten und Lenkeinstellungen pr&#228;zise zu ermitteln. Leider gibt es bei diesem Verfahren ein Problem. &#220;berschreitet das Fahrzeug eine bestimmte Geschwindigkeit kehrt sich der optische Fluss des Stollenprofils um und das Fahrzeug invertiert seine Geschwindigkeit. Dies ist ein Ph&#228;nomen,&#160;welches&#160;wohl jedem Zuschauer von Gl&#252;cksrad bekannt sein d&#252;rfte. Die optische Wirkung der Drehrichtung kehrt&#160;sich bei hohen Geschwindigkeiten pl&#246;tzlich um.&#160;Leider liegt diese Kipp-Geschwindigkeit hier bereits bei 1/3 der maximalen Geschwindigkeit des Fahrzeugs. Des weiteren geht sehr viel Bildeindruck verloren, da die Reifen einen Gro&#223;teil des Bildes einnehmen. Aus diesen Gr&#252;nden wurde dieses Verfahren nicht weiter verfolgt.</div>
</li>
</ul>
<p style="text-align: left;">&#160;</p><div class="item_footer"><p><small><a href="http://blog.killerschaf.de/index.php/2010/04/18/kleines-update">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://blog.killerschaf.de/index.php/2010/04/18/kleines-update#comments</comments>
			<wfw:commentRss>http://blog.killerschaf.de/index.php?tempskin=_rss2&#38;disp=comments&#38;p=22</wfw:commentRss>
		</item>
				<item>
			<title>GPU Power</title>
			<link>http://blog.killerschaf.de/index.php/2010/03/28/gpu-power</link>
			<pubDate>Sun, 28 Mar 2010 10:55:21 +0000</pubDate>			<dc:creator>killerschaf</dc:creator>
			<category domain="main">Das Projekt</category>			<guid isPermaLink="false">21@http://blog.killerschaf.de/</guid>
						<description>&lt;p&gt;Wieder mal was Neues. Gestern habe ich mich mal ein wenig in die Konzepte von Rechnen auf der Grafikkarte eingearbeitet. Und ich bin fast vom Stuhl gefallen.... Meine schon 1 1/2 Jahre alte GeForce 8800 GTS stellt mein Core2Duo mit 3GHz sowas von in den Schatten, das ist schon erstaunlich. Habe den Optischen Fluss Algorithmus nun auf der GPU implementiert. Vorher waren etwa 5 Iterationen pro Bild in Echtzeit m&amp;#246;glich (wenn man nicht die gesamte CPU blockieren wollte). Die vorherige Version lief auf einem 1/25 gro&amp;#223;en Originalbild (5x5 Bl&amp;#246;cke). Die jetzige Version auf der GPU l&amp;#228;uft auf 128 Cores parallel und schafft auf den nicht verkleinerten Bildern etwa 200 Iterationen. Die Dinger sind echte Rechenmonster.&lt;/p&gt;
&lt;p&gt;Viel besser werden die Ergebnisse zwar nicht, aber daf&amp;#252;r hat man mehr CPU Power f&amp;#252;r andere Dinge &amp;#252;brig. Ich werde sie versuchen weise einzusetzen :-)&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.killerschaf.de/index.php/2010/03/28/gpu-power&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Wieder mal was Neues. Gestern habe ich mich mal ein wenig in die Konzepte von Rechnen auf der Grafikkarte eingearbeitet. Und ich bin fast vom Stuhl gefallen.... Meine schon 1 1/2 Jahre alte GeForce 8800 GTS stellt mein Core2Duo mit 3GHz sowas von in den Schatten, das ist schon erstaunlich. Habe den Optischen Fluss Algorithmus nun auf der GPU implementiert. Vorher waren etwa 5 Iterationen pro Bild in Echtzeit m&#246;glich (wenn man nicht die gesamte CPU blockieren wollte). Die vorherige Version lief auf einem 1/25 gro&#223;en Originalbild (5x5 Bl&#246;cke). Die jetzige Version auf der GPU l&#228;uft auf 128 Cores parallel und schafft auf den nicht verkleinerten Bildern etwa 200 Iterationen. Die Dinger sind echte Rechenmonster.</p>
<p>Viel besser werden die Ergebnisse zwar nicht, aber daf&#252;r hat man mehr CPU Power f&#252;r andere Dinge &#252;brig. Ich werde sie versuchen weise einzusetzen :-)</p><div class="item_footer"><p><small><a href="http://blog.killerschaf.de/index.php/2010/03/28/gpu-power">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://blog.killerschaf.de/index.php/2010/03/28/gpu-power#comments</comments>
			<wfw:commentRss>http://blog.killerschaf.de/index.php?tempskin=_rss2&#38;disp=comments&#38;p=21</wfw:commentRss>
		</item>
				<item>
			<title>Obstacle Detection</title>
			<link>http://blog.killerschaf.de/index.php/2010/03/27/obstacle-detection</link>
			<pubDate>Sat, 27 Mar 2010 14:17:57 +0000</pubDate>			<dc:creator>killerschaf</dc:creator>
			<category domain="main">Das Projekt</category>			<guid isPermaLink="false">20@http://blog.killerschaf.de/</guid>
						<description>&lt;p&gt;F&amp;#252;r einen autonomen Roboter ist es unbedingt notwendig, eine echtzeitf&amp;#228;hige Hinderniserkennung zu nutzen. Die Aufgabe ist also aus einem Bild, oder aus einer Sequenz von Bildern f&amp;#252;r jeden Bildpunkt eine Tiefe absch&amp;#228;tzen zu k&amp;#246;nnen. Es gibt zahllose Ans&amp;#228;tze und Paper, die diese Aufgabe versuchen zu erf&amp;#252;llen. Eine gro&amp;#223;e Anzahl an Papern bedeutet allerdings nicht, wie man hoffen k&amp;#246;nnte, dass es zahllose Algorithmen gibt, die diese Aufgabe zufriedenstellend erf&amp;#252;llen k&amp;#246;nnen. Das Gegenteil ist der Fall. Je mehr wissenschaftliche Paper es zu einer Problemstellung gibt, desto eher versagen alle darin vorgestellten Algorithmen in der Realit&amp;#228;t. Warum? Angenommen jemand findet eine ganz hervorragende L&amp;#246;sung f&amp;#252;r eine Problemstellung, welche sehr akkurate Ergebnisse in Echtzeit ermittelt. Dann g&amp;#228;be es keinen Forschungsbedarf mehr f&amp;#252;r diese Aufgabenstellung. Dann g&amp;#228;be es aber auch keine neuen Paper mehr zu dieser Aufgabe.&lt;/p&gt;
&lt;p&gt;Das Schlimme an der Vielzahl der Paper ist: Ein Author eines Papers w&amp;#252;rde nie einen Algorithmus vorstellen um hinterher im Ergebnisteil seines Papers zu schreiben, dass der Algorithmus totale Gr&amp;#252;tze ist, eine gigantische Rechenzeit ben&amp;#246;tigt und die Ergebnisse nur unter Laborbedingungen brauchbar sind.&lt;/p&gt;
&lt;p&gt;In der Informatik lernt man, dass manche Problemstellungen einfach so schwierig sind, dass man keine brauchbare L&amp;#246;sung finden kann, wenn man die Aufgabenstellung nicht spezialisiert. Es ist in der Regel einfacher einen Algorithmus f&amp;#252;r ein spezielles Problem zu schreiben, als einen Algorithmus f&amp;#252;r ein Allgemeines. So bin ich nach dem Studium einiger Paper und der Implementierung eines der vielversprechensten Paper (welches grandios versagt hat!) dazu gekommen, mir eine eigene L&amp;#246;sung auszudenken. Wenn man nicht alles selber macht....&lt;/p&gt;
&lt;p&gt;Zun&amp;#228;chst gilt, dass das Fahrzeug den Boden vor sich sieht. Jetzt kann man davon ausgehen, dass alles, was sich direkt vor dem Fahrzeug befindet kein Hindernis ist, da das Fahrzeug ja grunds&amp;#228;tzlich nicht vor ein Hindernis vorfahren soll. Also liegt es nahe, dass alles, was ausgehend vom Fahrzeug so aussieht, wie das, was sich direkt vor einem befindet, Boden und somit kein Hindernis ist. Welche Informationen kann man verwenden um die &amp;#196;hnlichkeit zweier Elemente im Bild zu vergleichen? Die Auswahl der Informationen wird Feature genannt. Verwendet werden folgende Features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;#196;nderung einzelner Farbkan&amp;#228;le (&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?R(\alpha,r)\rightarrow \frac{\delta R}{\delta r}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;,&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?G(\alpha,r)\rightarrow \frac{\delta G}{\delta r}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;,&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?B(\alpha,r)\rightarrow \frac{\delta B}{\delta r}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;)&lt;/li&gt;
&lt;li&gt;&amp;#196;nderung&amp;#160;von Farbton, Farbs&amp;#228;ttigung und Farbhelligkeit (&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?H(\alpha,r)\rightarrow \frac{\delta H}{\delta r}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;,&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?S(\alpha,r)\rightarrow \frac{\delta S}{\delta r}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;,&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?V(\alpha,r)\rightarrow \frac{\delta V}{\delta r}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;)&lt;/li&gt;
&lt;li&gt;&amp;#196;nderung der Texturenergien (&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?G:=T\circ L&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; mit &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?T(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&amp;#160;Helligkeitsinformationen&amp;#160;und &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?L(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; Laws Texturmasken, &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?E(\alpha,r) =\sum_{w\in W}|G(w_{\alpha},w_{r})|\rightarrow \frac{\delta E}{\delta r}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die eingef&amp;#252;hrten Funktionen und Abk&amp;#252;rzungen bedeuten folgendes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?R(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; Rotkanal, &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?G(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; Gr&amp;#252;nkanal, &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?B(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&amp;#160;Blaukanal&amp;#160;&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?H(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; Farbton (Hue), &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?S(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; S&amp;#228;ttigung, &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?V(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; Helligkeit (Value)&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?T(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&amp;#160;Helligkeitsinformationen, &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?L(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; Laws Texturmasken (Dies sind kleine Masken, mit denen man ein Bild falten kann, um entsprechende Merkmale des Bildes feststellen zu k&amp;#246;nnen.&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?W(\alpha, r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; ist die Umgebung um die Polarkoordinaten &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?T(\alpha,r)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; Texturenergie&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das hier verwendete Koordinatensystem ist ein Polarkoordinatensystem. Es werden letztlich Strahlen vom Bodenursprung (&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?\vec{O}:=(width/2,height)^\top&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; Kartesisch) in einem Kreisf&amp;#246;rmigen Bogen verfolgt. Sollten sich auf dem Strahlenweg obige Constraints zu stark &amp;#228;ndern, so hat man ein Hindernis gefunden. Die L&amp;#228;nge des Strahls entspricht dabei der approximierten Entfernung. Die Strahlgeraden ergeben sich dabei durch&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?g:\vec{x}=\vec{O}+\lambda \begin{pmatrix} cos(\alpha)\\-sin(\alpha)\end{pmatrix}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/p&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;Und hier wie gewohnt das zugeh&amp;#246;rige Video...&lt;/p&gt;

&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/X5nqCcMxGBs&amp;amp;hl=de_DE&amp;amp;fs=1&amp;amp;&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.youtube.com/v/X5nqCcMxGBs&amp;amp;hl=de_DE&amp;amp;fs=1&amp;amp;&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.killerschaf.de/index.php/2010/03/27/obstacle-detection&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>F&#252;r einen autonomen Roboter ist es unbedingt notwendig, eine echtzeitf&#228;hige Hinderniserkennung zu nutzen. Die Aufgabe ist also aus einem Bild, oder aus einer Sequenz von Bildern f&#252;r jeden Bildpunkt eine Tiefe absch&#228;tzen zu k&#246;nnen. Es gibt zahllose Ans&#228;tze und Paper, die diese Aufgabe versuchen zu erf&#252;llen. Eine gro&#223;e Anzahl an Papern bedeutet allerdings nicht, wie man hoffen k&#246;nnte, dass es zahllose Algorithmen gibt, die diese Aufgabe zufriedenstellend erf&#252;llen k&#246;nnen. Das Gegenteil ist der Fall. Je mehr wissenschaftliche Paper es zu einer Problemstellung gibt, desto eher versagen alle darin vorgestellten Algorithmen in der Realit&#228;t. Warum? Angenommen jemand findet eine ganz hervorragende L&#246;sung f&#252;r eine Problemstellung, welche sehr akkurate Ergebnisse in Echtzeit ermittelt. Dann g&#228;be es keinen Forschungsbedarf mehr f&#252;r diese Aufgabenstellung. Dann g&#228;be es aber auch keine neuen Paper mehr zu dieser Aufgabe.</p>
<p>Das Schlimme an der Vielzahl der Paper ist: Ein Author eines Papers w&#252;rde nie einen Algorithmus vorstellen um hinterher im Ergebnisteil seines Papers zu schreiben, dass der Algorithmus totale Gr&#252;tze ist, eine gigantische Rechenzeit ben&#246;tigt und die Ergebnisse nur unter Laborbedingungen brauchbar sind.</p>
<p>In der Informatik lernt man, dass manche Problemstellungen einfach so schwierig sind, dass man keine brauchbare L&#246;sung finden kann, wenn man die Aufgabenstellung nicht spezialisiert. Es ist in der Regel einfacher einen Algorithmus f&#252;r ein spezielles Problem zu schreiben, als einen Algorithmus f&#252;r ein Allgemeines. So bin ich nach dem Studium einiger Paper und der Implementierung eines der vielversprechensten Paper (welches grandios versagt hat!) dazu gekommen, mir eine eigene L&#246;sung auszudenken. Wenn man nicht alles selber macht....</p>
<p>Zun&#228;chst gilt, dass das Fahrzeug den Boden vor sich sieht. Jetzt kann man davon ausgehen, dass alles, was sich direkt vor dem Fahrzeug befindet kein Hindernis ist, da das Fahrzeug ja grunds&#228;tzlich nicht vor ein Hindernis vorfahren soll. Also liegt es nahe, dass alles, was ausgehend vom Fahrzeug so aussieht, wie das, was sich direkt vor einem befindet, Boden und somit kein Hindernis ist. Welche Informationen kann man verwenden um die &#196;hnlichkeit zweier Elemente im Bild zu vergleichen? Die Auswahl der Informationen wird Feature genannt. Verwendet werden folgende Features:</p>
<ul>
<li>&#196;nderung einzelner Farbkan&#228;le (<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?R(\alpha,r)\rightarrow \frac{\delta R}{\delta r}" alt="""" border="0"></img>,<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?G(\alpha,r)\rightarrow \frac{\delta G}{\delta r}" alt="""" border="0"></img>,<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?B(\alpha,r)\rightarrow \frac{\delta B}{\delta r}" alt="""" border="0"></img>)</li>
<li>&#196;nderung&#160;von Farbton, Farbs&#228;ttigung und Farbhelligkeit (<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?H(\alpha,r)\rightarrow \frac{\delta H}{\delta r}" alt="""" border="0"></img>,<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?S(\alpha,r)\rightarrow \frac{\delta S}{\delta r}" alt="""" border="0"></img>,<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?V(\alpha,r)\rightarrow \frac{\delta V}{\delta r}" alt="""" border="0"></img>)</li>
<li>&#196;nderung der Texturenergien (<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?G:=T\circ L" alt="""" border="0"></img> mit <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?T(\alpha,r)" alt="""" border="0"></img>&#160;Helligkeitsinformationen&#160;und <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?L(\alpha,r)" alt="""" border="0"></img> Laws Texturmasken, <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?E(\alpha,r) =\sum_{w\in W}|G(w_{\alpha},w_{r})|\rightarrow \frac{\delta E}{\delta r}" alt="""" border="0"></img>)</li>
</ul>
<p>Die eingef&#252;hrten Funktionen und Abk&#252;rzungen bedeuten folgendes:</p>
<ul>
<li><img src="http://www.forkosh.dreamhost.com/mimetex.cgi?R(\alpha,r)" alt="""" border="0"></img> Rotkanal, <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?G(\alpha,r)" alt="""" border="0"></img> Gr&#252;nkanal, <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?B(\alpha,r)" alt="""" border="0"></img>&#160;Blaukanal&#160;</li>
<li><img src="http://www.forkosh.dreamhost.com/mimetex.cgi?H(\alpha,r)" alt="""" border="0"></img> Farbton (Hue), <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?S(\alpha,r)" alt="""" border="0"></img> S&#228;ttigung, <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?V(\alpha,r)" alt="""" border="0"></img> Helligkeit (Value)</li>
<li><img src="http://www.forkosh.dreamhost.com/mimetex.cgi?T(\alpha,r)" alt="""" border="0"></img>&#160;Helligkeitsinformationen, <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?L(\alpha,r)" alt="""" border="0"></img> Laws Texturmasken (Dies sind kleine Masken, mit denen man ein Bild falten kann, um entsprechende Merkmale des Bildes feststellen zu k&#246;nnen.</li>
<li><img src="http://www.forkosh.dreamhost.com/mimetex.cgi?W(\alpha, r)" alt="""" border="0"></img> ist die Umgebung um die Polarkoordinaten <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?(\alpha,r)" alt="""" border="0"></img></li>
<li><img src="http://www.forkosh.dreamhost.com/mimetex.cgi?T(\alpha,r)" alt="""" border="0"></img> Texturenergie</li>
</ul>
<p>Das hier verwendete Koordinatensystem ist ein Polarkoordinatensystem. Es werden letztlich Strahlen vom Bodenursprung (<img src="http://www.forkosh.dreamhost.com/mimetex.cgi?\vec{O}:=(width/2,height)^\top" alt="""" border="0"></img> Kartesisch) in einem Kreisf&#246;rmigen Bogen verfolgt. Sollten sich auf dem Strahlenweg obige Constraints zu stark &#228;ndern, so hat man ein Hindernis gefunden. Die L&#228;nge des Strahls entspricht dabei der approximierten Entfernung. Die Strahlgeraden ergeben sich dabei durch</p>
<p><img src="http://www.forkosh.dreamhost.com/mimetex.cgi?g:\vec{x}=\vec{O}+\lambda \begin{pmatrix} cos(\alpha)\\-sin(\alpha)\end{pmatrix}" alt="""" border="0"></img></p>
<p>&#160;</p>
<p>Und hier wie gewohnt das zugeh&#246;rige Video...</p>

<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/X5nqCcMxGBs&amp;hl=de_DE&amp;fs=1&amp;" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/X5nqCcMxGBs&amp;hl=de_DE&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><div class="item_footer"><p><small><a href="http://blog.killerschaf.de/index.php/2010/03/27/obstacle-detection">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://blog.killerschaf.de/index.php/2010/03/27/obstacle-detection#comments</comments>
			<wfw:commentRss>http://blog.killerschaf.de/index.php?tempskin=_rss2&#38;disp=comments&#38;p=20</wfw:commentRss>
		</item>
				<item>
			<title>Vehicle Movement Tracking</title>
			<link>http://blog.killerschaf.de/index.php/2010/03/21/vehicle-movement-tracking</link>
			<pubDate>Sun, 21 Mar 2010 17:21:29 +0000</pubDate>			<dc:creator>killerschaf</dc:creator>
			<category domain="main">Das Projekt</category>			<guid isPermaLink="false">19@http://blog.killerschaf.de/</guid>
						<description>&lt;p&gt;Es gibt mal wieder etwas Neues. Nachdem die Kamera auf den Kyosho montiert war, konnte mit der Entwicklung des Algorithmus angefangen werden, der die optischen Flussinformationen in ein Tracking umsetzt. Von vornherein ist klar, dass ein Tracking durch den optischen Fluss nicht allein funktionieren kann. Dies hat folgende Gr&amp;#252;nde:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die Szene muss mehr oder weniger statisch sein. Falls die Szene nicht statisch ist, d&amp;#252;rfen sich bewegende Elemente nicht zum Tracking verwendet werden. Sich bewegende Elemente k&amp;#246;nnen relativ leicht erkannt werden (der optische Fluss weicht hier von dem Rest der Szene ab), aber ein Herausrechnen dieser Elemente f&amp;#252;hrt mindestens zu kleinen Fehlern.&lt;/li&gt;
&lt;li&gt;Bildrauschen der Kamera f&amp;#252;hrt zu kleinen Fehlern.&lt;/li&gt;
&lt;li&gt;Bildelemente ohne Struktur f&amp;#252;hren bei der optischen Flussberechnung zum Fill-In-Effekt. Hier erben Bildelemente Flussvektoren von strukturierteren umgebenden Bildbereichen. Der Effekt h&amp;#228;lt einige Zeit an, auch wenn der Ursprung des optischen Flusses bereits v&amp;#246;llig andere Werte angenommen hat. Die Flussvektoren dieser Elemente k&amp;#246;nnen herausgerechnet werden, je mehr Flussvektoren hier jedoch herausgerechnet werden, desto ungenauer wird der akkumulierte Gesamtfluss f&amp;#252;r Rotation und Geschwindigkeit.&lt;/li&gt;
&lt;li&gt;Fehler, die sich Bild f&amp;#252;r Bild einschleichen akkumulieren sich. Je l&amp;#228;nger das Tracking l&amp;#228;uft, desto unpr&amp;#228;ziser wird es.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der Algorithmus vollzieht Bild f&amp;#252;r Bild folgende Schritte:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sch&amp;#228;rfen (einfache Faltung mit einem Sch&amp;#228;rfungsfilter). Dies bewirkt, dass beim Verkleinern das resultierende Bild nicht nurnoch Matsch ist.&lt;/li&gt;
&lt;li&gt;Berechnung der mittleren Helligkeit des Gesamtbildes und Anhebung/Absenkung der Helligkeit auf den Mittelwert des Definitionsbereiches. Dieser Schritt verhindert, dass eine pl&amp;#246;tzliche Helligkeitsanpassung der Kamera zu Fehlern im Fluss f&amp;#252;hrt. Dieser Effekt kann Rauschen verst&amp;#228;rken (beim Anheben) oder vermindern (beim Absenken).&lt;/li&gt;
&lt;li&gt;Blockmittelung. Einzelne Pixel werden zu Bl&amp;#246;cken zusammengefasst (hier 5x5 Pixel). Dieser Effekt vernichtet Details (leider) und Rauschen (juhu). Insgesamt kommt der Gesamtalgorithmus mit deutlich weniger Rechenzeit aus.&lt;/li&gt;
&lt;li&gt;Berechnung des optischen Flusses des gesamten Bildes auf Basis des aktuellen und des letzten Bildes. Der Algorithmus verwendet 5 Iterationen des Gauss Seidel Algorithmusses um den Fluss smooth zu halten und den Fill-In-Effekt zu mindern. Die letzte Sch&amp;#228;tzung des Flusses ist gleichzeitig Ausgangsbasis des Flusses des Folgebildes. Somit kann die Anzahl der Iterationen gering sein. Eigentlich w&amp;#228;ren viel mehr Iterationen erforderlich, n&amp;#228;mlich halb so viele Iterationen wie das Bild Pixel breit ist. (Bei einem 320x240 Bild mit 5x5 Bl&amp;#246;cken also 32 Iterationen).&lt;/li&gt;
&lt;li&gt;Klassifizierung der Flussvektoren in gut und schlecht. Ein guter Flussvektor ist einer, dessen Bildblock zu seinem Nachbarblock einen &quot;sichtbaren&quot; Helligkeitsunterschied aufweist. Dies wirkt dem Fill-In-Effekt nochmal entgegen.&lt;/li&gt;
&lt;li&gt;Betrachtung einer Teilmenge der guten Flussvektoren im oberen Bildbereich zur Bestimmung der Rotation. Exponentielle Gl&amp;#228;ttung des resultierenden Vektors.&lt;/li&gt;
&lt;li&gt;Betrachtung einer Teilmenge der guten Flussvektoren im unteren Bildbereich zur Bestimmung der Geschwindigkeit. Exponentielle Gl&amp;#228;ttung des resultierenden Vektors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die letzten beiden Schritte verwenden zur Stabilisierung eine Tiefenabsch&amp;#228;tzung jedes einzelnen Blocks. Die Tiefeneinsch&amp;#228;tzung wird durch R&amp;#252;ckprojektion eines Blocks von einer 2D in eine 3D Koordinate erreicht. Dabei wird zun&amp;#228;chst abgesch&amp;#228;tzt wie viel &quot;Boden&quot; es vom Fahrzeugursprung bis zur H&amp;#246;he des Blocks gibt. Das Verfahren ist schnell, leider aber auch schlecht. Zur Stabilisierung der letzten beiden Schritte ist es aber ausreichend. Und jetzt.....So sieht das ganze aus, wenns l&amp;#228;uft. Eine Fahrt von meinem B&amp;#252;ro ins Wohnzimmer, ein Wendeman&amp;#246;ver und die R&amp;#252;ckkehr ins B&amp;#252;ro. Der Fahrweg betr&amp;#228;gt etwa 22m. Das Tracking liefert hier eine Genauigkeit bis auf 30cm.&lt;/p&gt;
&lt;p&gt;&amp;#160;&amp;nbsp;
&lt;/p&gt;

&lt;object width=&quot;480&quot; height=&quot;385&quot; data=&quot;http://www.youtube.com/v/FcLm_x7crmw&amp;amp;hl=de_DE&amp;amp;fs=1&amp;amp;&quot; type=&quot;application/x-shockwave-flash&quot;&gt;
&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;
&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;
&lt;param name=&quot;src&quot; value=&quot;http://www.youtube.com/v/FcLm_x7crmw&amp;amp;hl=de_DE&amp;amp;fs=1&amp;amp;&quot; /&gt;
&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot; /&gt;
&lt;/object&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.killerschaf.de/index.php/2010/03/21/vehicle-movement-tracking&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Es gibt mal wieder etwas Neues. Nachdem die Kamera auf den Kyosho montiert war, konnte mit der Entwicklung des Algorithmus angefangen werden, der die optischen Flussinformationen in ein Tracking umsetzt. Von vornherein ist klar, dass ein Tracking durch den optischen Fluss nicht allein funktionieren kann. Dies hat folgende Gr&#252;nde:</p>
<ul>
<li>Die Szene muss mehr oder weniger statisch sein. Falls die Szene nicht statisch ist, d&#252;rfen sich bewegende Elemente nicht zum Tracking verwendet werden. Sich bewegende Elemente k&#246;nnen relativ leicht erkannt werden (der optische Fluss weicht hier von dem Rest der Szene ab), aber ein Herausrechnen dieser Elemente f&#252;hrt mindestens zu kleinen Fehlern.</li>
<li>Bildrauschen der Kamera f&#252;hrt zu kleinen Fehlern.</li>
<li>Bildelemente ohne Struktur f&#252;hren bei der optischen Flussberechnung zum Fill-In-Effekt. Hier erben Bildelemente Flussvektoren von strukturierteren umgebenden Bildbereichen. Der Effekt h&#228;lt einige Zeit an, auch wenn der Ursprung des optischen Flusses bereits v&#246;llig andere Werte angenommen hat. Die Flussvektoren dieser Elemente k&#246;nnen herausgerechnet werden, je mehr Flussvektoren hier jedoch herausgerechnet werden, desto ungenauer wird der akkumulierte Gesamtfluss f&#252;r Rotation und Geschwindigkeit.</li>
<li>Fehler, die sich Bild f&#252;r Bild einschleichen akkumulieren sich. Je l&#228;nger das Tracking l&#228;uft, desto unpr&#228;ziser wird es.</li>
</ul>
<p>Der Algorithmus vollzieht Bild f&#252;r Bild folgende Schritte:</p>
<ul>
<li>Sch&#228;rfen (einfache Faltung mit einem Sch&#228;rfungsfilter). Dies bewirkt, dass beim Verkleinern das resultierende Bild nicht nurnoch Matsch ist.</li>
<li>Berechnung der mittleren Helligkeit des Gesamtbildes und Anhebung/Absenkung der Helligkeit auf den Mittelwert des Definitionsbereiches. Dieser Schritt verhindert, dass eine pl&#246;tzliche Helligkeitsanpassung der Kamera zu Fehlern im Fluss f&#252;hrt. Dieser Effekt kann Rauschen verst&#228;rken (beim Anheben) oder vermindern (beim Absenken).</li>
<li>Blockmittelung. Einzelne Pixel werden zu Bl&#246;cken zusammengefasst (hier 5x5 Pixel). Dieser Effekt vernichtet Details (leider) und Rauschen (juhu). Insgesamt kommt der Gesamtalgorithmus mit deutlich weniger Rechenzeit aus.</li>
<li>Berechnung des optischen Flusses des gesamten Bildes auf Basis des aktuellen und des letzten Bildes. Der Algorithmus verwendet 5 Iterationen des Gauss Seidel Algorithmusses um den Fluss smooth zu halten und den Fill-In-Effekt zu mindern. Die letzte Sch&#228;tzung des Flusses ist gleichzeitig Ausgangsbasis des Flusses des Folgebildes. Somit kann die Anzahl der Iterationen gering sein. Eigentlich w&#228;ren viel mehr Iterationen erforderlich, n&#228;mlich halb so viele Iterationen wie das Bild Pixel breit ist. (Bei einem 320x240 Bild mit 5x5 Bl&#246;cken also 32 Iterationen).</li>
<li>Klassifizierung der Flussvektoren in gut und schlecht. Ein guter Flussvektor ist einer, dessen Bildblock zu seinem Nachbarblock einen "sichtbaren" Helligkeitsunterschied aufweist. Dies wirkt dem Fill-In-Effekt nochmal entgegen.</li>
<li>Betrachtung einer Teilmenge der guten Flussvektoren im oberen Bildbereich zur Bestimmung der Rotation. Exponentielle Gl&#228;ttung des resultierenden Vektors.</li>
<li>Betrachtung einer Teilmenge der guten Flussvektoren im unteren Bildbereich zur Bestimmung der Geschwindigkeit. Exponentielle Gl&#228;ttung des resultierenden Vektors.</li>
</ul>
<p>Die letzten beiden Schritte verwenden zur Stabilisierung eine Tiefenabsch&#228;tzung jedes einzelnen Blocks. Die Tiefeneinsch&#228;tzung wird durch R&#252;ckprojektion eines Blocks von einer 2D in eine 3D Koordinate erreicht. Dabei wird zun&#228;chst abgesch&#228;tzt wie viel "Boden" es vom Fahrzeugursprung bis zur H&#246;he des Blocks gibt. Das Verfahren ist schnell, leider aber auch schlecht. Zur Stabilisierung der letzten beiden Schritte ist es aber ausreichend. Und jetzt.....So sieht das ganze aus, wenns l&#228;uft. Eine Fahrt von meinem B&#252;ro ins Wohnzimmer, ein Wendeman&#246;ver und die R&#252;ckkehr ins B&#252;ro. Der Fahrweg betr&#228;gt etwa 22m. Das Tracking liefert hier eine Genauigkeit bis auf 30cm.</p>
<p>&#160;&nbsp;
</p>

<object width="480" height="385" data="http://www.youtube.com/v/FcLm_x7crmw&amp;hl=de_DE&amp;fs=1&amp;" type="application/x-shockwave-flash">
<param name="allowFullScreen" value="true" />
<param name="allowscriptaccess" value="always" />
<param name="src" value="http://www.youtube.com/v/FcLm_x7crmw&amp;hl=de_DE&amp;fs=1&amp;" />
<param name="allowfullscreen" value="true" />
</object><div class="item_footer"><p><small><a href="http://blog.killerschaf.de/index.php/2010/03/21/vehicle-movement-tracking">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://blog.killerschaf.de/index.php/2010/03/21/vehicle-movement-tracking#comments</comments>
			<wfw:commentRss>http://blog.killerschaf.de/index.php?tempskin=_rss2&#38;disp=comments&#38;p=19</wfw:commentRss>
		</item>
				<item>
			<title>Neues Fahrzeug Teil 2</title>
			<link>http://blog.killerschaf.de/index.php/2010/03/18/neues-fahrzeug-1</link>
			<pubDate>Thu, 18 Mar 2010 18:19:16 +0000</pubDate>			<dc:creator>killerschaf</dc:creator>
			<category domain="main">Das Projekt</category>			<guid isPermaLink="false">18@http://blog.killerschaf.de/</guid>
						<description>&lt;p&gt;Wie schon in einer der letzten Beitr&amp;#228;ge angeklungen, war ich mit dem Legofahrzeug zweiter Generation etwas unzufrieden. Eigentlich sollte sich dieses Projekt mehr der Software widmen. Letztlich war ich allerdings mehr damit besch&amp;#228;ftigt das Fahrzeug am Laufen zu halten als mich mit der eigentlichen Steuerungssoftware auseinander zu setzen. Daher kam mir die Idee Lego &amp;#252;ber Bord zu werfen und ein fertiges Fahrzeug als Unterbau zu verwenden. Dieser Idee bin ich durch das ein oder andere Forum nachgegangen: Ich brauchte ein Crawler-Fahrzeug. Crawler sind Fahrzeuge, die aufs Bergsteigen ausgelegt sind. Mit diesen Fahrzeugen kann man unglaubliche Steigungen &amp;#252;berwinden und in unglaublich unwegsamen Gel&amp;#228;nde herumfahren.
&lt;/p&gt;&lt;p&gt;
Was hat das mit diesem Projekt zu tun? Gar nichts. In meiner Wohnung gibt es weder Steigungen noch unwegsames Gel&amp;#228;nde (naja, wenn ich meine Klammotten mal wieder &amp;#252;berall rumliegen lasse schon...). Allerdings sind diese Fahrzeuge durch ihr Einsatzgebiet auch f&amp;#252;r zwei Dinge besonders ausgelegt: Langsames und Pr&amp;#228;zises Fahren. Dies wiederum kommt meiner Applikation nahe. 
&lt;/p&gt;&lt;p&gt;Nach einiger Beratung in Foren, welches Fahrzeug (als Bausatz oder als Kit), mit welchem Motor (Brushless oder nicht), welche Steuerung (2.4GHz oder 40MHz), welchen Akku (Lipo oder NiMh), welches Ladeger&amp;#228;t (mit Schnickschnack oder ohne), welche Servos (Metallgetriebe oder nicht) usw... habe ich mich f&amp;#252;r den Kyosho Rock Force entschieden. Ein Bausatz. Jede Schraube einzeln. Na das war ein Spass.&lt;/p&gt;&lt;p&gt; Insgesamt bedanke ich mich f&amp;#252;r die freundliche Beratung durch den Internetshop &lt;a href=&quot;http://www.monster-hopups.de&quot;&gt;http://www.monster-hopups.de&lt;/a&gt; (Ja, es gibt Internetshops mit Beratung!!) und dem &lt;a href=&quot;http://www.final-rc.de&quot;&gt;http://www.final-rc.de&lt;/a&gt; Forum.
&lt;/p&gt;

Und hier ist ein erstes Bild meines neuen Spielzeugs....

&lt;p&gt;
&lt;img src=&quot;http://www.killerschaf.de/images/DSC_5912klein.jpg&quot; width=&quot;95%&quot; alt=&quot;Bild&quot; title=&quot;&quot; /&gt;
&amp;nbsp;&lt;br /&gt;
Und hier in &lt;a href=&quot;http://www.killerschaf.de/images/DSC_5912.jpg&quot;&gt; Gro&amp;#223;&lt;/a&gt;
&lt;/p&gt;
Ein paar Details:
&lt;ul&gt;
  &lt;li&gt;Aluminium Chassis&lt;/li&gt;
  &lt;li&gt;Aluminium Links&lt;/li&gt;
  &lt;li&gt;Stahlkardanwellen&lt;/li&gt;
  &lt;li&gt;Allradantrieb (optional Allradlenkung)&lt;/li&gt;
  &lt;li&gt;Schneckenantrieb&lt;/li&gt;
  &lt;li&gt;Hohe Achsverschr&amp;#228;nkung&lt;/li&gt;
  &lt;li&gt;Vollgefedert&lt;/li&gt;
  &lt;li&gt;Brushless 18.5 Turn Sensored Crawler - Motorset&lt;/li&gt;
  &lt;li&gt;und und und...&lt;/li&gt;
&lt;/ul&gt;
Es sei noch abschlie&amp;#223;end ein Link auf die Herstellerseite erlaubt: &lt;a href=&quot;http://www.kyosho.de/?page=shop/flypage&amp;amp;product_id=18984&quot;&gt;http://www.kyosho.de/?page=shop/flypage&amp;amp;product_id=18984&lt;/a&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.killerschaf.de/index.php/2010/03/18/neues-fahrzeug-1&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Wie schon in einer der letzten Beitr&#228;ge angeklungen, war ich mit dem Legofahrzeug zweiter Generation etwas unzufrieden. Eigentlich sollte sich dieses Projekt mehr der Software widmen. Letztlich war ich allerdings mehr damit besch&#228;ftigt das Fahrzeug am Laufen zu halten als mich mit der eigentlichen Steuerungssoftware auseinander zu setzen. Daher kam mir die Idee Lego &#252;ber Bord zu werfen und ein fertiges Fahrzeug als Unterbau zu verwenden. Dieser Idee bin ich durch das ein oder andere Forum nachgegangen: Ich brauchte ein Crawler-Fahrzeug. Crawler sind Fahrzeuge, die aufs Bergsteigen ausgelegt sind. Mit diesen Fahrzeugen kann man unglaubliche Steigungen &#252;berwinden und in unglaublich unwegsamen Gel&#228;nde herumfahren.
</p><p>
Was hat das mit diesem Projekt zu tun? Gar nichts. In meiner Wohnung gibt es weder Steigungen noch unwegsames Gel&#228;nde (naja, wenn ich meine Klammotten mal wieder &#252;berall rumliegen lasse schon...). Allerdings sind diese Fahrzeuge durch ihr Einsatzgebiet auch f&#252;r zwei Dinge besonders ausgelegt: Langsames und Pr&#228;zises Fahren. Dies wiederum kommt meiner Applikation nahe. 
</p><p>Nach einiger Beratung in Foren, welches Fahrzeug (als Bausatz oder als Kit), mit welchem Motor (Brushless oder nicht), welche Steuerung (2.4GHz oder 40MHz), welchen Akku (Lipo oder NiMh), welches Ladeger&#228;t (mit Schnickschnack oder ohne), welche Servos (Metallgetriebe oder nicht) usw... habe ich mich f&#252;r den Kyosho Rock Force entschieden. Ein Bausatz. Jede Schraube einzeln. Na das war ein Spass.</p><p> Insgesamt bedanke ich mich f&#252;r die freundliche Beratung durch den Internetshop <a href="http://www.monster-hopups.de">http://www.monster-hopups.de</a> (Ja, es gibt Internetshops mit Beratung!!) und dem <a href="http://www.final-rc.de">http://www.final-rc.de</a> Forum.
</p>

Und hier ist ein erstes Bild meines neuen Spielzeugs....

<p>
<img src="http://www.killerschaf.de/images/DSC_5912klein.jpg" width="95%" alt="Bild" title="" />
&nbsp;<br />
Und hier in <a href="http://www.killerschaf.de/images/DSC_5912.jpg"> Gro&#223;</a>
</p>
Ein paar Details:
<ul>
  <li>Aluminium Chassis</li>
  <li>Aluminium Links</li>
  <li>Stahlkardanwellen</li>
  <li>Allradantrieb (optional Allradlenkung)</li>
  <li>Schneckenantrieb</li>
  <li>Hohe Achsverschr&#228;nkung</li>
  <li>Vollgefedert</li>
  <li>Brushless 18.5 Turn Sensored Crawler - Motorset</li>
  <li>und und und...</li>
</ul>
Es sei noch abschlie&#223;end ein Link auf die Herstellerseite erlaubt: <a href="http://www.kyosho.de/?page=shop/flypage&amp;product_id=18984">http://www.kyosho.de/?page=shop/flypage&amp;product_id=18984</a><div class="item_footer"><p><small><a href="http://blog.killerschaf.de/index.php/2010/03/18/neues-fahrzeug-1">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://blog.killerschaf.de/index.php/2010/03/18/neues-fahrzeug-1#comments</comments>
			<wfw:commentRss>http://blog.killerschaf.de/index.php?tempskin=_rss2&#38;disp=comments&#38;p=18</wfw:commentRss>
		</item>
				<item>
			<title>Sehr einfache Anwendung f&#252;r den optischen Fluss</title>
			<link>http://blog.killerschaf.de/index.php/2010/03/14/sehr-einfache-anwendung-fuer-den-optischen-fluss</link>
			<pubDate>Sun, 14 Mar 2010 14:50:57 +0000</pubDate>			<dc:creator>killerschaf</dc:creator>
			<category domain="main">Das Projekt</category>			<guid isPermaLink="false">17@http://blog.killerschaf.de/</guid>
						<description>&lt;p&gt;Eine sehr einfache Anwendung f&amp;#252;r den optischen Fluss: Virtuelle Gegenst&amp;#228;nde bewegen. Was ist dazu notwendig? Zun&amp;#228;chst muss man den optischen Fluss berechnen. Hier kann man sich auf den optischen Fluss in der N&amp;#228;he der virtuellen Gegenst&amp;#228;nde beschr&amp;#228;nken. Wir nutzen hier eine virtuelle Kugel (Heute ist Pi-Tag (&lt;a href=&quot;http://de.wikipedia.org/wiki/Pi-Tag&quot;&gt;Link&lt;/a&gt;)) &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?S&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; mit Position &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?(S_x,S_y)&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; und Radius &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?r&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;. Es sei &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?F&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; die Menge der Flussvektoren und &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?W=\{p\in F|\sqrt{(p_x-s_x)^2+(p_y-s_y)^2}\lt r\}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; die Menge aller Flussvektoren, die sich innerhalb der virtuellen Kugel befinden. Hieraus kann man eine additive Gesamtkraft &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?A=\binom{A_u}{A_v}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;herleiten, die auf die Kugel wirkt: &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?A_u=\frac{\sum_{w\in W}~w_u}{|W|}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt; und &lt;img src=&quot;http://www.forkosh.dreamhost.com/mimetex.cgi?A_v=\frac{\sum_{w\in W}~w_v}{|W|}&quot; alt=&quot;&quot;&quot;&quot; border=&quot;0&quot;&gt;&lt;/img&gt;. Diese Gesamtkraft addiert man auf den aktuellen Geschwindigkeitsvektor der Kugel. An den Bildschirmbegrenzungen gilt stets Einfallswinkel ist Ausfallswinkel und nebenbei ben&amp;#246;tigt man etwas Reibung, damit die Kugel auch wieder anh&amp;#228;lt. Thats it.&lt;/p&gt;
&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/E7h4OaTtCzY&amp;amp;hl=de_DE&amp;amp;fs=1&amp;amp;&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;http://www.youtube.com/v/E7h4OaTtCzY&amp;amp;hl=de_DE&amp;amp;fs=1&amp;amp;&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.killerschaf.de/index.php/2010/03/14/sehr-einfache-anwendung-fuer-den-optischen-fluss&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://b2evolution.net/&quot;&gt;b2evolution&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Eine sehr einfache Anwendung f&#252;r den optischen Fluss: Virtuelle Gegenst&#228;nde bewegen. Was ist dazu notwendig? Zun&#228;chst muss man den optischen Fluss berechnen. Hier kann man sich auf den optischen Fluss in der N&#228;he der virtuellen Gegenst&#228;nde beschr&#228;nken. Wir nutzen hier eine virtuelle Kugel (Heute ist Pi-Tag (<a href="http://de.wikipedia.org/wiki/Pi-Tag">Link</a>)) <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?S" alt="""" border="0"></img> mit Position <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?(S_x,S_y)" alt="""" border="0"></img> und Radius <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?r" alt="""" border="0"></img>. Es sei <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?F" alt="""" border="0"></img> die Menge der Flussvektoren und <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?W=\{p\in F|\sqrt{(p_x-s_x)^2+(p_y-s_y)^2}\lt r\}" alt="""" border="0"></img> die Menge aller Flussvektoren, die sich innerhalb der virtuellen Kugel befinden. Hieraus kann man eine additive Gesamtkraft <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?A=\binom{A_u}{A_v}" alt="""" border="0"></img>herleiten, die auf die Kugel wirkt: <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?A_u=\frac{\sum_{w\in W}~w_u}{|W|}" alt="""" border="0"></img> und <img src="http://www.forkosh.dreamhost.com/mimetex.cgi?A_v=\frac{\sum_{w\in W}~w_v}{|W|}" alt="""" border="0"></img>. Diese Gesamtkraft addiert man auf den aktuellen Geschwindigkeitsvektor der Kugel. An den Bildschirmbegrenzungen gilt stets Einfallswinkel ist Ausfallswinkel und nebenbei ben&#246;tigt man etwas Reibung, damit die Kugel auch wieder anh&#228;lt. Thats it.</p>
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/E7h4OaTtCzY&amp;hl=de_DE&amp;fs=1&amp;" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed src="http://www.youtube.com/v/E7h4OaTtCzY&amp;hl=de_DE&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><div class="item_footer"><p><small><a href="http://blog.killerschaf.de/index.php/2010/03/14/sehr-einfache-anwendung-fuer-den-optischen-fluss">Original post</a> blogged on <a href="http://b2evolution.net/">b2evolution</a>.</small></p></div>]]></content:encoded>
								<comments>http://blog.killerschaf.de/index.php/2010/03/14/sehr-einfache-anwendung-fuer-den-optischen-fluss#comments</comments>
			<wfw:commentRss>http://blog.killerschaf.de/index.php?tempskin=_rss2&#38;disp=comments&#38;p=17</wfw:commentRss>
		</item>
			</channel>
</rss>

