C++Guns – RoboBlog blogging the bot

31.08.2010

OpenCV Bild mit einem Bild binarsieren

Filed under: Allgemein — Thomas @ 14:08

Was das bedeuten soll und die Ergebnisse siehe hier
Opencv binarisieren mit Bild

23.08.2010

Objekterkennung mit OpenCV

Filed under: Allgemein — Tags: , — Thomas @ 20:08

Gerade beim aufräumen habe ich dieses alte Video von mir gefunden
http://www.dailymotion.com/video/xejjoz_objekterkennung-mit-opencv_tech

Mit OpenCV das Webcam Bild abgreifen und dann den Pavlidis Algo. laufen lassen (google it). Den Mittelpunkt merken und im nächsten Frame dort das Objekt wieder suchen. So ungefährt jedenfalls funktioniert es.

Der Code ist unter aller Sau. Müsste mir eigentlich mal die Zeit nehmen und das ordentlich machen. Immerhin boomen ja diese Gestik-Erkennungs-Geräte gerade. Besonders für Spiele ganz toll. Die Technik gibts schon lange, nur auf einmal wird sie populär.

21.08.2010

Ah ja, war klar

Filed under: Allgemein — Thomas @ 09:08

Machen wir mal einen kleinen geschichtlichen Rückblick in das Reich der Programme.
Früher bekam man seine Programme auf Diskette/CD oder wer hatte, über das Internet. Das waren fertig compilierte, ausführbare Programme. Ich nenne sie mal Binaries.

Wer Linux hatte, konnte sich seine Programme auch selbst kompilieren. Und es entstanden Meinungsverscheidenheiten unter den Nutzern.

Die Binaries-Fans meinten: Ja, einfach installieren und fertig. Man braucht nicht das ganze Wochenende um Office zu installieren.
Die Compilier-Fan meinten: Mir egal wenn es Zeit braucht, Ich kann meine Programme optimieren und an den Rechner anpassen.

Und Gott schaute einmal kurz weg, und es ward Java, .NET, Perl 6, JRuby, PyPy etc.

Diese setzten auf eine tolle Erfindung: Just-in-time-Kompilierung. Jedem ist bekannt, dass Interpretersprachen total langsam sind. Also werden sie, bevor man das Programm durchstarten kann, erstmal kompiliert. Das hat auch gleich den Vorteil, dass man sie auf die Hardware optimieren kann.

Nicht jeder hat die selbe CPU. Einige CPUs haben Erweiterungen die andere nicht haben. Und auch im Grafikkartenbereich ereignet sich in letzter Zeit einiges, dass man beachten muss. Das höhrt sich alles toll an, ist es auch.

Aber erinnern wir uns, was die Linux Typen vor 20 Jahren schon sagten (siehe oben): selbst compilieren weil optimieren. -_-

Nur muss mal bei JIT nicht auf Abhänigkeiten achten und auch kein Wochenende warten. Aber das sind techniche Eigenheiten. Im Grunde hatten wir Recht :P

20.08.2010

Mein Heli kann schwimmen!

Filed under: Allgemein — Tags: — Thomas @ 16:08

Eigentlich fing es ganz harmlos an. Jeder möchte doch wissen was sein Heli heben kann. Und da er zufällig gerade einmal funktioniert, habe ich einfach mal ein dünnes Kabel dran geknotet und in ein Meter Entfernung eine Banane. Lag halt grad hier rum.

Beim Starten zeigen sich schon die ersten Probleme. Wenn man nur wenig Gas gibt, zieht er die Banane natürlich nicht hoch. Also mehr Gas gaben und Zack, schleudert es die Banane durch die halbe Halle. Der Heli natürlich hinterher, ist ja nichts dran was eine Gegenkraft aufbieten kann.

10m weiter steht das erste Hinterniss. Der Heli war hoch genug. Die Banane nicht. Und so kam es wie es kommen musste. Zweimal um die Eisenstangen gewickelt und ab nach unten, durchs Loch im Boden, ins Wasser.
Ja richtig. Wir haben Wasser im Keller ^^ Na, ist ehr eine Abflussrinne. Die Bilder verraten mehr.

Was habe ich heute gelernt? Der Heli hebt eine Standardbanane (etwa 150g) locker hoch. Obwohl er schon einen überdimensionierten Akku hat.

Und was noch? Heli und Banane schwimmen oben :D Ein Glück. Sonst hätte ich die nicht heraus fischen können.

Da stell ich mir doch die Frage, was passiert mit einem Lipo Akku der längere Zeit im Wasser modert.
(/edit Nichts, ist Wasserdicht puh). Die Banane wurde übrigends gleich von einem Freund verspeist. Die gerechte Strafe.

Nach einer längere Trockenleg-Aktion funktioniert er auch wieder. Nur ein Gewinde muss nachgeschnitten werden.

HeliWasser1

HeliWasser2

HeliWasser3

19.08.2010

Something is wrong

Filed under: Allgemein — Thomas @ 23:08

Das soll die Nordsee darstellen. Aber einige Teile davon rasen sehr zielgerichtet der negativen Z Unendlichkeit entgegen ;)

