Paso 3: El software
Estoy utilizando sistema operativo Raspian, sólo la descarga predeterminada de la Página Web de frambuesa pi.
Recopilar todas las imágenes, estoy usando un servidor de archivo central (en mi caso estoy usando un Qnap). He configurado la imagen raspbian para conectarse al servidor de archivo mediante cifs. Esto se hace en el archivo/etc/fstab.
También estoy usando el servidor de archivos central para almacenar mi software, por lo que puedo hacer modificaciones sin tener que actualizar cada frambuesa por cuenta propia.
Después de que terminé esta imagen, usé dd (en mi mac) para clonar la tarjeta SD 40 x para cada frambuesa.
Quería escribir un guión "escuchando" que funcionaría cada frambuesa, escuchar una red particular transmitidos que disparar la cámara y luego guardar la foto y copiar en el servidor de archivos. Como quisiera que todas las imágenes se almacenan en un solo directorio (uno por disparo), estoy usando la dirección IP local de cada frambuesa (los 3 últimos dígitos) para un prefijo de nombre de archivo.
Aquí el script de python escucha estoy usando:
#! / usr/bin/python
importación zócalo
estructura de importación
fcntl de importación
subproceso de importación
Import sys
MCAST_GRP = '224.1.1.1'
MCAST_PORT = 5007
calcetín = socket.socket (socket.AF_INET, zócalo. CALCETÍN_DGRAM, toma de corriente. IPPROTO_UDP)
sock.setsockopt (socket. SOL_CASQUETE, zócalo. SO_REUSEADDR, 1)
sock.BIND (('', MCAST_PORT))
mreq = struct.pack («4sl», socket.inet_aton(MCAST_GRP), zócalo. INADDR_ANY)
sock.setsockopt (socket. IPPROTO_IP, zócalo. IP_ADD_MEMBERSHIP, mreq)
DEF get_ip_address(ifname):
s = socket.socket (socket.AF_INET, zócalo. CALCETÍN_DGRAM)
volver socket.inet_ntoa (fcntl.ioctl)
s.fileno(),
0X8915, # SIOCGIFADDR
struct.Pack ('256s, ifname[:15])
) [20:24])
ID = get_ip_address('eth0')
IP1, ip2, ip3, ip4 = id.split('.')
imprimir ' ID: ' + ip4
#create un archivo de opciones, este archivo debe contener los parámetros para el cmd de la imagen de raspistill
optionfile = open('/server/options.cfg','r')
opciones = optionfile.readline()
optionfile.Close()
Imprimir "extramo:" + opciones
Aunque la verdad:
datos = sock.recv(10240)
datos = data.strip()
Si los datos == "reboot":
Imprimir "reiniciar..."
cmd = 'sudo reboot'
PID = subprocess.call (cmd, shell = True)
otra cosa:
Imprimir "disparando" + datos
cmd = 'raspistill -o /tmp/photo.jpg' + opciones
PID = subprocess.call (cmd, shell = True)
Imprimir "crear directorio"
cmd = ' mkdir/Server/3dscan /' + datos
PID = subprocess.call (cmd, shell = True)
Imprimir "Copiar imagen"
cmd = 'cp /tmp/photo.jpg/Server/3dscan /' + datos + "/" datos + "_" + ip4 + ".jpg"
PID = subprocess.call (cmd, shell = True)
Imprimir "carga foto"
Para iniciar todas las frambuesas para tomar una fotografía, he creado un script de"enviar". Le pida un nombre. Este nombre es enviar a las frambuesas en el prefijo del nombre de archivo. Así que sé que las imágenes son de.
Aquí el python enviar secuencias de comandos:
importación zócalo
Import sys
tiempo de importación
imprimir ' nombre de Foto:'
n = sys.stdin.readline()
n = n.strip('\n')
MCAST_GRP = '224.1.1.1'
MCAST_PORT = 5007
calcetín = socket.socket (socket.AF_INET, zócalo. CALCETÍN_DGRAM, toma de corriente. IPPROTO_UDP)
sock.setsockopt (socket. IPPROTO_IP, zócalo. IP_MULTICAST_TTL, 2)
sock.SendTo (n, (MCAST_GRP, MCAST_PORT))
Escucha la secuencia de comandos comprueba el nombre recibido. Si el nombre es reiniciar, volver a cargar o reiniciar hace una acción especial, en vez de tirar una foto.
Para configurar las opciones desea utilizar para raspistill (el defecto imagen software de captura de la frambuesa para la cámara PI) estoy usando un archivo options.cfg para configurar esto. Otra vez se almacena en el servidor de archivo central, por lo que fácilmente puedo cambiar las opciones.
Hice algunas pruebas para ver cómo todas las tartas de frambuesa en sync tomaría la foto. Todos reciben el paquete de broadcast de red a la vez exactamente, encontré este gran trabajo. Hice una instalación de prueba con 12 unidades todos tomando una foto de mi iPhone ejecutar la aplicación del cronómetro. Cada foto captura exacta misma 1/10 de segundo.