---
# System prepended metadata

title: APPUNTI DRONE CHALLENGE

---

# APPUNTI DRONE CHALLENGE

### Idee generali
**Target**: gara a Philadelphia
**Deadline**: 15 maggio 2022
**Obiettivo**: bisogna implementare una IA che permetta di pilotare un drone.

In fase di qualifica, il test verrà fatto su un simulatore (Flightmare). 
La gara si svolgerà live a Philadelphia e in tale occasione il sw verrà fatto girare su un drone vero.


### Strumenti
+ **ROS**: è un meta-os che viene utilizzato per la programmazione di robot. Fornisce librerie in Python e tools, fornisce vari livelli di astrazione per lo sviluppo di software in robotica.
+ **FLIGHTMARE**: simulatore di volo per qudrirotori (droni volanti a 4 motori), basato su Unity con fisica realistica, fornisce le API per il training parallelo di droni
+ **COMPASS**: libreria per il training non supervisionato di IA


### Installazione
**!!!** Dopo l'installazione tramite il setup.bash del repository RICORDATI di aggiungere alle variabili d'ambiente della bash tramite `~/.bashrc `il path di flightmere, una cosa simile a: `FLIGHTMARE_PATH=/home/cam/Desktop/sim-ros/icra22_competition_ws/src/agile_flight/flightmare`

### Avvio
**!!!** Ricordarsi **sempre** di **disabilitare anaconda** (lanciando `conda deactivate`) e di lanciare `source devel/setup.bash` da `icra22_competition_ws` (Davvero, **SEMPRE**, anche quando apri una nuova bash per lanciare evaluation node)
dopodichè, da `./icra22_competition_ws/src/agile_flight` lanciamo:
`roslaunch envsim visionenv_sim.launch render:=True`
(per far partire tutte le schermate abbiamo dovuto installare `scipy`)
Inoltre abbiamo dovuto aggiornare, dentro a `.bashrc` il valore di `FLIGHTMARE_PATH` (era rimasto quello vecchio, di quando facevamo le prove su un'altra cartella)


poi, in un'altra bash, da `./icra22_competition_ws` lanciamo:
`source devel/setup.bash` (fa cambiare `$PYTHONPATH`)
`python evaluation_node.py`

In un'altra bash ancora abbiamo fatto partire la competizione da `./icra22_competition_ws/src/agile_flight/envtest/ros `lanciando: `python3 run_competition.py`

Per farlo andare, tuttavia, ci servivano torch, ruamel.yaml, stable_baselines3 e numpy versione 1.18 o successive
```
pip3 install torch
pip3 install ruamel.yaml
pip3 install numpy --upgrade
pip3 install stable_baselines3
```

Per far partire la soluzione abbiamo aperto un'ulteriore bash dove ci siamo posizionati su `/icra22_competition_ws` e abbiamo lanciato:
`rostopic pub /kingfisher/start_navigation std_msgs/Empty "{}" -1`

In questo modo il drone va dritto, senza schivare gli ostacoli (implementazione di base fornita dagli organizzatori)

Per implementare la nostra soluzione dobbiamo modificare, all'interno del file `agile_flight/envtest/ros/user_code.py` le due funzioni:
+ `compute_command_vision_based(state, img)` che si basa sulla grafica (più difficile)
+ `compute_command_state_based(state, obstacles, rl_policy=None)` che si basa sullo stato (consigliato)


### IDEE A LEZIONE

*  **generalizzazione** dell'ambiente
*  **randomizzazione** punto di partenza
*  randomizzazione colore
*  provare in scenari diversi (garage, città ecc)
*  utilizzo di **compass** (da lavorare sulla rete finale MLP che prende in input ciò che viene fuori da compass)
*  **scelta dei neuroni** utlimo livello (3 livelli di astrazione. Si pensava di partire dal più astratto fino ad arrivare poi a quello più a basso livello che dà più controllo e permettere performance migliori)
*  Scelta del tipo di rete neurale che vogliamo usare (**RNN** o altro - partire da fully contected, pochi layer)
*  Consigli sull'algoritmo di training: **DQN** (uno dei primi alg. di RL, problema: dà in output solo azioni discreti, quindi limita.) PPO(valore continuo, a differenza di DQN)
*  rimozione di baseline e tentativo di far procedere lo step direttamente da visualenv chiamato trainenv
*  studio della[ documentazione](https://flightmare.readthedocs.io/en/latest/) di **flightmare** (fatto dagli organizzatori)
*  doc flightmare: funzione "step" sincrona. Consiglio: togliere il binding che fanno loro e provare a fare noi con step
*  a ogni step abbiamo uil vettore observation che dobbiamo dare a in poasto a compass che ci dà in output le feature
*  Scegliere bene alogoritmo di RL
*  Possiamo ignorare il reward che ci danno solo e farlo da noi in PPO.
* 
*  Simulatore flight goggles basato su Unity.
*  Cercare di randomizzare il più possibile, idealmente in ambienti disversi. (Ambientare episodi in scene garage, magazzino ecc)

* Modello(tipologia + funzione di attivazione + iperparametri) + algoritmo di training (SGD) + Funzione di loss(errore di predizione che ho calcolato ad es PPO)(La funzione di loss rappresenta il ponte di aggancio ad esempio da renforcement learning a deep learning, come il Q learning)

### Schema funzionamento wrapper pyybind11


![](https://i.imgur.com/B1eh5y3.png)






### Compass download instruction

download azcopy from 
https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10
```
#activate file on wanted dir
./azcopy copy https://compassrelease.blob.core.windows.net/data/drone_datasets/ ./data/ --recursive
```
```

conda env create -f conda_env.yml //in the compass directory cloned from git
	//if it does get stucked in solving enviroment, 
	//conda config --set channel_priority strict
	// if it gets stucked again then
	//conda env -n compass //create apposite conda enviroment for compass
	//		conda activate base
			conda update conda
			conda activate compass
			conda install -c pythorch torchvision 
			conda install -c conda-forge tensorflow
			conda install -c conda-forge termcolor
			conda update -n base conda
			conda update --all
			conda update pytorch torchvision


	
export COMPASS_CKPT=<path to downloaded pretrained model>
	//where path is path to file .pth.tar
	//example:export COMPASS_CKPT=/home/mypc/compass/COMPASS/drone-navigation/data/drone_datasets/epoch1.pth.tar
			

python3 main_velocity.py --gpu 0 --output_dir ./output --arch compass                 --data_type video --clip_len 3                 --train_ann_file_name custom_datagen_t80v20_train_ann.json                 --val_ann_file_name custom_datagen_t80v20_val_ann.json                 --lr 1e-4 --scheduler MultiStepLR --disable_random_resize_crop                 --dataset_dir ./data/drone_datasets --linear_prob --seed 1                 --pretrained_encoder_path $COMPASS_CKPT

```


#### runnare compass senza nvidia
    ##inserire parametro map_location per runnare compass 
    torch.load(pretrained_path,map_location=torch.device('cpu'))['state_dict']
