Introduction: 3D Body Scanner Using a Depth Camera
*This post was originally written in 2015 and may not reflect the best options in terms of depth sensing camera or scanning software. However the architecture of the system should remain relevant. It was created at the MadSci Lab by Adam Lassy and Steve Cordova
Creating full body scans using the Kinect or other depth cameras is well worn territory, however after attending the Inside 3D Printing Expo earlier this year, and trying out The Great Fredini’s fine 3D scanning booth, we decided to build our own. We took some inspiration from Fred’s open sourced design, but also wanted to automate the camera movement and eventually make the booth completely self operating.
Step 1: 3D Scanning With the Kinect
A little background: Microsoft released the Kinect depth camera in 2010 as a gestural input device for the Xbox game system. Shortly after, SDKs were developed allowing developers to create a wealth of interactive software, including object scanning. Software like ReconstructMe and Skanect were released and made the job of scanning a lot easier. The basic methodology is to walk around a subject with the Kinect camera, slowly filling in a 3D model as the camera scans sections of the person and stitches it to the model in progress. Moving the camera too quickly, or if the subject moves, will kill the scan and it will need to be restarted. Fred’s rotating platform and hand-cranked linear camera motion makes the process easier. More expensive multi-camera scanners will deliver better results, but we wanted to see what we could get out of a single-camera set up.
Our system works by slowly rotating a user on a turntable, while moving a Kinect camera up a linear rail. A computer running ReconstructMe is attached to the Kinect camera. We begin the scan with the user standing on the the stationary platform, with the kinect camera at the bottom of the linear rail. A button press initiates platform rotation and the the camera vertical movement. The scan should be finished by the time the camera gets to the top of the linear rail.
Step 2: Hardware Architecture and Design Methodology
The basic architecture of our scanner is a Kinect v1 scanner traveling up a linear rail as a photography turntable slowly rotates the subject being scanned. The scanning software we use is ReconstructMe, which necessitated using the v1 Kinect scanner rather than newer v2 (as of this writing I don’t know of a software package that supports the v2, though please correct me if I’m wrong). The scan is first started in ReconstructMe, then the button on the scanner is pressed to initiate begin rotation of the subject, and vertical movement of the Kinect camera. The next version will be a one-button solution.
Our design methodology was to build this utilizing as much as possible that was already in the Lab or that could be printed on our Ultimaker2. The 80-20 building set has been pretty indispensable for us and we had a pile of extrusions and connectors we could make use of for the frame. The various stepper brackets, camera mounts and limit switch mounts were all 3D printed. We decided to just buy a photography turntable rather than build from scratch as Fredini did. A set of casters rounded it out and let’s us easily move the scanner around.
The first step will be print all parts from the project's Thingiverse page: https://www.thingiverse.com/thing:1185566
The mechanical components were purchased from McMastercarr and are as follows:
- Timing belt pulleys
- Timing belt
- Shoulder bolts
- Nuts & bolts
Step 3: Electronic Components and Arduino Firmware
The architecture of the electronics is as follows:
A stepper motor controller drives a stepper motor attached to a linear rail until limit switches are reached. A pushbutton with Led feedback initiates the cycle. Additionally, a relay board toggles power on an AC power socket. The turntable is plugged into this power socket.
The electronic components:
- An arduino microcontroller: We used an Arduino Uno, however the firmware requires little memory and could be run on a smaller controller
- Nema23 stepper motor: https://www.amazon.com/gp/product/B007R9U7VE/ Most stepper motors in this size package will work
- Limit switches: https://www.amazon.com/gp/product/B0058GKTZC/
- Stepper motor driver: I like to use heavy duty drivers such as these made by Keling, but anything that can drive your motor is fine. The Arduino firmware uses the AccelStepper library and a 2-wire connection to the driver.