During my sophomore year of college, I developed a 3D scanning machine with my friend Lucian by request of a company in Stamford, Connecticut. We were asked to design and fabricate a machine that could take a 3D scan of one or two people, full size.
We decided to use an Xbox Kinect, as there is already a substantial amount of software available that can render a 3D mesh using this hardware. After some initial tests, we decided on a pedestal that rotates with the scanned object resting on top, and the Kinect on a linear slide that moves up and down in order to capture the object’s entire geometry.
I immediately set to work designing an app in Java to control the scanner. I designed a basic UI with functionality to run a scan sequence based on user-defined settings, connect and disconnect from the scanner, and to jog the tower up and down ten centimeters. Then I started programming the Arduino to run the motors based on the settings from the app.
The scanner works by moving the Kinect carriage to the first position, stopping, and rotating the pedestal around once. Then, the Kinect moves up to the second position, and the process is repeated until the entire object is scanned. I wrote an algorithm that takes the minimum and maximum height to be scanned, calculates how many different pedestal rotations are necessary, and how high up the Kinect needs to be for each one.
After all the software was written, I launched into the circuitry. The controller board for the scanner is comprised of an Arduino Duemilanove, a Pololu A4988 Stepper Motor Driver, a small 5 volt relay board, and a 12 volt DC motor controller. The Pololu runs a 5 volt stepper motor that drives the Kinect carriage, and the DC motor controller runs a 12 volt motor that rotates the pedestal. Both are very easily controlled by the Arduino, and thus, the Java application. After adding a limit switch for the carriage, the wiring was complete.
Next came designing the carriage to carry the Kinect. It had to be able to slide along a 20mm x 20mm aluminum extrusion with little to no friction, but also be sturdy and not wobble, potentially botching a scan. After going through a few design iterations, I settled on a design.
I decided to go with this design because it used the weight of the Kinect in a beneficial way. The force of the Kinect downwards causes the two sets of bearings to push forcefully on the aluminum. This force keeps the carriage smoothly and reliably sliding along the extrusion, improving scan quality.
Also, it is worth noting that the Kinect carriage is moved using a pulley system. Using a “gun tackle” design, a 2:1 mechanical advantage is introduced, meaning the force required to lift the Kinect is only half its weight. I included this feature so that the stepper motor would only have to lift half as much, and have a lower likelihood of skipping steps.
After everything was soldered, glued, and painted, the scanner was complete.
After some initial tests, things were looking promising. Below is a scan of me, and it’s one of the first scans run on the machine. The three circles around the model show the path that the Kinect took relative to me.