- En cherchant une application pour participer au « défi 100 pompes par jour » du centre britannique contre le cancer, l’auteur a décidé de créer lui-même quelque chose d’amusant pour compter les pompes
- Exploration du framework Core Motion d’iOS
- En cherchant comment exploiter les données des capteurs, il a choisi d’utiliser les données de mouvement des AirPods via
CMHeadphoneMotionManager
- Core Motion fournit des données issues de l’accéléromètre, du gyroscope, du magnétomètre, etc.
- C’est utile pour mesurer avec précision et fiabilité les mouvements et l’orientation
- L’accès aux données nécessite des autorisations afin de protéger la vie privée des utilisateurs
- Réflexion sur la manière d’appliquer l’IA
- Il existe déjà de nombreuses applications utilisant des frameworks comme ARKit
- L’auteur a donc estimé que l’IA pouvait plutôt l’aider à concrétiser l’idée
- Il a utilisé un GPT entraîné sur Core Motion pour poser des questions en langage naturel et obtenir des solutions
- Conception de l’architecture de l’application
- Motion Manager : streame les données des capteurs et gère les mises à jour des capteurs de l’appareil
- Pushups Detector : analyse les données streamées pour détecter et compter les pompes selon des seuils prédéfinis
- SwiftUI View : fournit une UI réactive qui se met à jour en temps réel pendant les pompes
- Implémentation de Motion Manager
- Utilisation du pattern délégué pour accéder aux valeurs mises à jour
- Utilisation de
CMHeadphoneMotionManager pour récupérer les données de mouvement de l’appareil
startUpdates() et stopUpdates() permettent de démarrer et d’arrêter les mises à jour des capteurs
- Mise à jour des valeurs
pitch et accelerationY, puis notification au délégué
- Implémentation de Pushups Detector
- Introduction du concept de « session » pour démarrer et arrêter l’analyse du flux de données
- Interprétation des données brutes pour déterminer la posture de l’utilisateur et détecter les pompes
- Utilisation de seuils pour détecter la descente et la remontée d’une pompe, puis incrémenter le compteur
- Implémentation de
MotionManagerDelegate pour gérer les variations des valeurs d’accélération et de pitch
- Implémentation d’une vue simple avec SwiftUI
- Composée d’un bouton de démarrage/arrêt de session et d’un grand chiffre affichant le nombre de pompes
- Ajout d’un texte indiquant si la posture de l’utilisateur est correcte
- Analyse et visualisation des données
- Utilisation de Swift Charts pour visualiser les données brutes des capteurs et identifier des patterns
- Découverte d’un pattern de descente (-1.0) et de remontée (+0.5) des pompes sur l’accélération de l’axe Y
- Ajustement des seuils via des tests réels pour améliorer la précision (+0.4, -0.7)
- L’attrait du suivi en temps réel
- En portant les AirPods et en appuyant sur le bouton de démarrage, le nombre de pompes se met à jour automatiquement
- Le système fonctionne sans interaction supplémentaire de l’utilisateur
- Ce que le projet a permis d’apprendre
- Confirmation de l’importance de la validation précoce et de l’amélioration itérative
- Satisfaction et plaisir à créer quelque chose de significatif
- Il reste des points à améliorer, comme l’UI ou le comptage des pompes sur plusieurs jours
- Ajout d’un retour audio via les AirPods pour améliorer l’expérience utilisateur au-delà de l’interface visuelle
- Conclusion
- En combinant Core Motion, SwiftUI et l’IA, l’auteur a développé en 24 heures une application qui ajoute une nouvelle dimension au suivi fitness
- Le défi important est de réfléchir à la manière d’appliquer de nouvelles technologies à des problèmes du quotidien
2 commentaires
Ça rappelle à quel point la Galaxy Watch est impressionnante pour compter les répétitions sur les trois mouvements de base.
Il y a quelques années, j’avais créé une appli de challenge de pompes appelée Thirty qui utilisait le capteur de proximité de l’iPhone, et apparemment il y a aussi une façon de le faire avec les AirPods… J’ai l’impression que la précision du capteur de proximité a un peu baissé depuis l’ajout de la Dynamic Island 😭