dimanche 30 août 2020

Test kinect

Voici quelques notes sur des essais d'une kinect que m'avait prétée Stéphane Adam.
 
Installation pour avoir les images kinect arrivant dans python

Voici une video de démo de touch (utilisation de la kinect comme une souris, cela pourrait être utile sur un bateau où les doigts mouillées ne marchent plus sur les écrans touchscreen). Le code est là.

J'ai fait le test, mais ça ne marche pas très bien.
Il faut être à la bonne distance. Les doigts sont vus en double et la captation est perturbée par la lumière du jour (ce qui m'a obligé à fermer mes volets).

Bon sinon, la fonction de tilt automatique sur la kinect est amusante.

Garmin 360

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...

Bebop 2

Je partage ici en vrac quelques liens sur le drone Bebop 2 qui peut servir soit à faire de belles vidéos de kiteboat, soit à découvrir les autopilotes de drones qui pourraient servir de base ou d'exemple pour un autopilot de kite.

Le Bebop 2 est conçu par Parrot et fonctionne très bien avec le logiciel propriétaire Parrot (qui a une API ouverte). Parrot a également ouvert son matériel pour permettre l'utilisation d'autres plateformes. Le drone a pour conséquent été hacké par de nombreuses personnes.

Des indications étaient notamment disponibles sur le side developer de Parrot, mais elles ont malheureusement disparues depuis.

Guide du hackage
http://fargesportfolio.com/wp-content/uploads/2018/01/BeebopHackingGuide1_7_2.pdf

Skycontroller 2
Il s'agit de la télécommande qui grâce à son antenne directive permet de piloter et recevoir la vidéo du drone jusqu'à 2km.
https://www.rcgroups.com/forums/showthread.php?2728773-Official-Parrot-Disco-%2A%2A%2AOwner-s-Thread%2A%2A%2A/page53
https://github.com/jberaud/joystick_remote/issues/2
https://github.com/uavpal/disco-docs/wiki/skycontroller-2 

https://discuss.ardupilot.org/t/controlling-parrot-drones-using-skycontroller2/52647

4G
https://github.com/uavpal/beboptwo4g

Video streaming
https://developer.parrot.com/blog/2016/play-bebop-stream-on-vlc/

Paparazzi

https://www.youtube.com/watch?v=pv0CAQC6iAE


Ardupilot
Compilation  http://ardupilot.org/dev/docs/building-for-bebop-2.html
https://www.youtube.com/watch?v=Ir0DyvlbTM0

https://www.youtube.com/watch?v=HJN_gT1eNDk

https://www.youtube.com/watch?v=jFNdy4UPq_4

https://www.youtube.com/watch?v=lf9X7BZ7XbU

https://www.youtube.com/watch?v=ay0b1HgASM0

ROS

https://www.youtube.com/watch?v=fGKR1G7orKA

https://bebop-autonomy.readthedocs.io/en/latest/

https://docs.google.com/document/d/1oVEO_3HxiXwagmXyrMhh8KIorxdNxHejzwBQ876_fpM/edit

http://debojj.net/downloads/bebop-ros-demo

https://github.com/Michionlion/bebop_teleop

OpenCV
https://www.youtube.com/watch?v=aT_kC5ZE2Oc

PX4

https://docs.px4.io/en/flight_controller/bebop.html
https://www.youtube.com/watch?v=hTVNHlqxWBk

https://www.youtube.com/watch?v=loC3IJpMdNs

https://review.px4.io/plot_app?log=d9bf3e69-ecc5-478c-8713-23581efa84ad

Mètre ruban

(Notes réchauffés d'octobre 2016)

Je fais face à un problème sur les premières versions.

Il y a parfois du mou dans les lignes ce qui conduit à un surpattage.

Ma première parade a été d'utiliser du fil élastique

J'ai d'abord essayé avec du sandow (plus pour faire un border-choquer automatique d'ailleurs).

Afin de choquer sous tension, il fallait mettre les sandows sur les lignes servant à border, donc sur les arrières qui servent aussi au contrôle.

Une conséquence est que le contrôle n'était plus précis (mais possible de rééquilibrer avec un jeu de poulie).

Une autre approche est de mesurer la tension dans les lignes, puis de déclencher un moteur si la tension devient trop faible.

Ou encore de faire tourner en permanence un petit moteur avec un couple faible.

Une autre application est de ramener un cerf-volant monofil à terre en cas de chute de vent avec un système "passif".

Je cherchais donc un moteur à ressort de type moteur à barillet, aussi appelé moteur à force constante. Un tel moteur est difficile à trouver (si ce n'est moteur mécano sur le bon coin). J'ai bien trouvé des pièces sur des sites spécialisés mais pour quelques centaines d'euros, alors que ce que je cherche est intégré dans les laisses rétractables, dans le enrouleur à rappel de fil pour les enclos agricoles, ou simplement dans les mètres rubans.
Le mieux étant peut-être l'enrouleur de fil à linge qui va facilement jusqu'à 30m pour environ 15€.

Aujourd'hui j'ai testé une autre solution avec un simple petit mètre ruban avec enrouleur à ressort.

Mètre ruban métallique de 5m
40g de traction quand la longueur est réduite
200 g de traction quand la longueur est augmentée

Mètre ruban souple de 1.5m
20g
120g

Puissance par m2

On me demande quelle taille de cerf-volant est nécessaire pour tirer un grand bateau.

La question comme ça est un peu vague, il faut donc faire des hypothèses.
Un bon début est peut-être de donner la formule donnant la puissance du vent par 1m2. Cela correspond au flux de l'énergie cinétique du vent à travers 1m2

Une première expression est donc celle de la puissance incidente du vent
1/2*rho*v*S*v^3
Pour un vent de 8m/s (15kt) cela donne une puissance de 275W/m2.
Il faut ensuite considérer la limite de Betz qui donne un "rendement théorique" maximal (16/27) qui est dû au fait que toute l'énergie ne peut pas être récupérée. Cela donnerait une puissance théorique max de 163W/m2. La question est ensuite quelle surface de référence prendre.

Dans le cas d'une éolienne c'est généralement la surface balayée par les pâles qui est considérées. Pour un cerf-volant, il faudrait considérer cette surface également, mais comment la caractériser?

Une deuxième approche est de partir du rapport portance sur traînée. C'est l'approche de Loyd en 1980.
A 15kt, 600m2 produiraient 1MW avec un rapport CL/CD de 5 dans l'idéal, soit un peu moins de 2kW par m2. Plus vraisemblablement on peut retenir 1kW (1.4CV) par m2 pour une aile de kite (bien plus pour une aile rigide).

Pour un petit bateau, 4 à 5m2 peuvent donc remplacer un petit moteur 6CV si le vent est là.

Des calculateurs en ligne permettent d'estimer la vitesse du bateau et peut-être d'extrapoler à de plus grands bateaux !



AWEC 2015 (réchauffé...)

Simulateur de kite

KiteSat

Le proto de Rod Read. Il se plie comme une tente deux secondes

Le cerf-volant, l'aile, le planeur, l'avion wing Tec?

L'aile de TU Delft




dimanche 17 mars 2019

RTK moving base suite

J'ai enfin fait quelques tests de performance du GPS RTK.

Sur mes premiers tests, les résultats étaient très décevants, avec une précision de l'ordre du mètre seulement.
Le Rover restait bloqué en RTK Float (qualité n°5 de la trame GGA), jamais en RTK fix.

En creusant un peu sur le net, j'ai vu que la réception du signal devait être de bonne qualité. Et que mes petites antennes seules ne suffisaient pas atteindre la qualité nécessaire, même avec le ciel dégagé.

Pour améliorer la qualité, il faut augmenter le gain de l'antenne. Pour cela il faut utiliser une "ground plate", un support métallique qui permet de concentrer les ondes un peu comme une parabole.
J'ai pu vérifier avec U-Center que les gains augmentaient de manière importante en plaçant un couvercle de boite de gateau sous les antennes GPS (+5dB au moins).

Grâce à cette modification, j'observe une bien meilleure position (variation de l'ordre de +/-10cm, même sans passer en qualité fix (4). Cela n'arrive d'ailleurs quasiment jamais, peut-être 1 seconde de temps en temps. Et je ne semble pas le seul à avoir ce problème.

La précision est satisfaisante sans cela, mais elle peut se dégrader sans que cela soit visible (le HDOP reste autour de 0.7m). A creuser donc.

Autre soucis : la fréquence de retour de la position GPS (renvoyée en RF depuis le Rover vers le PC connecté à la base) est de l'ordre de 2Hz seulement (la fréquence remonte bien à 4Hz comme souhaité quand je coupe l'envoie des messages RTCM ou quand je passe les messages RCTM directement en USB via le PC. La limitation est donc dans le débit en 433MHz et le baurate de 57600).


import serial
import time # Optional (if using time.sleep() below)
import pynmea2
import time

serBase = serial.Serial(port='/dev/ttyACM1', timeout=1)
serRover = serial.Serial(port='/dev/ttyUSB0', timeout=1, baudrate=57600)

buf = ''
while (True):
    if (serBase.inWaiting()>0): #if incoming bytes are waiting to be read from the serial input buffer
        data = serBase.read(serBase.inWaiting())
        x = data.split('$GNGGA')
    serRover.write(x[0]) # RTCM data is sent before nmea
        if len(x)>1:
          try:
            msgBase = pynmea2.parse('$GNGGA'+x[1])
          except:
            pass
    if (serRover.inWaiting()>0): #if incoming bytes are waiting to be read from the serial input buffer
        data = serRover.read(serRover.inWaiting())
    data = buf + data
        if data.find('\r\n')<0:
          buf=data
        else:
          buf=''
          try:
            msgRover = pynmea2.parse(data)
            print ('dNorth: ', float(msgRover.gps_qual),msgRover.horizontal_dil, (float(msgRover.lat)-float(msgBase.lat))*1852)
          except:
            print("An exception occurred", data)
    time.sleep(0.01) # Optional: sleep 10 ms (0.01 sec) once per loop to let other threads on your PC run during this time.