Tầm nhìn#
Giới thiệu#
Cảm biến thị giác của máy bay không người lái VEX AIR phát hiện và theo dõi ID AprilTag. Điều này cho phép máy bay không người lái phân tích môi trường xung quanh, theo dõi các đối tượng và phản ứng dựa trên dữ liệu hình ảnh được phát hiện. Dưới đây là danh sách tất cả các phương thức và thuộc tính có sẵn:
Bộ phận nhận dữ liệu – Phát hiện xem máy bay không người lái có đang giữ vật thể nào không.
get_data– Trả về một bộ các đối tượng được phát hiện cho một chữ ký cụ thể.
Thuộc tính – Dữ liệu đối tượng được trả về từ get_data.
exists– Liệu đối tượng có tồn tại trong lần phát hiện hiện tại hay không.width– Chiều rộng của đối tượng được phát hiện.height– Chiều cao của vật thể được phát hiện.centerX– Vị trí X của tâm đối tượng.centerY– Vị trí Y của tâm đối tượng.bearing– Góc của vật thể so với Cảm biến Thị giác phía trước hoặc độ cần thiết để máy bay không người lái hướng về vật thể.rotation– Hướng của đối tượng.originX– Vị trí X của góc trên bên trái của đối tượng.originY– Vị trí Y của góc trên bên trái của đối tượng.id– ID thẻ của đối tượng.type– Trả về loại của đối tượng.
Người nhận#
get_data#
get_data lọc dữ liệu từ khung hình Cảm biến Thị giác thành một chữ ký duy nhất — một mô tả đã lưu về thứ mà cảm biến có thể nhận ra, chẳng hạn như ID AprilTag — và trả về một bộ dữ liệu.
The tuple stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. An empty tuple is returned if no matching objects are detected.
Usage:
drone.vision.get_data(camera, signature, count)
Thông số |
Sự miêu tả |
|---|---|
|
Camera dùng để lấy dữ liệu: hoặc |
|
Lọc tập dữ liệu chỉ bao gồm dữ liệu có chữ ký đã cho. Các chữ ký có sẵn là:
|
|
Tùy chọn. Thiết lập số lượng tối đa các đối tượng có thể được trả về từ 1 đến 24 (mặc định: 8). |
# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
drone.climb_for(direction=UP, distance=200)
Của cải#
Có nhiều thuộc tính được bao gồm trong mỗi đối tượng được lưu trữ trong một tuple sau khi get_data được sử dụng.
Tất cả các giá trị thuộc tính ngoại trừ .id và .type mô tả vị trí, kích thước, hướng hoặc góc phương vị của đối tượng được phát hiện tại thời điểm get_data được sử dụng. Các giá trị này được đo bằng pixel hoặc độ. Mỗi Cảm biến Thị giác có độ phân giải khác nhau:
Camera trước: 640 x 480 pixel
Hướng xuống dưới: 640 x 400 pixel
.exists#
.exists trả về giá trị Boolean cho biết chỉ mục có tồn tại trong bộ dữ liệu hay không. Trả về lỗi nếu không tìm thấy đối tượng nào.
True– Chỉ mục tồn tại.False– Chỉ mục không tồn tại.
# Climb upward when an AprilTag ID is detected
drone.take_off(climb_to=500)
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
drone.climb_for(direction=UP, distance=200)
.width#
.width trả về chiều rộng của đối tượng được phát hiện tính bằng pixel dưới dạng số nguyên từ 1 đến 640.
# Show if the AprilTag ID appears large or small
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
clear_console()
if vision_data[0].exists:
if vision_data[0].width > 100:
print("Large")
else:
print("Small")
wait(0.2, SECONDS)
.height#
.height trả về chiều cao của đối tượng được phát hiện tính bằng pixel dưới dạng số nguyên từ 1 đến 480.
# Show if the AprilTag ID appears large or small
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
clear_console()
if vision_data[0].exists:
if vision_data[0].height > 100:
print("Large")
else:
print("Small")
wait(0.2, SECONDS)
.centerX#
.centerX trả về tọa độ x của tâm đối tượng được phát hiện tính bằng pixel dưới dạng số nguyên từ 1 đến 640.
# Show if an AprilTag ID is to the left or the right of the camera
while True:
clear_console()
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if vision_data[0].centerX < 320:
print("To the left!")
else:
print("To the right!")
wait(0.2, SECONDS)
.centerY#
.centerY trả về tọa độ y của tâm đối tượng được phát hiện tính bằng pixel dưới dạng số nguyên từ 1 đến 480.
# Take off and align drone with AprilTag ID on wall
# Change drone.take_off parameter to see different results
drone.take_off(climb_to=800)
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if vision_data[0].centerY < 240:
print("Below the target!")
else:
print("Above the target!")
else:
print("No target found!")
.bearing#
.bearing trả về một góc biểu thị vị trí của vật thể so với máy bay không người lái. Hành vi này phụ thuộc vào loại cảm biến thị giác được sử dụng.
Giá trị 0° cho biết tâm của vật thể và cảm biến thẳng hàng. Giá trị dương có nghĩa là vật thể nằm bên phải, trong khi giá trị âm có nghĩa là vật thể nằm bên trái.
Cảm biến |
Trả lại |
|---|---|
Xuống dưới |
Góc quay mà phần trước của máy bay không người lái phải xoay để thẳng hàng với tâm của vật thể, từ -180º đến 180º. |
Phía trước |
Góc lệch của vật thể sang trái hoặc phải so với tâm của cảm biến thị giác, từ -180º đến 180º. |
# Align the front of the drone to an AprilTag ID
drone.set_turn_velocity(15)
drone.take_off(climb_to=500)
while True:
vision_data = drone.vision.get_data(DOWNWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if -20 < vision_data[0].bearing < 20:
# Hover once sensor is centered on AprilTag ID
drone.hover()
controller.sound.play(SUCCESS)
while controller.sound.is_active():
wait(50, MSEC)
elif vision_data[0].bearing < -21:
drone.turn(LEFT)
else:
drone.turn(RIGHT)
wait(5, MSEC)
.rotation#
.rotation trả về hướng xoay của ID AprilTag được phát hiện dưới dạng số nguyên tính bằng độ từ 1 đến 359.
# Turn left or right based on the rotation of an AprilTag ID
drone.take_off(climb_to=1000)
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if 240 < vision_data[0].rotation < 300:
drone.turn_for(LEFT, 90)
elif 60 < vision_data[0].rotation < 120:
drone.turn_for(RIGHT, 90)
else:
drone.hover()
wait(0.2, SECONDS)
.originX#
.originX trả về tọa độ x của góc trên bên trái của khung bao quanh đối tượng được phát hiện tính bằng pixel dưới dạng số nguyên từ 1 đến 640.
# Draw lines to the AprilTag ID origin from all corners
while True:
controller.screen.clear_screen()
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
wait(0.2, SECONDS)
.originY#
.originY trả về tọa độ y của góc trên bên trái của khung bao quanh đối tượng được phát hiện tính bằng pixel dưới dạng số nguyên từ 1 đến 480.
# Draw lines to the AprilTag ID origin from all corners
while True:
controller.screen.clear_screen()
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
controller.screen.draw_line(0, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(0, 480, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 0, vision_data[0].originX, vision_data[0].originY)
controller.screen.draw_line(640, 480, vision_data[0].originX, vision_data[0].originY)
wait(0.2, SECONDS)
.id#
.id trả về số nhận dạng của ID AprilTag được phát hiện dưới dạng số nguyên từ 0 đến 37.
# Display the detected AprilTag ID
while True:
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
clear_console()
if vision_data[0].exists:
print(vision_data[0].id)
wait(0.2, SECONDS)
.type#
.type trả về loại đối tượng được phát hiện. Nó sẽ trả về như sau:
Loại đối tượng |
Giá trị số |
Các đối tượng được bao gồm |
|---|---|---|
|
8 |
Mã định danh AprilTag |
|
1 |
Màu sắc đặc trưng - Sắp ra mắt! |
|
2 |
Mã màu - Sắp ra mắt! |
# Display what AprilTag ID is detected
while True:
controller.screen.clear_screen()
controller.screen.set_cursor(1, 1)
vision_data = drone.vision.get_data(FORWARD_CAMERA, ALL_TAGS)
if vision_data[0].exists:
if vision_data[0].type == drone.vision.TAG_OBJECT:
controller.screen.print("AprilTag ID: ")
controller.screen.print(vision_data[0].id)
wait(0.1, SECONDS)