Gå til innhold

Anbefalte innlegg

Trykk på "Legg til favoritt" for å følge med på tråden!

 

 

Da tenkte jeg det var på tide å starte bloggen min hvor jeg holder en jevn oppdatering på min bachelor-oppgave.

 

Anglophobia warning: Noen innlegg i denne tråden vil være på Engelsk. Det er fordi jeg tar min utdanning på engelsk, og skal bruke bloggen min som en del av rapporteringen til prosjektet.

 


Introduksjon

Prosjektet jeg skal lage er en quadcopter-drone som skal fly etter et gitt objekt. Det skal i bunn og grunn bestå av et quadcopter, en BeagleBone Black som gjør tallknekkingen og et lite kamera.

Prosjektet er i tidlig planlegging, så ting kan forandre seg drastisk i løpet av de neste ukene og faktiske resultater må dere enda vente litt på. Jeg skal prøve å gi dere noen godbiter under selv de tørre delene av prosjektet.

 

Programvare

For å forhindre plagiering så kommer koden min ikke til å bli distribuert i sin helhet før oppgaven er levert inn. Koden kommer til å bli utgitt under GPLv3 (du-uh) så snart den tiden kommer.

 

Jeg kommer i hovedsak til å utvikle prosjektet mitt i to deler, der en går til å få driten til å fly, og en annen går ut på å få driten til å se objektet jeg skal følge. Dette er for å hindre at koden min blir til en moosh av spaghetti og blobs, og quadcopteret ikke kan fly før det ser et rødt objekt, eller fargen grønn ikke fungerer før quadcopteret snur 90 grader til venstre eller annet feng shui crap. Ja, selv om det er et ekstremt eksempel så kan det skje. Spesielt om jeg ikke klarer å holde styr på koden min.

Derfor skal jeg holde disse to delene separert, og integrere de sammen gjennom et tynt grensesnitt.

 

Språket jeg skal programmere i er C, fordi C er et superkult språk. Kanskje jeg er modig nok og prøver meg på C++.

 

Modularitet

På grunn av en kritisk deadline og mye usikkerhet rundt prosjektet så vil utviklingen skje modulært og feature-driven. Hva det betyr er at jeg ikke kan love dere noe mer enn basic "Følg denne røde ballen", men etter hvert som jeg får en oversikt over prosjektet og hva jeg har tid til så har jeg følgende å tilby:

 

Kalman Filter

Kalman filteret er en idé med høy prioritet. I bunn og grunn så er det en estimerings-algoritme som gjør at dronen kan se hvor ballen har rullet og gjette hvor den vil befinne seg når den er utenfor syns-rekkevidden.

 

SIFT/Feature Detection istedet for farge

Hadde det ikke vært kult om jeg kunne følget f.eks en bil istedet for en ball med en forhåndsbestemt farge? Feature Detection ser på konturer til objektet og kan lete etter det i bildet, istedet for en forhåndsbestemt farge.

Dessverre er dette en utfordring å implementere, veldig tidskrevende og gir en helt ny dimensjon til ting som kan gå galt.

Har et høyt ønske om å implementere dette, men på grunn av tidsbegrensinger og prioriteter så ser jeg ikke på dette som realistisk.

 

GPS-posisjon

Veldig lett og greit å implementere da det bare er å dumpe GPS-data, men er egentlig ikke noe jeg ser på som akademisk interessant, derfor er nedprioritert.

 

More is yet to come... Gjerne kom med flere idéer!

 

Kommentartråd

Endret av Gavekort
Lenke til kommentar
Videoannonse
Annonse

Jeg skal prøve så godt jeg klarer å ikke kjede dere med detaljer under planleggingsperioden. Hva jeg har gjort i dag er at jeg har fått bekreftet hvor jeg skal begynne med prosjektet og hva jeg skal sikte mot.

 

Jeg har ikke startet på noe av det kule enda, og kommer ikke til å gjøre så før etter en drøss med rapporter.

 

