Sida 1 av 16

Korkens Optical Flow sensor

Postat: 22 december 2013, 17:00:55
av Korken
Godagens kära forumister!

Medans jag väntar på att mina KFly kort ska produceras så tog jag mig tiden att läsa på om Optical Flow sensorer. Optical flow är när man ser hur mycket någonting rör sig i en bild och jag ska ha detta för att se hur fort mitt system rör sig över marken för att få en markant ökning i estimerad x-y precision. Detta är en ganska intressant problem och det finns några lösningar på marknaden, dock är de lite för dyra för min smak, över 1000 kr, och så vill jag gärna lära mig om detta.

Jag tänkte använda en metod som heter "Sum of Absolute Differences" (SAD) för att göra min optical flow algoritm. Det är en block baserad metod som passar väldigt bra för inbyggda system, så det ska bli kul att testa å implementera den. :) Utöver detta så la jag till en höjdmätande sonar på samma kort då jag ändå behöver det för mitt system plus för att konvertera "pixelflöde" till m/s.

Lite HW specifikationer:
  • - STM32F407 MCU @ 168 Mhz med 192 kB RAM
    - ADP322 trippel spänningsregulator för 1.8 V, 2.8 V och 3.3 V. (Ramlade över denna på digikey, såg riktigt trevlig ut!)
    - En MAXSONAR för att mäta höjd upp till 5 meter i 20 Hz
    - OV9650 Camera module, kommer medelvärdesbilda en större bild för att få högre ljuskänslighet. Om denna inte är bra nog så går jag nog över en till Micron kamera som den i Kinect.
    - USB Virtual ComPort och en UART I/O
    - Massa LEDs för status
    - Enkelsidig montering med dubbelsidig design, hade nog kunna halverat storleken om jag hade MCUn på baksidan, men ville ha allt på samma sida för prototypen.

    Pris: ca $40 för ett komplett system om 1 st.

Detta kommer bli riktigt kul tror jag! :)
Korten är beställda och Digikey order lagd på delar, bara att vänta på hårdvaran.

Mvh
Emil Fresk

Obligatoriska renderingar av kretskorten:
Nya som är korrekta:
flow_top2.png
flow_bot2.png
Gamla med fel i:
flow_top.png
flow_bot.png

Re: Korkens Optical Flow sensor

Postat: 22 december 2013, 17:07:50
av Andax
Mycket intressant projekt. Blir nog en mycket kompetent sensor som går att tuna till diverse uppförande.
Jag köpte en mycket enklare Optical Flow sensor baserad på en ic från on optisk mus för ett tag sedan. Ska försöka skaka liv i den nu under julledigheten. Hade dock inte räknat med öroninflammation i min plan!

Re: Korkens Optical Flow sensor

Postat: 22 december 2013, 17:48:27
av lizerdboy
Wow det här blir spännande :tumupp:

Re: Korkens Optical Flow sensor

Postat: 22 december 2013, 17:49:43
av Korken
Coolt! :tumupp: Du får berätta hur det går med den sen. :)
Jag kollade på sånna, men de har lite för dålig lågljus funktionalitet samt att de brukar ha problem med rotation, men om du hittar fixar mot detta borde de funka kanon!

Re: Korkens Optical Flow sensor

Postat: 22 december 2013, 18:12:23
av JimmyAndersson
Oj, det här kommer bli kul! :)
Jag har haft lite tankar om en sådan modul, så det ska bli intressant att följa projektet.


Psst:
"En MAXSONAR för att mäta höjd i upp till 20 Hz"

Jag tror att det ska vara något annat där på slutet... :)



Andax:
När du mår bättre så får du gärna göra en tråd om det.

Re: Korkens Optical Flow sensor

Postat: 22 december 2013, 18:26:06
av Korken
JimmyAndersson: Tackar, ska försöka hålla ganska hög takt på detta så det hinner bli något innan KFly landar. Men känner jag mig själv kommer jag spräcka den tidsplanen. :lol:

Fixat om sonarn :)

Re: Korkens Optical Flow sensor

Postat: 23 december 2013, 10:44:38
av Agwan
Vad tror du att du kommer att få för framerate? Jag är i behov av en exakt lika dan sensor. Men möjligen högre upplösning och högre framerate än vad som behövs i en Quadrocotper.

Jag kollade på att göra phase correlation mellan bilderna. Man applicerar ett hammingfönster på bilderna, beräknar 2D fourriertransformer på båda. Komplexkonjugerar ena bilden, multiplicerar bilderna elementvis och normerar. Inverstransformerar och vips har man förflyttningen. Väldigt duktig på att hantera brus också. Men det är tungt att göra på en mikroprocessor. Möjligen behöver man inte ha speciellt många pixlar.