nordseefail1

nordseefail2

webcamviewer

Filed under: programmieren — Tags: — Thomas @ 13:08

Wer kennt das nicht, man will nur mal schnell mit der Webcam ein Bild machen.

Also startet man das beste Programm aller Zeiten dafür: xawtv [1] Der Author dieses Programmes benutzte nämlich nicht v4l (Video for Linux), sondern entwickelte seine eigenen Funktionen. Das hatte den Vorteil, dass dieses Programm wirklich immer, auch bei den schrottigsten Webcams ein Bild lieferte. Alle anderen Programme versagten. Was zugegeben an den teilweise schlechten Webcamtreibern liegt.

Aber die goldenen Zeiten nähren sich ihrem Ende. xawtv wird schon lange nicht mehr weiter enwickelt. Und mit der neusten Kernel (2.6.35.2) bekomme ich zwar ein Bild, kann es aber nicht mehr abspeichern.

Aber man kann sich ja selbst helfen. Anstatt irgendein doofes Programm zu suchen, welches überladen ist, zu lange braucht beim starten, zu kompliziert zu bedienen ist oder Probleme mit der Webcam hat, habe ich mir einfach mein eigenens geschrieben.

Mein Programm mit dem simplen Namen "webcamviewer" benutzt OpenCv um an die Bilder der Kamera zu kommen. Man startet das Programm, bekommt sofort ein Livestream der Kamera und mit der Taste "j" wird ein jpg Bild abgespeichert mit passenden Timestamp als Dateiname. Einfacher gehts nun wirklich nicht mehr :)

webcamviewer-0.2.tar.gz

[1] http://linux.bytesex.org/xawtv/

Samsung NC10 WLAN

Filed under: Allgemein — Thomas @ 09:08

Mein Netbook hat als WLAN Karte eine "Atheros Communications Inc. AR5001 Wireless Network Adapter" verbaut. Früher als Kernel 2.6.27 aktuell war musste man extra einen speziellen Treiber installieren, den madwifi-hal-0.10.5.6-r3875-20081105.
Spätestens seit Kernel 2.6.35.2 hat sich das geändert. Hier langt der ath5k Treiber der schon in der Kernel enthalten ist. Man muss ihn nur noch aktivieren (und ggf. von Hand laden).

Ein Dankeschön an die Entwickler

18.08.2010

Er fliegt wieder

Filed under: Allgemein — Tags: — Thomas @ 18:08

Ganze 10 Minuten war der Heli heute in der Luft. Hatte zwar etwas mehr erwartet, aber besser als garnichts. Zugegeben, der neue Akku (Conrad, 7.4V 2.5Ah 160g, 80g mehr als der original Akku, 30Eur) ist etwas größer als erwartet, aber Not macht erfinderisch :)
Nur sollte man nicht mehr abstürzen, sonst ist der Akku gleich wieder hin.

Die extra Kühlkörper für den Motor sind auch echt nötig gewesen. Man verbrennt sich jetzt nicht mehr die Finger. Allerdings ist das immer so eine Fummellei, bis sie dran sind. Werde mir aber wohl die Zeit nehmen und an den anderen Motor auch welche zu kleben.

Der Akku selbst wurde im Flug so gut wie garnicht warm. Am Kabel konnte man allerdings doch etwas fühlen, wenn auch nur gering. Allerdings ist die Ladezeit von 6 Stunden nur mit viel Gedult zu ertragen.
Es wird Zeit für die externe Stromversorgung.

Noch ein paar Worte zu LiPo Akkus:
Hatte ja vor einigen Wochen den ersten Ersatzakku für 16Eur gekauft. Er hatte 850mAh und 15C und war nach 10 mal Laden schon kaputt. Aufgebläht und Kapazitätsverlust ohne Ende. Eigentlich hab ich alles falsch gemacht.

- Der Akku kann einen Spitzenstrom von 0.85Ah*15C = 12.75A liefern. Einen Dauerstrom von also etwa 6.3A. Gerade die Hälfte, steht so in dem Hinweisblatt. Der Heli brauht aber 10A. Also wurde er total überlastet.

- Eine Kühlung hatte der Akku auch nicht. Er war nach dem Flug immer sehr heiß. Im Rotorwind lag er auch nicht so wirklich.

- Überspannung. Durch die Experimente mit der externen Stromversorgnung lagen schonmal 20V an dem Akku.

- Tiefendladen. Klar ;)

Der neue Akku ist aber nun stark genug. :)

snap-20100818-184939-0

snap-20100818-185959-0

15.08.2010

Game Of Life in BF to C

Filed under: Allgemein — Tags: , — Thomas @ 23:08

The Game of Life in Brainfuck geschrieben und mit einem BF2C Converter übersetzt und compiliert und dann noch statisch gelinkt.

Das klingt irgendwie absurd oder?

Im Anhang der Quelltext... (God gab ihn mir ;) )

gameoflifesource.tar

fucking C

Filed under: Allgemein — Tags: , — Thomas @ 20:08

Bei Lft Craft habe ich den wohl schrecklichsten C Code aller Zeiten gefunden.