Så hovedretningen min blir altså å få festet et Beaglebone Black til et quadcopter, få det til å fly (stabilt!) og ta imot basic instrukser fra en ubetydelig kilde, så få det til å fly noen centimeter i en eller annen retning. Så sant det fungerer så skal quadcopteret monteres fast til en flate for å hindre at prosjektet mitt ikke ender i en mindre finger og ødelagte propellere, men samtidig se om quadcopteret faktisk vil fly en plass etterhvert som ting skjer.

 

Så kommer vi til der vi driver med object-tracking. Jeg vil ikke bruke OpenCV fordi det gjør prosjektet mitt kjedelig, istedet så vil jeg implementere blob-detection (finne en klump av X farge), SIFT (finne en feature som en runding/trekant/bilkant/menneskekant etc) og et Kalman Filter for posisjonsestimering (Gjette hvor et punkt vil ende ved å se på hvilen retning det gikk i, og hvor for det gikk). Alt dette vil jeg implementere selv med minimal hjelp fra biblioteker til selve algoritmen. Det å fly quadcopteret derimot vil jeg unngå mest mulig, så der vil jeg aller helst ha en adskilt tredjeparts-enhet som styrer alt det.

 

Slik som dette ser planen min ut fremover:

Lage plan (in progress)

Drite ut et tonn med dokumentasjon - Det skal dere få slippe å bli med på, men det betyr at det vil være rimelig stille her i en liten periode

Boilerplate code - I bunn og grunn lage grunnlaget for prosjektet mitt. Slik som å få hente video fra kameraet, få quadcopteret til å fly med simple instrukser og finne ut hvilke biblioteker jeg skal bruke.

Starte på prototyp - Holde prosjektet til et minimum, det blir å få styringen av quadcopteret på plass, lage en simpel blob-detection algoritme og muligens integrere disse til å fungere halvveis shitty.

Implementere mer funksjonalitet og polere prototyp - Dette blir å implementere Kalman Filter og diverse andre, mer komplekse object-detection algoritmer og prøve å øke ytelsen til dronen min

 

Kommentartråd

Tykk på "Legg til Favoritt" om du vil holdes oppdatert til prosjektet

Endret av Gavekort
Lenke til kommentar

Da har jeg begynt å prototype blob-detection, med gode resultater så langt. Det er enda veldig støy-sensitivt, så skal drive å leke litt med automatisk threshold (minimalisering av margin) og gjøre slik at vi kan holde styr på flere blobs, for om det hadde vært to baller så ville resultatet blitt at begge ballene blir tolket som en stor ball, noe vi ikke kan ha noe av. :xmas:

snapshot1.png

snapshot2.png

Endret av Gavekort
Lenke til kommentar

Innkjøpsliste Version 0.5:

Hobbyking Fiberglass Quadcopter Frame 500MM

20835-1.jpg



Turnigy D2830-11 1000KV Brushless Motor
12921(3).jpg

Turnigy Plush 25amp Speed Controller
p25a.jpg


 

Så var det kontrolleren som jeg funderer på. Jeg tipper jeg må gå for en ArduPilot-basert kontroller slik som HKPilot Mega V2.5, som basically er en billig-klone av den mye dyrere APM-kontrolleren.

 

Dette er selvsagt bare selve Multirotor-delen av prosjektet. Jeg skal tenke litt mer på kamera etter at jeg har fått bekreftet hvor tung payload dette oppsettet kan løfte.

 

Kommentartråd

Endret av Gavekort
Lenke til kommentar

Siden jeg har en sånn fin døgnrytme så har jeg jobbet med å finpusse blob-detection prototypen min. Farger filtreres ikke lenger på RGB, men HSV slik som det skal være. Grunnen til at jeg bruker HSV istedet for RGB er slik at jeg lettere kan definere en bestemt farge og dens nyanser. Har jeg f.eks lys rød, så blir det bare Saturation (S) som vil minkes, istedet for med RGB der alle både G og B økes etter som rødt blir lysere.

 

Rødt (HSV): [0,100,100]

Rosa (HSV): [0, 28, 100]

 

Rødt (RGB): [255,0,0]

Rosa (RGB): [255, 183, 183]

 

Skal du drive å definere farger så er HSV mye greiere å bruke, og du kan sette opp terskler mye lettere med HSV enn å drive med "special cases" og RGB.

 


