Navigasjon og oppsummeringspost for Bugster


Hei bloggen!

I dag skal vi skrive om navigasjonssystemet vi har laget for Bugster og noen andre ting som er verdt å nevne før prosjektet avsluttes samt en oppsummering av prosjektet og hvor vi endte.

Utstyrsliste (bilen er satt sammen, men lista beskriver hva man trenger for at navigasjonskoden skal kjøre fornuftig):

  • Arduino Mega
  • IR-sensor til hjul
  • Ultralyd sensor
  • Hjul med enkoderhjul festet på
  • Ledninger, motstander, batteri osv

 

Navigasjon:

For å kort oppsummere hva målet med autopilot delen av Bugster er, så er det: Finne angitt mål, navigere til det angitte punktet og dersom det er hindringer skal den svinge unna, men samtidig jobbe seg nærmere måket. Når angitt punkt er nådd skal bilen stoppe.

Vi kan med glede si at dette har vi fått til! Det er noen scenarioer hvor det ikke vil virke, f.eks hvis bilen må kjøre langs en vegg et stykke før den kan kjøre rundt eller hvis punktet befinner seg bak spissen på et hjørnet. Koden for å gjøre det virker, men IR-sensorene vi skulle bruke for å se om det befinner seg en vegg på siden av bilen drar for mye strøm, så med nåværende hardware spesifikasjoner lar det seg ikke gjøre. Det som fakstisk skjer i slike scenarioer er at bilen vil snu seg mot veggen, se veggen, snu se vegg, snu tilbake, se veggen og fortsette slik til den klarer å kjøre seg helt fast. 🙁

Hvordan virker denne koden? Det er ikke noe poeng i å forklare hver minste variabel, men enkelt forklart så får navigasjon angitt ett punkt den skal kjøre til, en Y verdi og en X verdi. Hver iterasjon av programmet så sjekker navigasjon om den har nådd Y og/eller X (hvis begge er nådd så er den framme), deretter sjekker den  om bilen kjører langs Y eller X og om den skal fortsette med det. Hvis den kjører feil retning på aksen sin, eller om den har nådd verdien på denne aksen så finner den ut om den skal kjøre til høyre eller til venstre ved å se på verdien til aksen som befinner seg vinkelrett på nåværende akse. F.eks hvis angitt mål er 1,5m Y,  1,5m X og den kjører langs X aksen og når X så finner den ut at den skal svinge til venstre for å kjøre riktig retning langs Y aksen. Når et mål angis så taes det utganspunkt i at (positiv) Y verdi er foran retningen bilen ser der og da, og at (positiv) X verdi er til høyre.
Når bilen kjører så vil IR-sensorer som ser på hjulene sende interrupt hver gang den blir “rising”, da vet vi at bilen har kjørt nye x meter. navigasjonen vil da se om bilen kjører positiv eller negativ retning på aksen sin og legge til/trekke fra verdien på distanse kjørt på den aksen. Når en distanse kjørt på en akse er lik angitt distanse i målpunktet så vil bilen svinge til neste akse.

Hva skjer hvis det står en hindring i veien? I arduino sketchen som kjører hele sullabitten sjekker den ultralyd sensoren for å se avstanden til eventuelle objekter, dersom denne avstanden er mindre enn en halv meter vil den si ifra til navigasjonen om at det må skje en unnvikelse. Da sjekker navigasjonen om målet på den andre aksen er til høyre eller venstre for også svinge dit. Det er her IR-sensorer på sidene ville hindret bilen i å svinge mot en ny vegg/hindring hvis de hadde vært oppe og gått.

Enda kortere oppsummert? Bilen vet hvilken retning den peker, hvilken retning angitt X og Y er og den finner hvilke retning den bør kjøre til enhver tid. Hindringer fører til bytte av retning mot den andre vedien.

Vi har brukt et oppgradert bibliotek til ultralydsensoren, som heter newPing. Dette har støtte for blant annet timer interrupts slik at vi kan “polle” ved gitte intervall når vi måler avstand, vi bruker 24micro sekunder.

Oppsummering av prosjektet:

Prosjektet har gått ganske greit, vi har justert på kravene underveis for å komme i mål:

  • Navigasjons programmet kjøres nå på en arduino mega, og ikke på en raspberry pi som var originalplanen, dette fører til at vi bare kan ha ett mål i stedet for flere check points pga lite minne.
  • Vi droppa ir sensorer på sidene da disse fikk  resten av systemet til å knele da de fikk strøm, selv uten å legge de til i koden som kjørte eller å koble de til arduinoen(!)
    Mer feilsøking peker på at problemet var tomt batteri, men vi måtte fokusere på andre ting.

Ellers har det vært lærerikt.

Koden for prosjektet finner du her.


Leave a Reply