mirror of
https://github.com/CopterExpress/clover.git
synced 2026-05-30 06:49:32 +00:00
158 lines
8.5 KiB
Markdown
158 lines
8.5 KiB
Markdown
# Олимпиада НТИ 2019
|
||
|
||
## Работа с MQTT
|
||
|
||
[MQTT](https://ru.wikipedia.org/wiki/MQTT) – протокол для обмена сообщениями между различными устройствами. Этот протокол используется для отправки команд дрону на Олимпиаде НТИ 2019. Для отправки сообщения оно публикуется в определенный топик; все подписчики этого топика получают это сообщение.
|
||
|
||
### Подписка на топики
|
||
|
||
В образе Клевера для Олимпиады НТИ 2019 предустановлена библиотека `paho-mqtt` для Python. Пример работы с этой библиотекой описан ниже:
|
||
|
||
```python
|
||
import paho.mqtt.client as mqtt # Импортирование библиотеки mqtt
|
||
|
||
# Callback, вызываемый при получении от сервера подтверждения о подключении
|
||
def on_connect(client, userdata, flags, rc):
|
||
print ("Connected with result code "+str(rc))
|
||
|
||
# Если подписываться на топик в on_connect, то при обрыве соединения
|
||
# и повторном подключении произойдёт автоматическое переподписание
|
||
client.subscribe("/copters/copter1")
|
||
|
||
# Callback, вызываемый при появлении сообщения в одном из топиков, на который
|
||
# подписан клиент
|
||
def on_message(client, userdata, msg):
|
||
# В объекте msg хранится топик, в который пришло сообщение (в поле topic)
|
||
# и само сообщение (в поле payload)
|
||
print(msg.topic, str(msg.payload))
|
||
|
||
# Инициализация клиента MQTT
|
||
client = mqtt.Client()
|
||
# Здесь указываются callback'и, вызываемые при подключении и получении сообщения
|
||
client.on_connect = on_connect
|
||
client.on_message = on_message
|
||
|
||
# Подключение к MQTT-брокеру. Первый параметр - имя или адрес брокера, второй - порт
|
||
# (по умолчанию 1883), третий - максимальное время между сообщениями в секундах
|
||
# (по умолчанию 60).
|
||
client.connect('192.168.11.162', 1883, 60)
|
||
|
||
# Метод loop_start создаёт поток, в котором будет производиться опрос сервера и
|
||
# вызов callback'ов.
|
||
client.loop_start()
|
||
# Далее продолжается ваша программа
|
||
```
|
||
|
||
Более подробная документация доступна на [странице библиотеки в PyPI](https://pypi.org/project/paho-mqtt/).
|
||
|
||
### Проверка
|
||
|
||
Для проверки вы можете опубликовать любое сообщение в топик с помощью команды `hbmqtt_pub`:
|
||
|
||
```bash
|
||
hbmqtt_pub --url mqtt://192.168.0.1:1883 -t /copters/copter1 -m 'сообщение'
|
||
```
|
||
|
||
Где `192.168.0.1` – IP-адрес MQTT-брокера, `сообщение` – сообщение для публикации, `/copters/copter1` – необходимый топик для публикации.
|
||
|
||
### Работа с MQTT
|
||
|
||
В образе Клевера предустановлена библиотека `paho-mqtt` для Python. Пример работы с этой библиотекой описан ниже:
|
||
|
||
```python
|
||
import paho.mqtt.client as mqtt # Импортирование библиотеки mqtt
|
||
|
||
# Callback, вызываемый при получении от сервера подтверждения о подключении
|
||
def on_connect(client, userdata, flags, rc):
|
||
print ("Connected with result code "+str(rc))
|
||
|
||
# Если подписываться на топик в on_connect, то при обрыве соединения
|
||
# и повторном подключении произойдёт автоматическое переподписание
|
||
client.subscribe("/copters/copter1")
|
||
|
||
# Callback, вызываемый при появлении сообщения в одном из топиков, на который
|
||
# подписан клиент
|
||
def on_message(client, userdata, msg):
|
||
# В объекте msg хранится топик, в который пришло сообщение (в поле topic)
|
||
# и само сообщение (в поле payload)
|
||
print (msg.topic+" "+str(msg.payload))
|
||
|
||
# Инициализация клиента MQTT
|
||
client = mqtt.Client()
|
||
# Здесь указываются callback'и, вызываемые при подключении и получении сообщения
|
||
client.on_connect = on_connect
|
||
client.on_message = on_message
|
||
|
||
# Подключение к MQTT-брокеру. Первый параметр - имя или адрес брокера, второй - порт
|
||
# (по умолчанию 1883), третий - максимальное время между сообщениями в секундах
|
||
# (по умолчанию 60).
|
||
client.connect("192.168.11.162", 1883, 60)
|
||
|
||
# Метод loop_start создаёт поток, в котором будет производиться опрос сервера и
|
||
# вызов callback'ов.
|
||
client.loop_start()
|
||
# Далее продолжается ваша программа
|
||
```
|
||
|
||
Более подробная документация доступна на [странице библиотеки в PyPI](https://pypi.org/project/paho-mqtt/).
|
||
|
||
## Работа с Клевером
|
||
|
||
Для выполнения команд на Клевере:
|
||
|
||
* подключитесь в Wi-Fi сети NTI;
|
||
* подключитесь к вашему Клеверу по SSH по его IP-адресу (подробнее см. [подключение по SSH](ssh.md));
|
||
|
||
Для редактирования файлов на Клевере вы можете использовать консольные редакторы `nano` или `vim`. Также вы можете загружать файлы используя PyCharm или WinSCP.
|
||
|
||
Для автономного полета используйте API модуля [simple_offboard](simple_offboard.md).
|
||
|
||
Пример программы, выполняющей взлет, полет в точку в системе координат площадки и посадку на Python:
|
||
|
||
```python
|
||
# coding: utf8
|
||
|
||
import rospy
|
||
from clever import srv
|
||
from std_srvs.srv import Trigger
|
||
|
||
rospy.init_node('flight')
|
||
|
||
get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
|
||
navigate = rospy.ServiceProxy('navigate', srv.Navigate)
|
||
land = rospy.ServiceProxy('land', Trigger)
|
||
|
||
# Взлет на 1 метр со скоростью 1 метр в секунду
|
||
navigate(x=0, y=0, z=1, speed=1, frame_id='body', auto_arm=True)
|
||
|
||
# Ждем 5 секунд
|
||
rospy.sleep(5)
|
||
|
||
# Полет на координаты x=3, y=2, z=1 площадки с углом по рысканью 3.14 радиан со скоростью 0.5 метров в секунду
|
||
navigate(x=3, y=2, z=1, yaw=3.14, speed=0.5, frame_id='aruco_map')
|
||
|
||
# Ждем 5 секунд
|
||
rospy.sleep(5)
|
||
|
||
# Посадка
|
||
land()
|
||
```
|
||
|
||
Для более подробной информации и описания других команд смотрите [API simple_offboard](simple_offboard.md) и [примеры кода](snippets.md).
|
||
|
||
Пример взлета на высоту 1 метр из командной строки:
|
||
|
||
```bash
|
||
rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, yaw_rate: 0.0, speed: 0.5, frame_id: 'body', auto_arm: true}"
|
||
```
|
||
|
||
Для более подробной информации и описания других команд смотрите [API simple_offboard](simple_offboard.md) и [примеры кода](snippets.md).
|
||
|
||
### Работа со светодиодной лентой
|
||
|
||
В используемой версии Клевера LED-лента подключена напрямую к Raspberry Pi. При включении всех светодиодов ленты на полную мощность возможно повреждение цепей питания микрокомпьютера.
|
||
|
||
Сигнальный провод ленты подключен к GPIO-пину 18.
|
||
|
||
Подробнее про работу с LED-лентой можно прочитать [в соответствующей статье](leds.md)
|