Nous avons fabriqué une caméra pour détecter AprilTag et ArTag avec mROS. Connectez-vous via Uart ou Ethernet.
Nous avons essayé JeVois et OpenMV, apprécié les avantages et les inconvénients et assemblé notre caméra.

Recherchez des balises visuelles et l'orientation du robot en fonction des données. Nous développons un
robot de collecte de balles de golf sur le practice . Maintenant, dans le monde, une seule entreprise vend un robot pour résoudre ce problème. Le marché est très prometteur, il nous a encouragés à faire du projet DIY une startup technologique.
En utilisant le GPS sans RTK pour naviguer dans le robot, il est difficile d'atteindre la précision nécessaire pour rechercher correctement une base et un parking. En utilisant la cinématique en temps réel, j'aurai des problèmes à l'approche des bâtiments. Nous avons essayé différentes options et décidé de fabriquer notre propre appareil photo pour rechercher une marque visuelle à l'entrée de la base.
Une partie du développement du robot a été son stationnement à la station d'accueil pour décharger le compartiment à billes et charger les batteries. Nous avons longuement réfléchi à la façon de le garer, avons convenu que le robot trouverait un objet optique brillant et le suivrait.
Les balises AprilTag ou ArTag ont été choisies comme cible, selon la façon dont elles se sont présentées sur le terrain. Parce que nous ne souffrons pas du syndrome
NIH - la recherche de caméras de vision industrielle avec prise en charge de ces marqueurs et avec prise en charge des scripts directement sur la caméra a commencé.
Premier JeVois
D'après ce qui a été rapidement trouvé -
JeVois , développé par le laboratoire de l'Université de Californie du Sud. Malheureusement, j'ai dû commander en Russie via Amazon, il n'y avait pas de revendeurs internes et apparemment il n'y en aura pas - apparemment, le marketing et les ventes sont effectués par les développeurs eux-mêmes (nous avons été assez surpris quand nous avons dû passer de Jevois à Jevois inc pour acheter un appareil photo , puis à la recherche d'un lien vers le répertoire - sélectionnez la caméra quelque part au milieu de 10 à 12 positions).

Les premiers essais sur l'ordinateur ont été assez encourageants, en général, tout a fonctionné dès la sortie de la boîte et a semblé assez intéressant. Cependant, après des tests de connexion à la carte de contrôle, quatre problèmes graves sont devenus évidents:
Les 60-90 FPS indiqués dans le matériel publicitaire sont pour des résolutions de 160x120 ou 320x240, ce qui n'est pas du tout approprié pour le stationnement - la capture est toujours souhaitable à une distance d'au moins 5 mètres. Et pour qu'un carré tombe dans le grain 160x120 de 6-8 mètres - vous devez le faire au moins un demi-mètre et lorsque vous vous en approchez, il ferme d'abord complètement le cadre, puis arrête de détecter du tout.
Consommation de 800mA, alors que l'alimentation se fait uniquement via des câbles USB avec mini USB, qui peuvent supporter ce courant sans trop de chute de tension. Il s'est avéré très difficile de trouver un câble d'une longueur d'au moins un demi-mètre avec de telles caractéristiques - une quinzaine d'options ont été sélectionnées et le résultat n'était pas très satisfaisant de toute façon.
La caméra est soit aveugle la nuit, soit clignote le jour. L'équilibre automatique fonctionne au-delà du bien et du mal.
La caméra est refroidie par un ventilateur. Le ventilateur est très petit, la vitesse est élevée - bruit à haute fréquence ou simplement grincement.
Le robot hurlant est la dernière chose que nous voulions faire.
L'écriture du code d'exécution à l'intérieur de la caméra est un divertissement distinct - l'installation de l'environnement est une question plutôt confuse, et l'assemblage et le téléchargement sur la carte SD prennent au moins 2 à 5 minutes. Oui, il n'y a pas de flash - tout est sur la carte SD.
Conclusion: une caméra pour jouer avec des passionnés en intérieur et avec un bon éclairage. En même temps, il serait souhaitable que les passionnés soient des étudiants - l'interface, la documentation et les méthodes de travail avec la caméra me rappelaient vivement le travail de laboratoire des étudiants, où presque aucune attention n'était accordée à la commodité de travailler avec le système et d'autres excès. Il s'agit bien sûr des modules C ++. Les scripts Python peuvent être modifiés via Jevois Inventor, mais le FPS est également nettement inférieur. En dehors des locaux, la caméra n'a même pas survécu à deux pluies, et le ventilateur a obstrué la saleté sur le terrain à une vitesse spatiale.
Le résultat - il ne convient pas pour une utilisation sur le robot, mais la possibilité fondamentale de stationnement a été prouvée.
OpenMV 3 et toutes ses variantes

Au moment de la première recherche, il n'était tout simplement pas disponible - il y avait une campagne sur
Kickstarter .
Après avoir assez joué avec JeVois et 100 dollars ont été jetés à la poubelle - un vendeur avec des stocks a été trouvé et 2 pièces ont été achetées.
En général, les impressions sont extrêmement agréables - une interface remarquablement pensée dans l'OpenMV IDE, une compilation python transparente, il est pratique de regarder l'algorithme fonctionner et de le déboguer. Cependant, il y avait des problèmes ici:
- La résolution peut être quelconque, mais AprilTag ne peut être recherchée que dans une zone ne dépassant pas 200x200 pixels. Nous revenons au problème des céréales, etc. Le développeur a recommandé de tirer d'abord les blobs, puis regardez les codes qu'ils contiennent. Mais sur autre chose qu'un fond uni (idéalement un mur blanc) cela ne fonctionne pas, l'herbe verte et le soleil brillant sur le fond transforment tout en bouillie. De plus, le FPS chute à un maximum de 5.
- Capteur Omnivision pas cher + optique pas cher = image savonneuse. Visuellement, cela n'est pas très visible lors de la visualisation d'un flux vidéo, mais lors de la visualisation d'images individuelles, il est clairement visible.
- Il n'y a pas de rideau IR, mais il y a un éclairage IR. [WHAAAAT?]
- Il n'y a aucune protection contre l'environnement externe. Pas du tout.

Le script a été débogué sur cette caméra, plusieurs dizaines de parkings ont été effectués. Cependant, après que le robot a roulé de Moscou à Saint-Pétersbourg et vice-versa, la caméra a cessé de démarrer - le régulateur de puissance a été mis hors tension. L'action évidente était l'emballage et la stabilisation de la puissance. Et ici, la chose la plus intéressante a été découverte - le boîtier avec la bonne adresse IP pour cette caméra est tout simplement introuvable, ou ce sont des boîtiers avec des couvercles transparents, sans supports internes et des entrées / sorties de câble serrées. À la suite de la recherche, une masse de caméras de surveillance chinoises bon marché avec les bons cas ont été trouvées. La caméra a été achetée et éviscérée, une deuxième copie d'OpenMV s'est tenue à la place de la carte, tout a fonctionné.
Mais le soir et la nuit sont devenus un obstacle presque insurmontable - il n'y a pas de rideau infrarouge.
Résultats: la caméra est TRÈS pratique pour le prototypage, les ressources sont limitées, il n'y a pas du tout de protection de l'environnement extérieur (la deuxième caméra est ensuite allée dans un congélateur industriel et n'a pas survécu à -30). Pas bon.
Et puis, il est devenu très intéressant pour nous quel type de planches nous obtenions des caméras chinoises
Clones HiSilicon
Après un examen attentif, il s'est avéré que la carte a un ARM à 2 cœurs, un processeur DSP, un rideau IR, un éclairage IR, un capteur décent de Sony, la carte est recouverte d'un composé de protection + boîtier pour la rue. Exactement ce dont vous avez besoin - il reste à collecter des logiciels.
Inside s'est avéré être un clone Linux fonctionnel de HiSilicon + u-boot.
J'ai dû télécharger le SDK à partir des ressources chinoises et gérer les assemblys. En principe, rien de terrible n'a été trouvé en cours de route, sauf qu'il était nécessaire de corriger plusieurs fichiers à l'intérieur du SDK - la distribution Linux sur laquelle le SDK allait être assez ancien, et certains fichiers d'en-tête ont changé depuis. Eh bien, j'ai dû changer le shell de zsh en bash. Je vais omettre les détails; pour de bon, cela devrait être un article séparé.
Ces ressources ont aidé:Analyse, connexion à la caméraExemple de diagramme d'assemblage de logicielsEnsuite, tout s'est déroulé selon le schéma bien connu:

La plupart du temps, il a fallu pour obtenir l'image du capteur, j'ai terminé le reste en seulement 4 heures, en portant simplement l'algorithme débogué de Python vers C ++.
Le travail avec le capteur a pris environ une semaine et demie. Bien sûr, il n'y a pas / dev / video0 dans ces périphériques, du matériel presque nu avec un travail direct avec la mémoire et les ports.
Nous devons dire tout de suite que les échantillons du SDK fonctionnent sans modification uniquement sur les cartes de débogage de ces SDK, sinon cela nécessite beaucoup de modifications mineures. Aussi drôle que cela puisse paraître, le principal problème est de déterminer quel capteur se trouve dans l'appareil photo, car les chinois en écrivent un dans la description, un autre est marqué sur le tableau, le troisième modèle est initialisé dans le logiciel. Par exemple, la caméra a un capteur IMX323 dans la description, la carte est marquée SC2235, lorsqu'elle est lancée dans les scripts d'initialisation, elle démarre comme AR130 et le logiciel de la caméra l'initialise comme SC2235P.
Les raisons de tout cela sont assez simples: pour l'utilisateur final, que l'IMX323, que le SC2235 sont tous les mêmes, l'image est très similaire. Le noyau et rootfs avec des scripts int ont été assemblés à partir du SDK avec des modifications minimales et ne se sont pas souciés d'un script d'initialisation distinct pour chaque modèle - seuls les paramètres de lancement sont corrects et le nom a été laissé tel quel. Dans le logiciel pour travailler avec la caméra, la deuxième pièce d'initialisation du DSP avec le capteur est déjà lancée et le modèle exact de la caméra y est déjà critique - par conséquent, les journaux ont déjà le modèle exact - SC2235P. P - c'est important, c'est un capteur différent en termes de caractéristiques, qui fonctionne même à une fréquence de bus légèrement différente et une résolution différente par rapport au SC2235.
La deuxième partie de la quête est constituée de fiches techniques sur les capteurs, qui ne le sont généralement pas. Par conséquent, j'ai dû reconstruire le module hi_i2c avec l'impression dans le journal via printk et le remplacer dans le vidage supprimé de la caméra, écrire l'amortisseur de configuration DSP du processeur vidéo et supprimer les configs de la caméra qui fonctionne, ainsi que plusieurs fois pour regarder les pilotes du projet DafangSoftware. En détail, cela attire 3-4 articles distincts, que j'ai l'intention d'écrire après NG.
Au final, tout s'est avéré encore meilleur que prévu - un travail confiant pour capturer AprilTag à partir de 6 mètres même dans l'obscurité presque totale, 25-12 ips, le contrôleur de contrôle de stationnement PID, etc.
Le résultat - c'est le plus pour travailler sur le terrain, beaucoup de choses ont été prises en compte pour se protéger des conditions extérieures. La seule chose qui n'a pas pu être entièrement vérifiée a été le travail sous un soleil radieux, la météo depuis octobre s'est dégradée.
Idée de développement
Et ici, nous avons eu une idée - nous avons entre nos mains un analogue d'OpenMV avec de bien meilleures fonctionnalités matérielles et une production de masse. Il reste à amener le travail avec la caméra au niveau OpenMV, à y micropython, à créer un IDE pratique et à vérifier comment les scripts actuels d'OpenMV fonctionneront. De plus, mRos y est complètement porté, ce qui étend immédiatement l'utilisation de ces caméras pour les systèmes ROS.
Par conséquent, nous prévoyons de livrer des analogues d'OpenMV en mars et de
mROS d' ici mai.
Afin de réduire le prix de la personnalisation de la caméra, nous sommes prêts à vous l'offrir.
Remplissez le formulaire et nous vous contacterons lorsque nous serons prêts à commander le premier lot.