Uit het gebruikersonderzoek is gebleken dat kinderen vooral naar de kasten en lege muren kijken bij het binnenkomen van het operatiekwartier. Wannneer ze gaan liggen op het bed wordt hun zicht beperkt tot enkel het plafond. Daarom werd beslist om projectiemateriaal te ontwikkelen voor zowel de muren als het plafond.
De meest voor de hand liggende oplossing was om meerdere projectors in te zetten, in functie van het gekozen oppervlak. Het nadeel hierbij is dat elke projector gefixeerd zou moeten worden om de mapping juist te krijgen. Bovendien vereist deze oplossing redelijk wat hardware per operatiezaal. (Opm: elk operatiekwartier beschikt over meerdere zalen die in rotatie gebruikt worden. Zo kan elke zaal na gebruik gedesinfecteerd worden, terwijl de andere in gebruik wordt genomen). Dokters en verpleegkundig personeel hebben echter niet de tijd om iedere keer een volledige setup te doen van de mappings, of om de projectors juist te richten.
We kozen dus voor een andere oplossing. Daarbij werden grote Aruco-markers (geprint op stickerpapier via een plotter) tegen de kasten gehangen, wat toeliet om automatisch te detecteren waar de projector zich naar moest richten. Deze stickers voorzagen de oplossing van de juiste info rond het type oppervlak en de nodige mapping en oriëntatie. Bovendien konden we de oplossing selectief programmeren, zodat bijvoorbeeld werkruimten met rust konden worden gelaten en het medisch personaal ongestoord zijn werk kon doen.
Het originele beeldmateriaal werd geproduceerd in Unity (zie video creatie). Je kan echter ook zelf beeldmateriaal produceren en toevoegen aan de applicatie.
Dit kan je op volgende manier doen:
- Produceer drie videolagen voor zowel het plafond als de muur (m.a.w., in bovenaanzicht en zijaanzicht). Dit brengt het totaal op zes bestanden per thema:
- Een achtergrond voor plafond en muur
- Een voorgrond (inclusief transparantie) voor plafond en muur
- Een interactielaag (inclusief transparantie) voor plafond en muur
- Doe dit voor elk van de gekozen thema's (in dit geval: onderwater en ruimtereis)
- Maak in de
bin/data
-folder van je openframeworksinstallatie een map aan, en vernoem deze naar je thema (bv./space
of/water
) - Kopieer de videofiles naar de overeenkomstige mappen
- Ofwel de bestaande werelden uit
media/video_material
op onze git - Ofwel de zelfgemaakte werelden (indien je het voorbeeld Unity-project neemt: vanuit de map
recordings
) - Controleer daarna de naamgeving via videosettings en oppervlakken
- Ofwel de bestaande werelden uit
- In
bin/data/sounds
kan je ook een ander achtergrondmuziekje (.mp3) plaatsen dat beter bij jouw beeldmateriaal past. Gebruik hierbij de naamgevingbackground.mp3
of pas dit aan inofApp.cpp
) - Build en run de applicatie
- Een reeds geïnstalleerde versie van Openframeworks, beschikbaar voor zowel OSX, Windows als Linux.
- TouchOSC, geïnstalleerd op GSM
- TouchOSC Bridge
- TouchOSC editor
Windows: gebruik VSCode Mac: Gebruik XCode Linux: Gebruik whatever
OpenFrameworks is een opensource, C++-based framework, supercharged met add-ons.
Openframeworks werd ontwikkeld door Zach Lieberman als een toolbox voor creative coding (o.a. dus voor interactieve videoinstallaties zoals in dit project). Het werd sindsdien omarmd door de opensource crowd en kent nog steeds uitbreidingen en updates. We kozen voor OpenFrameworks omdat de detectie van Aruco-markers het snelst implementeerbaar was via bestaande OpenFrameworks add-ons, wat van belang was gezien de strakke deadline van het project. Bovendien waren de add-ons voor OSC en interface design ook van waarde.
Om het project te kunnen builden hadden we nood aan onderstaande plugins. Sommigen zijn reeds beschikbaar in OpenFrameworks, anderen moeten nog toegevoegd worden. Je kan dit doen door ze manueel te downloaden en toe te voegen aan de 'addons'-folder in openframeworks.
- ofxAruco
- ofxCv
- ofxGui - (included)
- ofxHapPlayer
- ofxOpenCv - (included)
- ofxOsc - (included)
- ofxPoco - (included)
- ofxXmlSettings - (included)
Volg de Engelstalige installatiegidsen op OpenFrameworks
Het builden van het project verschilt van OS tot OS. We lijsten hieronder kort even wat aandachtspunten op:
Opm: initiëel gingen we van start met development op macOS, maar we stapten over op Windows wanneer bleek dat de RPI3 niet performant genoeg was, en dat de RPI4 nog geen ondersteuning bood voor OpenFrameworks. Wegens tijdsgebrek was het ook niet mogelijk dit extenstief te testen of de applicatie verder te optimaliseren. We kochten een NUC aan en zorgden dat de applicatie hierop kon draaien, onder andere door de toevoeging van de hap video player.
!!! ofxHapPlayer is niet beschikbaar voor mac. Je kan deze vervangen door ofVideoPlayer, maar dan moeten bepaalde lijnen (getError) verwijderd worden. Vergeet ook niet deze uit de addons.make file te halen.
- Download en extract de repository via zipfile of download via git
- Kopieer
arucoMap
naaropenframeworks/apps/myApps
- Gebruik de ProjectGenerator om het project aan te maken
- Open de ProjectGenerator
- Klik 'import' en navigeer naar de projectfolder
- Druk op 'generate' om de projectfiles aan te maken. Dit maakt meteen ook de xcode projectfiles aan
- Open het project in xcode
- Gebruik de build-functionaliteiten om de applicatie te builden en te runnen
Je kan dit ook builden en runnen met make
en make run
. Neem daarvoor volgende stappen:
- Dupliceer de
emptyproject
-folder en geef deze een nieuwe naam - Kopieer de
/src
en/bin
folder naar de nieuw aangemaakte folder - Vervang de
addons.make
-file door deze uit het gedownloade project - Navigeer via een terminal naar deze folder en run de commands
make
enmake run
De projectfiles komen in de '/src'-folder, de datafiles (video en XML) en de uiteindelijke builds komen in de '/bin'-folder.
- Download en extract de repository via zipfile of download via git
- Kopieer
arucoMap
naaropenframeworks/apps/myApps
- Kopieer de
emptyproject
-folder - Kopieer de
/src
en/bin
folder naar de nieuw aangemaakte folder - Open het project in VSCode
- Gebruik de build-functionaliteiten om de applicatie te builden en te runnen
- Download en extract de repository via zipfile of download via git
- Kopieer
arucoMap
naaropenframeworks/apps/myApps
- Kopieer de
emptyproject
-folder - Kopieer de
/src
en/bin
folder naar de nieuw aangemaakte folder - Vervang de
addons.make
-file door deze uit het gedownloade project - Navigeer via een terminal naar deze folder en run de commands
make
enmake run
Na het builden van het project kan je de applicatie opstarten. Dit geeft initieel een zwart scherm omdat de applicatie in live-modus draait en nog geen markers kan detecteren. Markers worden namelijk enkel gedetecteerd wanneer de tracking-modus aan staat. Dit kan je doen door de knop "T" of "6" langdurig in te drukken. Indien er slechts 1 marker gedetecteerd wordt, kan je het te projecteren vlak voor deze marker instellen via OSC (zie onder). Dit moet natuurlijk gebeuren om de eerste projectievlakken aan te maken.
Om de projectie-opstelling aan te kunnen sturen, kan er in twee modi gewerkt worden: de 'live'-modus (met markers) en de 'preset'-modus (zonder markers).
Je kan dit aanpassen via de remote numpad (waarbij 0 = live, 1 tot 3 = presets).
De presets tonen een vooringestelde configuratie van projectievlakken. Om deze vlakken in te stellen maken we gebruik van OSC. OSC is een communicatiemethode die te vergelijken valt met MIDI. OSC kan met andere OSC-enabled toestellen communiceren via channels.
Om de vlakken in te stellen, maakten we gebruik van TouchOSC. De file die hiervoor nodig is bevindt zich in de 'additions'-folder.
TouchOSC is een (betalende) app waarmee je messages en slider-waarden (zie foto voor interface) kan doorsturen naar de applicatie via het IP-adres van de computer (op voorwaarde dat je met eenzelfde netwerk geconnecteerd bent).
De live-modus staat toe dat de webcam markers detecteert. Op basis hiervan wordt automatisch bepaald welke vlakken er geprojecteerd moeten worden.
Indien de applicatie is ingesteld op live en er slechts één marker zichtbaar is, kan je de view hiervan instellen via TouchOSC. Vergeet niet het juiste IP-adres in te stellen in settings.hpp
.
Name | Function |
---|---|
Scale | Schaal van het projectievlak |
Output | Projectievlak instellingen |
X | Horizontale positie |
Y | Verticale positie |
Z | Diepte positie |
Width | Breedte van het vlak |
Height | Hoogte van het vlak |
Video | Video input instellingen |
X | Horizontale positie |
Y | Verticale positie |
Width | Breedte van de crop |
Height | Hoogte van de crop |
Ceiling | Gebruik de ceiling video ipv de wall video |
Write | Instellingen oplaan |
❗️❗️❗️ 'Edit mode' moet ingeschakeld zijn om wijzigingen te kunnen aanbrengen (zie ook tweede scherm onderaan) ❗️❗️❗️
Screen 1 | Screen 2 | Screen 3 |
---|---|---|
Name | Function |
---|---|
Previous preset | Vorige preset |
Next preset | Volgende preset |
Delete preset | Verwijder huidige preset |
Video | Video input instellingen |
X | Horizontale positie |
Y | Verticale positie |
Width | Breedte van de crop |
Height | Hoogte van de crop |
Positionering | Positie instellingen |
Width | Breedte van de preset |
Height | Hoogte van de preset |
X | Horizontale positie |
Y | Verticale positie |
Z | Diepte positie |
RX | Horizontale rotatie |
RY | Verticale rotatie |
RZ | Diepte rotatie |
Aruco-markers worden gebruikt om de applicatie te vertellen op welk oppervlak (muren, plafond, ...) deze moet projecteren. De markers die wij gebruikten waren minstens A3, om er zeker van te zijn dat de webcam deze accurraat kon detecteren. Hoe groter de markers, hoe beter de resultaten. Eens de applicatie wordt opgestart en de gebruiker de tracking activeert, worden de markers gezocht door de ArucoHandler.cpp
-class. Dit is het moment waarop het belangrijk is de projector en de webcam juist te aligneren.
Elke Aruco-marker kent een uniek ID die gebruikt kan worden om een bepaald deel van een video te projecteren, met een bepaalde transformatie (width, height, x- / y-offset).
De markers zijn belangrijk voor de Aruco-library. Wanneer de library de markers detecteert, kan deze afleiden welke marker het is en in welke oriëntatie die zich bevindt. Door deze oriëntatie dan toe te passen op de beelden komt een automatische mapping tot stand.
Het is hierbij belangrijk dat de markers voldoende groot zijn (in ons geval minstens A3), en op niet-reflecterend papier afgeprint worden (don't repeat our mistakes).
Markers kunnen gegenereerd worden met bijvoorbeeld deze online tool. We raden sterk aan de ID van de gegenereerde marker reeds toe te voegen aan de bin/data/presets.xml
file.
De videoinput kent drie videolagen voor de muren, en drie voor het plafond - allen geëncodeerd in HAP om transparantie te ondersteunen.
De eerste laag is de achtergrond, waar de andere lagen overheen worden gelegd:
- [water or space]/[wall or ceiling]_background.mov
- [water or space]/[wall or ceiling]_foreground.mov
- [water or space]/[wall or ceiling]_interaction.mov
Uiteraard kan men de code wijzigen zodat slechts 1 videofile wordt gebruikt, maar dit schakelt ook de interactieve component uit.
Eerst wordt een FBO opgebouwd in de update-functie. Daar worden de drie videolagen over elkaar heen gelegd en een FBO-shader gegenereerd. Vervolgens kan deze in de draw-functie getekend worden met de transformatie gedetecteerd door de Aruco class. Dit kan omdat de transformatie, herkend door de Aruco class, aangevuld wordt met informatie die wordt ingegeven door de OSC class.
Het ZNA Kinderziekenhuis Koningin Paolo had reeds een mascotte, Groene Louis, die we integreerden in de eigen visualisaties. Groene Louis kan in beeld springen vanuit één zijde van de projectie door gebruik te maken van de shortcut "4" of "L". Dit gebeurt manueel, zodat het medisch personeel Groene Louis konden oproepen wanneer ze dit zelf zinvol vonden.
De presets kunnen gebruikt worden op locaties waar de markers niet opgehangen kunnen worden of niet aanwezig zijn. We denken daarbij bijvoorbeeld aan het dokterskwartier. De presets geven een vooringestelde opstelling weer van de vlakken. Het eerste kan gebruikt worden op de kruising van twee muren en het plafond; het tweede vertegenwoordigt een vast projectievlak (recht tegenover de projector).
Om deze presets in te stellen, zie OSC.
We gebruikten een draadloze numpad om binnen een steriele omgeving de applicatie te kunnen gebruiken.
Function | Key |
---|---|
Track markers | 6 / T |
Display live | 0 |
Display Preset 1 | 1 |
Display Preset 2 | 2 |
Display Preset 3 | 3 |
Display overlay interaction | 4 / L |
Display in-video interaction | 5 / I |
Debug mode* | 7 / V |
Show webcam image | 8 / C |
Mute sound | 9 |
Load space scene | - / S |
Load water scene | + / W |
Play sound | . |
- Debug mode: Weergave van de indicatie rond gevonden Aruco-markers
Er zijn een paar problemen waar we weet van hebben, maar waar we onvoldoende tijd voor hadden om ze op te lossen:
- De locatie van de projecties op basis van de markers kent een probleem waarbij de Z-offset slecht ingesteld staat. Dit heeft invloed op de multiplier van de grootte van de projecties.
- Het netwerken via OSC had anders gekund, bijvoorbeeld via een lokaal netwerk of een kleine included router.