使用djitellopy连接多台Tello无人机时初始化及streamon调用报错求助
djitellopy连接多台Tello无人机时初始化及streamon调用报错求助
我在尝试用djitellopy连接多台Tello无人机,结果连初始化都失败了,还没走到调用streamon的步骤就报错了。ChatGPT没给出有效解决办法,麻烦大家帮我看看问题出在哪。
我的测试代码:
from djitellopy import tello import cv2 # Create instances for each Tello drone drone1 = tello.Tello(ip='192.168.10.2') # Replace with your first Wi-Fi adapter's IP #drone2 = tello.Tello(ip='192.168.10.3') # Replace with your second Wi-Fi adapter's IP # ... Add more instances for additional drones # Connect to drones drone1.connect() #drone2.connect() # ... Connect other drones # Send commands to drones # drone1.takeoff() # drone2.takeoff() # ... Send other commands # Clean up drone1.streamon() # while True: # img = drone1.get_frame_read().frame # img = cv2.resize(img, (360, 240)) # cv2.imshow("results", img) # if cv2.waitKey(1) & 0xFF == ord('q'): # break
报错信息:
Traceback (most recent call last): File "C:\Users\origi\PycharmProjects\DroneProject\venv\Interface.py", line 4, in <module> drone1 = tello.Tello(ip='192.168.10.2') # Replace with your first Wi-Fi adapter's IP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\origi\PycharmProjects\DroneProject\venv\Lib\site-packages\djitellopy\enforce_types.py", line 54, in wrapper return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ TypeError: Tello.__init__() got an unexpected keyword argument 'ip' Exception ignored in: <function Tello.__del__ at 0x000001FAE5924720> Traceback (most recent call last): File "C:\Users\origi\PycharmProjects\DroneProject\venv\Lib\site-packages\djitellopy\enforce_types.py", line 54, in wrapper return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\origi\PycharmProjects\DroneProject\venv\Lib\site-packages\djitellopy\tello.py", line 1028, in __del__ self.end() File "C:\Users\origi\PycharmProjects\DroneProject\venv\Lib\site-packages\djitellopy\enforce_types.py", line 54, in wrapper return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\origi\PycharmProjects\DroneProject\venv\Lib\site-packages\djitellopy\tello.py", line 1023, in end host = self.address[0] ^^^^^^^^^^^^ AttributeError: 'Tello' object has no attribute 'address' Process finished with exit code 1
补充说明:我用多块WiFi适配器连接多台Ryze无人机,因为每台Tello的默认IP都是192.168.10.1,所以我想指定本地适配器的IP来区分,但没想到初始化就报错了。
问题分析与解决办法
从报错信息里的TypeError一眼就能看出核心问题:你用了Tello类根本不存在的ip参数。djitellopy的Tello初始化时,没有名为ip的参数,你搞混了参数名。
你想要指定本地WiFi适配器的IP,应该用local_addr参数(格式是(本地网卡IP, 本地监听端口)),而无人机自身的IP是通过host参数指定(所有Tello默认都是192.168.10.1,不需要改)。因为多网卡连多台Tello时,需要给每个Tello实例绑定对应的本地网卡和独立端口,避免通信冲突。
修正后的代码示例
from djitellopy import tello import cv2 # 多无人机初始化:绑定对应本地网卡IP+独立端口 # local_addr是(本地WiFi适配器IP, 本地监听端口),不同无人机用不同端口 drone1 = tello.Tello(host='192.168.10.1', local_addr=('192.168.10.2', 8889)) # drone2 = tello.Tello(host='192.168.10.1', local_addr=('192.168.10.3', 8890)) # 连接无人机 drone1.connect() # drone2.connect() # 检查无人机状态(可选,确认连接成功) print(f"Drone1 battery: {drone1.get_battery()}%") # 开启视频流 drone1.streamon() # 视频流读取测试 try: while True: img = drone1.get_frame_read().frame img = cv2.resize(img, (360, 240)) cv2.imshow("Drone1 Stream", img) # 按q退出 if cv2.waitKey(1) & 0xFF == ord('q'): break finally: # 一定要做资源清理 drone1.streamoff() drone1.end() cv2.destroyAllWindows()
额外注意事项
- 每台Tello必须连接到对应的本地WiFi适配器,确保网络链路是通的
- 不同无人机实例的
local_addr端口要不一样(比如8889、8890、8891...),否则会出现端口占用冲突 - 必须先调用
connect()成功后,再调用streamon(),不能在连接前操作 - 程序退出前一定要调用
streamoff()和end(),避免残留网络进程导致下次连接失败
备注:内容来源于stack exchange,提问作者Joash




