Skip to content

Latest commit

 

History

History
84 lines (51 loc) · 14.9 KB

File metadata and controls

84 lines (51 loc) · 14.9 KB

Dynamique du Tello reconstruit

Le module DonifySimulation représente un petit quadrirotor à six degrés de liberté, aux dimensions et à la masse du Tello montré dans la référence. Son interface et ses constantes sont dans DroneDynamics.h, ses équations dans DroneDynamics.cpp. Il dépend des types mathématiques de Core, sans dépendance aux acteurs ou à la scène. La forme est reconstruite ; il ne s'agit pas d'un modèle 3D du fabricant. Les spécifications publiques ci-dessous fixent son échelle. Les inerties, la propulsion, la traînée et les contrôleurs sont estimés, sans identification sur un appareil réel et sans exécution du firmware Tello.

L'image de référence fournie par l'utilisateur est conservée sans modification dans SourceAssets/References/Tello-user-reference.png. La géométrie de DroneVisual.cpp reconstruit sa coque blanche, son cadre noir, ses protections, moteurs, hélices et caméra ; l'affiche n'est pas utilisée comme texture sur le drone.

Références et échelle

La fiche constructeur Ryze Tello indique 80 g avec batterie et hélices, des dimensions de 98 × 92,5 × 41 mm, des hélices de 3 pouces, une vitesse maximale de 8 m/s et une batterie de 1,1 Ah sous 3,8 V. Le manuel Tello v1.4, p. 21 donne 87 g avec protections d'hélices et 4,18 Wh : ce sont la masse et l'énergie retenues pour la version avec protections affichée dans le simulateur. Le mode rapide est limité à 25° d'inclinaison dans le manuel, p. 5 ; le contrôleur stabilisé reprend cette limite.

Les dimensions annoncées de 98 × 92,5 × 41 mm ne servent pas d'envergure aux pales en rotation. Le placement des axes de moteurs est reconstruit à partir du cadre et de la référence, et non coté par le fabricant. Avec ces axes et des pales de 76,2 mm, l'enveloppe des disques est de 165,2 × 159,7 mm, avant protections. La coque centrale est plus petite que le cadre. Le Pawn utilise une enveloppe de collision comprenant les protections.

Paramètre du modèle Valeur Nature
Masse totale avec protections 0,087 kg Constructeur
Diamètre des hélices 0,0762 m / 3 pouces Constructeur
Batterie 1,1 Ah, 3,8 V, 4,18 Wh Constructeur
Consigne horizontale maximale stabilisée 8 m/s Limite constructeur reprise
Consigne verticale maximale du contrôleur 3 m/s Choix du simulateur ; commande Y/A limitée à 2 m/s
Inclinaison maximale stabilisée 25° Limite constructeur reprise
Centres des moteurs X/Y ± 0,0445 / ± 0,04175 m Reconstruction estimée
Inerties principales X/Y/Z 0,000060 / 0,000080 / 0,000120 kg·m² Estimation de répartition de masse
Coefficient de poussée 7,2 × 10⁻⁸ N/(rad/s)² Estimation
Couple de réaction / poussée 0,004 m Estimation
Régime maximal à 3,8 V sous charge 22 000 tr/min Estimation
Traînée équivalente CdA X/Y/Z 0,0065 / 0,0065 / 0,012 m² Estimation
Constantes de réponse montée / descente 35 / 50 ms Estimation
Pesanteur / densité de référence 9,80665 m/s² / 1,225 kg/m³ Références physiques

Les calculs utilisent mètres, secondes, kilogrammes, newtons et radians. Le Pawn convertit les distances en centimètres Unreal. Le repère local est X vers l'avant, Y vers la droite, Z vers le haut. Le quaternion transforme le repère du drone vers celui du monde. Les moteurs sont indexés avant droit, arrière droit, arrière gauche et avant gauche.

Forces, couples et intégration

La poussée suit Tᵢ = kT × ωᵢ² × ρ/ρ₀. Chaque vitesse moteur rejoint sa consigne par une réponse exponentielle du premier ordre ; il n'y a pas de passage instantané à la poussée de stationnaire. Chaque moteur apporte le moment rᵢ × (0,0,Tᵢ) et un couple de réaction ±0,004 × Tᵢ, alterné pour s'annuler à régime égal. Cette structure correspond à celle des modèles de rotors de Gazebo, avec nos propres coefficients estimés.

La translation suit m a = R (0,0,ΣTᵢ) + Ftraînée + (0,0,-mg) et la rotation suit I dω/dt = τ − ω × Iω. Le quaternion est intégré par la vitesse angulaire du milieu du pas, selon les équations classiques d'un corps rigide, voir les notes de dynamique de quadrirotor du MIT. Le mélange des moteurs utilise séparément les bras de levier X et Y : le cadre n'est pas carré.

