Stap 4: programmeren
Het programma zal worden een steeds evoluerende project. Als u beschikken over een bijgewerkte versie wilt, stel ik het vertakken van de code van mijn GitHub repository op de volgende link:
https://github.com/TheInventorMan/IntelligentTraff...
Echter heb ik geplakt de code hieronder voor uw gemak, hoewel dit is alleen voor het lokale apparaat dat zal worden gehouden in het voertuig. Alle zich bestanden van de Server bevinden op de repo.
Voor degenen onder u die geïnteresseerd zijn, is hier een eenvoudige schets van het algoritme dat wordt gebruikt:
- GPS ontvangt locatie, snelheid, rubriek en tijd
- Apparaat worden gegevens opgevraagd uit server via de 3G dongle
- Server reageert met een gegevensstroom, vergelijkbaar met die van een zin NMEA (maar hey, het is een eenvoudig protocol)
- Gegevensstroom is geparseerd en geordend in een 2D-matrix, met de signalen locaties, tijdsinstellingen, offsets, enz.
- Met behulp van deze informatie, bepaalt het apparaat welke signaal nadert.
- Het groene licht-venster wordt bepaald, en maatregelen die daarmee tegen de huidige snelheid
- Apparaat wordt gevraagd stuurprogramma te versnellen, vertragen of snelheid te handhaven om te vangen het signaal van groene venster.
In de toekomst, kan dit worden uitgebreid tot niet-getimede signalen (degene met inductie spoelen onder de weg), evenals een "veiligheid buffer" van ongeveer 3 seconden wanneer het voertuig zal * nauwelijks * maken voorbij het signaal. Op deze manier de bestuurder zal nooit opraken geen gele verlichting (gevaarlijk); Er zullen enige tijd te sparen.
importeren van mraa;
importeren van Math;
Initialisatie van de poort
var GPS = mraa. UART(0); var 3G = mraa. USB(0); werkt niet nog, een USB host-poortstuurprogramma zal worden uitgevoerd in de plaats var verhoging = mraa.gpio(2); var handhaven = mraa.gpio(3); de daling van de var = mraa.gpio(4); GPS.setBaudRate(9600);
Constanten
var earthRadius = 6371000; straal van de aarde in meter var degToRad = 0.01745329251; Radialen per graad var radToDeg = 57.2957795131; Graden per radiaal
functie getLocation() {//Uses de $GPGGA berichten om te bepalen van de huidige locatie var GPSLocation [0,0,0,0] =; while(1) {if(GPS.dataAvailable()) {var buffer = GPS.readStr(512); als (buffer.find("GPGGA")! = -1) {var rawNmea = buffer.substring(buffer.search("GPGGA"), buffer.search("\n")); var nmeaList = rawNmea.strip().split(","); var tijd = nmeaList [1]; var latraw = nmeaList [2]; var latdir = nmeaList [3]; var lonraw = nmeaList [4]; var londir = nmeaList [5]; var lat = (latraw.substring(0,2)) + (latraw.substring(2)) /60; var lon = (lonraw.substring(0,3)) + (lonraw.substring(3,0)) /60; als (londir == "W") {lon lon = * -1;} als (latdir == "S") {lat = lat * -1; } var alt = nmeaList [9]; GPSLocation = [lat, lon, alt, tijd]; Return GPSLocation; }}}} functie getVelocity() {//Uses $GPVTG berichten om snelheid en richting var GPSVel = [0,0]; while(1) {if(GPS.dataAvailable()) {var buffer = GPS.readStr(512); if (buffer.find("GPVTG")! = -1) {var nmeaData = buffer.substring(buffer.search("GPVTG"), buffer.search("\n")); var nmeaList = nmeaData.strip().split(","); var hdg = nmeaList [1]; var rawVel = nmeaList [7]; var vel = rawVel / 3,6; GPSVel = [hdg, vel]; Return GPSVel; } } } }
functie getLights() {var lichten = [7] [10]; //array van stoplicht tijdsinstellingen, 10 dichtstbijzijnde lichten, 7 parameters elke. Lat, Lon NTime, Etime, TimeOffset, kop, afstand / / requestData(); if(3G.dataAvailable()) {var buffer = 3G.readStr(512); if (buffer.find("$$")! = -1) {lightData = buffer.substring(buffer.search("$$"), buffer.search("\n")); //light informatie specificatie volgt GPS systeem, met "$$" ter aanduiding van het begin van een zin. lightList = nmeaData.strip().split(","); voor (ik = 0; ik
functie computeDistance (Latdeg1, Londeg1, Latdeg2, Londeg2) {var Lat1 = Latdeg1 * degToRad; var Lat2 = Latdeg2 * degToRad; var Lon1 = Londeg1 * degToRad; var Lon2 = Londeg2 * degToRad; var afstand = 2 * earthRadius * Math.asin(sqrt((Math.sin(Lat2-Lat1/2)) ^ 2 + (Math.cos(Lat1) * Math.cos(Lat2) * (Math.sin(Lon2-Lon1/2))^2))); //Use haversine formule voor het berekenen van de grootcirkelafstand}
functie computeHeading (Latdeg1, Londeg1, Latdeg2, Londeg2) {var Lat1 = Latdeg1 * degToRad; var Lat2 = Latdeg2 * degToRad; var Lon1 = Londeg1 * degToRad; var Lon2 = Londeg2 * degToRad; var y = Math.sin(Lon2-Lon1) * Math.cos(Lat2); var x = Math.cos(Lat1)*Math.sin(Lat2) - Math.sin(Lat1)*Math.cos(Lat2)*Math.cos(Lon2-Lon1); var rubriek = Math.atan2 (y, x).toDegrees(); terugkeer post;}
Hoofdreeks while(1) {var temp [4]; var currLat var currLon; var currHdg; var currSpd; var lichten; var tijd; var Dir; var currSignal; var t1, t2; temp = getLocation(); currLat = temp [0]; currLon = temp [1]; tijd = temp [3]; temp = getVelocity(); currHdg = temp [0]; currSpd = temp [1]; Verlichting = getLights(); voor (ik = 0; ik < Lights.length(); i ++) {var hdg = computeHeading (currLat, currLon, lichten [0] [i], Lights[1][i]); als (HGD > 180) {Lights [5], [i] = 180 - computeHeading (currLat, currLon, lichten [0] [i], Lights[1][i]);} anders {Lights [5], [i] = computeHeading (currLat, currLon, lichten [0] [i], Lights[1][i]);} Lichten [6], [i] = computeDistance (currLat, currLon, lichten [0], [i], Lights[1][i]); Als (lichten [6], [i] < Lights[6][currSignal]) {currSignal = i;}} Als (HGD < 45 || hdg > 315 || 135 < hdg < 225) {//north-south verkeer Dir = 0;} anders {Dir = 1;} als (Dir == 0) {t1 = lichten [4] [currSignal] + time % (lichten [2] [currSignal] + Lights[3][currSignal]); wellicht vast te stellen t2 = lichten [4] [currSignal] + time % (lichten [2] [currSignal] + Lights[3][currSignal]) + verlichting [2] [currSignal]; } else {t1 = lichten [4] [currSignal] + time % (lichten [2] [currSignal] + Lights[3][currSignal]); T2 = lichten [4] [currSignal] + time % (lichten [2] [currSignal] + Lights[3][currSignal]) + verlichting [3] [currSignal]; } Als (t1 > Lights[6][currSignal]) {\\increase snelheid increase.write(1); maintain.write(0); decrease.write(0);} else if (t1 == Lights[6][currSignal]) {\\maintain snelheid increase.write(0); maintain.write(1); decrease.write(0);} else {\\decrease snelheid increase.write(0); maintain.write(0); decrease.write(1);}
}