Multiple Raspberry PI 3D Scanner

Hi,
I am a big Arduino and Raspberry PI fan and also love 3D printing. I wanted to be able to make a 3d model of my kids and started investigating how to build a 3d scanner. I found a lot of solutions out there, but the problem with most of them is that the subject would have to sit still for a while… well I think it would be easier for me to invent a spaceship that can fly to mars then inventing a solution for my 2-year old son to sit still 🙁 So none of those solutions where going to work.
Multiple Raspberry PI 3D Scanner
I knew I had to come up with a way to instantly take many images at the same time. So I first started to research what cheap digital cameras exists. If I could find a cheap model, I probably could make an automated trigger system using arduinos. But then I would have all the images on many separate SD cards and I was not able to find a cheap good digital camera.

Then I noticed the Raspberry PI and PI camera combination. A “fairly” affordable module, that already is ethernet connected, so I could do the triggering of the cameras using the network and an easy way to download all the images to a centralized place. So my Project (and investment) started.

I bought for this project:
– 40 Raspberry Pies for this project and 40 PI cameras.
– 40 8Gb SD cards
– 1 single 60A 5v power supply to power all the raspberry Pies
– Led Strips and a powerful 12v power supply to power them on

As I am an impatient person I did not build the whole setup at once, I started of with 12 cameras, and was already seriously impressed with the results. So you DO NOT need 40 cameras, especially not if you just want to catch just the front of a persons face.

Here a result output:

UPDATE:
I have included a photo of Britt (the model in the video) being printed in full color by shapeways.

UPDATE2:

I finally was able to make a scan of my little son Hugo (2years old). It was made using 47 Raspberries and using my new softboxes with permanent lights. This allows me to shoot the images with no shadow. Can't wait to receive the printed model from shapeways 🙂

Step 1: Setting up the hardware

So I first needed a rig to hold the Raspberry Pies. I initially did some testing with a big round circle I made out of wood, but this was really impractical to work with and hard to walk in and out of. So after some testing, I went with an “individual pole” design. Most programs that turn images into a 3D model need the images to be shoot from different angles. So I settled for each pole to hold 3 Raspberry Pies cameras.

I made the poles out of fairly cheap multiplex wood using a 2mm cutting bit on my CNC machine. This allowed me to pre-drill 2mm mounting holes for the Raspberry, so I just needed 2.5mm screws that would instantly fix the raspberry to my frame.

For the PI Camera, I designed a small and easy to print bracket (as I need 40 of them, so it needed to be small) that can hold the camera securely and would easily allow me to change the angle the camera would be pointing at.

To fancy up the poles I also added a 1meter strip of 60 LEDs to each one, to provide some extra light for the photos and just because it looked cool 🙂

Step 2: Connecting everything up

Connecting 40 computers with ethernet and power was going to be messy, but I wanted to do it as efficient as possible. Unfortunately the Raspberry PI does not support Power-over-Ethernet, so I had to make this myself. I cut 40 ethernet cables, each 5 meters long. I kept all cables the same length so I know that what ever voltage I would lose over this distance would be equal for all and I would be able to adjust this on the power supply to get a very accurate 5v.

As 100mb ethernet only requires 4 of the 8 cables inside an ethernet cable, I could use 2 for providing the 5v to the raspberry. So I ended up putting 80 (2x 40) connectors on the cables using just 6 of the 8 wires (2 not being used). I would say this was one of the most boring and tedious elements of this project 🙁

I bought a bunch of female jumper wires, cut them in half and soldered 2 on the end of each network cable, so I could easily just fit this on the ground and 5v pin of the Raspberry Pi.
On the other side, I build a “power distribution board” from my single 60A 5v power supply to where I could easily connect all the 5v and ground wires to coming from each ethernet cable.

Step 3: The software

I am using Raspian OS, just the default download from the raspberry pi website.

To collect all the images, I am using a central file server (in my case I am using a Qnap). I configured the raspbian image to connect to the file server using cifs. This is done in the /etc/fstab file.

I am also using the central file server to store my software, so I can make modifications without having to update every raspberry on its own.

After I completed this image, I used dd (on my mac) to clone the SD card 40x for each raspberry.

Multiple Raspberry PI 3D Scanner

I wanted to write a “listening” script that each raspberry would run, listening to a particular network broadcast package that would trigger the camera and then save the photo and copy it to the file server. As I want all the images to be stored in a single directory (one directory per shot), I am using th

e local IP address of each raspberry (the last 3 digits) for a prefix of the filename.

Here the python listening script I am using:

#!/usr/bin/python

import socket
import struct
import fcntl
import subprocess
import sys

MCAST_GRP = ‘224.1.1.1'
MCAST_PORT = 5007

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((”, MCAST_PORT))
mreq = struct.pack(“4sl”, socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)

sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return 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(‘.')

print ‘ID: ‘ + ip4

#create an options file, this file should containt the parameters for the raspistill image cmd
optionfile = open(‘/server/options.cfg','r')
options = optionfile.readline()
optionfile.close()
print “optons: ” + options

while True:
data = sock.recv(10240)
data = data.strip()
if data == “reboot”:
print “rebooting…”
cmd = ‘sudo reboot'
pid = subprocess.call(cmd, shell=True)
else:
print “shooting ” + data
cmd = ‘raspistill -o /tmp/photo.jpg ‘ + options
pid = subprocess.call(cmd, shell=True)
print “creating directory”
cmd = ‘mkdir /server/3dscan/' + data
pid = subprocess.call(cmd, shell=True)
print “copy image”
cmd = ‘cp /tmp/photo.jpg /server/3dscan/' + data + “/” + data + “_” + ip4 + ‘.jpg'
pid = subprocess.call(cmd, shell=True)
print “photo uploaded”
To initiate all the raspberries to take a photo, I created a “send script”. That would ask for a name. This name is send to the raspberries to include in the prefix of the filename. So I know who the images are from.

Here the python send script:

import socket
import sys
import time

print ‘photo name:'
n = sys.stdin.readline()
n = n.strip(‘\n')

MCAST_GRP = ‘224.1.1.1'
MCAST_PORT = 5007

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
sock.sendto(n, (MCAST_GRP, MCAST_PORT))

The listening script checks the name received. If the name is reboot, reload or restart it does a special action, instead of shooting a photo.

To configure what options I want to use for raspistill (the default image capture software on the raspberry for the PI camera) I am using an options.cfg file to configure this. Again this is stored on the central file server, so I can easily change the options.

I did some testing to see how in-sync all the Raspberry Pies would take the photo. As they all receive the network broadcast package at the exactly same time, I found this worked great. I did a setup test with 12 units all taking a photo of my iPhone running the stopwatch app. Each photo captured he exact same 1/10th of a second.

 

For more detail: Multiple Raspberry PI 3D Scanner


About The Author

Ibrar Ayyub

I am an experienced technical writer holding a Master's degree in computer science from BZU Multan, Pakistan University. With a background spanning various industries, particularly in home automation and engineering, I have honed my skills in crafting clear and concise content. Proficient in leveraging infographics and diagrams, I strive to simplify complex concepts for readers. My strength lies in thorough research and presenting information in a structured and logical format.

Follow Us:
LinkedinTwitter
Scroll to Top