0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

教育用小型ドローンTELLOを用いた追従機能の開発

Posted at

ー初めての投稿ー
初めまして,現在大学四年生です。
私は,TELLOを用いて追従機能の開発(といってもそんなに立派なものではありませんが...)をしています。
担当の教授の専門分野が電子回路系で,プログラムのことを聞けずお手上げ状態です。
至らぬ点もございますが,どうかお助けください。

ー開発環境ー
---windows10
---python

ープログラミングの中身ー

import socket
import threading
import cv2
import numpy as np

event = threading.Event()

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

cap = cv2.VideoCapture(0)

width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

X = width//2
Y = height//3

W = width//2
H = height//2

x = width//2
y = height//3

w = width//2
h = height//2

gain_vx = 3
gain_vy = 3

gain_bf = 0.0022

gain_x_1 = 0.15
gain_y_1 = 0.1

gain_x_2 = 0.0003
gain_y_2 = 0.00005

dx = X - x
dy = Y - y

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
sock.bind(("", 9000))

tello_address = ("192.168.10.1", 8889)

def send_command(msg):
print(msg)
msg = msg.encode(encoding="utf-8")
sock.sendto(msg, tello_address)
event.wait()
event.clear()

def recv():
while True:
try:
data, server = sock.recvfrom(1518)
print(data.decode(encoding="utf-8"))
event.set()
except Exception:
break
recvThread = threading.Thread(target=recv)
recvThread.start()

def tracking(dx,dy,vx,vy):

if 5 < dx <= 150:
    print('right')
    drone.right(gain_x_1*dx + gain_vx*vx)

if -150 <= dx < -5:
    print('left')
    drone.left(- gain_x_1*dx - gain_vx*vx)

if dx > 150:
    print('right')
    drone.right(gain_x_2*dx*dx + gain_vx*vx/2)

if dx < -150:
    print('left')
    drone.left(gain_x_2*dx*dx - gain_vx*vx/2)

if dy > 5:
    print('down')
    drone.down(gain_y_2*dy*dy + gain_vy*vy/2)

if dy < 5:
    print('up')
    drone.up(gain_y_2*dy*dy + gain_vy*vy/2)

else:
    print("___ERROR___")

def main():
try:
send_command("command")
send_command("streamon")
send_command("takeoff")

    cap = cv2.VideoCapture("udp://0.0.0.0:11111")

    while True:
        ret, img = cap.read()
        cv2.rectangle(img, (X, Y), (X+W, Y+H), color=(0,0,255),thickness= 4)


        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)
        for (x,y,w,h) in faces:
            cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
            roi_gray = gray[y:y+h, x:x+w]
            roi_color = img[y:y+h, x:x+w]
        cv2.imshow('img', img)

        tracking(dx,dy,vx,vy)


        if cv2.waitKey(1) & 0xFF == ord('q'):
            break




except Exception as ex:
    print (ex)

finally:
    cap.release()
    cv2.destroyAllWindows()
    send_command("streamoff")
    sock.close()
    print("--- END ---")

if name == "main":
main()

ーうまくいかない点ー
①フレームスキップを入れるとしたらどこが適切か
➁そもそもフレームスキップ云々以前の問題なのか

よろしくお願いいたします。

ー参考にさせていただいたサイトー
https://atsblog.org/tello_tracking_camshift/
http://totech.hateblo.jp/entry/2017/10/22/100726

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?