Det fina med när de använder möss är att de får en jäkla framerate. Kamera är inte lika enkelt. Men jag är intresserad av att utvärdera ditt kort och möjligen hjälpa till om det behövs bara jag kan övertala min kund att han vill använda den här tekniken. Min tanke är att ersätta ett gyro med en sån här för att öka upplösningen. Tanken är då att titta på något långt bort med kameran genom en kikare och få hög upplösning på det sättet. Rörelsen kommer inte att vara stor men en frekvens på kanske 15 Hz, så jag behöver ganska så hög framerate.

Re: Korkens Optical Flow sensor

Postat: 23 december 2013, 11:34:23
av Greve Hamilton
Intressant. Det labbades lite med optical flow i en kurs jag läste. Tyvärr minns jag inte så mycket om deras för- respektive nackdelar, men när jag skummar wikipedia verkar det som att vi implementerade Lucas-Kanade och Horn-Schunck. Dock aldrig "på riktigt", utan bara i Matlab. Men ska bli skoj att se hur hög framerate du kommer få.

Re: Korkens Optical Flow sensor

Postat: 23 december 2013, 12:00:31
av gkar
Det kommer att käka cycler!

Kolla om din kompilator ger optimal kod, annars skriv innerlopen i assembler och använd USADA8 eller en släkting.
http://infocenter.arm.com/help/index.js ... BJGJD.html

Re: Korkens Optical Flow sensor

Postat: 23 december 2013, 20:08:50
av monstrum
Hur löser man cancelering av rotation? Alltså den bildförskjutning man får då enheten roterar X- eller Y-axeln sett från kameran. Ifall rotationshastigheten och höjden över marken är känd så går det ju att räkna ut hur stort felet blir så man kan kompensera, men det känns lurigt att få någon precision i det.

Re: Korkens Optical Flow sensor

Postat: 24 december 2013, 22:18:31
av LHelge
Har du helt missat korkens andra projekttråd?

Re: Korkens Optical Flow sensor

Postat: 25 december 2013, 01:26:43
av blueint
Menar du denna tråd? Korkens styrkort för multirotors (KFly) - Nu med Blogg!

Intressant projekt förresten :tumupp:

Undrar dock hur mycket processorkraft som går åt dock..

Re: Korkens Optical Flow sensor

Postat: 25 december 2013, 05:42:13
av Magnus_K
Kan man bli svartsjuk på någon annans kunskap så är jag det... Jäkligt kul att följa dina projekt, Korken. :tumupp:

Re: Korkens Optical Flow sensor

Postat: 25 december 2013, 08:58:59
av Andax
Kamera-modulen kan ju läsa ut bilder i olika upplösningar. Gissar att den lågpassfiltrerar om man läser ut en lågupplöst bild. Tror den lägsta upplösningen är 352x288. Det räcker säkert för en hyfsad optical flow estimering. Då har man ju bara 100kPixel mot 1.3MPixel vid full upplösning vilket minskar beräkningsbördan ganska mycket.
Sedan går det ju också att köra region-of-interest utläsning. Då kan man ju ta små patchar som ligger optimalt för det man vill skatta fram.

Re: Korkens Optical Flow sensor

Postat: 25 december 2013, 12:42:52
av Korken
Oj vad det har skrivits i denna tråd över jul då. :)
Ska försöka svara på lite frågor och korrigera lite missförstånd.
Jag uppdaterade bilderna i första inlägget också, självklart han ett fel smyga sig in men jag hann fixa det. :)

Agwan:
Jag siktar på samma framerate som kameran kan ge ut, dvs 120 fps.
Jag ramlade över ett projekt har gjort en liknande sensor: https://pixhawk.ethz.ch/px4/modules/px4flow och de får ut 240 fps ur sitt system med samma metod.
Så tror det inte ska vara några problem med ganska hög framerate. :) Kommer nog ha en bild på omkring 80 x 80 pixlar.

gkar:
Jodå, jag har planer på att skriva alla innerloopar i ASM, annars kommer det nog inte att gå. :)

monstrum:
Det kan jag kompensera för från KFly systemet.
Funderar dock på att lägga till ett gyro så kan man ha det som ett stand-alone system också.

Magnus_K:
Tackar! :)

Andax:
Jag kommer nog ta en QCIF frame och medelvärdesbilda några block i bilden för att få omkring 50x50 till 80x80 pixel bilder. Detta ska räcka mer än väl för en SAD algoritm.
Varför jag valde en 1.3MPixel kamera är för att de är billiga och enkla att få tag på, sendan om man väljer mindre bild så kan de komma upp i väldigt hög frame rate. :)