Paso 4: programación
El programa será un proyecto siempre en evolución. Si desea tener acceso a una versión actualizada, sugeriría bifurcar el código desde mi repositorio de GitHub en el siguiente enlace:
https://github.com/TheInventorMan/IntelligentTraff...
Sin embargo, he pegado el código de abajo para su conveniencia, aunque esto solo es para el dispositivo local que se mantendrá en el vehículo. Los archivos del servidor se encuentran en el repositorio.
Para aquellos de ustedes que estén interesados, aquí es un esquema básico del algoritmo que utiliza el sistema:
- GPS recibe la posición, velocidad, rumbo y tiempo
- Dispositivo solicita datos de servidor mediante el dongle 3G
- Servidor responde con una secuencia de datos, similar a la de una sentencia NMEA (pero bueno, es un protocolo fácil)
- Flujo de datos es analizado y dispuesto en una matriz de 2-D, que contiene la ubicación de las señales, horarios, desplazamientos, etc..
- Con esta información, el dispositivo determina que señal se acerca.
- La ventana de luz verde se determina y medidas contra la velocidad de la corriente
- Dispositivo le solicita conductor para acelerar, frenar o mantener la velocidad para coger la ventana verde de la señal.
En el futuro, esto podría ampliarse para incluir señales no programado (los con bobinas de inducción debajo de la carretera), así como un "buffer de seguridad" de aproximadamente 3 segundos cuando el vehículo va * apenas * hacerlo más allá de la señal. Esta manera, el conductor nunca funcionará cualquier luces amarillas (peligrosas); habrá tiempo de sobra.
mraa de importación;
importación matemáticas;
Inicialización del puerto
var GPS = mraa. UART(0); var 3G = mraa. USB(0); no funciona todavía, un controlador USB host puerto llevará a cabo en su lugar var incremento = mraa.gpio(2); mantener la var = mraa.gpio(3); disminuir var = mraa.gpio(4); GPS.setBaudRate(9600);
Constantes
var earthRadius = 6371000; radio de la tierra en metros var degToRad = 0.01745329251; Radianes por grado var radToDeg = 57.2957795131; Grados por radián
function getLocation() {//Uses la $GPGGA mensajes para determinar la actual situación var GPSLocation = [0,0,0,0]; while(1) {if(GPS.dataAvailable()) {var buffer = GPS.readStr(512); if (buffer.find("GPGGA")! = -1) {var rawNmea = buffer.substring(buffer.search("GPGGA"), buffer.search("\n")); var nmeaList = rawNmea.strip().split(","); var tiempo = 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; si (londir == "W") {lon = lon * -1;} si (latdir == "S") {lat = lat * -1; } var alt = nmeaList [9]; GPSLocation = [lat, lon, alt, tiempo]; volver GPSLocation; getVelocity() de función}}}} {//Uses $GPVTG los mensajes para determinar la velocidad y la dirección var GPSVel = [0,0]; while(1) {if(GPS.dataAvailable()) {var buffer = GPS.readStr(512); si (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]; volver GPSVel; } } } }
function getLights() {var luces = [7] [10]; //array de tiempos del semáforo, luces más cercanas 10, 7 parámetros. Lat, Lon, NTime, tiempo, TimeOffset, rumbo, distancia / / requestData(); if(3G.dataAvailable()) {var buffer = 3G.readStr(512); si (buffer.find("$$")! = -1) {lightData = buffer.substring(buffer.search("$$"), buffer.search("\n")); //light información especificación sigue esquema de GPS, con "$$" que denota el comienzo de una frase. lightList = nmeaData.strip().split(","); para (i = 0; i
función computeDistance (Latdeg1, Londeg1, Latdeg2, Londeg2) {var y+LAT1 = Latdeg1 * degToRad; var Lat2 = Latdeg2 * degToRad; var Lon1 = Londeg1 * degToRad; var Lon2 = Londeg2 * degToRad; var distancia = 2 * earthRadius * Math.asin(sqrt((Math.sin(Lat2-Lat1/2)) ^ 2 + (Math.cos(Lat1) * Math.cos(Lat2) * (Math.sin(Lon2-Lon1/2))^2))); //Use fórmula de haversine para calcular distancia}
función computeHeading (Latdeg1, Londeg1, Latdeg2, Londeg2) {var y+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 título = Math.atan2 (y, x).toDegrees(), partida vuelta;}
While(1) de secuencia principal {var temp [4]; var currLat; var currLon; var currHdg; var currSpd; var luces; var tiempo; var Dir; var currSignal; var t1, t2; temp = getLocation(); currLat = temp [0]; currLon = temp [1]; tiempo = temp [3]; temp = getVelocity(); currHdg = temp [0]; currSpd = temp [1]; Luces = getLights(); para (i = 0; i < Lights.length(); i ++) {var hdg = computeHeading (currLat, currLon, luces [0] [i], Lights[1][i]); if (hdg > 180) {luces [5] [i] = 180 - computeHeading (currLat, currLon, luces [0] [i], Lights[1][i]);} otro {luces [5] [i] = computeHeading (currLat, currLon, luces [0] [i], Lights[1][i]);} Luces [6] [i] = computeDistance (currLat, currLon, luces [0] [i], Lights[1][i]); Si (luces [6] [i] < Lights[6][currSignal]) {currSignal = i;}} Si (hdg < 45 || hdg > 315 || 135 < hdg < 225) {//north-south tráfico Dir = 0;} else {Dir = 1;} si (Dir == 0) {t1 = luces [4] [currSignal] + % del tiempo (luces [2] [currSignal] + Lights[3][currSignal]); puede que deba fijarse t2 = luces [4] [currSignal] + % del tiempo (luces [2] [currSignal] + Lights[3][currSignal]) + luces [2] [currSignal]; } else {t1 = luces [4] [currSignal] + % del tiempo (luces [2] [currSignal] + Lights[3][currSignal]); T2 = tiempo % luces [4] [currSignal] (luces [2] [currSignal] + Lights[3][currSignal]) + luces [3] [currSignal]; } Si (t1 > Lights[6][currSignal]) {\\increase velocidad increase.write(1); maintain.write(0); decrease.write(0);} else if (t1 == Lights[6][currSignal]) {\\maintain velocidad increase.write(0); maintain.write(1); decrease.write(0);} else {\\decrease velocidad increase.write(0); maintain.write(0); decrease.write(1);}
}