# Tracking - Caméras et capteurs de positions

### Captation actuelle - Capteur Ultrasons Arduino

Actuellement, **pour le prototypage**, un capteur à ultrasons avec un Arduino est utilisé pour récupérer la distance à laquelle un spectateur est dans l'oeuvre par rapport au capteur. Celui-ci fonctionne pour une personne jusqu'à environ 2.5m.

Les données de distance captés par l'Arduino sont envoyés par cable USB à l'ordinateur et captés par le script python via *Serial.*&#x20;

### Captation future - Augmenta de Theoriz

Pour l'oeuvre finale, nos recherches nous mènent vers le système Augmenta de Theoriz (<http://augmenta-tech.com>) qui permettrait le tracking de plusieurs individus dans l'oeuvre sans limite de distance (suivant le nombre de capteurs).

Via un système de nodes (ordinateur Augmenta) + capteurs 3D (Kinect Azure ou Orbbec Astra), la solution de Theoriz permet de tracker avec précision chaque spectateur dans l'oeuvre et ouput via OSC les paramètres de chaque individu (position xyx, hauteur, orientation, ...) au script python qui les interprètera mapper ces données sur les LEDs (cf. section [Interpretation](#interpretation)).

Ce système paraît très robuste et nous avons déjà pris contact avec la société pour venir tester le logiciel. Il est encore à définir s'il est nécessaire d'avoir un équipement de telle qualité permettant de tracker chaque spectateur individuellement tout le long de l'oeuvre ou non. Pour l'instant, il est possible d'utiliser leur logiciel de simulation open source (<https://github.com/Theoriz/Augmenta-Simulator>) afin de prototyper cette interaction avec l'oeuvre.

![Capture d'écran d'Augmenta Simulator](https://3783230662-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Me9qTar0I3OzpEnDOVb%2F-MedNoQYctfGEX2Zm4zQ%2F-MeeJPYYYeLKDt2jvyYX%2FAugmenta%20Simulator.png?alt=media\&token=74d8e302-0d49-4db4-8024-6ea6c712f351)

### Interprétation&#x20;

Ce tracking nous permet de déclencher différents scénarios de lumière dans l'oeuvre suivant la position des spectateurs dans celle-ci. Un des scénarios est que les tiges colorées s'allument et s'éteignent au fur et à mesure de la déambulation du spectateur dans l'oeuvre, avec chaque tige représentant les qualités de l’air respective de chaque jour du mois précédent.

Grâce à l'Arduino, nous pouvons capter la distance d'une personne jusqu'à environ 2.5m du capteur. Lorsque l'Arduino est détecté (cf. page [Script Python - Configuration et Execution](https://zephirlorne.gitbook.io/the-shapes-of-things-to-come-doc-technique/english/script-python/configuration-et-execution) pour entrer la bonne adresse) et que la **Storyline** correspondante est lancée, un nouveau thread est lancé pour capter les données de distances via *Serial.*  Le scénario dynamique est ainsi lancé: le script vérifie continuellement si la distance du spectateur reçu correspond à un intervalle dans lequel se trouve un ruban LED. Si c'est le cas, qu'il est éteint, et qu'il n'a pas été mis à jour depuis un temps donné, celui-ci s'allume. L'inverse est appliqué si la distance ne se trouve pas ce même intervalle.

Extrait du script:

```python
# Turns on/off light fixtures depending on arduino motion_data if there is a spectator within its range
# Supports 1 spectator less than 2.5m from the arduino distance sensor
def send_dynamic_arduino_scenario(refresh_frequency):
    print("#### Starting MadMapperOSC.send_dynamic_arduino_scenario() ####")
            
    # While the arduino is processing motion, lights up fixture where spectator is located 
    # by calling send_arduino_processed_motion at specified frequency
    # and sending it the processed_motion_data it gets from the Arduino.get_update_motion active thread
    while Arduino.process_motion_threading.thread_status:
        
        y_data = int(Arduino.get_update_motion.processed_motion_data) # Get depth data
        detect_range = 30    # +/- range within fixture position in which it will be selected : to allow smooth detection
        cooldown = 0.5  # delay before a fixture can be changed, to avoid flickering / to smooth result
    
        if y_data < 300: # Filter out positions outside of accepted range
            
            # Check for each fixture if there is a spectator within its range and turns it on/off accordingly
            for day in range(MadMapperOSC.days_output_number):
                
                if (Arduino.fixture_lastTimeUpdated[day] + cooldown < time.time()):
                    
                    if (Arduino.fixture_positions[day] - detect_range < y_data) and (y_data < Arduino.fixture_positions[day] + detect_range):
                        # If fixture is off but spectator is within range => turn on
                        if Arduino.fixture_luminosities[day] == 0:
                            print("person in range of turned off fixture " + str(day))
                            Arduino.fixture_luminosities[day] = 1
                            Arduino.fixture_lastTimeUpdated[day] = time.time()
                            element_address = "/fixtures/Group-Fixtures/Fixture-" + str(day+1)
                            MadMapperOSC.send_light(element_address,1,1)
                            
                    else:
                        # If fixture is on but spectator is not within range => turn off
                        if Arduino.fixture_luminosities[day] == 1:
                            print("person in range of turned on fixture " + str(day))
                            Arduino.fixture_luminosities[day] = 0
                            Arduino.fixture_lastTimeUpdated[day] = time.time()
                            element_address = "/fixtures/Group-Fixtures/Fixture-" + str(day+1)
                            MadMapperOSC.send_light(element_address,1,1)
        
        time.sleep(refresh_frequency)
    
    print("#### MadMapperOSC.send_dynamic_arduino_scenario() finished executing ####")
```

Grâce au potentiel du futur système [Augmenta](#captation-future-augmenta-de-theoriz), il sera possible de faire ce tracking pour davantage de personnes et d'autres scénarios seront aussi envisageables grâce aux données supplémentaires
