У меня есть два 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
Кто-нибудь с идеей о том, как это исправить?
Большое спасибо!