Dans les axes du drone, Ftraînée = -0,5 ρ |vrel| (CdA ⊙ vrel), avec vrel = v − vent. Cela reprend la dépendance quadratique de l'équation de traînée NASA. Un centre aérodynamique estimé 2 mm au-dessus du centre de masse produit des perturbations d'attitude. L'amortissement angulaire utilise un coefficient (0,000012 + 0,000003 |ω|) × ρ/ρ₀.

Un sous-pas dure au maximum 1/240 s. Step plafonne une interruption à 0,25 s afin de ne pas intégrer une longue pause d'un seul coup. La position utilise v dt + 0,5 a dt², ce qui reproduit la chute libre analytique sous accélération constante. Les collisions, les impulsions et le support du sol sont gérés dans le Pawn, pas par une altitude plancher cachée dans la dynamique.

Commandes stabilisées et assistances

Le démarrage se fait en MANUEL STABILISÉ, avec MotorPower = 0. Ce champ représente désormais le réglage persistant de propulsion et de vitesse de croisière, borné entre 0 et 1. Il ne représente ni les RPM, ni la poussée réelle, ni une commande directe de collectif. RT / Page haut l'augmente, LT / Page bas le réduit, à raison de 0,5 unité par seconde à pleine gâchette ; les gâchettes relâchées conservent le réglage atteint.

La commande manuelle utilise le contrôleur de vitesse et d'altitude. Les états de consigne exposés sont ManualTargetVelocity, en mètres par seconde dans le repère du monde, et ManualTargetAltitude, en mètres dans ce même repère. Le stick gauche choisit la direction de déplacement ; sa position neutre conserve la consigne horizontale. Cette direction est mémorisée dans le monde : un changement de lacet ne la fait pas tourner avec le drone. Un nouveau mouvement du stick change la direction demandée. Hors zone morte, son amplitude ne règle pas la vitesse : le recentrage progressif d’un stick à ressort ne doit donc pas ralentir la croisière. RT/LT fait évoluer le réglage de propulsion et la vitesse de croisière. Après une sélection de direction, la norme cible est 8 × MotorPower m/s. Lors d’une reprise depuis une assistance, l’initialisation peut conserver une fraction de cette limite pour reprendre le mouvement courant sans saut de consigne.

Y / Espace et A / Ctrl commandent une vitesse verticale de +2 ou −2 m/s à pleine entrée. À leur relâchement, le contrôleur conserve une altitude cible et ramène la vitesse verticale vers zéro. LS / K / frein demande l'arrêt du déplacement horizontal puis un vol stationnaire. Ainsi, le retour des sticks ou boutons au neutre ne signifie plus retour à une poussée fixe ni ralentissement horizontal volontaire.

Les consignes passent par le calcul de vitesse, d'accélération, d'attitude, de couples et de poussées individuelles. Les moteurs compensent l'inclinaison, la traînée, le vent et la charge dans la mesure de leurs capacités. Un réglage de propulsion inchangé n'implique pas des RPM inchangés : conserver une altitude pendant un déplacement incliné exige davantage de poussée totale. Aucune modification directe de position ou de vitesse ne remplace cette réponse physique.

À zéro exact, les quatre poussées demandées sont nulles et le maintien stabilisé est désactivé. Les touches de montée et les corrections d'attitude ne contournent pas cette coupure. Les hélices ralentissent avec leur constante de temps et gardent brièvement une poussée résiduelle, puis la gravité et la traînée gouvernent la chute. Une nouvelle action sur RT réactive les moteurs depuis la position, la vitesse, l'attitude, les RPM et la batterie présents ; elle ne téléporte pas le drone, ne recharge pas la batterie et ne répare pas les dégâts d'un impact. Une reprise pendant une chute doit physiquement freiner la vitesse déjà acquise.

Le HUD sépare PROPULSION, les cibles, les RPM et la poussée réellement produits. CIBLE Z utilise l'altitude fixe du monde ; HAUTEUR AU-DESSUS DU SOL utilise la surface détectée sous le drone. Cette distinction évite de confondre le maintien d'altitude avec un suivi automatique du relief.

Trois assistances complètent le manuel stabilisé :

  • X / décollage recherche un support sous le drone par balayage de l'enveloppe de collision et vise environ 1,5 m au-dessus. La fin du décollage rend la main au manuel stabilisé avec maintien à faible hauteur.
  • B / atterrissage mesure une surface suffisamment horizontale sous la position actuelle, maintient la position horizontale et descend à une vitesse commandée d'au plus 0,7 m/s. Seul un contact réel admissible termine l'atterrissage et coupe les moteurs. Le calcul utilise la surface détectée, y compris une surface surélevée, et non l'altitude du pad de départ.
  • Mission suit les points de la rue et de la périphérie, avec des transits à 18 m dans le repère du monde, puis descend sur le pad d'arrivée. Le contact valide l'arrivée. La surveillance d'obstacle peut interrompre la mission ; aucun détour n'est calculé.