Jeg har sikkert doblet ytelse, da jeg slo sammen filtreringen og margin-kalkuleringen i samme iterasjon. Filtreringen er i bunn og grunn bare å gå gjennom hver eneste piksel og se om den stemmer overens med mine definisjoner av "rød". Jeg la ved en illustrasjon som skal forklare prosessen ganske simpelt og greit.

 

Jeg skulle gjerne illustrert hvordan jeg kalkulerer marginene mine også. Det er ikke komplisert, men det er et kav å forklare på en forståelig måte. I bunn og grunn så sier jeg at hvis en piksel er rød, så skal den også sjekke om X/Y-koordinatene er større/mindre enn allerede satt margin, om den er det så blir dette den nye marginen, er det ikke det så hopper den bare videre.

snapshot5.png


Sist men ikke minst så har jeg også overhalet hele prototyp-koden. Jeg kommer trolig ikke til å bruke denne koden uansett, men jeg gjør meg selv en tjeneste å kode ting skikkelig istedet for å bare hacke noe kjapt sammen.


Ting som skal fikses senere:

  • Auto-threshold - Der programmet finner ut tersklene selv
  • Kamera-feed - Få dette her til å fungere i real-time istedet for på statiske bilder
  • Flere blobs - Programmet kan fortsatt bare oppfatte en blob om gangen, så om det er to baller så skal programmet kunne sette en slik rektangel på begge ballene, istedet for nå der rektanglet bare utvider seg til å dekke begge ballene.
  • Optimalisering - Så snart jeg skal gjøre dette i real-time så må jeg begynne å optimalisere ting. Jeg aner ikke hvor krevende dette er, men jeg må minst ha 10-15 FPS på en BeagleBone Black for at dette skal være brukende.

Skravletråd

 

snapshot4.png

Endret av Gavekort
  • Liker 1
Lenke til kommentar

Har ikke så mange oppdateringer på programvaren eller på selve quadcopteret, men jeg har nå kjøpt inn et kamera og en USB-hub.

Kameraet er et helt vanlig Logitech C270 HD med en oppløsning på 720p og rimelig god bildekvalitet. Oppløsningen kommer ikke til å være på langt nær 720p, da det ikke trengs og er CPU-sultent. Det viktigste er at det er billig, kompakt, ikke har for mye ISO-støy og ikke har for mye slep i bildet.

41nrUTghr%2BL._SX385_.jpg

http://www.amazon.co.uk/gp/product/B003R1O320/ref=oh_details_o01_s00_i00?ie=UTF8&psc=1

 

Så var det en USB-hubben. BeagleBone Black har én ulempe i forhold til Raspberry Pi, og det er at den kun har én USB-port, som om to ikke var lite nok. Jeg skal egentlig bare ha to USB-porter, en til kameraet, og en til en USB WiFi-dongle, og for at dette skal gå så må jeg ha en hub.

 

Her er link om du absolutt er interessert i USB-hubben.

http://www.amazon.co.uk/gp/product/B005GLDAVE/ref=oh_details_o00_s00_i00?ie=UTF8&psc=1

 


 

Ellers så har jeg undersøkt videre på innkjøp av quadcopteret, og fått min kjære BeagleBone til å boote opp med Ängstrom Linux.

 

Comments go here ---> https://www.diskusjon.no/index.php?showtopic=1564684

Endret av Gavekort
  • Liker 1
Lenke til kommentar
  • 3 uker senere...

Så! En oppdatering!

 

Jeg har nå fått quadcopteret mitt og er 90%* ferdig med å bygge det (bilder kommer senere i form av en skikkelig update). Dessverre så har jeg to problemer: Det første er at jeg mangler nylonskruer til motorene og det andre er at jeg mangler forgrener fra ESC til HXT-battericonnector. Jeg mangler også flightcontrolleren, men det er fordi jeg har planer om å låne en av universitetet, om jeg bare får svar på eposten min.

 

