Capturing the room
To capture images of the room, I’m using an application for the iPhone called Photosynth. This is a really great app for quickly and easily stitching together 360 degree panoramic photos of spaces. It’s smart enough to provide excellent results even when just held in the hand, but for even better results I’ve used a tripod - although fixing my iPhone to the tripod required some sticky tape and the bumper case.
More torch adaptations
To fit the projector and phone in the torch, and align them all neatly with the lens of the torch, I’ve had to make a few more physical adaptations.
First, to fit all the leads into the case of the torch I needed to create a right angled composite jack. I couldn’t find one of these in the shops, so I soldered one together myself.
Second, to hold the projector in place I created a cardboard holder and glued this into the case of the torch.
Third, I have had to widen the aperture of the torch lens to avoid blocking the throw of the projector. I drilled a larger hole through the bulb socket. This worked but left a messy edge. I therefore covered the edge by gluing on a rubber washer.
New plan - projector torch
Based on my findings using the pico projector with an iPhone, I have decided on a new plan for my model. I will now create a torch that will project a 360 degree view of a room in my house onto any surface in the space it’s used in. I will do this by creating an application that will be loaded onto the iPhone and sent to the projector. This application will utilise the compass and accelerometer in the iPhone so that it will be dynamically controlled by the movement of the phone. As the phone moves, it will move the image being projected. I will use a 360 degree panoramic photo of my room that will loop round as the user pans the phone around in a circle.
I will then place the phone and the projector in the case of a lamp style torch. This will hide the technology from view, making a very intuitive interface for the user. They will be presented with a torch, it will project light like a torch, but as they point it at walls and objects within their environment, it will reveal an image of the interior of my flat. As they move the torch around they will be able to explore my location within their location.
I have started development for this by registering for the Apple Developer Program and downloading their SDK to learn how to create applications that utilise accelerometer and compass data.
I have also purchased a cheap torch which matches the dimensions of my phone and projector. It has required some alterations, but should hold all the devices within it (see photos).
Pico projector - a new direction
I couldn’t go any further with my model without getting my hands on the projector I intend to use in the final piece. The quality and scope of the projector will dictate how much information I can display on the side of the model. If the dimension of the projected image are too small it will prove difficult to effectively show small text, and I’ll need to use larger text and graphical information.
To establish this I ordered a second had pico projector on eBay. I chose this new type of small projector as it seemed a practical solution. As I intended to incorporate the projector into the model, I didn’t want anything too big and bulky.
However, now that I have received the projector and have had the chance to play with it, I’m struck with new ideas that could take the project into a new direction.
When using the projector, the first thing that occurs to me is that the strength of this particular type of projector lies in it’s extreme portability and maneuverability. The projector can be linked to portable media device such as an iPod or iPhone. In fact, as I do not currently have the correct adapter for my laptop, the only way I have had of testing the projector is to attach it to my iPhone and play videos through that.
When you link the small projector with an even smaller media device, it becomes really clear that you’re holding a powerful combination of kit in your hands. The fact that both the projector and it’s source can be held in one hand makes it really easy to move around with the projector, throwing the image onto different surfaces as you move through a space. In terms of creating an information environment, this seems like a useful tool.
On top of this you have the potential of the iPhone itself. The latest models of these contain accelerometers and compass components which mean that the device knows in which direction it’s pointing at any given time. When linked to the projector this means that image being projected could change, depending on what surface it’s pointing at.
All in all I think this setup provides a much more powerful set up than my original idea of using the projector to show images on the side of a model.
Mouse scroll wheels
I’ve been looking at methods of linking the physical movement of the turntable in my project, to the electronic movement of the image being displayed. It’s important that as the user rotates the model, the projection changes at exactly the same rate, otherwise the surface of the model will become out of sync with the information that is meant to be presented on top of it.
To translate this physical movement to movement on a computer/projector, it’s ocured to me that a cheap and easy method would be to modify a mouse scroll wheel. These wheels already turn rotational movement into movement on a computer screen. Therefore if the scroll wheel could be mechanically linked to the turntable, the virtual and physical movements should be in sync.
I have been looking at an old wireless mouse I have to see if this is possible, and it should be easy to move the rotational sensor component from the mouse board and attach it to the gearing of the turntable with some simple soldering.
Presenting the model
I have been giving some thought to how to merge the digital information I am gathering on my daily information intake with the physical object of the model.
In recent visits to the museums - particularly the Science Museum - I have seen interesting work done with projectors, and I’d like to utilise one of these in my project if possible. They provide a useful way of overlaying physical objects with digital information which it would be good to explore.
In order to project digital information on to the surface of the model of my flat, I envisage creating a turntable that will allow the model to be rotated 360 degrees. A small projector will be linked to the turntable, which will project images onto the front surface of the model. As the model rotates though, the image being projected will change. The idea is that, as long as the viewer stays positioned behind the projector, this will allow all surfaces of the model to be augmented by one projector.
I have downloaded and installed Google SketchUp to create a mock up of the turntable/projector/model unit. SketchUp proved really easy to get to grips with. I shall be using it again!
This is a text file created from logging my TV and computer use during a day. It hasn’t all been error corrected, but it gives a good impression of my information intake.
Below is the Applescript code I wrote to take TV screenshots generated by the ION software and run these through Tesseract OCR API. This returns the text found in each screenshot. I have added some extra code to do some error correcting on this output. For example some times characters like “I” are interpreted as slash or pipe symbols, which isn’t correct. The code replaces these. Also, some patterns or images are interpreted incorrectly as text, resulting in gobbledygook words. The code checks for this by detecting correct amounts of vowels and consonants in words.
set rCount to 0
set previousText to “”
repeat
if rCount is less than 10 then
set countString to “000” & rCount
end if
if rCount is greater than 9 and rCount is less than 100 then
set countString to “00” & rCount
end if
if rCount is greater than 99 and rCount is less than 1000 then
set countString to “0” & rCount
end if
if rCount is greater than 999 and rCount is less than 9999 then
set countString to “” & rCount
end if
tell application “Terminal”
delay 3
do script with command “cd desktop/model_project/tv_capture/snapshots/Snapshot_0000
convert Snapshot_0000_” & countString & “.tif +compress -type Grayscale -threshold 30% -crop 520x100+100+440 imOut.tif
tesseract imOut.tif imOut
convert Snapshot_0000_” & countString & “.tif -crop 1x1+0+0 -compress BZip Snapshot_0000_” & countString & “.tif”
delay 3
close window 1
end tell
set foo to (open for access (POSIX file “/Users/angus/Desktop/model_project/tv_capture/snapshots/Snapshot_0000/imOut.txt”))
set txt to (read foo for (get eof foo))
close access foo
set txtTrim to findAndReplace(“\”, ” “, txt)
set txtTrim to findAndReplace(“_”, ” “, txtTrim)
set txtTrim to findAndReplace(“-“, ” “, txtTrim)
set txtTrim to findAndReplace(“!”, ” “, txtTrim)
set txtTrim to findAndReplace(“|”, “I”, txtTrim)
set txtTrim to findAndReplace(“:”, ” “, txtTrim)
set txtTrim to findAndReplace(“"”, ” “, txtTrim)
set txtTrim to CleanLineBreaks(txtTrim)
set actualWordString to findActualWords(txtTrim)
if actualWordString is not equal to previousText then
write_to_file(actualWordString, “Macintosh HD:Users:angus:Public:Drop Box:textLog.txt”, true)
log actualWordString
set previousText to actualWordString
end if
set rCount to rCount + 1
end repeat
on findAndReplace(tofind, toreplace, TheString)
set ditd to text item delimiters
set text item delimiters to tofind
set textItems to text items of TheString
set text item delimiters to toreplace
if (class of TheString is string) then
set res to textItems as string
else — if (class of TheString is Unicode text) then
set res to textItems as Unicode text
end if
set text item delimiters to ditd
return res
end findAndReplace
on CleanLineBreaks(dirty_string)
set clean_string to “”
set OldDelims to AppleScript’s text item delimiters
set AppleScript’s text item delimiters to (ASCII character 10)
set line_list to text items of dirty_string
set i to 0
repeat with this_line in line_list
— set AppleScript’s text item delimiters to (ASCII character 10)
if length of this_line > 6 then
set clean_string to clean_string & this_line & ” “
end if
if the length of line_list is greater than 1 then
set clean_string to clean_string
end if
set i to i + 1
end repeat
set AppleScript’s text item delimiters to OldDelims
return clean_string
end CleanLineBreaks
on findActualWords(dirty_string)
set clean_string to “”
set OldDelims to AppleScript’s text item delimiters
set AppleScript’s text item delimiters to {” “}
set word_list to text items of dirty_string
repeat with this_word in word_list
set AppleScript’s text item delimiters to {“a”, “e”, “i”, “o”, “u”}
set vowelTest to text items of this_word
if length of vowelTest is greater than 1 then
set AppleScript’s text item delimiters to {“1”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “0”, “ß”, “¬”, “Ä”}
set unWordTest to text items of this_word
if length of unWordTest is less than 2 then
log this_word
set clean_string to clean_string & this_word & ” “
end if
end if
end repeat
set AppleScript’s text item delimiters to OldDelims
return clean_string
end findActualWords
on write_to_file(this_data, target_file, append_data)
try
set the target_file to the target_file as text
set the open_target_file to ¬
open for access file target_file with write permission
if append_data is false then ¬
set eof of the open_target_file to 0
write this_data to the open_target_file starting at eof
close access the open_target_file
on error
try
close access file target_file
end try
end try
end write_to_file