Flera Raspberry PI 3D Scanner (3 / 8 steg)
Steg 3: Programvaran
Jag använder Raspian OS, bara standard ladda ner från webbplatsen raspberry pi.
För att samla in alla bilder, jag använder en central filserver (i mitt fall jag använder en Qnap). Jag konfigurerat raspbian bilden för att ansluta till servern via cifs. Detta görs i filen/etc/fstab.
Jag använder också en central filserver för att lagra min programvara, så jag kan göra ändringar utan att uppdatera varje hallon på egen hand.
Efter att jag avslutat den här bilden, använde jag dd (på min mac) att klona den SD kort 40 x för varje hallon.
Jag ville skriva ett "lyssnande" skript som varje hallon skulle körning, lyssnar till ett visst nätverk broadcast paket som skulle utlösa kameran och sedan spara bilden och kopiera den till filservern. Jag vill alla bilder lagras i en enda katalog (en katalog per skott), använder jag den lokala IP-adressen för varje hallon (de sista 3 siffrorna) för ett prefix för filnamn.
Här python lyssnande skriptet jag använder:
#! / usr/bin/python
import socket
importera struct
importera fcntl
importera underprocess
importera sys
MCAST_GRP = "224.1.1.1"
MCAST_PORT = 5007
Sock = socket.socket (socket.AF_INET, uttag. SOCK_DGRAM, uttag. IPPROTO_UDP)
Sock.Setsockopt (socket. SOL_SOCKET, uttag. SO_REUSEADDR, 1)
Sock.BIND (('', MCAST_PORT))
mreq = struct.pack ("4sl", socket.inet_aton(MCAST_GRP), socket. INADDR_ANY)
Sock.Setsockopt (socket. IPPROTO_IP, uttag. IP_ADD_MEMBERSHIP, mreq)
def get_ip_address(ifname):
s = socket.socket (socket.AF_INET, uttag. SOCK_DGRAM)
återgå 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('.')
skriva ut ' ID: "+ ip4
#create en alternativ fil, denna fil bör innehålla parametrar för raspistill bild cmd
optionfile = open('/server/options.cfg','r')
alternativ = optionfile.readline()
optionfile.Close()
skriva ut "optons:" + alternativ
samtidigt sant:
data = sock.recv(10240)
data = data.strip()
om data == "omstart":
skriva ut "omstart..."
CMD = "sudo omstart"
PID = subprocess.call (cmd, shell = True)
annat:
skriva ut "skytte" + data
CMD = "raspistill -o /tmp/photo.jpg" + alternativ
PID = subprocess.call (cmd, shell = True)
Tryck "skapa katalog"
CMD = ' mkdir/server/3dscan /' + data
PID = subprocess.call (cmd, shell = True)
skriva ut "Kopiera bild"
CMD = 'cp /tmp/photo.jpg/server/3dscan /' + data + "/" data "_" + ip4 + + ".jpg"
PID = subprocess.call (cmd, shell = True)
skriva ut "Foto belastat upp"
För att inleda alla hallon för att ta ett foto, skapade jag en "Skicka script". Som skulle vilja ha ett namn. Detta namn skickas till hallonen i prefix för filnamn. Så jag vet vem bilderna är från.
Här skickar python skript:
import socket
importera sys
Importera tid
skriva ut "Foto namn:"
n = sys.stdin.readline()
n = n.strip('\n')
MCAST_GRP = "224.1.1.1"
MCAST_PORT = 5007
Sock = socket.socket (socket.AF_INET, uttag. SOCK_DGRAM, uttag. IPPROTO_UDP)
Sock.Setsockopt (socket. IPPROTO_IP, uttag. IP_MULTICAST_TTL, 2)
Sock.SendTo (n, (MCAST_GRP, MCAST_PORT))
Lyssnande skriptet kontrollerar fick. Om namnet är pånyttfödd, reload eller starta om gör den en särskild handling, i stället för att skjuta ett foto.
Om du vill konfigurera vilka alternativ jag vill använda för raspistill (standard image capture software på hallon för PI kameran) använder jag en options.cfg fil för att konfigurera den här. Igen lagras detta på en central filserver, så jag kan lätt ändra alternativen.
Jag gjorde en del tester för att se hur alla hallon pajer i sync skulle ta bilden. Som de alla få network broadcast paket på exakt samma gång, hittade jag den här arbetat stor. Jag gjorde en setup testa med 12 enheter alla ta ett foto av min iPhone kör stoppur app. Varje foto fångade han exakt samma 1/10th av en sekund.