You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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()

额外注意事项

  1. 每台Tello必须连接到对应的本地WiFi适配器,确保网络链路是通的
  2. 不同无人机实例的local_addr端口要不一样(比如8889、8890、8891...),否则会出现端口占用冲突
  3. 必须先调用connect()成功后,再调用streamon(),不能在连接前操作
  4. 程序退出前一定要调用streamoff()end(),避免残留网络进程导致下次连接失败

备注:内容来源于stack exchange,提问作者Joash

火山引擎 最新活动