På software-fronten så har jeg ingenting juicy da det meste går å refaktorere blob-detection. Den typen blob-detection som dere kan se i videoen ovenfor er en naiv fremgangsmåte som bare setter en ramme rundt det røde. Det jeg jobber med nå er å ekspandere røde blobs slik at jeg kan fjerne små blobs, separere blobs og referere til hver enkelt av de. Jeg vil også gjøre en skikkelig post om det så snart jeg har det fungerende.

 

Det blir spennende fremover. Snart skal dere få oppdateringer i form av bilder, og enda flere videoer. Neste uke så har jeg mer papir jeg må pushe, og en demonstrasjon for veilederne mine. Wish me luck.

 

Questions/Comments/Critique

 

 

*estimated

Endret av Gavekort
  • Liker 1
Lenke til kommentar

Enda en mini-update:

 

Blob-detection er så og si ferdig. Jeg har nå gitt hver røde piksel en peker til hvilken blob den tilhører, og som video viser så fargelegger den pikselen etter hvilken ID den tilhørende blobben har.

 

http://youtu.be/7hbbrDwFbyo

 

For å forklare hva som skjer i videoen så er det to røde korker jeg har lagt ut på en CV-vennlig overflate (MAO: Ikke en rød overflate). Alt annet enn rødt blir filtrert ut, så finner jeg en gjenstående piksel og ser om det er noen tilhørende nabo-piksler og gir de alle en peker til en blob med f.eks ID 1. Når jeg har utforsket alle naboene så leter jeg videre i input-feeden, og om jeg finner en ny rød piksel som jeg ikke har besøkt før så gjør jeg det samme, bare nå får de en peker til en blob med ID 2, og slik fortsetter det.

 

Det dere ser i videoen her er ikke pikslene fra kameraet. Det er fargelegging av blobber, der blå farge er blob 1 og grønn farge er blob 2.

 

NB: Jeg har en diger flaskehals i queuen min, så ytelsen i videoen er lavere enn det den burde være.

 

Update: Flaskehalsen er nå fjernet og ytelsen gikk fra 16 til 26 FPS. :D

Flaskehalsen var forårsaket av min egen idioti der jeg hadde O(n) insertion på queue, istedet for O(1) slik det burde være. Hva det betyr er at jeg måtte iterere over hvert eneste element i queuen for å kunne legge til et element på slutten, så hvis antallet elementer (n) er, si, 15.000 så må jeg iterere over 15.000 elementer før jeg kan legge til et nytt. Som dere kan tenke dere så er dette DYRT! Jeg er ikke stolt av meg selv...

Endret av Gavekort
  • Liker 2
Lenke til kommentar
  • 3 uker senere...

So...

 

Hvor er vi?

 

Quadcopter

99% ferdig. Det er ferdig bygget og står klart uten propeller som jeg ikke har satt på fordi det ikke er nødvendig og for å bevare min egen helse.

ArduPilot, flightcontrolleren jeg bruker, var litt annerledes enn det jeg forventet. Det er min egen feil at jeg ikke leste dokumentasjonen nøye nok, men jeg har ikke muligheten til å kunne styre quadcopteret gjennom ArduPilot sitt MAVLink-grensesnitt. Derfor har jeg nå scrappet datalink-idéen og begynt å takle problemet litt mer naivt, å emulere en radio kontroller, du vet, slik ting som du holder i hendene for å styre greien. Dette gjøres ved å sende et PWM-signal på flightcontrolleren sin input.

 

BeagleBone Black

Jeg har lyst til å kaste driten i veggen og gråte meg til søvne. Den lille dingsen forårsaker ganske kritiske problemer for meg. Først og fremst så fungerer ikke MJPEG-komprimering på C270 web-kameraet. Dette betyr at kameraet sender meg rå YUYW pikseldata, noe som gir meg dårligere ytelse og lav oppløsning. Den lave oppløsningen (slik jeg forstår det) kommer av at bussen ikke takler den enorme datamengden som kommer med ukomprimert pikseldata, så V4L (Video4Linux - Video backend) klarer ikke å polle framen over til minne før den blir droppet av kameraet. Resultatet er at ting borker seg og alt jeg får ut er "select timeout" feilmelding. Selvsagt kan jeg bruke YUYW-formatet, men da med en laber oppløsning på 160x120. Selv om oppløsning ikke er så fryktelig viktig i min situasjon så vil en såpass lav oppløsning gi dårligere resultater da det vil medføre mindre separering av blobs. Ønsket oppløsning er 640x480, som jeg kunne klart fint om jeg får MJPEG-komprimering til å fungere.

