Sistema para medición de calidad de aire de ciudades utilizando taxis

Historia

Cuando mi familia se mudó a Lima, Perú, hace unos meses, estaba emocionado ante la perspectiva de poder hacer mi carrera diaria junto al mar.

Desafortunadamente, tengo que cruzar algunas calles concurridas para ir de mi casa a la playa, y realmente pude sentir un cosquilleo en la garganta después de correr por estas partes.

Ahora, desde la perspectiva de la calidad del aire, Lima no está tan mal. La brisa casi constante del Pacífico hace que el aire sea bastante claro, pero lo que Lima también tiene es una gran cantidad de vehículos diesel muy viejos en las carreteras que hacen visibles nubes de humo cuando avanzan por las calles.

El monitoreo de la calidad del aire es un tema candente en estos días. No es de extrañar, con tantos estudios recientes que muestran una fuerte correlación entre ciertos tipos de contaminación del aire y efectos negativos para la salud. Sin embargo, la mayor parte del monitoreo de la calidad del aire ocurre en unas pocas estaciones que son pocas y distantes entre sí. Se sabe muy poco acerca de cómo varían los niveles de contaminación dentro de una ciudad en una calle a nivel de calle, aunque estudios recientes indican que esto podría ser increíblemente importante.

Esto me hizo pensar en cuánto podría variar la calidad del aire calle por calle y cómo medirla.

¿Qué pasaría si utilizáramos taxis para recopilar datos sobre la calidad del aire en toda la ciudad casi en tiempo real? Lo bueno de Lima es que tiene una gran cantidad de taxis, y los taxis van a todas partes. Aún mejor es que casi todos los taxis en Lima tienen exactamente el mismo letrero de taxi de vinilo hueco pegado en el techo.

Probablemente tampoco sea una suposición irrazonable que pueda convencer a algunos taxistas de Lima para que ganen un poco de dinero extra colocando mis letreros idénticos en sus taxis.

NOTA: Por supuesto, su situación particular en su ciudad puede ser bastante diferente (señales diferentes, regulaciones más estrictas, etc.). Puede que tenga que trabajar con una empresa en particular, pero estoy seguro de que hay una solución en alguna parte.

Así que aquí está el proyecto a grandes rasgos:

  • Diseñe un registrador de datos basado en Android Things con una serie de sensores ambientales, GPS y batería.
  • Monte la electrónica dentro de un letrero de taxi.
  • Escriba algún software para Android Things para recopilar datos con regularidad y cargue los datos en Google Cloud Platform para su posterior análisis.
  • (Análisis posterior) Haga bonitas imágenes con los datos que tal vez puedan ayudarnos a comprender más sobre la contaminación en una calle por nivel de calle.

Este es un testo del sensor de partículas en el aire cuando salí acorrer:

A mayor escala (con incluso más taxis), incluso podríamos recopilar datos suficientes para construir mapas de contaminación que nos permitan comprender mejor cómo la contaminación puede afectar a algunas áreas más que a otras.

En este proyecto registraremos: longitud, latitud, temperatura, humedad, presión y (lo más importante) recuentos de partículas en el aire ( PM10 – partículas con un diámetro entre 2.5 μm y 10 μm, PM2.5 – partículas finas con un diámetro de 2,5 μm o menos).

A continuación, se muestra una vista de alto nivel del flujo de datos de este proyecto:

  • El Taxi Datalogger basado en Android Things recopila datos de sus sensores. Siempre que tiene conectividad de red, intenta enviar los datos de sus sensores (como JSON) a Google IoT Core.
  • Google IoT Core garantiza que solo los dispositivos autorizados puedan enviar datos (mediante criptografía de clave pública). Los datos del dispositivo se publican en un tema de Google Pub / Sub.
  • Google Dataflow lee los datos del sensor de un tema de Pub / Sub y los agrega a una tabla de BigQuery (en teoría, también puede hacer mucho más procesamiento previo). Para el propósito de este proyecto, también tengo un script que extrae entradas de Pub / Sub y las inserta en la tabla de BigQuery.
  • Una vez que los datos están en BigQuery, puede analizarlos directamente, pero es más probable que desee procesarlos previamente. Puede hacerlo mediante sus propias consultas de BigQuery o de forma más interactiva con la herramienta Dataprep de Google.
  • Una vez que sus datos estén listos, puede usar cualquier cantidad de herramientas para analizar y presentar sus datos (incluidos Google Data Studio y Google Datalab). Para este proyecto, lo haremos simple y solo usaremos Google Maps.

