Voici quelques points d'entrée qui j'espère pourront aider quelques souhaitant hacker la caméra virb 360. C'est la caméra 360 que j'utilise pour mes vidéos de kiteboat, ou par cerf-volant.
Une fois connecté sur le même réseau que la caméra
sudo apt-get install avahi-discover
avahi-discover
Found service '7390' of type '_garmin-virb._tcp' in domain 'local' on 2.0.
ping 7390.local
64 bytes from Garmin-WiFi (192.168.1.58): icmp_seq=2 ttl=64 time=6.34 ms
J'ai maintenant le nom de ma caméra Garmin-WiFi
A partir du document Camera_network_services_API.pdf
curl --data "{\"command\":\"status\"}" http://Garmin-Wifi/virb
{"apiMin":3,"apiMax":3,"batteryLevel":34.000000,"batteryChargingState":0,"totalSpace":7763124,"availableSpace":6008732,"gpsLatitude":47.214432,"gpsLongitude":-1.540702,"antSensor":0,"btSensor":0,"btHeadset":0,"wifiSensor":0,"recordingTimeRemaining":527,"photosRemaining":1543,"photoCount":0,"recordingTime":0,"wifiSignalStrength":40,"wifiMode":"STA","state":"idle","lastMediaEventTime":3359,"result":1}
curl --data "{\"command\":\"sensors\"}" http://Garmin-Wifi/virb
{"sensors":[
{"name":"InternalGyroX","type":"LOCAL","has_data":"1","units":"Degrees/Second","data_type":"double","data":"4.329268"},
{"name":"InternalGyroY","type":"LOCAL","has_data":"1","units":"Degrees/Second","data_type":"double","data":"0.000000"},
{"name":"InternalGyroZ","type":"LOCAL","has_data":"1","units":"Degrees/Second","data_type":"double","data":"-13.780488"},
{"name":"InternalAccelX","type":"LOCAL","has_data":"1","units":"InstG's","data_type":"double","data":"0.018066"},
{"name":"InternalAccelY","type":"LOCAL","has_data":"1","units":"InstG's","data_type":"double","data":"-0.098633"},
{"name":"InternalAccelZ","type":"LOCAL","has_data":"1","units":"InstG's","data_type":"double","data":"-1.012207"},
{"name":"InternalAccelG","type":"LOCAL","has_data":"1","units":"InstG's","data_type":"double","data":"1.017162"},
{"name":"Altitude","type":"LOCAL","has_data":"1","units":"Meters","data_type":"double","data":"215.007126"}],"result":1}
https://github.com/JanKlopper/garmin-virb/blob/master/virb.py
curl --data "{\"command\":\"livePreview\",\"streamType\":\"rtp\",\"maxResolutionVertical\":\"100\",\"liveStreamActive\":\"1\"}" http://Garmin-Wifi/virb
{"result":1,"url":"rtsp://192.168.1.58/livePreviewStream?maxResolutionVertical=2160&liveStreamActive=1"}
L'url peut-ensuite être mise dans un navigateur qui proposera d'ouvrir le flux avec vlc. La résultion minimale est 360, maximale 2160
J'ai aussi trouvé une appli html permettant de contrôler depuis un pc sans windows, mais je n'ai pas réussi à la faire marcher
https://github.com/skaterlui/VIRBControlUI5
Les données du magnétomètre sont manquantes dans les données json.
Pourtant les données sont bien présentes dans les fichiers .fit. J'ai pu les lire soit à partir de la bibliothèque python fitparse, soit en convertissant les fichiers .fit grâce au SDK ant
sudo java -jar FitCSVTool.jar 2018-03-17-19-38-56.fit
Les données obtenues sont toutefois un peu brutes car elles correspondent aux valeurs des registres (par exemple 32935 est probablement proche de la moitié de 2^16). Les données sont enregistrées toutes les 4ms pour gyro, accéléro et magnéto et toutes les 40ms pour le baromètre dont la résolution en sortie semble limitée à 20cm
Le bruit sur l'accéléro est de l'ordre de 0.01g, celui sur le gyro de l'ordre de 0.3°/s pour une résolution de 0.05°/s. Le signal du capteur d'altitude est régulièrement plat. Cela peut-être lié à un bruit inférieur à la résolution, qui semble cependant variable...