📜  使用 python 控制 Tello 无人机(1)

📅  最后修改于: 2023-12-03 14:49:45.687000             🧑  作者: Mango

使用 Python 控制 Tello 无人机

简介

Tello 是 DJI 推出的一款极其便携小巧的无人机,易于携带,提供多种飞行模式以及传感器,具有出色的稳定性和易操作性。使用 Python 语言,我们可以通过 Tello SDK 轻松地对 Tello 无人机进行控制。

安装依赖

在开始编写 Python 脚本之前,确保您已经安装了以下依赖:

  • OpenCV: 需要使用这个库来接收 Tello 的视频流数据(如果你不需要飞行时显示视频,可以不用安装)
  • tellopy: 一个使用 Python 编写的,可以直接与 Tello 进行通讯操作的库
  • pygame: 如果想使用 Gamepad 进行操作,需要安装这个库
pip install opencv-python
pip install tellopy
pip install pygame
控制 Tello 的基础操作

使用 tellopy 库中的 Tello 类,可以轻松地与 Tello 进行通讯并控制它的飞行。

下面是 Tello 类中的几个关键方法:

  • connect(): 连接 Tello
  • takeoff(): 起飞
  • land(): 降落
  • up(x): 向上飞 x 厘米
  • down(x): 向下飞 x 厘米
  • left(x): 向左飞 x 厘米
  • right(x): 向右飞 x 厘米
  • forward(x): 向前飞 x 厘米
  • backward(x): 向后飞 x 厘米
  • rotate_cw(x): 顺时针旋转 x 度
  • rotate_ccw(x): 逆时针旋转 x 度
接收 Tello 的视频流数据

使用 Tello 的 Wi-Fi 与 PC 或者移动设备建立连接,即可接收 Tello 发送的视频流。通过使用 Opencv 可以轻松处理这些视频流:

import cv2
from tellopy import Tello

tello = Tello()

# 连接 Tello
tello.connect()

# 开始视频流处理
tello.start_video()

while True:
    # 读取视频内容
    frame = tello.get_frame_read().frame
    
    # 处理视频
    # ...

    # 显示视频
    cv2.imshow("frame", frame)

    # 退出
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

# 释放所有资源
cv2.destroyAllWindows()
tello.end()
使用 Keyboard 控制 Tello

使用键盘可以让我们方便的操作 Tello 进行飞行和其他控制。

import curses
import time
from tellopy import Tello

tello = Tello()

# 连接 Tello
tello.connect()

# 获取屏幕对象
screen = curses.initscr()
curses.noecho()
curses.cbreak()
screen.keypad(True)

try:
    while True:
        # 读取输入
        char = screen.getch()
        if char == ord("q"):
            break
        elif char == curses.KEY_UP:
            # 向上飞 50cm
            tello.up(50)
        elif char == curses.KEY_DOWN:
            # 向下飞 50cm
            tello.down(50)
        elif char == curses.KEY_LEFT:
            # 向左飞 50cm
            tello.left(50)
        elif char == curses.KEY_RIGHT:
            # 向右飞 50cm
            tello.right(50)
        elif char == ord("t"):
            # 起飞
            tello.takeoff()
        elif char == ord("l"):
            # 降落
            tello.land()
        elif char == ord("r"):
            # 顺时针旋转90度
            tello.rotate_cw(90)
        elif char == ord("e"):
            # 逆时针旋转90度
            tello.rotate_ccw(90)

finally:
    # 关闭键盘输入接口
    curses.nocbreak()
    screen.keypad(0)
    curses.echo()
    curses.endwin()
    tello.end()
使用 Gamepad 控制 Tello

如果你使用的是 XBox 360 控制器,而且已经安装好了 pygame 库,那么就可以使用以下代码操作 Tello。

import pygame
import time
from tellopy import Tello

tello = Tello()

# 连接 Tello
tello.connect()

# 初始化 pygame
pygame.init()
pygame.joystick.init()
joystick = pygame.joystick.Joystick(0)
joystick.init()

try:
    while True:
        pygame.event.pump()

        # 获取所有游戏手柄的状态
        axes = [joystick.get_axis(i) for i in range(joystick.get_numaxes())]
        buttons = [joystick.get_button(i) for i in range(joystick.get_numbuttons())]

        # 根据游戏手柄状态控制 Tello
        if buttons[0]:
            # 起飞
            tello.takeoff()
        elif buttons[1]:
            # 降落
            tello.land()
        elif buttons[4]:
            # 顺时针旋转90度
            tello.rotate_cw(90)
        elif buttons[5]:
            # 逆时针旋转90度
            tello.rotate_ccw(90)
        elif abs(axes[1]) > 0.1:
            # 与左边 stick 的垂直轴控制上下
            throttle = int(axes[1] * 50)
            tello.up(throttle)

        elif abs(axes[0]) > 0.1:
            # 与左边 stick 的水平轴控制左右
            throttle = int(axes[0] * 50)
            tello.left(throttle)

finally:
    joystick.quit()
    tello.end()
总结

以上是 Python 控制 Tello 无人机的基本方法和操作,希望能对大家有所帮助。操作 Tello 可以带来一些有趣的体验,但同时一定要注意安全措施,避免产生危险。