Comment utiliser OpenMV pour la télémétrie
Tutoriel vidéo 10 - Déterminer et mesurer la taille des objets : https://singtown.com/learn/50001/
Tutoriel vidéo 33 - Télémétrie optique ToF : https://singtown.com/learn/50539/
Première méthode :\ En utilisant Apriltag, Apriltag peut effectuer un positionnement 3D. Veuillez vous référer à notre tutoriel pour une implémentation spécifique :\ Suivi des balises AprilTag http://book.openmv.cc/image/apriltag.html
Deuxième méthode :\ OpenMV utilise une caméra monoculaire Si vous souhaitez mesurer la distance, vous devez sélectionner un objet de référence et utiliser le rapport de taille de l'objet de référence pour calculer la distance.
Cette section présente la deuxième méthode, comment calculer la distance entre la caméra et la balle de ping-pong en fonction de la taille de la balle de ping-pong dans la caméra.
Comme nous le savons tous, plus la balle de ping-pong est éloignée de la caméra, plus la taille de la balle de ping-pong dans la caméra est petite. La question est donc :\ Quelle est exactement cette relation ?\ (Remarque : les questions de géométrie mathématique ici concernent uniquement la partie fonction trigonométrique des mathématiques du secondaire. Si vous ne voulez pas la lire, vous pouvez simplement regarder la conclusion)
Pour simplifier le problème, regardons l'image :\
On peut le savoir grâce à la relation géométrique dans la caméra de gauche :
Il y a donc (formule 1)
On le sait d'après la relation géométrique dans l'environnement réel à droite :
En faisant intervenir (formule 1), on peut obtenir (formule de conclusion) :
Ce qui précède est la relation que nous voulons finalement connaître !\ Qu'est-ce que cela signifie ?\ Lm sur le côté gauche du signe égal est la longueur, et Bpix sont les pixels occupés par la balle dans la caméra (pixels de diamètre). Sur le côté droit du signe égal, Rm est le vrai rayon de la balle, Apix est un pixel fixe et a est la moitié de l'angle de vision.\ donc ! donc ! donc ! donc ! donc ! donc ! donc !\ Ce que nous dit cette formule est :
实际长度和摄像头里的像素成反比
La simplification est
距离 = 一个常数/直径的像素
D'accord, nous connaissons déjà la relation, et c'est tellement élégant et simple !\ Les étapes de fonctionnement spécifiques consistent à mesurer d'abord la valeur de cette constante. Inutile de dire comment la mesurer, laissez d'abord la balle être à 10 cm de la caméra, imprimez la valeur en pixels du diamètre dans la caméra, puis multipliez-la par. obtenez la valeur de k !
Ensuite, distance = cette constante/pixel dans la caméra, si simple.
J'ai posté le code OpenMV ici :
# Measure the distance
#
# This example shows off how to measure the distance through the size in imgage
# This example in particular looks for yellow pingpong ball.
import sensor, image, time
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
yellow_threshold = ( 56, 83, 5, 57, 63, 80)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.
K=5000#the value should be measured
while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([yellow_threshold])
if len(blobs) == 1:
# Draw a rect around the blob.
b = blobs[0]
img.draw_rectangle(b[0:4]) # rect
img.draw_cross(b[5], b[6]) # cx, cy
Lm = (b[2]+b[3])/2
length = K/Lm
print(length)
#print(clock.fps()) # Note: Your OpenMV Cam runs about half as fast while
# connected to your computer. The FPS should increase once disconnected.
Le résultat est le suivant : la distance est imprimée via le port série.