Introduction: Color Seeking Mirrors
Color Seeking Mirrors is an installation composed of an array of 30 x 30 small mirrors reflecting the immediate space. In essence the array acts as physical pixels where normally pixels are completely separated from the physical world. In front of this array of mirrors a camera is positioned on a tripod, which reads the color picked up by the mirrors. The camera is connected to computer and micro-controller (TinyG), which drives a CNC, motorised arm, which sits behind the mirrors. This CNC arm can adjust the tilt of each mirror, changing the direction of the reflection. The colors picked up by the camera and CNC arm are displayed across the array.
In its basic form Color Seeking Mirrors is an analog machine, which picks out color from the environment. In doing so it uses the redirection of the beholders sight to construct an image. It illustrates the complexity of the process behind not only human vision but also how technologies relating to machine vision become automatized.
A strong bound is created between the installation and the environment since every shown image is completely unique to its surrounding space and its colors of which it is recomposed.
The installation amplifies the processes needed for the machine to find colors in the space. On first sight this seems an almost impossible task to find one specific color. However the installation provides the audience with insight into this process, which in itself is interesting to observe as the machine decides which color to select if it can’t find the desired one. The mechanical beauty of the machine let the beholder watch the intriguing process of setting each mirror to the correct tilt.
As the audience move from the sweet-spot they can observe the abstract animation and its changing colors.
Color seeking mirrors was developed in the Artist in Residence program at Pier9. This Instructable is not intended as a step by step instruction to rebuild this installation. It is more thought as a documentation of my progress of tackling a big complicated project.
Step 1: The Idea
The idea came from one of my previous works i did in my studies. It is called encoded Mirrors and here is a short project description:
Wassily Kandinsky and Piet Mondrian are two famous artists of abstract art. Both had different approaches in terms of form but when it comes to the choice of color they agreed. The three primary colors red, blue and yellow are the most essential in their work.
To demonstrate the connection between both artists the installation takes Kandinsky’s painting „Yellow-Red-Blue“ and turns it into Mondrian’s “Composition with big red square, yellow, black, grey and blue” just by using static mirrors. Every mirror on the surface is tilted to a specific angle to reflect a certain color of the Kandinsky painting hanging on the wall. If a person stands at the correct distance and height to the surface, the sweetspot, the image of the Mondrian painting appears in the mirrors. The whole image is just constructed by redirecting the sight to different spots located on the Kandinsky painting.
Further information: http://florianborn.com/projects/encoded_mirrors/
I liked the idea of showing images just by redirecting the beholders sight to a specific spot with mirrors. I wanted to do more explorations on this topic but the static mirror surface of encoded mirrors made it hard to make further iterations. On the other hand I would love to work more with the surrounding environment in which the installation is placed.
With this fascination the idea was born to develop an interactive version of encoded mirrors that is able to adapted to its surrounding space.
Step 2: First Resolution Test
It is all about the resolution if you want to display a recognisable image.
My first experiment was an self developed openframeworks sketch that allowed me to load an image and display it in a desired resolution to see the lowest resolution which still let you recognise the image. Since my installation is also limited to the colors of the environment I extended the sketch with live video footage and manually picked colors from its surrounding space. With this sketch I was able to get an idea on how the final result could look like.
I ended up to use a 30x30 resolution because it was a the best balance between the recognisability of the image and feasibility of the installation itself since this resolution already needed 900 movable mirrors.
Step 3: Computer Vison
For the camera tracking I had to choose between two different approaches.
1. Camera ray casting to scan the surrounding space to calculate the position for each color and the vectors that to point to each mirror.
This solution require a lot computer vision programming and would take quite some time to setup each time it is placed into a new environment. The machine itself needs to be perfectly calibrated to be able to address a absolute coordinate in space.
2. Placing a camera in front of the mirror and track each mirror itself to check the color it is showing. This is a much simpler solution since there is no need for complex mathematical calculations. The downside is that each mirror need to scan all available colors by moving the mirror to every possible angle.
I decided to go for solution 2 since it fits my needs for this installation much better and need less programming hours. Simple is often better. Also the mechanical resolution of the mirrors are not able to point to every position in space which would mean the available colors form solution 1 need to be sorted by the accessibility of the mirror.
Step 4: Mirror Motion System
After the software experiments I build prototypes of different mechanics to see how to tilt the mirrors.
To build these prototypes I used Fusion360. It's mechanical simulations helped iterate different mechanical solutions. One thing I always had to keep in mind was to make the mechanic as simple as possible because I needed to produce 900 of those.
In my first approach I completely ignored what I just said. It was a round platform with a big gear attached to the bottom. Each turn it would hit a little pin and tilt the platform by one tooth. This solution would work but it is way t complicated and needed super tight tolerances.
To reduce the mechanical complicity I focused on a well known mechanic, the gimbal. A 3D print on a resin based printer allowed me easily to print a full functional gimbal. After seeing that a single gimbal has a total resin cost of about 4$ I needed to find a better fabrication method.
This was the first attempt to cut a gimbal from flat sheet material with a water jet. The result looked promising but I quickly realised that I needed to experiment more with materials and geometry. The biggest problem was that I had to find a different tool to cut the metal because the kerf of the water jet was to wide. I wanted to make the mirrors not bigger then 20mm. The curve of the water jet was to big for such a filigree geometry.
As a tool for cutting metal I decided to used a 400W Metabeam laser cutter. The laser cutter has a much finer kerf which allowed me to experiment with smaller and more complex geometries.
After some material research decided to do use blue-tempered springsteel because of its flexible attributes and its nice looking blue finished surface. In the image above you see a few experiments on different geometries.
From left to right.
- spiral, it broke because of the air pressure that is used to make better cuts
- gimbals, worked but broke pretty quick and needed a lot of space
- kerf bending, this worked very well but cutting took forever
- springs, the 4 on the right side were different springs that worked the best and were easy to cut
Bellow you can see a final sheet coming right out of the metabeam
Step 5: Mechanics
After figuring out the motion system for the mirrors I needed a mechanic that sits behind each mirror to tilt them.
Normally one of the easiest ways to create such a movement would be using a 2 degrees of freedom system like you see below. This system uses two actuators and a balljoint to to tilt the connected plain.
This solution would mean I need two motors per mirror which are 900 in total I would need to get 1800 motors. To assemble, wire and control so many motors is a project on its own. I decided do some more investigation in finding a solution that require one instead of two motors per mirror.
After a while I came up with an idea where a little hock sitting on a tip a standard M3 screw. By driving the screw in the hook slowly pushes against the mirror.
With this solution I reduced the amount of motors needed by half. Still 900 motors are a lot so I made a decision on the project to reduce the motors even more. See next step.
Step 6: Assembly and Fabrication
This step should give you some impression on my fabrication processes I used.
Cutting the motion system on the metabeam
CNC milling the aluminium panels on the Haas VF2 with around 75 M3 threads.
After machining all parts and receiving the ordered ones it was about time to assemble everything. Here is a list of all things that had to be assemble for this project. Each module consists of around 200 single pieces and all 25 modules have around 5000 pieces.
Step 7: CNC
Since assembling, wiring and controlling 900 motors is a project on its own, I decided to build a 4-axis cnc machine that is driving from screw to screw and adjusting one at a time. This reduce the complexity of the system enormous.
The CNC machine uses 5 motors that can be easily controlled by a tinyG motor controller.
The main difference between both option is that with 900 motors I have a refresh rate of about 1-2 min versus 5 motors have about 12-24 hours refresh rate. Since the idea behind this project is to explore the relationship between machine - space - image there is no need of having a fast refresh rate.
The focus also shifts from just showing images to the actual processes of finding the colors of these images. The beholder can observe the machine moving around and make decisions on which color is the coolest to the desired color.
The CNC head and especially the a-axis that drives the screw in and out had a spacial requirement. It needed to be able to set every screw back to its home/zero position. So I modified a plunger limit switch so in could sit inside the socket. By unscrewing the screw till it pushes against the switch the machine is able to reset the screws position.
Step 8: Software / App
Obviously for a project like this there is no out of the box software.
I developed the whole software that is running the machine in C++ using Cinder a creative coding framework that already come with a bunch of library and functions so I did not needed to start completely from screech.
The TinyG motor controller has a G-Code interpreter onboard so sending operation commands to the cnc could be done by sending G-Code via serial communication.
For the tracking of the mirrors by the camera I could use some basic openCV.
The main part is organizing all my lists of mirrors, colors, positions, screw locations, offsets, etc. and to make sure they are always sorted correctly and to save these information to files.
I quickly realised that I need a tool to calibrate the whole machine and setting all offsets for each module. This calibration is essential to make sure that the cnc head engage each screw correctly without crashing into the machine itself. I decided to develop a small control App for my phone so I can move around the machine and control the cnc without sending G-Code commands by hand and holding my heavy laptop all the time.
Step 9: Simulations
Here are a few simulations on how an image generated by this machine in a particular space could look like.
With this installation there are different possible explorations to make of the dialog of object and its surrounding environment. In the following paragraphs these explorations will be explained shortly.
Jorge Luis Borges was an Argentine writer and poet who wrote the story about The Library of Babel. Each of its books consists of 410 pages and has a different combination of letters. With this concept the library contain every book ever written and that will be written but most of the books are nonsense.
If you think about this idea in coherence with color seeking mirrors every space contains every image. The colors just need to be composed to the desired image by redirecting the sight. Sure not every environment contains every color but this limitation allows an interesting dialog between image and space since the machine has to decide by itself which is the closest color to the desired one.
This concept works with an image as well but instead of changing the image the installation shows the same image in different environments. An image composed of colors in a workshop will produce a completely different visual manifestation compared to a forest or a gallery.
There are artworks like the Nike of Samothrace which once was destroyed and have been reconstructed. Till now they still missing her arms and head.
Placing the installation in front of the statute it could reconstruct the missing parts by picking up colors of it and trying to imaging how the complet Nike could look like.
This idea could also transferred to other destroyed artworks or buildings. The installation could pick up colors of the remains to try to reconstruct an image of them.
In this experimental exploration the maschine simply tries to display a color. By the limitation to the color palette to the surrounding space and the mechanical resolution of the mirror movement this simple task becomes a difficult one. The machine has to decide which of the available colors are the closest to the desired one. Since not every mirror can adjust its angle to the same color spot the mirrors starts to display a variation for example of all different types of red that are available.
In this last and most open idea the maschine is given much more freedom in its decisions. The machine could for example restructure the image colors by what it find in the environment. This idea address a question Ralf Baecker already asked in a few of his artworks: About what does a machine dream?
Step 10: Result
We have a be nice policy.
Please be positive and constructive.