You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 16.04下用Python向同IP端口多UDP连接发Socket消息控Tello无人机

控制多台Ryze Tello无人机的Python UDP解决方案

嘿,我之前做过多台Tello的控制开发,刚好能给你一些实用的建议。首先得明确Tello的网络逻辑:每台Tello自身是一个Wi-Fi热点,默认IP是192.168.10.1,监听UDP端口8889。要同时控制多台,你的Ubuntu 16.04需要多个网络接口(比如内置Wi-Fi加一个USB无线网卡),每个接口连一台Tello的热点,然后通过绑定不同本地IP的Socket来区分指令发送路径。

核心实现思路

每台Tello需要对应一个独立的UDP Socket,并且这个Socket要绑定到连接该Tello热点的本地网卡IP上。这样系统就会知道把这个Socket的数据包通过指定网卡发送出去,精准到达对应的无人机,而不会混在一起。

一步步来实现

1. 先搞定网络环境

  • 给你的Ubuntu加个USB无线网卡,确保系统能识别多个Wi-Fi接口。
  • 分别用每个网卡连接不同Tello的热点(热点名一般是TELLO-XXXXXX格式)。
  • 运行ip addr show查看每个接口的本地IP,比如第一个网卡可能拿到192.168.10.2,第二个是192.168.10.3(Tello热点会自动分配同网段的IP)。

2. Python代码封装

我写了一个简单的Tello类来封装单台无人机的操作,这样实例化多个对象就能控制多台了:

import socket
import time

class Tello:
    def __init__(self, local_ip, tello_ip='192.168.10.1', tello_port=8889):
        self.local_ip = local_ip
        self.tello_ip = tello_ip
        self.tello_port = tello_port
        # 创建UDP Socket并绑定到指定的本地网卡IP
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.bind((self.local_ip, 0))  # 0表示让系统自动分配本地端口
        # 设置超时,避免等不到响应时程序卡死
        self.sock.settimeout(0.5)
        
    def send_command(self, command):
        try:
            # 发送指令
            self.sock.sendto(command.encode('utf-8'), (self.tello_ip, self.tello_port))
            # 尝试接收Tello的返回信息
            response, _ = self.sock.recvfrom(1024)
            print(f"[{self.local_ip}] Tello回复: {response.decode('utf-8')}")
        except socket.timeout:
            print(f"[{self.local_ip}] 没收到Tello的回复")
    
    def close(self):
        # 关闭Socket连接
        self.sock.close()

# 示例:控制两台Tello
if __name__ == "__main__":
    # 替换成你实际的两个本地网卡IP
    tello1 = Tello(local_ip='192.168.10.2')
    tello2 = Tello(local_ip='192.168.10.3')
    
    # 先给第一台发送指令激活
    tello1.send_command('command')
    time.sleep(1)
    tello1.send_command('takeoff')
    
    # 再激活第二台
    tello2.send_command('command')
    time.sleep(1)
    tello2.send_command('takeoff')
    
    # 让它们飞5秒
    time.sleep(5)
    
    # 降落
    tello1.send_command('land')
    tello2.send_command('land')
    
    # 关闭连接
    tello1.close()
    tello2.close()

3. 几个关键注意点

  • 绑定本地IP是重中之重:如果不绑定,系统会用默认网卡发送所有指令,结果就是所有命令都发给同一台Tello。绑定到对应网卡的IP,才能确保指令走对路。
  • UDP是无连接的,但我们用Socket绑定实现了逻辑上的“独立连接”:虽然UDP本身没有连接的概念,但每个绑定不同本地IP的Socket,会被系统当作不同的发送通道,对应不同的无人机。
  • 超时和延迟:发送指令后加一点延迟(比如1秒),避免数据包拥挤;设置Socket超时,防止程序因为等待无响应的Tello而卡住。
  • 防火墙设置:Ubuntu默认防火墙可能会阻止UDP通信,记得运行sudo ufw allow 8889/udp开放端口。

常见问题排查

  • 某台Tello没反应?检查对应网卡是不是真的连上了Tello的热点,本地IP有没有填错,防火墙有没有开放端口。
  • 指令乱套了?确保每个Tello实例的Socket是独立的,发送指令时不要太频繁,加适当的延迟。

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:14:23