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
相关产品推荐
相关产品推荐

