robomaster-python/controller/packagesrc/measure.py

62 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
# ██████╗ ██████╗ ██████╗ ██████╗ ███╗ ███╗ █████╗ ███████╗████████╗███████╗██████╗ ██████╗ ██╗ ██╗
# ██╔══██╗██╔═══██╗██╔══██╗██╔═══██╗████╗ ████║██╔══██╗██╔════╝╚══██╔══╝██╔════╝██╔══██╗██╔══██╗╚██╗ ██╔╝
# ██████╔╝██║ ██║██████╔╝██║ ██║██╔████╔██║███████║███████╗ ██║ █████╗ ██████╔╝██████╔╝ ╚████╔╝
# ██╔══██╗██║ ██║██╔══██╗██║ ██║██║╚██╔╝██║██╔══██║╚════██║ ██║ ██╔══╝ ██╔══██╗██╔═══╝ ╚██╔╝
# ██║ ██║╚██████╔╝██████╔╝╚██████╔╝██║ ╚═╝ ██║██║ ██║███████║ ██║ ███████╗██║ ██║██║ ██║
# ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝
import math
from typing import Tuple
FOCAL_LENGTH_HD: float = 710
HORIZONTAL_DEGREES: float = 96
HORIZONTAL_PIXELS: float = 1280
VERTICAL_DEGREES: float = 54
VERTICAL_PIXELS: float = 720
INFANTRY_LENGTH: float = 0.32
INFANTRY_WIDTH: float = 0.24
INFANTRY_HEIGHT: float = 0.27
ENGINEERING_LENGTH: float = 0.41
ENGINEERING_WIDTH: float = 0.24
ENGINEERING_HEIGHT: float = 0.33
def pinhole_distance(actual_size: float, pixel_size: float, focal_length: float = FOCAL_LENGTH_HD) -> float:
"""
使用针孔相机模型估测物体到相机的距离。
Estimate distance between camera and object using pinhole camera model.
:param actual_size: 实际大小,单位米。 Actual object size in meters.
:param pixel_size: 像素大小,单位像素。 Object size in pixels.
:param focal_length: 可选当前分辨率下的等效焦距和分辨率相关。默认使用1280*720分辨率下的数值。Perceived focal length at specified image resolution, default to value under 1280*720.
:return: 物体到相机的距离,单位米。 Distance between camera and object, in meters.
"""
return focal_length * actual_size / pixel_size
def distance_decomposition(pixel_x: float, distance: float, horizontal_pixels: float = HORIZONTAL_PIXELS, horizontal_degrees: float = HORIZONTAL_DEGREES) -> Tuple[float, float, float]:
"""
将距离分解为前进分量(前为正)和侧向分量(右为正)。本函数要求线段的两端在相同海拔高度。
Decomposition distance into forward vector(forward as positive) and lateral vector(right as positive).
This function requires that both ends of the line segment are at the same altitude.
:param pixel_x: 物体在图像上的x坐标单位像素。 the x coordinate of the object on the image, in pixels.
:param distance: 距离,单位米。 Distance in meter.
:param horizontal_pixels: 图像横向的像素数目默认1280. The number of pixels in the horizontal direction of the image, the default is 1280.
:param horizontal_degrees: 图像横向的视角大小默认96. The horizontal viewing angle of the image, the default is 96.
:return: 前进分量和侧向分量,单位米;水平偏转角度,单位度。 forward vector and lateral vector in meters; horizontal angle in degrees.
"""
horizontal_degree = horizontal_degrees * (pixel_x / horizontal_pixels - 0.5)
rad = horizontal_degree / 180 * math.pi
lateral = distance * math.sin(rad)
forward = distance * math.cos(rad)
return forward, lateral, horizontal_degree