La parte de análisis es, por supuesto, enormemente abierta y depende de los datos que recopile y de lo que quiera hacer con ellos. Solo estoy mostrando algunos ejemplos simples de creación de mapas de calor usando Google Fusion Tables y la API de Google Javascript, pero hay mucho más que puede hacer.

Entonces, ¿quieres probar esto tú mismo? ¡Así es cómo podrás hacerlo!

Montaje del monitor de calidad del aire

Dependiendo del recinto que tenga (por ejemplo, su letrero de taxi), los pasos para montar su hardware serán diferentes. Sin embargo, debe conectarse como se muestra en el diagrama de Fritzing a continuación.

Es importante tener en cuenta que debe asegurarse de que el puerto USB al que conecta el adaptador USB FTDI coincida con el que se usa en el código. Actualmente, el código espera que el adaptador FTDI se conecte a «USB1-1.4: 1.0» (puede cambiarlo, si es necesario).

Nota: Quería usar el Powerboost 1000C de Adafruit con un paquete de baterías LiPo, pero no pudo llegar a tiempo (problemas en la frontera). Mientras tanto, utilicé una batería de teléfono USB externa. Todavía recomiendo usar el Powerboost 1000C, ya que le permitirá cargar u operar con la corriente de suministro mientras enciende su dispositivo al mismo tiempo. Esto es útil si alguna vez desea instalar una conexión de alimentación fija para un funcionamiento a largo plazo (12v a 5v).

Aquí hay una imagen de cómo monté el letrero de taxi y un video que lo explica un poco más.

Aquí hay algunos principios de diseño que traté de tener en cuenta:

  • Asegure una buena ventilación en su recinto, ya que los sensores necesitan un buen flujo de aire para obtener buenas lecturas. Agregué orificios de ventilación en la parte inferior de mi gabinete.
  • Trate de minimizar los efectos del clima en sus dispositivos electrónicos. Usé separadores para mantener los componentes electrónicos fuera de la parte inferior y pantallas de nailon sobre los orificios de ventilación.
  • Oriente su sensor de partículas perpendicular al flujo de aire. La mayoría de los sensores de partículas tienen su propio ventilador interno para introducir aire en el sensor. Puede obtener lecturas inconsistentes si se fuerza aire en el sensor.

