Соедините два Tello Drones с одним и тем же Raspberry Pi (Tello Drone Swarm) - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть два Ryze Tello Дронов, и я хотел бы управлять ими обоими с одной машины. Проблема в том, что оба беспилотника открывают точку доступа с одинаковыми IP-диапазонами , и это нельзя изменить.

Для этого я установил два интерфейса Wi-Fi на Raspberry Pi и настроил эти интерфейсы с wpa_supplicant для подключения к нужным дронам при включении:

$ iwconfig
wlan0     IEEE 802.11bgn  ESSID:"TELLO-D3ADAB"  
          Mode:Managed  Frequency:2.427 GHz  Access Point: 60:60:1F:D3:AD:AB   
          Bit Rate=24 Mb/s   Tx-Power=31 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
          Link Quality=47/70  Signal level=-63 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

...

wlan1     IEEE 802.11bg  ESSID:"TELLO-FC690B"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:2.452 GHz  Access Point: 60:60:1F:FC:69:0B   
          Bit Rate:54 Mb/s   Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=99/100  Signal level=75/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

Итак, как вы можете видеть, оба интерфейса wlan0 и wlan1 связаны с отдельной точкой доступа Wi-Fi (TELLO-D3ADAB и TELLO-FC690B).

Однако не оба интерфейса получают IP-адреса, назначенные при подключении PI к точке доступа Wifi дронов:

$ ifconfig
....
wlan0     Link encap:Ethernet  HWaddr b8:27:eb:89:c9:9e  
          inet addr:192.168.10.2  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::a53e:99ce:c027:6c6f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8474 errors:0 dropped:12 overruns:0 frame:0
          TX packets:204 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3150720 (3.0 MiB)  TX bytes:32182 (31.4 KiB)

wlan1     Link encap:Ethernet  HWaddr 80:3f:5d:a3:5c:ba  
          inet6 addr: fe80::4e88:6d0e:eebd:2e1b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1057 errors:0 dropped:58 overruns:0 frame:0
          TX packets:141 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:186081 (181.7 KiB)  TX bytes:26521 (25.8 KiB)

Если я выключу точку доступа, подключенную к wlan0, и подожду несколько секунд, то интерфейсу wlan1 будет назначен правильный IP-адрес.

Следовательно, отправка команд по UDP4 работает только на дрон, в сети которого нам был назначен IP-адрес.

Код Python для этого:

import socket

drone1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
drone1.setsockopt(socket.SOL_SOCKET, 2, 'wlan0')

drone2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
drone2.setsockopt(socket.SOL_SOCKET, 2, 'wlan1')

drone1.sendto('command'.encode(), 0, ('192.168.10.1', 8889))
drone1.sendto('takeoff'.encode(), 0, ('192.168.10.1', 8889))

drone2.sendto('command'.encode(), 0, ('192.168.10.1', 8889))
drone2.sendto('takeoff'.encode(), 0, ('192.168.10.1', 8889))


drone1.sendto('command'.encode(), 0, ('192.168.10.1', 8889))
drone1.sendto('land'.encode(), 0, ('192.168.10.1', 8889))

drone2.sendto('command'.encode(), 0, ('192.168.10.1', 8889))
drone2.sendto('land'.encode(), 0, ('192.168.10.1', 8889))

Я получил идею из этой статьи: https://medium.com/@henrymound/adventures-with-dji-ryze-tello-controlling-a-tello-swarm-1bce7d4e045d

Кто-нибудь с идеей о том, как это исправить?

Большое спасибо!

...