La reprise manuelle ne réinitialise pas l'état physique. Seul Redémarrer / ResetFlight replace le drone au départ, recharge le pack, répare les dégâts et efface la trace. Celle-ci enregistre les positions réelles environ toutes les 0,2 s pendant le déplacement et conserve au plus 1 200 points.

Pendant le menu LB / Tab, les commandes de vol sont temporairement réservées à la sélection et les consignes précédentes sont conservées. Le temps physique continue. Avec une propulsion non nulle, le contrôleur stabilisé ou l'assistance poursuit son travail ; à zéro, ouvrir le menu ne suspend pas la chute. À la fermeture, le retour au neutre des commandes évite de transmettre au vol la déviation utilisée pour sélectionner un mode.

Le profil stabilisé limite séparément la consigne horizontale à 8 m/s et la consigne verticale à ±3 m/s, avec une inclinaison maximale de 25°. Cette séparation évite qu'une montée réduise artificiellement la vitesse horizontale demandée. L'intégrateur borné compense un vent constant. Les saturations de poussée, le délai des moteurs et l'état de batterie peuvent créer un écart entre les cibles et le mouvement réel. Le contrôleur utilise l'état exact du monde ; ni la dégradation du positionnement visuel réel, les filtres de capteurs, la liaison radio ni les protections du firmware Tello ne sont simulés. L'interface de propulsion persistante et de croisière conservée est propre au simulateur.

Les modèles Angle / Acro restent présents dans la dynamique et ses essais. Leur collectif direct n'est pas le comportement du MANUEL STABILISÉ. Dans ces modèles de laboratoire, le mélange peut réduire les couples pour respecter la poussée totale disponible. La boucle d'attitude demande une vitesse angulaire ; une boucle PI commande ensuite les couples et les répartit entre les quatre moteurs. L'architecture en cascade documentée par PX4 décrit ce principe général. Les gains sont adaptés aux inerties estimées ; aucun firmware PX4 n'est exécuté.

Batterie et météo

Le pack est une cellule, avec 4,18 Wh disponibles au départ. La courbe à vide estimée utilise V = 3,35 + 0,55 s + 0,45 s⁸ pour une fraction d'énergie s entre 0 et 1. Elle atteint 4,35 V à pleine charge ; ces valeurs de courbe ne sont pas une mesure du pack Tello. Une résistance interne estimée à 0,035 Ω crée la chute de tension sous charge. La tension chargée est bornée à 3,0 V, et le régime maximal varie proportionnellement à cette tension par rapport à 3,8 V.

La puissance est estimée à partir de la puissance induite des quatre disques avec un rendement global de 40 %, de pertes de profil de 1,7 W par moteur à 16 400 tr/min évoluant au cube du régime, et de 2,5 W d'électronique. L'énergie est intégrée par P dt / (4,18 × 3600) ; à zéro, les moteurs se désarment. Le stationnaire de ce modèle consomme environ 18,7 W, soit un ordre de grandeur de 13 minutes si ces conditions persistent. Ce calcul n'est pas une garantie d'autonomie mesurée.

Le vent change la vitesse relative de l'air, donc les forces et les moments. La densité change aussi la poussée et la puissance induite. La météo est un environnement expérimental : elle ne démontre aucune aptitude du Tello réel à voler sous la pluie ou le vent. Ni l'eau dans l'électronique, le givrage, les collisions de gouttes, l'effet de sol, les sillages, le vortex ring state, les pales déformables, ni une nacelle mécanique de caméra ne sont résolus.

Vérifications déterministes

FDroneDynamics::RunDeterministicChecks, implémenté dans DroneDynamicsChecks.cpp, exécute les équations de production avec les types mathématiques Unreal. Les 13 contrôles physiques couvrent la chute libre analytique en vide, le stationnaire, la poussée inclinée, le sens des axes, le vent, la coupure moteur, la batterie, le lacet, Acro, la densité, la montée en régime et la convergence vers 8 m/s.

Les contrôles d’intégration de FlightChecks.cpp complètent ces essais dans la scène : décollage et atterrissage au pad, puis sur une plateforme surélevée ; absence de déplacement instantané au lancement d'une assistance ; maintien d’altitude après relâchement de Y/A ; croisière conservée au neutre et pendant un changement de lacet ; freinage stationnaire ; réglage de propulsion par RT/LT indépendant des commandes verticales ; coupure exacte à zéro et reprise pendant la chute en conservant le mouvement. Les essais de collectif direct restent propres aux modèles de laboratoire. Les contrôles de menu et d'entrées sont séparés, de même que ceux de mission, collision, météo et audio.

Ces vérifications sont destinées à contrôler la cohérence interne des équations et des commandes. Les journaux indiquent les résultats des exécutions ; les changements du maintien stabilisé doivent être exécutés à nouveau après modification. Ces essais ne constituent pas une calibration sur un Tello réel ni un test de toutes les manettes physiques.