Una palabra sobre los sensores de partículas: la única parte que puede ser un poco difícil de encontrar es el sensor de partículas, ya que no es (todavía) parte de los sensores comúnmente disponibles en tiendas de aficionados como Adafruit. Elegí el sensor Honeywell simplemente porque estaba disponible rápidamente en Mouser, por lo que no puedo hablar de sus ventajas o desventajas. La razón por la que nos preocupamos tanto por un contador de partículas es que el material particulado en el aire y, en particular, PM2.5 (partículas de menos de 2.5 micrómetros de diámetro) parece ser uno de los peores contaminantes en términos de efectos adversos para la salud ( https://es.wikipedia.org/wiki/Part%C3%ADculas_en_suspensi%C3%B3n ). Hay una gran cantidad de información disponible sobre varios sensores de partículas (y otra información relacionada con la calidad del aire) aquí: http://aqicn.org/sensor/.

Configuración del backend del servicio en la nube de Google

Antes de configurar nuestro dispositivo, necesitamos configurar nuestro proyecto en Google Cloud Platform para que nuestro dispositivo tenga un lugar para enviar sus datos cuando se conecte. Lo guío a través del proceso de configuración en el video de descripción general y en las instrucciones escritas a continuación. Sugiero ver el video, ya que las instrucciones para usar cosas como los servicios en la nube no siempre envejecen bien (la interfaz de usuario puede moverse), mientras que un video aún le dará una buena idea general.

Precaución: tenga en cuenta que, si bien nuestro proyecto no debería ser costoso de ejecutar, Google Cloud Platform cuesta dinero de usar, y seguir las instrucciones a continuación le costará algo de dinero (pero con suerte no mucho).

Paso 1: crea tu proyecto

Paso 2: crea credenciales

  • Vaya aquí: https://console.cloud.google.com/apis/credentials
  • Cree una clave de API: asígnele el nombre » Clave del navegador «, ya que así es como accederemos a la API de JavaScript de Google Maps cuando mostramos los datos recopilados en una página web.
  • Cree una ID de cliente OAuth2: de manera similar, asígnele un nombre como ‘ ID de cliente del navegador ‘, ya que esto es lo que usaremos cuando mostramos los datos recopilados mediante una página web.
  • Crear un ID de cuenta de servicio: esta cuenta será necesaria para ejecutar cualquier script o comando desde la línea de comandos (si no usa Google Cloud Shell). Descargue las credenciales como JSON. Puede que los necesite más tarde.

Paso 3: habilita las API

Paso 4: configura Google Pub / Sub

  • Vaya aquí: https://console.cloud.google.com/cloudpubsub
  • Crea un tema de ‘ eventos ‘.
  • Cree una suscripción para el tema de ‘ eventos ‘ llamado ‘ almacenamiento ‘, con el tiempo de espera de confirmación establecido en 600 segundos (el máximo).

Paso 5: configurar Google IoT Core

  • Vaya aquí: https://console.cloud.google.com/iot
  • Cree un registro llamado ‘ taxis ‘.
  • Establezca el tema pub / sub de telemetría en proyectos / <nombre-proyecto>/ temas / eventos
  • Utilice la región de la nube que desee.
  • Asegúrese de que el protocolo MQTT esté habilitado.
  • Deje la CA en blanco.

Paso 6: configura Google BigQuery

[

{ «mode»: «REQUIRED», «name»: «deviceId», «type»: «STRING» },

{ «mode»: «REQUIRED», «name»: «time», «type»: «TIMESTAMP» },

{ «mode»: «REQUIRED», «name»: «latitude», «type»: «FLOAT» },

{ «mode»: «REQUIRED», «name»: «longitude», «type»: «FLOAT» },

{ «mode»: «REQUIRED», «name»: «accuracy», «type»: «FLOAT» },

{ «mode»: «NULLABLE», «name»: «altitude», «type»: «FLOAT» },

{ «mode»: «NULLABLE», «name»: «verticalAccuracy», «type»: «FLOAT» },

{ «mode»: «NULLABLE», «name»: «temperature», «type»: «FLOAT» },

{ «mode»: «NULLABLE», «name»: «humidity», «type»: «FLOAT» },

{ «mode»: «NULLABLE», «name»: «pressure», «type»: «FLOAT» },

{ «mode»: «NULLABLE», «name»: «pm25», «type»: «INTEGER» },

{ «mode»: «NULLABLE», «name»: «pm10», «type»: «INTEGER» }

]

Configuración del software del monitor de calidad del aire (señal de taxi)

Configuración básica

Actualice la última versión de Android Things en su placa RPi3, inicie su dispositivo y asegúrese de que puede conectarse al dispositivo a través de ADB. Las instrucciones sobre cómo actualizar el RPi3 y conectarse a través de ADB se pueden encontrar aquí: https://developer.android.com/things/hardware/raspberrypi.html

Ahora, debido a que también vamos a necesitar sincronizar los datos del letrero de Taxi periódicamente a través de WiFi, también deberá seguir las instrucciones en la misma página que la anterior, para configurar su dispositivo para poder conectarse a algunos WiFi. Puntos de acceso (AP). Agregué credenciales para el WiFi de mi hogar y el punto de acceso WiFi que configuré en mi teléfono Android.

Liberar el puerto serie

A continuación, este proyecto utiliza el puerto serie de Raspberry Pi para comunicarse con nuestros sensores de partículas. Desafortunadamente, de forma predeterminada, la Raspberry Pi utiliza un puerto serie como consola de Linux. Necesitamos cambiar esto y liberarlo para nuestro uso. Afortunadamente, suponiendo que pueda conectarse a su dispositivo a través de ADB, podemos hacerlo desde la línea de comandos.

Reinicie ADB para que se ejecute como usuario root de forma predeterminada:

$ adb root

Debe volver a conectarse a adb después de ejecutar el comando `adb root`.

$ adb connect <address-of-your-RPI>

Monte la partición de arranque y copie los argumentos del kernel ( cmdline.txt ) en su máquina.

$ adb shell

rpi3:/ # cd /data/local/tmp

rpi3:/ # mkdir boot

rpi3:/ # mount /dev/block/mmcblk0p1 boot/

rpi3:/ # exit

$ adb pull /data/local/tmp/boot/cmdline.txt

Ahora edite el archivo cmdline.txt para eliminar la parte que dice ‘ console = serial0,115200 ‘, vuelva a colocarlo en el dispositivo y luego reinícielo.

$ nano cmdline.txt

$ adb push cmdline.txt /data/local/tmp/boot/cmdline.txt

$ adb reboot

Descargue, compile, instale y configure la aplicación

A continuación, clone la aplicación de Github y abra la aplicación en Android Studio.

$ git clone https://github.com/jpuderer/Taxi-Datalogger.git

Cuando abra el proyecto en Android Studio, espere a que la aplicación se sincronice. Haga clic en ‘Ejecutar aplicación’ en el menú Ejecutar, que debería instalar la aplicación. Si se le solicita, asegúrese de seleccionar el dispositivo iot_rpi3 como el dispositivo para instalar en:

Después de instalar la aplicación en el dispositivo (por primera vez), reinicie el dispositivo (desenchúfelo y vuelva a enchufarlo, o escriba ‘adb reboot’ desde la línea de comando). Esto es necesario para que a la aplicación se le otorguen algunos de los permisos solicitados (peligrosos) (consulte aquí para obtener más detalles . Deberá volver a conectar ADB una vez que el dispositivo se haya reiniciado.

Si todo funciona hasta ahora, lo único que queda es aprovisionar el dispositivo para que se comunique con Google IoT Core.

Ejecute los siguientes comandos, reemplazando <PROJECT_ID>, <REGION>, <REGISTRY_ID> y <DEVICE_ID> con sus propias versiones.

$ adb shell am startservice \

-a net.jpuderer.android.things.taxidatalogger.CONFIGURE \

-e project_id <PROJECT_ID> -e cloud_region <REGION> \

-e registry_id <REGISTRY_ID> \

-e device_id <DEVICE_ID> \

net.jpuderer.android.things.taxidatalogger/.cloud.CloudPublisherService

Aprovisione Google IoT Core con las credenciales de su dispositivo

Ahora, si todo ha ido bien hasta este punto, el dispositivo debería estar completamente configurado. Sin embargo, todavía no podrá enviar datos a Google IoT Core, porque Google IoT Core no conoce su dispositivo. Consulte la siguiente excepción del registro (por ejemplo, adb logcat ).

10-19 03:00:12.620  1373  1398 E CloudPublisherService: Could not create MQTTPublisher. Will try again later

10-19 03:00:12.620  1373  1398 E CloudPublisherService: java.lang.IllegalArgumentException: Could not initialize MQTT

Para que Google IoT Core reconozca nuestro dispositivo, debemos agregar el dispositivo a Google IoT Core.

Para agregar su dispositivo, deberá obtener el certificado público que debería haberse generado en el dispositivo, así que descargue el certificado desde el dispositivo.

$ adb pull /sdcard/cloud_iot_auth_certificate.pem

Abra Google IoT Core Console para su proyecto: https://console.cloud.google.com/iot

Si siguió los pasos anteriores para configurar Google Cloud Platform, ya debería tener un registro llamado ‘ taxis ‘.

Haga clic en el botón AÑADIR DISPOSITIVO para crear un nuevo dispositivo. Deberá darle un nombre al dispositivo, seleccionar el formato de clave RS256_X509 , luego cortar y pegar el contenido del archivo de certificado que acaba de descargar del dispositivo en el cuadro marcado » Valor de clave pública «. Deje todo lo demás como predeterminado y haga clic en el botón » Agregar» .

Finalmente, reinicie el dispositivo por última vez para asegurarse de que todo funcione correctamente.

NOTA : Es posible que también vea excepciones en el registro acerca de no poder conectarse debido a un certificado que aún no es válido. Esto es normal. Solo necesita esperar a que Android obtenga una hora válida de la red.

Si todo funciona correctamente, debería ver mensajes periódicos en los registros (por ejemplo, adb logcat ) que se parecen a los que se muestran a continuación:

Publishing: {«deviceId»:»Taxi-1″,»time»:1508415139,»latitude»:-12.105056666666666,»longitude»:-77.04408166666667,»accuracy»:6,»altitude»:0,»verticalAccuracy»:0,»temperature»:21.346969604492188,»humidity»:64.81196594238281,»pressure»:616.6408081054688,»pm25″:»20″,»pm10″:»21”}

NOTA: La aplicación solo registra datos cuando tiene una posición de GPS. Es posible que deba conectar la antena GPS (que se muestra en el video de ensamblaje anterior) para obtener una solución mientras realiza la prueba en su taller (o escritorio, cobertizo, sótano, etc.).

¡Eso es! Si ha seguido todos los pasos hasta ahora, ¡su Taxi Datalogger debería estar listo para dar una vuelta!

Nota al margen técnica súper geek: Google IoT Core utiliza criptografía de clave pública que garantiza que solo los dispositivos autorizados puedan conectarse. Lo interesante en nuestro caso es que estamos generando el par de claves en el dispositivo (en el almacén de claves de Android), y solo copiamos la clave pública (en lugar de generar la clave en otro lugar y copiar la clave en el dispositivo). La ventaja de este enfoque es que si la placa de Android Things que estamos usando tiene un almacén de claves respaldado por hardware (el RPI no lo tiene, pero otros sí), la clave privada está irrevocablemente vinculada a ese dispositivo en particular y no se puede extraer sin un significativo esfuerzo por parte de algún Bad Guy (TM). Aún mejor, es que puede aprovisionar la clave en el momento de la creación para que deje de funcionar si alguien piratea o arraiga su dispositivo. Esto hace que sea realmente difícil para alguien robar uno de sus dispositivos una vez que está en producción y usarlo maliciosamente en su contra.

Recopilación de datos

Así que ahora, recopilemos algunos datos.

Una vez que haya terminado de recopilar datos, asegúrese de que su registrador de datos tenga conectividad a Internet de alguna manera, para que pueda comenzar a cargar sus datos. A menos que su registrador de datos haya tenido una conexión desde el principio, en cuyo caso sus datos ya deberían haber sido enviados a Google IoT Core.

Analizar los datos

Ahora que tenemos algunos datos, necesitamos procesarlos de alguna manera y ver si no podemos aprender algo de ellos.

Lleva los datos del sensor a BigQuery

Ahora que tenemos estos datos (en algún lugar), debemos introducirlos en BigQuery para poder hacer algo con ellos.

El lugar exacto en el que se encuentran nuestros datos en este momento está en la cola de la suscripción (de almacenamiento) de Pub / Sub que creamos anteriormente. Los mensajes en cola se almacenan durante 7 días, por lo que al menos tenemos algo de tiempo para hacer algo al respecto.

Hay dos opciones básicas para mover datos de Pub / Sub a BigQuery. Podemos usar el servicio Dataflow de Google para mover los datos (https://cloud.google.com/dataflow/), o simplemente podemos ejecutar un script que lo haga por nosotros (extrae de la suscripción Pub / Sub y lo inserta en BigQuery ).

En aras de la simplicidad, elegiremos la opción posterior y ejecutaremos un script de Python que lo haga por nosotros.

NOTA: Si bien Dataflow promete una solución altamente escalable para procesar datos, es más de lo que necesitamos abordar en este momento. Puede usar una de las plantillas de Google predefinidas para transmitir datos desde Pub / Sub a BigQuery aquí , pero solo funciona con datos en vivo (tal como viene) y es algo costoso de ejecutar (consume muchos recursos). Aún así, vale la pena mirarlo si escalas algo más allá de la etapa de “simplemente un juguete”.

La forma más sencilla de ejecutar algunos scripts y alojar nuestra página web temporal (más abajo en la página) es utilizar Google Cloud Shell. Google Cloud Shell es básicamente un shell en una instancia de VM temporal con todas las herramientas necesarias de Google Cloud Platform ya preinstaladas. Tenga en cuenta que cuando usa Google Cloud Shell, solo su directorio de inicio persiste en las invocaciones.

Haga clic a continuación para iniciar uno:

https://console.cloud.google.com/home/dashboard?cloudshell=true

Una vez que tenga un Cloud Shell abierto, haga lo siguiente:

Configure un virtualenv de Pyton para ejecutar sus scripts (Nota: deberá volver a ejecutar el paso de activación cada vez que finalice su shell en la nube)

$ virtualenv taxi-datalogger-env

$ source taxi-datalogger-env/bin/activate

Clone el repositorio del proyecto y vaya al directorio de scripts:

$ git clone https://github.com/jpuderer/Taxi-Datalogger.git

$ cd Taxi-Datalogger/scripts

Edite el archivo setup.yaml para que corresponda con su proyecto (con cualquier editor):

$ nano setup.yaml

Instale las dependencias del script:

$ pip install -r requirements.txt

Finalmente, ejecute la secuencia de comandos para extraer eventos de su suscripción de pub / sub y publíquelos en la tabla de BigQuery:

$ ./pull_taxi_pubsub.py

Debería ver el script extrayendo eventos de la suscripción:

Pulled: {«deviceId»:»Taxi-1″,»time»:1508456006,»latitude»:-12.105038333333333,»longitude»:-77.04422833333334,»accuracy»:6,»altitude»:0,»verticalAccuracy»:0,»tempe

rature»:23.744205474853516,»humidity»:58.5398063659668,»pressure»:1001.915771484375,»pm25″:»25″,»pm10″:»27″}

Pulled: {«deviceId»:»Taxi-1″,»time»:1508455946,»latitude»:-12.10496,»longitude»:-77.04428166666666,»accuracy»:6,»altitude»:0,»verticalAccuracy»:0,»temperature»:23

.699161529541016,»humidity»:57.91984176635742,»pressure»:1001.7929077148438,»pm25″:»27″,»pm10″:»29″}

Pulled: {«deviceId»:»Taxi-1″,»time»:1508455976,»latitude»:-12.10502,»longitude»:-77.04423333333334,»accuracy»:6,»altitude»:0,»verticalAccuracy»:0,»temperature»:23

.724185943603516,»humidity»:57.979087829589844,»pressure»:1001.8703002929688,»pm25″:»26″,»pm10″:»28”}

El script se ejecutará para siempre (esperando más eventos) hasta que lo detenga. Solo espere hasta que tenga todos los datos que desea (debería dejar de imprimirse si no está registrando más datos) y escriba Ctrl-C para detenerlo.

Ahora, si tenemos suerte, todos nuestros datos deberían estar en BigQuery listos y esperando el siguiente paso.

Sugerencia: a veces, es posible que desee comenzar de nuevo y borrar los datos existentes de su tabla de BigQuery. Afortunadamente, esto es fácil de hacer desde Cloudshell y ya hay una copia del esquema requerido en el directorio de scripts:

$ bq rm <your-project>:taxi_sensor_data.log_entries

$ bq mk –schema entries_schema.json <your-project>:taxi_sensor_data.log_entries

Procesamiento previo de los datos

Es tentador tomar los datos que hemos registrado e inmediatamente intentar mapearlos. Es tentador, pero no nos dirá mucho. La mayoría de los datos necesitan algún tipo de procesamiento previo.

En nuestro caso, queremos hacer un mapa de calor, por lo que debemos asegurarnos de que agregamos nuestras medidas, para que no tengamos demasiados puntos de datos juntos. De lo contrario, si intentamos hacer un mapa de calor utilizando los datos sin procesar, nuestro mapa de calor simplemente mostrará dónde pasó la mayor parte del tiempo nuestro Taxi Datalogger (ya que ahí es donde estarán la mayor cantidad de puntos en el mapa).

Una herramienta que Google proporciona como parte de Google Cloud Platform es Dataprep (https://cloud.google.com/dataprep/). Es bastante ordenado y ofrece una forma intuitiva de desinfectar los datos. Sin embargo, para lo que necesitamos en este momento, nuestros requisitos son mucho más simples.

Hay un post muy bueno aquí en la cantidad de distancia cada lugar decimal de un número de longitud y latitud representa. Resulta que el tercer lugar decimal representa aproximadamente 110 m, lo que en realidad es bastante perfecto para nosotros.

Esto nos permite convertir nuestra colección de puntos de seguimiento que representan dónde estábamos, en una cuadrícula de puntos espaciados regularmente que representan los valores promedio que registramos en cada área de 110 mx 110 m en Lima. Tenga en cuenta que el suyo todavía es muy ondulado, y con más datos deberíamos regularizar mejor estos datos (contra el tiempo y los puntos de referencia conocidos), pero es un comienzo.

Podemos ejecutar la siguiente consulta en nuestra tabla de BigQuery para crear una nueva tabla o exportar los datos como una hoja de cálculo:

SELECT ROUND(latitude, 3) AS latitude,

ROUND(longitude, 3) AS longitude,

AVG(temperature) AS temperature,

AVG(humidity) as humidity,

AVG(pressure) as pressure,

AVG(pm25) as pm25,

AVG(pm10) as pm10

FROM [taxi-datalogger:taxi_sensor_data.log_entries] GROUP BY latitude, longitude

Guardé los resultados de la consulta como una nueva tabla llamada aggregated_sensor_values y exporté una hoja de cálculo a Google Drive para usarla en la siguiente parte.

Visualización de un mapa de calor con las tablas dinámicas de Google

Google Fusion Tables es una herramienta un poco más antigua, pero funciona muy bien para buscar rápidamente nuestros datos y generar un mapa de calor.

Simplemente vaya aquí: https://fusiontables.google.com y haga clic en el botón ‘ Crear una tabla de fusión ‘.

Debería poder seleccionar la hoja de cálculo que acaba de guardar en Google Drive.

Después de crear su tabla de fusión, debería haber una pestaña Mapa que muestre sus datos como puntos.

Para ver un mapa de calor, simplemente haga clic en la opción ‘ Mapa de calor ‘ en el lado izquierdo del mapa y elija un ‘ Peso ‘ basado en el valor que le gustaría mapear (PM2.5 por ejemplo). Juega con el radio y la opacidad como desees y listo. ¡Voila! Mapa de calor instantáneo!

Visualización de un mapa de calor con la API de JavaScript de Google Maps

El mapa de calor que se muestra en las tablas de Google Fusion también está disponible como una capa a través de la API de Google Maps, por lo que si desea crear su propio mapa o herramientas personalizados con Google Maps, hay una manera. Como antes, inicie un shell en la nube de Google haciendo clic en la siguiente URL:

https://console.cloud.google.com/home/dashboard?cloudshell=true

Suponiendo que todavía tiene una copia del repositorio de git (consulte más arriba en la sección «Cómo obtener los datos del sensor en BigQuery»), vaya al directorio de scripts:

$ cd Taxi-Datalogger/scripts

A continuación, edite el archivo heatmap.html y cambie los siguientes valores de marcador de posición para reflejar su proyecto:

  • Your-Maps-API-Key (use las credenciales de API que creó en el paso Crear credenciales )
  • Your-OAuth2-Client-ID (use las credenciales de OAuth2 que creó en el paso Crear credenciales )
  • ID de su proyecto
  • … Y dependiendo de dónde te encuentres, la variable ceterLatLng que especifica dónde centrar el mapa.
  • También puede cambiar la consulta que utiliza la página para completar el mapa. De forma predeterminada, utiliza datos de la tabla aggregated_sensor_values , pero puede cambiar eso a lo que quiera.

$ nano heatmap.html

A continuación, inicie Python SimpleHTTPServer para servir la página del mapa de calor:

$ python -m SimpleHTTPServer 8080

En Cloud Shell, haga clic en el botón ‘ Vista previa web ‘ en la esquina superior derecha de la página (parece un pequeño «ojo» en un cuadro) y obtenga una vista previa en el puerto 8080.

Debería abrir una nueva pestaña. Copie la parte https://8080-dot-somenumber-dot-devshell.appspot.com de la URL (sin ninguna de las rutas después de .com).

En otra ventana o pestaña del navegador, deberá agregar esta URL a los «URI de redireccionamiento autorizados» de sus credenciales de OAuth2 (creadas en el paso Crear credenciales ) en su página de credenciales: https://console.cloud.google.com / apis / credentials

Ahora debería poder hacer clic en heatmap.html y, después de hacer clic en algunos cuadros de diálogo de OAuth2, se mostrará su mapa. Ahora puede usar la herramienta de selección de rectángulos para seleccionar un área en el mapa para mostrar un mapa de calor.

Conclusión

Bueno eso fue divertido. Por supuesto, podemos hacer mucho más, ¡pero es un buen comienzo!

Con más datos, podríamos hacer un análisis que sea más que un simple movimiento de la mano, y también querríamos calibrar nuestros sensores para saber qué tan precisos son en comparación con las estaciones fijas de monitoreo del aire administradas por el gobierno peruano ( http : //www.senamhi.gob.pe ).

Tantas cosas que me gustaría hacer: más sensor (tal vez incluso sensores virtuales que usan cámara / audio y TensorFlow) conexión de 12 vdc desde el automóvil, luz de taxi en funcionamiento, aplicación complementaria para el conductor que se empareja con el registrador de datos para proporcionar conectividad (y tal vez incluso utilícelo para pagarle al conductor) … y así sucesivamente …

En última instancia, el objetivo será ampliar esto en una ciudad (¡o ciudades!) Y llegar al punto en el que realmente podamos descubrir algo nuevo, y tal vez incluso útil.

Puedes acceder a todos los archivos del proyecto en: https://github.com/jpuderer/Taxi-Datalogger

Acerca de James Puderer 1 Article
Cuando no estoy construyendo sistemas integrados para ganarme la vida, navegando o volando, estoy construyendo cosas. Arreglo cosas, hago cosas, rompo cosas.

1 Comentario

Dejá un Comentario

Tu dirección de correo no será publicada.


*