char m[9999],*n[99],*r=m,*p=m+5000,**s=n,d,c;main(){for(read(0,r,4000);c=*r;
r++)c-']'||(d>1||(r=*p?*s:(--s,r)),!d||d--),c-'['||d++||(*++s=r),d||(*p+=c==
'+',*p-=c=='-',p+=c=='>',p-=c=='<',c-'.'||write(2,p,1),c-','||read(2,p,1));}

Leute die meinen Style schlecht reden habe einfach keine Ahnung ;)

Und ja, das Ding compiliert wirklich. In den letzten zwei Tage habe ich das mal in lesbares C übersetzt


// m enthaelt den kompletten bf code und den programm pointer
// also programm und daten, so ist es moeglich eine quine zu programmieren
// 0 bis 4999 ist der bf code in plain text
// n und s sind mir noch nicht so ganz klar
// r zeigt auf das aktuelle zeichen im bf code
// p der programm pointer
// d hat irgendwas mit schleifen zu tun
// c das aktuelle zeichen im bf code

char m[9999],*n[99],*r=m,*p=m+5000,**s=n,d,c;

main(){
// Lese maximal 4000 zeichen von stdin
// (was mag passieren wenn der bf code groesser als 4000 zeicen ist
// naja, wird wohl einfach ueberschrieben)
for(read(0,r,4000);c=*r;r++)
{
//c- ']' || (d>1 || (r=*p?*s:(--s,r)) , !d||d--);
if(c == ']')
{
if(d <= 1) { if(*p) { r = *s; } else { --s; } } if(d) d--; } //c- '[' || d++ || (*++s=r), if(c == '[') { if(d == 0) { d++; *(++s) = r; } } //d|| ( if(d == 0) { //*p+=c=='+', if(c == '+') *p += 1; //*p-=c=='-', if(c == '-') *p -= 1; //p+=c=='>',
if(c == '>')
p += 1;

//p-=c=='<'; if(c == '<') p -= 1; //c-'.'||write(2,p,1); if(c == '.') write(2,p,1); //c-','||read(2,p,1); if(c == ',') read(2,p,1); // ) } } }
(Leider geht die Formatierung in WordPress verloren).

Aber jetzt erstmal ein paar Erklärungen. Wenn man sich den Code genauer anschaut, wird man feststellen, dass wohl alle ";" durch "," ersetzt wurden. So kann man mehrere Anweisungen in eine Zeile schreiben.

a = 0, b = a+1, c = a+b;

Weiterhin fällt auf, dass es kein einziges if() gibt. Man kann ein if() durch ein logisches ODER ersetzen:

a || b++;

Der Ausdruckt stimmt so. Normalerweise erwartet man sowas in einer if(), aber es geht auch ohne. Das Programm wird von links nach rechts abgearbeitet.
Ein ODER ist dann wahr, wenn einer von beiden Argumenten wahr ist.

Also wenn a ungleich 0 ist, zählt das als wahr. Aber sagen wir lieber true, spricht sich schöner.
Wenn also a true ist, muss b++ nicht mehr ausgeführt werden.
Ist a hingegen 0, wird b++ ausgeführt.
So einfach kann es sein :)

Dann fallen Sachen wie p+=c=='>' auf. Auch das ist ganz einfach. Der Operator == wird vor += ausgewertet. Wenn also c=='>' ist, ergibt das true, also 1. Dann steht als zweites p+=1 da. Sollte c irgendein anderes Zeichen sein, wird p+=0 ausgeführt.

Folgender Code ist auch noch erwähnenswert

c- '[' || d++ || blubb

Das ist wieder eine geschachtelte if(). In c steht ein Zeichen vom Bf Code. Sollte in C nun das Zeichen '[' stehen, und subtrahiert man nun ein '[', ist das ergebis 0. Unsere if() wird also wahr und der nächste Ausdruck wird in Angriff genommen.

d++ || blubb

Das Problem mit dem ++ sollte ja bekannt sein, bei d++ wird erst d bentuzt, dann um eins erhöht. Bei ++d wird erst d um ein erhöht und dann benutzt. Ist also d gleich 0. Wird d um eins erhöht und dann blubb ausgewetet.

Mit diesem Wissen kann man schon fast den kompletten Code verstehen. Nur diese eine Zeile hat mich eine Weile beschäftigt

c- ']' || (d>1 || (r=*p?*s:(--s,r)) , !d||d--)

Schaut erstmal eine Weile drauf. Am Anfang eine if(), noch eine if(), noch eine if() und dann noh eine if() ;)

Interesannt ist nur der innerste Teil

r=*p?*s:(--s,r)

Da steht ?:
Und ?: geht vor dem = Operator. Wenn also *p nicht 0 ist, dann wird r = *s ausgeführt. Sollte *p 0 ergeben. Wird erst s um eins erniedrigt und dann r=r ausgeführt.
r=r ist natürlich doof, aber ohne das würde da stehen r=--s; und das ist ja nicht gewollt.

So und was ist das nun für ein Programm? Na ein Brainfuck Interpreter. Sieht man doch ;)

Older Posts »

Powered by WordPress