Как я могу управлять вертолетом, используя UDP с Python? - PullRequest
0 голосов
/ 07 ноября 2018

Я получил школьный проект (по своему выбору), который направлен на управление вертолетом с использованием Python (или C ++). Я работал над этим около двух недель безрезультатно :-(.
Я наконец решил поделиться своей проблемой с вами, ребята, надеясь, что это не будет так сложно.

Вертолет : Он использует открытую сеть, к которой вы можете подключиться.

Моя цель: Я должен иметь возможность отправлять команды (летать вверх / вниз / вперед ...) в общую сеть вертолета, используя UDP, как это приложение, которое я нашел в магазине приложений: multispy

Моя проблема :

Я не могу подключить свой компьютер к вертолету и управлять им. Когда я извлек .apk-файл приложения, я нашел полезную информацию, которая мне была нужна, включая адрес и порт, к которому должен быть подключен сокет udp, а именно: "192.168.10.123" и порт: 60034 .
И самое важное - данные (массив байтов), которые отправляются в сеть для управления вертолетом.
Я не мог поставить исходный код, потому что он тяжелый. Но вы можете скачать apk (6,6 МБ) и распаковать его с помощью этого инструмента . В извлеченной папке Wifi.java для поиска этот класс содержит полезную информацию.

После того, как я немного понял, как это работает, я начинаю переводить код на C ++ / Qt. Это быстрый пример:

void MainWindow::updateData()
{
QHostAddress host(QString("192.168.10.123"));

socket->connectToHost(host, 60034); // socket as a member

long buffer = GetPowerLeftRightValue();
char data[12];
data[0] = (char) -86;
data[1] = (char) 85;
data[2] = (char) (redContrFg| 96);
data[3] = (char) (((leavl & 7) << 5) | 21);
data[4] = (char) (((char) ((leavl >> 3) & 255)) & 255);
data[5] = (char) ((int) (buffer & 255));
data[6] = (char) ((int) ((buffer >> 8) & 255));
data[7] = (char) ((int) ((buffer >> 16) & 255));
data[8] = (char) ((((rudHeliLUpVal & 3) ^ ((rudHeliLUpVal >> 2) & 3)) << 4) | rudHeliLUpVal);
data[9] = (char) 0;
data[10] = (char) 0;
data[11] = 0;
for(int i=0; i<17; ++i)
  data[11] += data[i];

socket->writeDatagram(data, 12, host, 60034);
}

redContrFg , rudHeliLUpVal , buffer и leavl - целые числа, которые я изменяю с помощью ползунков. Метод updateData запускается каждый раз, когда изменяется значение ползунка.

Но, к сожалению, этот код не работает для меня.

Я начал поиск в Google для некоторых проектов, подобных этому, и нашел похожее здесь . Но, честно говоря, я не мог заставить это работать.

Вот и все, и мне очень жаль, потому что очень больно читать все это!

Любые ваши предложения очень ценятся, и спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...