Les mer her: http://blog.lemoneerlabs.com/3rdParty/Darling_BBB_30fps_DRAFT.html

 

Problem nr.2 med Beaglebone Black er horrible drivere for bruk av PWM. Jeg håpet jeg kunne finne et bibliotek, gjøre litt minnemagi eller lignende. Er fristet til å bare slenge på en Arduino og proxye kommandoer over serial til Arduino og la den fikse PWM-signalet til flightcontrolleren. However, jeg skal prøve et forsøk i nærmeste fremtid og se om jeg bare kan dumpe data inn i system-device filene, selv om dette blir veldig skittent og det er ikke første gangen at en kernel-oppdatering forandret på strukturen til driverne.

Mer om PWM på Beaglebone Black: http://digital-drive.com/?p=146

 

Problem nr.3 er hvordan jeg skal forsyne dingsen med strøm. Jeg trodde jeg hadde det under kontroll da jeg kjøpte et lite LiPo-batteri som jeg loddet på en integrert batteri-kontroller. Men siden jeg ikke eier kompetanse til å lese dokumenter skikkelig så så jeg ikke at USB-porten sluttet å fungere på 3.7V forsyningen. USB-porten trenger en stabil 5V-forsyning... DOH!

So back to the drawingboard. Jeg fant ut at ArduPiloten kan forsyne 5V på output-railet. Jeg har ikke lyst til å ta noen sikringer, så denne gangen så leter jeg gjennom hele internettet, selv de mørke hjørnene, for å finne ut om det er trygt å dra så mye strøm fra denne railen.

 

Kalman Filter

Jeg har satt Kalman Filter på lav-prioritets slotten min, noe som betyr at jeg laster ned et papir om Kalman Filter, leser et avsnitt og får vondt i hodet.

 

 

GOOD NEWS EVERYONE

HBIqvKB.jpg

 

Koden min er nå tilgjengelig på Github, ihvertfall inntil videre. Lisensiert under GPLv3, og skal være mulig å kjøre på de fleste Linux-maskiner med OpenCV installert.

https://github.com/Gavekort/MultirotorDrone

 

 

IMG_20140403_170038.jpg

IMG_20140326_163448.jpg

 

Skravlesyk? Gi meg noen kommentarer!

 

Bildet under er rimelig stort

poster_A2.png

Endret av Gavekort
  • Liker 2
Lenke til kommentar

Mini update:

 

Jeg har nå kjøpt inn en haug av elektronikk. Blant dette så kjøpte jeg noen M/F jumperledninger som jeg skal bruke til å koble Beaglebonen til Ardupilot sin output powerrail. Jeg fikk bekreftet av 3D Robotics selv at Ardupilot skal kunne tilby strøm til min Beaglebone, noe jeg testet ut ved å poke løse ledninger borti den. :w00t:

 

Jeg har også byttet WiFi-modul siden min gamle dongle fra totusenoglengesiden var utdatert, strømsulten og ustabil. Det jeg har drevet med i det siste er å få den forbanna rtl8192cu-driveren til å kompilere og kjøre. Heldigvis så fant jeg noen blogg-innlegg som hjalp meg ganske mye.

http://gencarelle.com/blog/2013/07/19/problems-with-rtl8188cus/

http://www.codealpha.net/864/how-to-set-up-a-rtl8192cu-on-the-beaglebone-black-bbb/

 

Jeg har også begynt å implementere styrings-prosedyren som jeg tenker skal kjøre som egen thread, oversette throttle til PWM-verdi, fikse opp, ned, frem, tilbake, osv, osv, osv...

Sjekk ut drone_control branchen på Github, så kan dere se fremgangen.

https://github.com/Gavekort/MultirotorDrone/tree/drone_control

 

Jeg har linket til kommentartråden i nesten alle postene frem til nå, så her er en link til min programmerings-jam

Lenke til kommentar
  • 2 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...