00: Final Project

Self-Stabilizing Column


Olafur Eliasson, Your Unpredictable Sameness, 2014

For the final project, I want to build an interface using human body.
Thanks to our best TA Diego, I came to know a program called Runway ML, a deep learning platform that does all the complicated process in the black box. In the Runway, you can load a posenet library. All output keypoints are indexed by part id. The parts and their ids are:

Id Part
0 nose
1 leftEye
2 rightEye
3 leftEar
4 rightEar
5 leftShoulder
6 rightShoulder
7 leftElbow
8 rightElbow
9 leftWrist
10 rightWrist
11 leftHip
12 rightHip
13 leftKnee
14 rightKnee
15 leftAnkle
16 rightAnkle

Design & Fabrication

Soft Robotic Joints

I wanted to make a soft robotic joint actuated by vacuum rather than inflation. The joint have three chambers that enable omnidirectional movement of the arms. Major difficulties in working with silicone was first, predicting the exact behavior of the silicone was close to impossible. I had to go through a number of iterations to reach the result I wanted. Second, high surface tension made it extremely hard to control bubbles captured inside the mold, especially when you are working with relatively deep molds. Especially when working with 3D-printed molds, you have to be very careful about the air leaking out into the silicone from the tiny cavities inside the molds.


...and more degasing

1st Iteration

I printed the molds in Prusa Original using the 0.15 OPTIMAL setting in the slicer, with the infill density of 50%. Prints seemed like they are done nice and clean.

a little bit of craft...

After they have been cured, there was a problem while demolding them. First, the friction between the silicone and the mold made it impossible to pull the silicone out of the mold. I ended up tearing all of the casts while demolding it. I decided to make the wall slightly tapered for the next iteration.

2nd Iteration

For the 2nd iteration, I designed the mold with the interior walls and outer walls tapered 5 degrees and 1 degree respectively.

Also, I tried to find a specific cast release agent that Ali suggested (Ease Release 200), but they were sold out, so I just bought a similar one, Castin' Craft Mold Release spray.

However, there was another problem with the bubbles; there were simply too many bubbles even after degasing thoroughly before pouring the silicone. Ali told me that it might have to do with the cavity inside the 3D printed mold; as it gets vacuumed, the air inside the mold leaks out into the mold.

3rd Iteration

I used the same shape but printed with 100% infill settings for my 3rd iteration. It took only 10 minutes longer to print the single mold than 50% infill, so not too bad. The molds still created bubbles but definitely much less than the 50% infilled one. Then I soon realized that it is much better to not use the vacuum at all for degasing after you pour the mix into the mold. As long as you pour it with extra care, it would be much less time-consuming and creates less bubbles. Then I was finally able to test the actual behavior of the silicone.
The contracting behavior of silicone joints was along the horizontal axis rather than vertical. First, the walls became too thick when I was trying to taper them, which made it more difficult to contract vertically. Second, since the contraction happens along the shortest edge within the volume, it is impossible to reach a vertical contraction without additional constraints.

These are what I've got so far.
1. Taper the walls for the silicone to released easily of the mold
2. Apply some release agent on the mold.
3. 3D-print the mold with the 100% infill, since the air trapped inside the mold might leak out into the silicone mix during the degasing process.

4th Iteration

After realizing that the units are not going to contract vertically, I made constraints to limit the contraction to a horizontal movement. First I cut a 0.02" sheet of paper to make the constraint pieces. At first I tried polystyrene sheet for this, but after testing the compatibility with silicone, I soon realized that the silicone and polystyrene slides against each other, which made it less effective to work as a constraint.

So I used pieces of paper instead. Since the paper absorbs the silicone a slight bit, it adheres better with silicone than plastic.


Arms are composed of three parts.

1. Connectors(PLA prints; where the silicone joints are glued)
2. Shell(planned as a rolled plastic sheet, but ended up as PLA prints)
3. Core(Acrylic rod;for structural purpose)

