Shadowing designed by Jonathan Chomko and Matthew Rosier was the winner of the Playable City Award 2014. Shadowing was to give the city infrastructure (namely street lights) memory, enabling them to record and playback the shadows of people who pass underneath.
The next four posts will explore some of the technical challenges encountered in the development of Shadowing and what solutions were implemented to overcome those challenges.
- This post focuses on the hardware elements that made up the Shadowing lampheads.
- Post 2 explores how we setup and implemented numerous computer vision elements.
- Post 3 explains how the software records shadows and how the playback mechanism worked.
- Post 4 demonstrates how we were able maintain and alter the Streetlights from Watershed.
What computer do you put into a lamppost?
Even from day one we could see that the project would require some heavy duty processing power to handle both the capture and display of shadows. We initially thought of using a Mac Mini due to their relative small unit size and computing power, but when you see the inside of streetlight you understand why we could not use one.
It’s not exactly spacious and besides it still had to fit a display mechanism, a camera and other hardware.
What were the options? A couple but none were practical or powerful enough to run our software.
- Raspberry Pi – Perfect in terms of size, but its processing power was far too low and on testing we burnt one out.
- Cubietruck – Again perfect in terms of size, but we could not get the correct graphics drivers installed.
- Macbook Air – Extremely expensive and just too big to fit inside the casing.
We eventually settled on using Intel D54250 NUCs as they could be customised to suit our needs. They were customised with a Crucial 8GB memory chip, a Intel 30GB Harddrive, a integrated WiFi and Bluetooth chip and finally a 3G mobile broadband dongle.
To save time, we built one NUC from scratch then cloned its image to the other NUCs.
Here is a quick run down of how we setup the NUC’s.
First we had to alter the BIOS Settings on the NUCs so that they would allow us to Boot from a usb key rather than the core OS.
- Power > Secondary Power Setting > After Power Failure : power on - Boot > Boot Priority > Legacy Boot Priority > Legacy Boot: Uncheck - Boot > Boot Configuration > UEFI Boot > Boot USB Devices First: Check - Boot > Boot Configuration > UEFI Boot > Boot Devices > Network: Uncheck - reboot
We then installed a Ubuntu 13.04 LTS distro, then removed the unnecessary elements from the harddrive.
- sudo -i - apt-get update - apt-get dist-upgrade -y - apt-get autoremove --purge -y - reboot
Next we had to ensure that the units would accept a USB 3G dongle as we needed to be able to communicate with the units once they were installed. To do this we installed usb-modeswitch, then ran the following commands.
- sudo apt-get install usb-modeswitch - vi /etc/fstab - - Prefix mount-options (errors=remount) with "discard," to enable TRIM support - - mount -oremount / - apt-get install -y xinit git bluez usb-modeswitch - echo 'allow-hotplug usb0' >> /etc/network/interfaces - echo 'iface usb0 inet dhcp' >> /etc/network/interfaces - echo 'GRUB_RECORDFAIL_TIMEOUT=5' >> /etc/default/grub - update-grub2
This allowed the system to pass internet traffic through the USB dongle rather than the Ethernet or WiFi chip.
We used openFrameworks to build the software for this projects, as it was quick to prototype, versatile enough to operate on numerous systems and both Jonathan and I have used it in previous projects.
To install openFrameworks on a GUIless Ubuntu simply.
- curl -O http://www.openframeworks.cc/versions/v0.8.3/of_v0.8.3_linux64_release.tar.gz - tar -xvf of_v0.8.3_linux64_release - cd of_v0.8.3_linux64_release/scripts/linux/ubuntu/ - ./install_dependencies.sh - ./install_codecs.sh - cd .. - ./compile_OF.sh
The final setup step was to ensure that the NUCs did not send any display to sleep. Our method was to do the following.
- sudo apt-get install x11-xserver-utils - sync - nano /etc/rc.local - Enter the following command: su - root -c 'startx' & end 0
In the root directory you add a new file
- pico .xinitrc, then add the following code.
#!/bin/sh # Set the background to navy-blue /usr/bin/xsetroot -solid navy # Disable DPMS / Screen blanking /usr/bin/xset -dpms; /usr/bin/xset s off; # Hide the cursor /usr/bin/unclutter; # Sleeeeeep while /bin/true; do sleep $(( 7 * 24 *6 *6 )); done;
Then reboot the system.
There are other commands specific to this project, but these will be covered in another post
For the display mechanism we used Acer ACER H6510 projectors which outputted an impressive 3000 lumens despite their relatively small size.
In an ideal world Jonathan and Matthew would have used the existing hardware of the lamp head to create the display. In a similar way to what HYBE did for their IRIS project. Although in the case of Shadowing the Transmissive LCD Display would have blocked the light being emitted from the bulb.
However, projectors were a far more suitable method and one which could be implemented with ease and quickly (when I say easily cast your minds back to the image of the lamp casing! Jonathan in fairness was a dab hand with a hacksaw).
The projector was connected to the NUC via HDMI. We also used a USB to RS-232 serial adapter to communicate with the projector, this allowed us to control when the projector turned on and off. This was done through a software addon ofxProjectorControl. Which simply pulses commands down the serial port. The repo contains an example which demonstrates the how to use the core components of the addon.
To protect the hardware we laser cut perspex plates that fitted inside the lampheads offering an air intake and exhaust that would both draw cool air into unit and expel hot air from the projector.
To see how we setup the camera hardware see the next post.