At first I wanted to use PVC pipe for the arm first, but Ali soon told me that I would need a huge compressor to deal with such weights.

So I decided to divide into two parts: paper-thin plastic sheet for a shell and an acrylic rod for a core to make it as lightweight as possible. I unrolled the surface in Rhino to cut the sheet, and physically rolled it to make a cylinder shape.

connector and a core assembled

However, I soon realized that it is impossible to roll the paper with oval shaped opening because the it is difficult to control the actual shape of the rolled paper. Then I decided to 3d print the arms. Using Prusa 3D printer, I wanted to make the prints as light as possible. First I generated a g-code using a solid of 0.15mm thickness, which is exactly a diameter of the nozzle.

But it seems it's too thin for the print doesn't work because it is unable to build up all the way up to the last layer.

Then I used 0.2mm thickness and an optimal setting in the prusa slicer. I ran 4 printers and only half of them came out well.

as lightweight as possible


Now all the parts are ready.

Silpoxy was my friend. Silicone is usually hardly adhesive by any kind of glue, so the Silpoxy is the only way to glue silicone to the PLA 3D prints.

baking silpoxy on a heatbed. Silpoxy takes about 12 minutes to set with heat.

first full-movement test


For the electronics, I wanted to use networking to recieve live stream video to my computer, and use it as an input for the pose detection library. First, I wanted to use ESP-WROOM and OV7670 rather than ESP32-CAM, because I wanted to seperate the processor with the camera itself. I found a nice tutorial and an example that uses both boards.
I found a esp32 library from a git page I created a schematics, but I couldn't figure how to unravel all the wires. Also, I figured that the rectangular zone on the left is the antenna, which should not be interfered with other wires.

Then I decided to make a simple ESP32-CAM for the input. I couldn't find a single row 8 pin female header, so I just used 10 pin for one side and used only 8 pins among the pins. Other than that, milling and soldering was very simple and straightforward.


While programming the board through Arduino, I encountered a few errors. I found a nice website that covers pretty much every troubleshooting for ESP32-CAM in particular. First if you get an error that says something like "Sketch too big", make sure you set the Partition Scheme from default to Huge APP.

Even after changing the partition scheme, I got an error that says "Failed to connect to ESP32: Timed out waiting for packet header". I couldn't figure to program it on my computer, so I moved on to a Linux PC at the shop. As I changed the port to the right one, I was able to write a program.

My windows PC just doesn't recognizes my boards all the time. So I used my 7 years old macbook pro and it worked fine. As I pushed the reset button, the serial window gave me a bunch of glyphs. When this happens, make sure to set your baud rate to 115200.

Now it says "Camera Ready! Use '' to connect", which seems happy.


After I failed to figure out how to connect the ESP32 webstream image and the RunwayML environment, I tried to create a GUI to control the tippoint of the column real-time. I used Processing to create a GUI to select a point in a window and find a path to reach that certain point within the range that the tip of the column can reach. Using the communication protocol in Processing that Ali had developed, I was able to relatively easily send commands to the board through the USB port.
However, as the column turned out to be not too rigid and robust, I changed the plan to make a self-stabilizing column.
The following lines of code makes the column the stand up even when tipped over. First of all, the code measures the pressure value of the chamber by sending '?i' (i being the index of the chamber) thorough the serial port. Ali's module was able to sense the pressure only one port at a time, so I made it to open and close the port rotating around each chambers every 100ms. When the column is tipped over to one side, the air chamber on that side gets squeezed, yielding a slight jump on the pressure. A global variable p_sq defines a threshold that can tell that there had been a tipping action, which then trigger the inflating actuation of that certain chamber. p_sq worked best when set 0.1PSI higher than the atmospheric pressure. Another global variable p_max defines a maximum air pressure. When the pressure goes higher than p_max, the air is released from the chamber. p_max prevents air chambers from inflating more than necessary.