Merge branch 'master' into 22-armhf

This commit is contained in:
Oleg Kalachev
2021-03-24 20:59:33 +03:00
418 changed files with 13437 additions and 172 deletions

View File

@@ -1,10 +1,10 @@
# Клевер
<img class="center bigclever zoom" src="../assets/clever4-front-white-large.png" width="80%" alt="Клевер 4">
<img class="center zoom big-clover" src="../assets/clover42-main.png" width="80%" alt="Клевер 4.2">
**«Клевер»** — это учебный конструктор программируемого квадрокоптера, состоящего из популярных открытых компонентов, а также набор необходимой документации и библиотек для работы с ним.
Набор включает в себя полетный контроллер Pixracer с полетным стеком PX4, [Raspberry Pi 4](raspberry.md) в качестве управляющего бортового компьютера, [модуль камеры](camera.md) для реализации полетов с использованием компьютерного зрения, а также набор различных датчиков и другой периферии.
Набор включает в себя полетный контроллер [COEX Pix](coex_pix.md) с полетным стеком PX4, [Raspberry Pi 4](raspberry.md) в качестве управляющего бортового компьютера, [модуль камеры](camera.md) для реализации полетов с использованием компьютерного зрения, а также набор различных датчиков и другой периферии.
Платформа Клевера также включает в себя преднастроенный [образ для Raspberry Pi](image.md) в полным набором необходимого ПО для работы со всей периферией и [программирования автономных полетов](simple_offboard.md). Исходный код платформы Клевера и данной документации открыт и [доступен на GitHub](https://github.com/CopterExpress/clover).

View File

@@ -54,6 +54,8 @@
* [MAVROS](mavros.md)
* [Дополнительные материалы](supplementary.md)
* [COEX Pix](coex_pix.md)
* [COEX PDB](coex_pdb.md)
* [COEX GPS](coex_gps.md)
* [Гид по автономному полету](auto_setup.md)
* [Имя хоста](hostname.md)
* [Симулятор](sitl.md)
@@ -63,6 +65,7 @@
* [Docker-контейнер с симулятором](sitl_docker.md)
* [Установка ROS Melodic](ros-install.md)
* [Калибровка камеры](camera_calibration.md)
* [Подключение к VPN ZeroTire](zerotire_vpn.md)
* [Подключение к VPN Hamachi](hamachi_vpn.md)
* [Управление мультикоптером при помощи 4G связи](4g.md)
* [Пакеты Клевера на Jetson Nano](jetson_nano.md)
@@ -79,7 +82,10 @@
* [Взаимодействие с Arduino](arduino.md)
* [Подключение GPS](gps.md)
* [Работа с ИК датчиками](ir_sensors.md)
* [Установка FPV](fpv.md)
* [Установка FPV](fpv_clover_4_2.md)
* [Установка FPV (Клевер 3)](fpv.md)
* [Магнитный захват](magnetic_grip.md)
* [Механический захват](mechanical_grip.md)
* [Сборка шаровой защиты](sphere_guard.md)
* [Управление в режиме тренера](trainer_mode.md)
* [Техника лужения](tinning.md)
@@ -92,6 +98,8 @@
* [Вклад в Клевер](contributing.md)
* [Переход на версию 0.20](migrate20.md)
* [Переход на версию 0.22](migrate22.md)
* [COEX Duocam](duocam.md)
* [Виртуальная MAVLink-камера](duocam_mavlink.md)
* [Мероприятия](events.md)
* [CopterHack-2021](copterhack2021.md)
* [CopterHack-2019](copterhack2019.md)
@@ -100,12 +108,15 @@
* [CopterHack-2018](copterhack2018.md)
* [CopterHack-2017](copterhack2017.md)
* [Проекты на базе Клевера](projects.md)
* [Система автоматической посадки (AMLS)](amls.md)
* [Разработка системы для управления БПЛА с помощью шлема виртуальной реальности](remote-control-with-oculusvr.md)
* [Шоу коптеров](clever-show.md)
* [Innopolis Open 2020 (L22_ÆRO)](innopolis_open_L22_AERO.md)
* [Олимпиада НТИ 2020 (P4DF2)](nti2020_p4df2.md)
* [Генератор ArUco карт](arucogenmap.md)
* [Модель аэротакси в городе](bigchallenges.md)
* [Шаровая защита коптера](shield.md)
* [Система засечки для дронов](race_timing_sys_copterhack.md)
* [Дрон для 3D-сканирования человека](3dscan.md)
* [Распознавание лиц](face_recognition.md)
* [Управление дроном силой мысли](control_emotions.md)
@@ -114,6 +125,15 @@
* [Блочный конструктор полета](clever_blocks.md)
* [Калибровка камеры (legacy)](camera_calib.md)
* [Управление дроном для оценки позы человека](human_pose_estimation_drone_control.md)
* [Распознавание видов агрокультур](agriculture.md)
* [AdvancedClover](advanced_clover.md)
* [Дрон для высаживания семян](seeding_drone.md)
* [Граффити коптер D-drone](ddrone.md)
* [Программируемый летающий автомобиль](zaural_viking.md)
* [Дрон-Агроном](drone-agronom.md)
* [Easy To Fly](easytofly.md)
* [Хардатон Квиддич](hardaton_quidditch.md)
* [Октокоптер со специфичным расположением пропеллеров](oktazodg.md)
## Учебник

View File

@@ -0,0 +1,91 @@
# Advanced Clover
[CopterHack-2021](copterhack2021.md), team **FTL**. Контакты: @maximmasterr в Telegram.
Как-то раз устав выполнять некоторые действия с Клевером мы решили их упростить, и так появился проект advancedClover, которой включает в себя следующие элементы:
* IDE
* VSCode-like IDE в браузере
* Интегрированный файловый менеджер
* Интегрированный терминал
* Автокомплит
* Возможность просмотра топиков
* Возможность просмотра топиков с изображениями
* Возможность вызова сервисов
* Возможность просмотра статуса коптера
* Библиотека для Python
* Упрощение работы с навигацией
* Упрощение работы с камерой
Пример автокомплита, терминала и файлового менеджера:
![Пример автокомплита, терминала и файлового менеджера](../assets/advancedClover1.png)
Пример инструментов ROS и Copter Status:
![Пример инструментов ROS и Copter Status](../assets/advancedClover2.png)
Пример полёта по квадрату с использованием advancedClover:
![Пример полёта по квадрату с использованием advancedClover](../assets/advancedClover3.png)
Более подробно об установке и использовании advancedClover можно почитать [здесь](https://ftl-team.github.io/cloverIDE).
## Технические подробности
Итак, что у нас внутри:
* [Theia](https://theia-ide.org/) прикольная web IDE которая очень похожа на VSCode и во многом даже лучше его.
* Расширения для vscode (работает и в theia), предоставляющее инструменты ROS.
* Питоновская библиотек, на самом деле это просто примеры из документации вынесенные в классы.
* Документация на docsify (gitbook слишком усложнён).
* Сборка на GitHub actions.
На самом деле интерес представляет только расширение, но я расскажу о всех частях.
### IDE
Изначально мы использовали code-server, но он слишком долго собирался и был монолитен, поэтому мы перешли на theia которая менее монолитна и собирается намного быстрее, однако её пришлось допилить:
1. Theia по дефолту тянет с собой около 1гб `node_modules` что не очень хорошо, так что мы добавили сборку в один бинарник с помощью pkg, однако необходимо патчик код генерируемый при build перед упаковкой в бинарник с помощью [патча](https://raw.githubusercontent.com/FTL-team/cloverIDE/master/ide/src.patch).
2. Несмотря на то что по сравнению с code-server сборка занимала раза в три меньше времени, её пришлось ещё немного распараллелить вынеся скачивание плагинов/расширений в отдельный job на GitHub actions.
3. Благодаря стараниям тех людей кто пишет web-стандарты theia нормально работает либо на HTTPS, либо на localhost, по этому мы написали специальную программку на golang которая на лету генерирует сертификат, подписывает его корневым (который установил пользователь), и им по нему отправляет HTTPS.
### Расширение
Вот здесь самое интересное, расширение написано на TypeScript, собирается с помощью webpack и использует react, roslibjs и OpenCV.
#### ROSLIB.js
Для коммуникации с ROS используется библиотека roslib.js, у неё есть некоторые особенности:
1. Так как мы используем строго (ну почти) типизированный TypeScript нам нужен типизированный ROS, типизация по дефолту лежит в DefinitelyTyped, но она там немного кривая, поэтому лучше создать [файл](https://github.com/FTL-team/cloverIDE/blob/master/cloverExtension/src/ros/roslib.d.ts) roslib.d.ts который будет содержать типизацию для roslibjs и в случае если она не совпадает исправлять её.
2. Roslib использует колбэки а они очень неудобные, поэтому мы промисифицировали функции roslib. [Здесь](https://github.com/FTL-team/cloverIDE/blob/master/cloverExtension/src/ros/core.ts).
3. Потом была написана обёртка для roslib которая ещё немного упростила работу с [сервисами](https://github.com/FTL-team/cloverIDE/blob/master/cloverExtension/src/ros/service.ts) и [топиками](https://github.com/FTL-team/cloverIDE/blob/master/cloverExtension/src/ros/topic.ts).
4. И ещё мы написали [хуки](https://github.com/FTL-team/cloverIDE/tree/master/cloverExtension/src/ros/hooks) для реакта что бы ещё немного упростить работу.
5. ROS умеет кодировать сообщения в cbot или в json, json не умеет принимать 64-битные числа (они становятся неточными) и занимает больше места, а cbor из-за кривой реализации не может отправлять массивы сообщений но зато меньше по размеру и умеет в 64-bit.
6. Чтобы декодировать MAVLink нужно получать массив из 64 битных чисел, в js они называются BigInt, однако roslib когда видит 64 битное число обрезает его, поэтому мы написали [замену](https://github.com/FTL-team/cloverIDE/blob/master/cloverExtension/roslibCBOR.js) модулю roslib, замена применяется вебпаком.
#### Рендеринг картинок
Изначально мы использовали web video server для отображения картинок, однако он немного плохо работал и мы переписали рендеринг картинок на OpenCV, и тут кроется несколько подвохов:
1. Загрузка OpenCV происходит асинхронно повлиять на это никак нельзя, самым простым решением оказалось использование экспериментальной штуки в webpack под названием top-level async, мы написали простой [модуль](https://github.com/FTL-team/cloverIDE/blob/1e171e1709b1dfde0c11c3b2e00687d7e9091a9f/cloverExtension/src/opencv/index.ts) который загружает OpenCV, и когда мы хотим использовать OpenCV мы импортируем этот модуль и вызываем в top-level асинхронную функцию которая загружает OpenCV.
2. Так как картинки весят много и слать их закодированными в base64 не очень удобно, мы для получения картинок используем CBOR
3. В ROS картинки могут приходить в разных форматах по этому мы написали [функцию](https://github.com/FTL-team/cloverIDE/blob/1e171e1709b1dfde0c11c3b2e00687d7e9091a9f/cloverExtension/src/ros/image.ts#L31) которая конвертирует их в RGB.
В общем можно посмотреть как это делается [здесь](https://github.com/FTL-team/cloverIDE/blob/master/cloverExtension/src/components/ImageTopic.tsx).
#### И ещё чуть чуть веселья
1. Не всё что можно узнать от контроллера публикуется в mavros поэтому надо парсить MAVLink, для этого юзаем кодирование cbor и затем вытягиваем данные на основе данных [отсюда](https://mavlink.io/en/messages/common.html).
2. TF2 в roslib не очень удобен, по этому чтобы получить позицию коптера нужно запрашивать фрэйм `map` и смотреть трансформации относительно его (не забывайте их инвертировать).
### Библиотека для питона
Является в основном просто красиво оформленным кодом написанным в примерах кода из документации Клевера, однако есть интересный момент с получением картинки, он в отличие от стандартного возвращает последнюю полученную картинку предоставляя API похожий на `VideoCapture`, более подробно можно посмотреть [здесь](https://github.com/FTL-team/cloverIDE/blob/master/pylib/image.py).
### Сборка и Документация
Документация написана на markdown, рендерится с помощью docsify (ибо gitbook слишком переусложнён).
Проект собирается на GitHub actions, сборка максимально распаралелена.

147
docs/ru/agriculture.md Normal file
View File

@@ -0,0 +1,147 @@
# Распознавание видов агрокультур в массовом сельском производстве
## Введение
Современное сельское хозяйство во многих странах превращается в один из ярких примеров быстрого и успешного внедрения новых технологий. Беспилотные летательные аппараты способны выполнять широкий круг задач, среди которых мониторинг сельскохозяйственных угодий сегодня стал уже почти привычным инструментом повышения эффективности сельских хозяйств. Целью моего проекта является написание кода для распознавания видов агрокультур в массовом сельском производстве. В дальнейшем из результатов распознавания можно спроектировать карту посевных площадей.
## Мониторинг
В сельском хозяйстве мониторинг необходим для получения информации о состоянии угодий и посевов. Фермеры или специалисты могут по результатам мониторинга понять, нормально ли всходят культуры, есть ли угроза со стороны сорняков и/или насекомых вредителей, какова степень увлажненности отдельных участков или целых площадей и т.д.
## Объяснение кода
Подключаем библиотеки:
```python
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import numpy as np
```
Создаём некоторые переменные:
```python
rospy.init_node('computer_vision_sample')
bridge = CvBridge()
color = 'undefined'
shape = 'undefined'
culture = ""
```
Для реализации алгоритмов компьютерного зрения рекомендуется использовать предустановленную на образ Клевера библиотеку OpenCV.
 Создаём подписчика на топик с изображением с основной камеры для обработки с использованием OpenCV:
```python
def image_colback_color(data):
global color, shape
cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') # OpenCV image
img_hsv = cv2.cvtColor(cv_image, cv2.COLOR_BGR2HSV) #[118:119,158:159]
#detected color
#print(img_hsv[0][0])
```
Каждая культура имеет свой неповторимый оттенок(пшеница- золотистая, гречиха - светло-коричневая).
<img src="../assets/field.jpg" width="75%">
<img src="../assets/field2.jpg" width="75%">
Прописываем диапазоны цветов для определённых культур:
```python
#пшеница
yellow_orange_low = (38, 110, 150)
yellow_orange_high= (52, 110, 150)
#гречиха
brown_low = (23, 50, 50)
brown_high= (37, 50, 50)
yellow_orange_mask = cv2.inRange(img_hsv, yellow_orange_low, yellow_orange_high)
brown_mask = cv2.inRange(img_hsv, brown_low, brown_high)
if yellow_orange_mask[119][159] == 255:
shape = shape_recog(yellow_orange_mask)
elif brown_mask[119][159] == 255:
shape = shape_recog(brown_mask)
else:
shape = 'undefined'
color = 'undefined'
if shape = 'brown':
culture = "greshiha"
if shape = 'yellow_orange':
culture = "pshenitsa"
image_sub = rospy.Subscriber('main_camera/image_raw', Image, image_colback_color)
```
Скрипт будет занимать 100% процессора. Для искусственного замедления работы скрипта можно запустить throttling кадров с камеры, например, в 5 Гц (`main_camera.launch`):
```xml
<node pkg="topic_tools" name="cam_throttle" type="throttle" args="messages main_camera/image_raw 5.0 main_camera/image_raw_throttled"/>
```
Топик для подписчика в этом случае необходимо поменять на: `main_camera/image_raw_throttled`.
```python
print (culture)
while not rospy.is_shutdown():
print("color: {}".format(color))
print("shape: {}".format(shape))
rospy.sleep(0.2)
```
Данная программа будет определять культуру по её оттенку. Для повышения точности определения можно использовать больше цветовых диапазонов и дрон сможет распознавать большее количество культур.
Вот примеры цветовых диапазонов:
```python
red_low1 = (0, 110, 150)
red_high1 = (7, 255, 255)
red_low2 = (172, 110, 150)
red_high2 = (180, 255, 255)
red_orange_low = (8, 110, 150)
red_orange_high = (22, 110, 150)
orange_low = (23, 110, 150)
orange_high = (37, 110, 150)
yellow_orange_low = (38, 110, 150)
yellow_orange_high = (52, 110, 150)
yellow_low = (53, 150, 150)
yellow_high = (67, 255, 255)
yellow_green_low = (68, 150, 150)
yellow_green_high = (82, 255, 255)
green_low = (83, 150, 150)
green_high = (97, 255, 255)
blue_green_low = (98, 150, 150)
blue_green_high = (113, 255, 255)
blue_low = (114, 150, 150)
blue_high = (127, 255, 255)
blue_violet_low = (128, 150, 150)
blue_violet_high = (142, 255, 255)
violet_low = (143, 150, 150)
violet_high = (157, 255, 255)
red_violet_low = (158, 150, 150)
red_violet_hugh = (171, 255, 255)
```
Обратите внимание, что для красного цвета используется два диапазона т. к. красный цвет находится на границах цветового пространства HSV.

674
docs/ru/amls.md Normal file
View File

@@ -0,0 +1,674 @@
# Autonomous Multirotor Landing System (AMLS)
![Logo](../assets/amls/logo_book.png "Logo")
## Цель проекта: Автоматически посадить дрон в движении
### Статья о проекте AMLS
В этой статье будет описание нашего проекта, а именно, алгоритмов оптической стабилизации, удержания по GPS, следование по GPS, удержания высоты, системы захватов, крыши, измерения освещённости, скорости движения платформы. Также, после прочтения статьи станет понятно, как работает проект AMLS!
### Основной репозиторий проекта на GitHub
https://github.com/XxOinvizioNxX/Liberty-Way
### Разработчики
- [Павел Нешумов](mailto:xxoinvizionxx@gmail.com)
- [Андрей Кабалин](mailto:astik452@gmail.com)
- [Владислав Яснецкий](mailto:vlad.yasn@gmail.com)
![Drone 1](../assets/amls/drone_meme.jpg "Drone 1")
-----------
## Оглавление
- [0. Как это работает?](#how-it-works)
- [0.1. Видео про наш проект](#short-video-about-our-project-clickable)
- [1. Удержание по GPS и полёт по точкам](#hold-and-flight-to-waypoints-functions)
- [1.1. Чтение данных из UART](#serial-reading)
- [1.2. Парсинг протокола UBlox](#ublox-parsing)
- [1.3. Установка текущей путевой точки](#set-current-waypoint)
- [1.4. Изменение точек (Чтобы летать по координатам)](#waypoint-edit-to-fly-to-waypoints)
- [1.5. Удержание конкретной позиции](#waypoint-stabilization)
- [2. Следование за платформой](#following)
- [3. Компас](#compass)
- [4. Удержание высоты (барометр)](#altitude-stabilization-barometer)
- [5. Оптическая стабилизация](#optical-stabilization)
- [5.1. Так сложно и так важно](#so-difficult-and-so-important)
- [5.2. Первые шаги](#first-steps)
- [5.3. Инверсия](#inverse-approach)
- [5.4. Версия на Java](#java-edition)
- [5.5. Liberty-Way](#liberty-way)
- [5.6. Связь с дроном](#communication-with-the-drone)
- [5.7. Подвес для камеры](#camera-gimbal)
- [6. Платформа Eitude](#eitude-amls-platform)
- [6.1. Система захватов](#grabbing-system)
- [6.2. Крыша](#weather-protection-system)
- [6.3. Спидометр](#platform-speedometer)
- [6.4. Датчики уровня освещённости](#platform-light-sensor)
- [7. Заключение](#conclusion)
-----------
## 0. Как это работает? {#how-it-works}
Система состоит из двух частей:
- Дрона
![Liberty-X](../assets/amls/liberty-x_side_cutout_2_small.png "Liberty-X")
- И платформы, или подвижной (на автомобиле), или статичной (на постамате)
![Platform](../assets/amls/platform_side_transparent.png "Platform")
Порядок действий выглядит так:
- В начале, дрон с посылкой находится далеко от платформы. По сотовой связи или другому радиоканалу, ему отправляются GPS координаты платформы (на дроне установлен модуль Liberty-Link, способный корректировать его положение, независимо от прошивки полётного контроллера. (Модуль ставится в разрыв линии от приёмника (пульта) до полётника).
- Дрон летит на эти координаты. В процессе полёта они могут обновляться (но не часто, чтобы не нагружать канал).
- Когда дрон подлетает близко к платформе, включается стабилизация по GPS. Тут уже данные передаются по ближней радиосвязи и с большой частотой, чтобы дрон успевал за платформой.
- Вместе с этим, происходит снижение дрона (на платформе и дроне есть барометры). Снижение происходит до высоты 1.5-2 метра над платформой.
- В момент снижения включается оптическая (прецизионная) стабилизация с платформы. Как только камера увидит метку, алгоритм "захватит" дрон.
- После включения оптической стабилизации, GPS отходит на второй план и является страхующим (на случай, если что-то пойдёт не так, снова включается GPS стабилизация).
- Во время оптической стабилизации на дроне закреплена ArUco метка, которую видит камера на платформе и по ближней радиосвязи посылает на дрон корректирующие значения.
- Одновременно с оптической стабилизацией включается и посадка. Этот алгоритм искусственно плавно снижает setpoint по высоте (Z) до некоторого порога.
- Как только снижение достигло нужного значения, подаётся команда на платформу для активации механических захватов, которые должны поймать дрон.
- После поимки дрона, происходит его обслуживание, разгрузка посылки и закрытие крыши над платформой (для защиты от неблагоприятных погодных условий).
- На этом посадка завершена!
### Видео про наш проект (кликабельно) {#short-video-about-our-project-clickable}
<iframe width="560" height="315" src="https://www.youtube.com/embed/6qjS-iq6a3k" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
-----------
## 1. Удержание по GPS и полёт по точкам {#hold-and-flight-to-waypoints-functions}
Как уже было сказано ранее, на дроне установлен "универсальный" модуль Liberty-Link, принимающий команды с платформы и корректирующий положение дрона, вмешиваясь в сигнал с пульта управления (подробнее об этом в следующих пунктах).
В Liberty-Link будет встроенный GPS модуль, и, соответственно, возможность поддержания положения по GPS и следования по точкам. Результат работы алгоритма поддержания позиции по GPS (кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/x364giIt6lc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
GPS-модуль будет использоваться из семейства UBlox (например, UBlox Neo-M8). Установлено будет 1 или 3 (для минимизации погрешности) модуля.
![GPS Module](../assets/amls/liberty-x_front_cutout_2_small_gps.png "GPS Module")
Модули работают по UART-интерфейсу. Настроены на частоту отправки 5 раз в секунду. Прошивка Liberty-Link будет читать данные с модулей и вычислять координаты текущего положения.
### 1.1. Чтение данных из UART {#serial-reading}
Чтение данных с модуля в буфер выглядит так:
```cpp
// Read data from the GPS module
while (GPS_serial.available() && new_line_found == 0) {
// Stay in this loop as long as there is serial information from the GPS available
char read_serial_byte = GPS_serial.read();
if (read_serial_byte == '$') {
// Clear the old data from the incoming buffer array if the new byte equals a $ character
for (message_counter = 0; message_counter <= 99; message_counter++) {
incoming_message[message_counter] = '-';
}
// Reset the message_counter variable because we want to start writing at the begin of the array
message_counter = 0;
}
// If the received byte does not equal a $ character, increase the message_counter variable
else if (message_counter <= 99)
message_counter++;
// Write the new received byte to the new position in the incoming_message array
incoming_message[message_counter] = read_serial_byte;
// Every NMEA line end with a '*'. If this character is detected the new_line_found variable is set to 1
if (read_serial_byte == '*') new_line_found = 1;
}
```
### 1.2. Парсинг протокола UBlox {#ublox-parsing}
После, из заполненного буфера вычисляются широта, долгота, тип корректировки (2D, 3D) и количество спутников.
Парсинг GPS данных протокола UBlox выглядит так:
```cpp
// If the software has detected a new NMEA line it will check if it's a valid line that can be used
if (new_line_found == 1) {
// Reset the new_line_found variable for the next line
new_line_found = 0;
if (incoming_message[4] == 'L' && incoming_message[5] == 'L' && incoming_message[7] == ',') {
// When there is no GPS fix or latitude/longitude information available
// Set some variables to 0 if no valid information is found by the GPS module. This is needed for GPS lost when flying
l_lat_gps = 0;
l_lon_gps = 0;
lat_gps_previous = 0;
lon_gps_previous = 0;
number_used_sats = 0;
}
// If the line starts with GA and if there is a GPS fix we can scan the line for the latitude, longitude and number of satellites
if (incoming_message[4] == 'G' && incoming_message[5] == 'A' && (incoming_message[44] == '1' || incoming_message[44] == '2')) {
// Filter the minutes for the GGA line multiplied by 10
lat_gps_actual = ((int)incoming_message[19] - 48) * (long)10000000;
lat_gps_actual += ((int)incoming_message[20] - 48) * (long)1000000;
lat_gps_actual += ((int)incoming_message[22] - 48) * (long)100000;
lat_gps_actual += ((int)incoming_message[23] - 48) * (long)10000;
lat_gps_actual += ((int)incoming_message[24] - 48) * (long)1000;
lat_gps_actual += ((int)incoming_message[25] - 48) * (long)100;
lat_gps_actual += ((int)incoming_message[26] - 48) * (long)10;
// To convert the minutes to degrees we need to divide the minutes by 6
lat_gps_actual /= (long)6;
// Add the degrees multiplied by 10
lat_gps_actual += ((int)incoming_message[17] - 48) * (long)100000000;
lat_gps_actual += ((int)incoming_message[18] - 48) * (long)10000000;
// Divide everything by 10
lat_gps_actual /= 10;
// Filter the minutes for the GGA line multiplied by 10
lon_gps_actual = ((int)incoming_message[33] - 48) * (long)10000000;
lon_gps_actual += ((int)incoming_message[34] - 48) * (long)1000000;
lon_gps_actual += ((int)incoming_message[36] - 48) * (long)100000;
lon_gps_actual += ((int)incoming_message[37] - 48) * (long)10000;
lon_gps_actual += ((int)incoming_message[38] - 48) * (long)1000;
lon_gps_actual += ((int)incoming_message[39] - 48) * (long)100;
lon_gps_actual += ((int)incoming_message[40] - 48) * (long)10;
// To convert the minutes to degrees we need to divide the minutes by 6
lon_gps_actual /= (long)6;
// Add the degrees multiplied by 10
lon_gps_actual += ((int)incoming_message[30] - 48) * (long)1000000000;
lon_gps_actual += ((int)incoming_message[31] - 48) * (long)100000000;
lon_gps_actual += ((int)incoming_message[32] - 48) * (long)10000000;
// Divide everything by 10
lon_gps_actual /= 10;
if (incoming_message[28] == 'N')
// When flying north of the equator the latitude_north variable will be set to 1
latitude_north = 1;
else
// When flying south of the equator the latitude_north variable will be set to 0
latitude_north = 0;
if (incoming_message[42] == 'E')
// When flying east of the prime meridian the longiude_east variable will be set to 1
longiude_east = 1;
else
// When flying west of the prime meridian the longiude_east variable will be set to 0
longiude_east = 0;
// Filter the number of satillites from the GGA line
number_used_sats = ((int)incoming_message[46] - 48) * (long)10;
number_used_sats += (int)incoming_message[47] - 48;
if (lat_gps_previous == 0 && lon_gps_previous == 0) {
// If this is the first time the GPS code is used
// Set the lat_gps_previous variable to the lat_gps_actual variable
lat_gps_previous = lat_gps_actual;
// Set the lon_gps_previous variable to the lon_gps_actual variable
lon_gps_previous = lon_gps_actual;
}
// Divide the difference between the new and previous latitude by ten
lat_gps_loop_add = (float)(lat_gps_actual - lat_gps_previous) / 10.0;
// Divide the difference between the new and previous longitude by ten
lon_gps_loop_add = (float)(lon_gps_actual - lon_gps_previous) / 10.0;
// Set the l_lat_gps variable to the previous latitude value
l_lat_gps = lat_gps_previous;
// Set the l_lon_gps variable to the previous longitude value
l_lon_gps = lon_gps_previous;
// Remember the new latitude value in the lat_gps_previous variable for the next loop
lat_gps_previous = lat_gps_actual;
// Remember the new longitude value in the lat_gps_previous variable for the next loop
lon_gps_previous = lon_gps_actual;
}
// If the line starts with SA and if there is a GPS fix we can scan the line for the fix type (none, 2D or 3D)
if (incoming_message[4] == 'S' && incoming_message[5] == 'A')
fix_type = (int)incoming_message[9] - 48;
}
```
### 1.3. Установка текущей путевой точки {#set-current-waypoint}
Далее, с полученными данными и происходит самая магия. Для включения поддержания текущего положения достаточно установить флаг `waypoint_set = 1;` и установить текущие координаты как waypoint:
```cpp
l_lat_waypoint = l_lat_gps;
l_lon_waypoint = l_lon_gps;
```
После этого, начнётся вычисление ошибки в координатах и корректировка с помощью PD - регулятора. Для D - составляющей используется rotation memory.
<a name="14-waypoint-edit-to-fly-to-waypoints"></a>
### 1.4. Изменение точек (Чтобы летать по координатам) {#waypoint-edit-to-fly-to-waypoints}
Если просто задать новые `l_lat_waypoint` и `l_lon_wayoint`, находящиеся на большом удалении от дрона, он не сможет нормально прилететь и стабилизироваться на этих координатах. Для плавного изменения можно использовать переменные `l_lat_gps_float_adjust` и `l_lon_gps_float_adjust`. Это переменные типа `float`, изменяя которые, `l_lat_waypoint` и `l_lon_waypoint` будут плавно меняться.
Например, если в основном цикле постоянно прибавлять некую величину к этим переменным:
```cpp
l_lat_gps_float_adjust += 0.0015;
```
При установленном waypoint, дрон будет плавно перемещаться в заданном направлении.
В дальнейшим это будет использоваться для плавного ускорения и замедления во время движения к точке.
### 1.5. Удержание конкретной позиции {#waypoint-stabilization}
```cpp
if (waypoint_set == 1) {
//If the waypoints are stored
// Adjust l_lat_waypoint
if (l_lat_gps_float_adjust > 1) {
l_lat_waypoint++;
l_lat_gps_float_adjust--;
}
if (l_lat_gps_float_adjust < -1) {
l_lat_waypoint--;
l_lat_gps_float_adjust++;
}
// Adjust l_lon_waypoint
if (l_lon_gps_float_adjust > 1) {
l_lon_waypoint++;
l_lon_gps_float_adjust--;
}
if (l_lon_gps_float_adjust < -1) {
l_lon_waypoint--;
l_lon_gps_float_adjust++;
}
// Calculate the latitude error between waypoint and actual position
gps_lon_error = l_lon_waypoint - l_lon_gps;
// Calculate the longitude error between waypoint and actual position
gps_lat_error = l_lat_gps - l_lat_waypoint;
// Subtract the current memory position to make room for the new value
gps_lat_total_average -= gps_lat_rotating_mem[gps_rotating_mem_location];
// Calculate the new change between the actual pressure and the previous measurement
gps_lat_rotating_mem[gps_rotating_mem_location] = gps_lat_error - gps_lat_error_previous;
// Add the new value to the long term average value
gps_lat_total_average += gps_lat_rotating_mem[gps_rotating_mem_location];
// Subtract the current memory position to make room for the new value
gps_lon_total_average -= gps_lon_rotating_mem[gps_rotating_mem_location];
// Calculate the new change between the actual pressure and the previous measurement
gps_lon_rotating_mem[gps_rotating_mem_location] = gps_lon_error - gps_lon_error_previous;
// Add the new value to the long term average value
gps_lon_total_average += gps_lon_rotating_mem[gps_rotating_mem_location];
// Increase the rotating memory location
gps_rotating_mem_location++;
if (gps_rotating_mem_location == 35)
// Start at 0 when the memory location 35 is reached
gps_rotating_mem_location = 0;
// Remember the error for the next loop
gps_lat_error_previous = gps_lat_error;
gps_lon_error_previous = gps_lon_error;
//Calculate the GPS pitch and roll correction as if the nose of the multicopter is facing north.
//The Proportional part = (float)gps_lat_error * gps_p_gain.
//The Derivative part = (float)gps_lat_total_average * gps_d_gain.
gps_pitch_adjust_north = (float)gps_lat_error * gps_p_gain + (float)gps_lat_total_average * gps_d_gain;
gps_roll_adjust_north = (float)gps_lon_error * gps_p_gain + (float)gps_lon_total_average * gps_d_gain;
if (!latitude_north)
// Invert the pitch adjustmet because the quadcopter is flying south of the equator
gps_pitch_adjust_north *= -1;
if (!longiude_east)
// Invert the roll adjustmet because the quadcopter is flying west of the prime meridian
gps_roll_adjust_north *= -1;
//Because the correction is calculated as if the nose was facing north, we need to convert it for the current heading.
gps_roll_adjust = ((float)gps_roll_adjust_north * cos(angle_yaw * 0.017453)) + ((float)gps_pitch_adjust_north * cos((angle_yaw - 90) * 0.017453));
gps_pitch_adjust = ((float)gps_pitch_adjust_north * cos(angle_yaw * 0.017453)) + ((float)gps_roll_adjust_north * cos((angle_yaw + 90) * 0.017453));
//Limit the maximum correction to 300. This way we still have full control with the pitch and roll stick on the transmitter.
if (gps_roll_adjust > 300) gps_roll_adjust = 300;
if (gps_roll_adjust < -300) gps_roll_adjust = -300;
if (gps_pitch_adjust > 300) gps_pitch_adjust = 300;
if (gps_pitch_adjust < -300) gps_pitch_adjust = -300;
}
```
## 2. Следование за платформой {#following}
Основной задачей стабилизации по GPS-координатам стала разработка алгоритма предсказания положения дрона. Самым простым способом представилось использовать математический расчет следующего положения дрона. Это вычисляется для наиболее точного позиционирования дрона в отношении посадочной платформы.
Для начала был придуман простейший алгоритм расчета коэффициента изменения координат. Реализация производилась на языке Python. На этапе тестирования данного алгоритма встала проблема симуляции генерации GPS-координат. Дабы разрешить эту проблему, было испробовано много различных ресурсов: от открытых исходных кодов самодельных навигаторов до попытки использовать API Google Maps, Yandex Maps или 2GIS. И лишь спустя семестр мы додумались до простого изменения значений по некоторой дельте с отрисовкой в MatPlotLib либо PyQtGraph. До этого всё тестирование алгоритма производилось с использованием инструментария прошивки PX4, симулятора движения дрона Gazebo. Как следствие было преодолено много формальностей в вопросах общения с симулятором и увеличением производительности.
Видео работы алгоритма предсказания GPS координат (кликабельно)
<iframe width="560" height="315" src="https://www.youtube.com/embed/Rg-Y_fl4BKQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Конечный результат ошибки предсказанных координат достиг диапазона от 0 до 70 см.
-----------
<a name="3-compass"></a>
## 3. Компас {#compass}
До момента оптической стабилизации (во время GPS стабилизации), для вычисления вектора корректировки по GPS требуется знать точный угол по компасу. Для этого используется встроенный в GPS модуль компас.
Т.к. во время полёта меняются углы крена и тангажа, требуется корректировать значения с компаса. В общем плане, вычисления угла с комапса выглядит так:
```cpp
// The compass values change when the roll and pitch angle of the quadcopter changes. That's the reason that the x and y values need to calculated for a virtual horizontal position
// The 0.0174533 value is phi/180 as the functions are in radians in stead of degrees
compass_x_horizontal = (float)compass_x * cos(angle_pitch * -0.0174533) + (float)compass_y * sin(angle_roll * 0.0174533) * sin(angle_pitch * -0.0174533) - (float)compass_z * cos(angle_roll * 0.0174533) * sin(angle_pitch * -0.0174533);
compass_y_horizontal = (float)compass_y * cos(angle_roll * 0.0174533) + (float)compass_z * sin(angle_roll * 0.0174533);
// Now that the horizontal values are known the heading can be calculated. With the following lines of code the heading is calculated in degrees.
// Please note that the atan2 uses radians in stead of degrees. That is why the 180/3.14 is used.
if (compass_y_horizontal < 0)actual_compass_heading = 180 + (180 + ((atan2(compass_y_horizontal, compass_x_horizontal)) * (180 / 3.14)));
else actual_compass_heading = (atan2(compass_y_horizontal, compass_x_horizontal)) * (180 / 3.14);
// Add the declination to the magnetic compass heading to get the geographic north
actual_compass_heading += declination;
// If the compass heading becomes smaller then 0, 360 is added to keep it in the 0 till 360 degrees range
if (actual_compass_heading < 0) actual_compass_heading += 360;
// If the compass heading becomes larger then 360, 360 is subtracted to keep it in the 0 till 360 degrees range
else if (actual_compass_heading >= 360) actual_compass_heading -= 360;
```
Понятно, что угол с компаса можно использовать и для поддержания угла рыскания дрона в целом. При полётах по точкам это, возможно, будет реализовано. Но данный момент, острой необходимости в этом нет, т.к. после начала оптической стабилизации, её алгоритм способен корректировать дрон независимо от его угла рыскания. Также, во время оптической стабилизации угол автоматически корректируется.
-----------
## 4. Удержание высоты (барометр) {#altitude-stabilization-barometer}
До момента оптической стабилизации (во время GPS стабилизации), наш модуль Liberty-Link будет иметь возможность поддержания высоты при помощи барометра.
На платформе, так же, как и в Liberty-Link будут установлены следующие барометры MS5611.
![MS5611](../assets/amls/ms5611_barometer.png "MS5611")
Согласно документации, разрешение по высоте составляет 10см. Алгоритм будет брать значения давления и, пропуская его через ПИД-регулятор, стабилизировать высоту дрона, изменяя Throttle (3-ий канал).
Видео работы алгоритма удержания высоты по барометру (кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/xmvcGeZzEfc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Во время полёта по точкам, setpoint давления будет уменьшаться, для повышения высоты (лететь по прямой безопаснее на большой высоте, чтобы ни во что не врезаться). А во время стабилизации по GPS (когда дрон находится уже близко к платформе), дрону будет задан setpoint по давлению такой, чтобы соответствовать ~1.5-2м высоты над платформой.
-----------
## 5. Оптическая стабилизация {#optical-stabilization}
### 5.1. Так сложно и так важно {#so-difficult-and-so-important}
Оптическая стабилизация - самая важная и сложная часть нашего проекта. Только благодаря этим алгоритмам в наших условиях возможно достаточно точно удерживать дрон над платформой. Текущая версия алгоритма оптической стабилизации вместе с описанием для повторения, доступна в нашем основном репозитории на GitHub. В дальнейшем, к ней добавится и стабилизация по GPS.
### 5.2. Первые шаги {#first-steps}
Так как мы не знали насколько реальным окажется выполнение этой далеко не простой задачи, первое что мы сделали, это определились, с помощью чего возможно точно стабилизировать дрон в пространстве.
И тут, практически единогласно победил вариант с оптической стабилизации при помощи меток дополненной реальности. Во первых, это достаточно бюджетно, не нужны дорогостоящие системы GPS RTK, а, во вторых, дает требуемую точность.
Одной из самых первых идей - было приделать Raspberry Pi к дрону, как это сделано на платформе Клевер, и стабилизироваться по метке на платформе.
Тест прототипа первой оптической стабилизации (кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/TrrxXOHAqbQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Но, проведя пару тестов от этой идеи мы быстро отказались. Для начала, Raspberry Pi очень слабая для быстрого вычисления такого объема данных, во вторых, сама идея установки на каждый дрон компьютера выглядит нерациональной.
Также, у нас были промежуточные прототипы, например, попытки использовать цветовые маркеры (окружности различных цветов), но эти идеи не оказались достаточно работоспособными.
### 5.3. Инверсия {#inverse-approach}
Так мы и пришли к текущему виду оптической стабилизации, когда камера с мощным компьютером расположены на платформе, а на дроне лишь ArUco 4x4 метка и модуль, управляющий им.
Самые первые тесты, в этом примере даже нет оценки положения маркера (pose estimation)(кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/A2oq6zCebVo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Далее, были внедрены алгоритмы Pose Estimation благодаря библиотеке OpenCV. Первые тесты показали что мы на верном пути!
Pose Estimation Pyhton (кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/kE3UmJZ00so" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Но, по прежнему, алгоритмы были далеки от идеала. Например, т.к. код писался на Python (https://github.com/XxOinvizioNxX/Liberty-X_Point), производительность была не велика, также, не было нормального контроля потоков. Поэтому, пришлось что-то менять.
### 5.4. Версия на Java {#java-edition}
Взвесив все ЗА и ПРОТИВ, было решено переписать всю оптическую стабилизацию на Java. Так и появилась первая версия Liberty-Way. На этот раз было решено подойти к ООП основательно, и, после небольшой настройки получился отличный алгоритм стабилизации и посадки.
Тест посадки на Liberty-Way v.beta_0.0.1 (кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/8VAobWPFG8g" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
### 5.5. Liberty-Way {#liberty-way}
Далее последовало много доработок и исправлений ошибок. В результате, Liberty-Way представляет собой кроссплатформенное приложение, управляющееся через веб сарвар, что очень удобно для настройки и отладки. Также, в последних версиях (beta_1.0.3 - beta_1.1.2) был внедрён blackbox (для записи логов), а также общение с платформой и много других необходимых алгоритмов.
Полное описание, включая все настройки, запуск и т.д. вы можете найти в нашем репозитории на GitHub: https://github.com/XxOinvizioNxX/Liberty-Way.
Видео работы статичной стабилизации (кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/adR38R27MEU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Liberty-Way может даже стабилизировать "брошенный" дрон (кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/gAaGQSC-r2g" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Да, на видео есть небольшой баг с поворотом, в новом релизе он исправлен
И, конечно же, работа в движении (тестировалось ещё на beta_0.0.3)(кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/8vB-8QIBoJU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Все основные настройки удобно вынесены в отельный JSON-файлы (settings, PID), что позволяет без пересборки приложения быстро менять нужные параметры. Фактически, для запуска приложения, достаточно скачать последний релиз, распаковать архив и запустить через соответствующий вашей ОС лаунчер.
### 5.6. Связь с дроном {#communication-with-the-drone}
Liberty-Way подключается к модулю Liberty-Link, установленному на дроне, и, корректирует его положение, управляя напрямую первыми четырьмя основными каналами пульта. За один цикл (каждый фрейм с камеры) на модуль отправляются 12 байт данных корректировки:
![Packet](../assets/amls/data_structure.png "Data packet")
- **Roll bytes** - Корректировка крена (1000-2000)
- **Pitch bytes** - Корректировка тангажа (1000-2000)
- **Yaw bytes** - Корректировка рыскания (1000-2000)
- **Altitude bytes** - Корректировка газа (высоты)
- **Service info** - Состояние дрона (0 - Корректировка отключена, 1 - Стабилизация, 2 - Снижение по барометру (команда не внедрена), 3 - Отключение моторов)
- **Check byte** - XOR чек-сумма
- **Data suffix** - уникальная пара ASCII символов, чтобы обозначить конец пакета
На стороне дрона (модуля Liberty-Link), чтение данных происходит следующим образом:
```cpp
while (Telemetry_serial.available()) {
tdc_receive_buffer[tdc_receive_buffer_counter] = Telemetry_serial.read();
if (tdc_receive_byte_previous == 'L' && tdc_receive_buffer[tdc_receive_buffer_counter] == 'X') {
tdc_receive_buffer_counter = 0;
if (tdc_receive_start_detect >= 2) {
tdc_check_byte = 0;
for (tdc_temp_byte = 0; tdc_temp_byte <= 8; tdc_temp_byte++)
tdc_check_byte ^= tdc_receive_buffer[tdc_temp_byte];
if (tdc_check_byte == tdc_receive_buffer[9]) {
direct_roll_control = (uint32_t)tdc_receive_buffer[1] | (uint32_t)tdc_receive_buffer[0] << 8;
direct_pitch_control = (uint32_t)tdc_receive_buffer[3] | (uint32_t)tdc_receive_buffer[2] << 8;
direct_yaw_control = (uint32_t)tdc_receive_buffer[5] | (uint32_t)tdc_receive_buffer[4] << 8;
direct_throttle_control = (uint32_t)tdc_receive_buffer[7] | (uint32_t)tdc_receive_buffer[6] << 8;
direct_service_info = (uint32_t)tdc_receive_buffer[8];
if (direct_roll_control > 1100 && direct_roll_control < 1900 &&
direct_pitch_control > 1100 && direct_pitch_control < 1900 &&
direct_yaw_control > 1100 && direct_yaw_control < 1900 &&
direct_throttle_control > 1100 && direct_throttle_control < 1900 &&
/*flight_mode == 2 &&*/ channel_7 > 1500) {
tdc_timer = millis();
tdc_working = 1;
}
else
tdc_working = 0;
}
else {
direct_roll_control = 1500;
direct_pitch_control = 1500;
tdc_working = 0;
}
} else
tdc_receive_start_detect++;
}
else {
tdc_receive_byte_previous = tdc_receive_buffer[tdc_receive_buffer_counter];
tdc_receive_buffer_counter++;
if (tdc_receive_buffer_counter > 11)tdc_receive_buffer_counter = 0;
}
}
if (millis() - tdc_timer >= 500) {
tdc_working = 0;
}
if (tdc_working && direct_service_info == 2 && !return_to_home_step)
return_to_home_step = 3;
if (!tdc_working)
return_to_home_step = 0;
if (!tdc_working || direct_service_info < 1) {
direct_roll_control = 1500;
direct_pitch_control = 1500;
direct_yaw_control = 1500;
direct_throttle_control = 1500;
}
```
В результате, имеются 4 переменные:
```
direct_roll_control
direct_pitch_control
direct_yaw_control
direct_throttle_control
```
Которые напрямую прибавляются к данным, поступающим с пульта управления.
Вероятно, в дальнейшем, будут добавлены и другие данные, как минимум, для работы с GPS. Следите за обновлениями в нашем репозитории.
### 5.7. Подвес для камеры {#camera-gimbal}
Для эксплуатации нашей системы в реальных условиях, требуется минимизировать тряску камеры, чтобы не потерять метку на дроне. Для этого, была разработана 3Д-модель крепления подвеса от дрона к нашей платформе для стабилизации обычной веб камеры
Крепление для камеры:
![Camera mount](../assets/amls/gimbal_camera_mount.png "Camera mount")
Крепление провода (ферритового фильтра на проводе) камеры:
![Filter mount](../assets/amls/gimbal_filter_mount.png "Filter mount")
Крепление защёлок "крабиков" на подложку подвеса:
![Plane mount](../assets/amls/gimbal_plane_mount.png "Plane mount")
Примерный вид сборки всего механизма подвеса:
![Assembly](../assets/amls/gimbal_assembly.png "Assembly")
-----------
## 6. Платформа Eitude {#eitude-amls-platform}
Платформа - взаимосвязанная система для посадки дрона. Управляться платформа планируется через Serial-интерфейс, с помощью G-Code команд:
Текущий код платформы можно в репозитории Eitude на GitHub: https://github.com/XxOinvizioNxX/Eitude.
### 6.1. Система захватов {#grabbing-system}
Но ведь логично, что в реальности, без системы захватов невозможно посадить дрон, не повредив никого. Пока что, у нас есть прототип в виде 3Д модели. Для реализации захвата дрона будут изготовлены 4 длинных захвата с крючками на концах и по мере посадки коптера на платформу, шасси будут захватываться этими 4-мя крючками и удерживаться по мере снижения и после него.
![Screenshot](../assets/amls/grabbing_system_1.png "Screenshot")
![Screenshot](../assets/amls/grabbing_system_2.png "Screenshot")
### 6.2. Крыша {#weather-protection-system}
Для защиты от неблагоприятных погодных условий, мы разработали механизм крыши - ножничные механизмы, обтянутые брезентом, которые находятся на краях платформы и после успешной посадки механизмы с обеих сторон платформы будут закрываться и защищать дрон от внешнего воздействия, Сама конструкция крыши делает её достаточно лёгкой и прочной, а ножничный механизм позволяет просто складывается и раскладывается при этом сборка такого механизма будет простой и надежной.
![Screenshot](../assets/amls/platform_side_transparent.png "Screenshot")
![Screenshot](../assets/amls/platform_roof.png "Screenshot")
### 6.3. Спидометр {#platform-speedometer}
Для будущей посадки на быстро движущуюся платформу, очень полезно знать скорость её движения. На данный момент на платформе нет GPS модуля, или иных способов измерить абсолютную скорость. Поэтому, для временного решения этой проблемы, решено было вычислять скорость по ускорению, используя акселерометр. Для примера, MPU6050. IMU-модуль через мягкую подложку установлен на прототип платформы и прикрыт крышкой для защиты от ветра. Алгоритм стабилизации (Liberty-Way) посылает на платформу запрос `L1` для проверки скорости. В качестве ответа возвращается `S0 L<скорость в км/ч>`.
![MPU6050](../assets/amls/mpu6050_gyro.png "MPU6050")
Тест спидометра (внутри серого круга нижний правый параметр (SPD) - скорость в км/ч) (кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/yvCo6tYjdM0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Для вычисления скорости, берётся ускорение за маленькие промежутки времени, перемножается со временем, получая моментальную скорость. Которая постоянно прибавляется к предыдущей сумме:
```cpp
void speed_handler(void) {
gyro_signalen();
// Filter accelerations
acc_x_filtered = (float)acc_x_filtered * ACC_FILTER_KOEFF + (float)acc_x * (1.0 - ACC_FILTER_KOEFF);
speed = acc_x_filtered;
// Convert acceleration to G
speed /= 4096.0;
// Convert to m/s^2
speed *= 9.81;
// Multiply by dt to get instant speed in m/ms
speed *= (millis() - speed_loop_timer);
// Reset timer
speed_loop_timer = millis();
// Convert to m/s
speed /= 1000.0;
// Convert to km/h
speed *= 3.6;
// Accumulate instatnt speed
speed_accumulator += speed;
if (!in_move_flag) {
// If the platform is not moving, reset the speed
speed_accumulator = speed_accumulator * SPEED_ZEROING_FACTOR;
}
}
```
Несмотря на наличие различных фильтров, из-за погрешности скорость может не "вернуться" в 0, поэтому, также производится замер вибраций, и, если они меньше порога, считается что платформа стоит и постепенно обнуляется скорость.
Полный код спидометра можно найти в репозитории Eitude на GitHub: https://github.com/XxOinvizioNxX/Eitude
### 6.4. Датчики уровня освещённости {#platform-light-sensor}
Т.к. наша платформа должна работать в различных окружающих условиях, а оптическая стабилизация очень требовательна к видимости ArUco маркера, важно иметь автоматическую систему измерения выдержки камеры по уровню освещённости, а, при её нехватке, даже включать дополнительную подсветку. В долгосрочной перспективе в качестве датчиков света планируется использовать специализированные сенсоры, например, BH1750.
В текущем варианте прототипа, используются 6 светодиодов в качестве датчика света и, встроенный в микроконтроллер, АЦП. Алгоритм стабилизации (Liberty-Way) посылает на платформу запрос `L0` для проверки уровня освещённости. В качестве ответа возвращается `S0 L<освещённость>`.
![Light sensors](../assets/amls/light_sensors.png "Light sensors")
Тест определения уровня освещённости с помощью светодиодов (кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/xQeiA945aRA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Тест регулировки выдержки и включения дополнительной подсветки (кликабельно):
<iframe width="560" height="315" src="https://www.youtube.com/embed/iMORim6zxsg" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
-----------
## 7. Заключение {#conclusion}
На данный момент, имеется отлаженный прототип оптической стабилизации, GPS удержания, стабилизации высоты по барометру, платформы и множество 3Д-моделей, жаждущих реализации.
Проект автоматической посадки дрона на движущуюся платформу ещё не закончен.
Следите за нашими апдейтами:
- На репозитории GitHub: https://github.com/XxOinvizioNxX/Liberty-Way.
- И на нашем YouTube-канале: https://www.youtube.com/channel/UCqN12Jzy-1eJLkcA32R0jdg.
В дальнейшем, мы планируем сделать ещё много нового и интересного!
![Follow the white rabbit](../assets/amls/follow_the_white_rabbit.png "Follow the white rabbit")

View File

@@ -1,5 +1,7 @@
# Сборка Клевера 4.2
Габаритный чертеж  [clover-4.2.pdf](https://github.com/CopterExpress/clover/raw/master/docs/assets/dimensional-drawing/clover-4.2.pdf).
## Размер крепежа
> **Hint** Во время сборки используются винты и стойки различных размеров, использование крепежа не соответствующего размера может повредить коптер.

View File

@@ -1,5 +1,7 @@
# Сборка Клевера 4.2 WorldSkills
Габаритный чертеж  [clover-4.2-ws.pdf](https://github.com/CopterExpress/clover/raw/master/docs/assets/dimensional-drawing/clover-4.2-ws.pdf).
## Размер крепежа
> **Hint** Во время сборки используются винты и стойки различных размеров, использование крепежа не соответствующего размера может повредить коптер.

View File

@@ -14,7 +14,7 @@
## Запуск
Для того, чтобы открыть интерфейс блочного программирования в Клевере, [подключитесь к Клеверу по Wi-Fi](wifi.md) и перейдите на страницу http://192.168.11.1:8080/clover_blocks/ либо нажмите ссылку *Blocks programming* на [основной веб-странице Клевера](wifi.md#веб-интерфейс).
Для того, чтобы открыть интерфейс блочного программирования в Клевере, [подключитесь к Клеверу по Wi-Fi](wifi.md) и перейдите на страницу http://192.168.11.1/clover_blocks/ либо нажмите ссылку *Blocks programming* на [основной веб-странице Клевера](wifi.md#веб-интерфейс).
Интерфейс выглядит следующим образом:

View File

@@ -2,7 +2,7 @@
Чтобы откалибровать датчики зайдите во вкладку *Vehicle Setup* и выберите меню *Sensors*.
> **Caution** Если вы используете полетный контроллер *COEX Pix*, во всех графах *Autopilot Orientation* необходимо указать значение `ROTATION_ROLL_180_YAW_90`, иначе полетный контроллер будет не корректно воспринимать наклоны и повороты коптера.
> **Caution** Если вы используете полетный контроллер [*COEX Pix*](coex_pix.md), во всех графах *Autopilot Orientation* необходимо указать значение `ROTATION_ROLL_180_YAW_90`, иначе полетный контроллер будет не корректно воспринимать наклоны и повороты коптера.
## Компас

13
docs/ru/coex_gps.md Normal file
View File

@@ -0,0 +1,13 @@
# COEX GPS
ГНСС-приемник **COEX GPS** совместим с полетным контроллером [COEX Pix](coex_pix.md). Этот приемник поставляется с наборами COEX Клевер 4 Pro.
## Схемы расположения контактов
### Вид сверху
<img src="../assets/coex_gps/coex-gps-top.png" width=400 class=zoom>
### Вид снизу
<img src="../assets/coex_gps/coex-gps-bottom.png" width=400 class=zoom>

15
docs/ru/coex_pdb.md Normal file
View File

@@ -0,0 +1,15 @@
# COEX PDB
**COEX PDB** (Power Distribution Board) плата распределения питания для квадрокоптеров <a href="assemble_4_2.md">Клевер&nbsp;4</a>.
Габаритные размеры платы: 35x35 мм.
## Схемы расположения контактов
### Вид сверху
<img src="../assets/coex_pdb/coex-pdb-top.png" width=400 class=zoom>
### Вид снизу
<img src="../assets/coex_pdb/coex-pdb-bottom.png" width=400 class=zoom>

View File

@@ -63,9 +63,9 @@
### Нововведения
* Заменен разъем USB Micro-B на раазъем USB Type-C.
* Заменен разъем USB Micro-B на разъем USB Type-C.
* Изменен слот для MicroSD карт, на более глубокий.
* Изменены назначения пинов на разьеме I2C.
* Изменены назначения пинов на разъеме I2C.
* Добавлены ферритовые фильтры в цепи питания.
### Схемы расположения контактов

View File

@@ -56,7 +56,7 @@
git checkout -b new-article
```
4. Напишите новую статью в разделе `docs/ru` или `docs/en` в формате [Markdown](https://ru.wikipedia.org/wiki/Markdown) (например `docs/ru/new_article.md`).
4. Напишите новую статью в разделе `docs/ru` или `docs/en` в формате [Markdown](https://ru.wikipedia.org/wiki/Markdown) (например `docs/ru/new_article.md`). Не забудьте указать контактную информацию (e-mail / Telegram /...) для авторских статей.
5. Поместите дополнительные визуальные материалы в папку `docs/assets` и оформите на них ссылки в вашей статье.
6. Добавьте статью в файл оглавления `SUMMARY.md` в том разделе, где вы её написали (например в `docs/ru/SUMMARY.md`):

View File

@@ -3,3 +3,33 @@
CopterHack 2021 это командный конкурс по разработке проектов с открытым исходным кодом для платформы квадрокоптера "Клевер".
Все информацию о мероприятии смотрите на официальном сайте: https://ru.coex.tech/copterhack.
Полная запись трансляции финала: https://www.youtube.com/watch?v=Z06vxuAHmuE.
<div class="image-group">
<img src="../assets/copterhack2021/1.jpg" class="zoom border">
<img src="../assets/copterhack2021/2.jpg" class="zoom border">
</div>
## Отчетные статьи команд-участников
|Место|Команда|Проект|Балл|
|-|-|-|-|
|1|🇧🇾 FTL|[AdvancedClover](advanced_clover.md)|18.8|
|2|🇷🇺 EasyToFly|[EasyToFly](easytofly.md)|18.5|
|3|🇩🇪 ADDI|[3D-printed generative design frame](../en/generative_design_frame.html)|17.8|
|4|🇰🇬 AT Makers|[Граффити-коптер D-drone](ddrone.md)|16.7|
|5|🇶🇦 DroMap|[The Indoor Mapping Drone](../en/dromap.html)|16.5|
|6|🇰🇬 MINIONS|[Дрон для высаживания семян](seeding_drone.md)|15.5|
|7|🇷🇺 Хардатон|[Хардатон Квиддич](hardaton_quidditch.md)|15.48|
|8|🇷🇺 Atomic Ferrets|[Система засечки для дронов](race_timing_sys_copterhack.md)|15|
|9|🇷🇺 Drones to fight Corona|[Drones to fight Corona](../en/anticorona_drones.html)|14.6|
|10|🇷🇺 AMLS|[Система автоматической посадки](amls.md)|12.8|
|11|🇷🇺 PаD30DЖ|[Октокоптер со специфичным расположением пропеллеров](oktazodg.md)|11.6|
|12|🇷🇺 Зауральский Викинг|[Программируемый летающий автомобиль](zaural_viking.md)|11.4|
|13|🇨🇦 Bennie and the Jetson TX2|[Retail Drone](../en/bennie.html)|9.8|
|14|🇳🇱 Blue Jay Eindhoven|[Designing a drone and a path planning algorithm](../en/blue_jay_eindhoven.html)|9.6|
|15|🇷🇺 ProCleVeR|[Разработка системы для управления БПЛА с помощью шлема виртуальной реальности](remote-control-with-oculusvr.md)|8.5|
|16|🇷🇺 Quadrotor|[Дрон-Агроном](drone-agronom.md)|7.7|
Смотрите оценки по критериям в [полной таблице](https://docs.google.com/spreadsheets/d/1L9NDrw4c4vTCIVR3aC8ErAjxnuBg-Afil9AwUQZVJ5I/edit?usp=sharing).

97
docs/ru/ddrone.md Normal file
View File

@@ -0,0 +1,97 @@
# Граффити коптер D-drone
[CopterHack-2021](copterhack2021.md), команда **AT Makers**.
<img class="center" src="../assets/ddrone/final.gif" width="600">
## Введение
Люди стремятся научить искусственный интеллект всему, что могут делать сами. Рисовать нас учат с детства. И почему бы не научить дрона рисовать? На данный момент коптеры и граффити набирают свою популярность. Поэтому мы решили совместить их.
## Модели и сборка
<img class="center" src="../assets/ddrone/full_holder.png" width="300" class="zoom">
<img class="center" src="../assets/ddrone/full_holder_in_real.jpg" width="300" class="zoom">
Для выполнения проекта вам нужно иметь в наличии:
- аэрозольная краска
- сервопривод MG90S;
- 3D-принтер;
- удлинитель распылителя;
- лента с липучкой (желательно);
- 4 длинных винта M4 или;
- 2-4 коротких самореза M4 или M3.
[Скачать](https://github.com/PerizatKurmanbaeva/D-drone/tree/master/details) и распечатать детали:
- держатель;
- винт;
- держатель стоек с гайкой;
- стойки (2 шт.);
- держатель для серво.
**Держатель баллончика.** Держатель баллончика прикрепляется к деке 4 винтами и гайками. Чтобы закрепить баллончик к держателю мы использовали ленту с липучкой. С помощью 4 гаек и винтов закрепляем деку с держателем сверху дрона.
Вес держателя: 90 г.
<img class="center" src="../assets/ddrone/holder.png" width="300" class="zoom">
Если диаметр баллончика меньше диаметра держателя, мы используем деталь в виде дуги, размером разницей между ними. Это помогает нам устойчиво закрепить баллончик.
**Схема нажатия.** Для нажатия клапана будем использовать винтовую передачу с неподвижной гайкой. К сервоприводу будут прикреплена планка с отверстиями, в которых будут входить стойки, закрепленные к гайке. Это помогает сервоприводу двигаться только по одной оси, вверх вниз. Также мы смоделировали крышку для кнопки баллончика, так как поверхность насадки не ровная.
<img class="center" src="../assets/ddrone/pressing_mechanism.png" width="300" class="zoom">
<img class="center" src="../assets/ddrone/pressing_mechanism_in_real.jpg" width="300" class="zoom">
## Перед запуском
### Настройка работы сервопривода
Перед запуском коптера нужно скачать [servo.py](https://github.com/PerizatKurmanbaeva/D-drone/blob/master/examples/servo.py) и перенести его на RPi. Можно просто скопировать и вставить используя буфер обмена. Или скопировать используя команду scp. Например, так:
```bash
scp servo.py pi@192.168.11.1:/home/pi
```
Затем выполнить удаленно на Raspberry Pi следующие команды:
```bash
sudo pigpiod
python servo.py
```
### Настройка веб-интерфейса
Нужно скачать [репозиторий](https://github.com/PerizatKurmanbaeva/visual_ddrone) в формате .zip. Копируем на RPi и распаковываем с помощью следующих команд:
```bash
scp visual_ddrone-master.zip pi@192.168.11.1:/home/pi
cd catkin_ws/src/clover/clover/www
unzip /home/pi/visual_ddrone-master.zip .
mv visual_ddrone-master ddrone
```
Теперь чтобы открыть веб-интерфейс нужно перейти по ссылке [http://192.168.11.1/clover/ddrone](http://192.168.11.1/clover/ddrone).
## Веб-интерфейс
Запуск нашего дрона осуществляется с помощью [веб-сайта](https://perizatkurmanbaeva.github.io/visual_ddrone). Веб-интерфейс позволяет рисовать и кодировать нарисованное в G-code. Данные координат будут переданы для дальнейшей обработки и исполнением коптером.
<img class="center" src="../assets/ddrone/screen_2.png" width="600" class="zoom">
Мы выбрали веб-интерфейс для управления коптера, потому что он легче и ближе для пользователя.
<img class="center" src="../assets/ddrone/instruction.png" width="300" class="zoom">
## Полеты
<iframe width="560" height="315" src="https://www.youtube.com/embed/ErtioCj5iMw" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
## Благодарность
Хотим выразить благодарность Международному университету Ала-Тоо за предоставленную финансовую помощь в осуществлении данного проекта.
![Ala-Too University](https://my.alatoo.edu.kg/images/logo_text.png)

19
docs/ru/drone-agronom.md Normal file
View File

@@ -0,0 +1,19 @@
# Дрон-Агроном
Проект команды **Quadrotor** с [CopterHack-2021](copterhack2021.md).
## Суть проекта
В современном мире фермеры сталкиваются с проблемой не качественного или недостаточного орошения полей. Из-за этого по статистике ООН погибает около 25% урожая.
Эту проблему решают использованием авиации, что очень дорого и не практично. Наша команда разработала более дешевое решение проблемы - Дрон-агроном. Наш продукт разработанный на платформе Клевер 3 и базе рамы Tarot Iron Man 650 позволяет при небольшой взлётной массе (в сравнении с конкурентами) сохранить скорость, маневренность и время полета. Также использование насоса высокого давление позволяет обеспечить максимальную площадь распыления (что то похожее на квадрат 3x3 метра). В преимущество перед конкурентами можно также отнести не высокую стоимость и широкий комплект поставки.
<iframe width="560" height="315" src="https://www.youtube.com/embed/_4QB9Ha0wZA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
## Прототип
Первый прототип был полностью построен на базе Клевер 3 Pro (в форм факторе гексакоптера). Но после первых тестов (ссылка на один из них: https://drive.google.com/file/d/1gwpZZ2ZTkYvmTbspskpW79i8WShVEiI0/view?usp=sharing), было принято решение ставить всю электронику на мощную винтомоторную группу и легкую и прочную раму Tarot Iron Man 650.
## Дополнительные материалы
Перейдя по этой ссылке (https://drive.google.com/drive/folders/1wCyUtMYOLiqYCBLC8aWpisBAH3ai9WNu?usp=sharing) вы можете получить доступ к нашему проекту. Там находятся примеры кода, 3D модели.

197
docs/ru/duocam.md Normal file
View File

@@ -0,0 +1,197 @@
# COEX DuoCam
"COEX DuoCam" это программно-аппаратный комплекс, позволяющий получать комбинированное визуально-тепловизионное изображение.
<img src="../assets/duocam/gitup_seek.jpg" width=400 class="center" alt="duocam">
В качестве источника визуальной картинки теоретически можно использовать любую камеру, имеющую CSI или HDMI-выход.
В качестве источника тепловизионной картинки можно использовать тепловизоры Seek Compact или Seek Compact Pro.
В качестве платформы для запуска обрабатывающего софта рекомендуется использовать одноплатный компьютер Raspberry Pi 4B.
## Подключение устройств
Тепловизор подключается в один из портов USB 3.0 на RPi4. Во второй USB 3.0-порт подключается Wi-Fi адаптер для осуществления связи с наземной станцией.
Визуальная камера подключается в CSI порт напрямую или через HDMI-CSI-конвертер.
В порт USB 2.0 следует подключить USB-flash устройство, на которое будет производиться сохранение фото и видеофайлов.
## Принцип работы
Программная часть осуществляет наложение тепловизионной картинки на визуальную. С помощью конфигурационного файла или виджета управления свойствами камеры в QGroundControl можно изменять результирующее изображение.
### Выбор модели тепловизора
Первоначально надо определиться, какая у вас модель тепловизора (простая или Pro) и выставить соответствующую настройку в конфиг-файле (`enable: yes` у seek_thermal_pro или seek_thermal в разделе thermal_camera_models. Важно не забыть выставить `enable: no` у камеры, которую не предполагается использовать).
### Управление наложением
При включенном визуальном (`show_visual: yes`) и термическом (`show_thermal: yes`) изображениях, термическое будет налагаться на визуальное в регион, заданный в свойстве `overlay_thermal_on_visual` (начальная точка с координатами `(x_start, y_start)`, ширина региона - `thermal_region_width`, высота - `thermal_region_height`).
Если отключить визуальное изображение (`show_visual: no`), то термическое развернется на весь экран.
Если отключить термическое (`show_thermal: no`), то будет транслироваться только визуальное.
Если отключить оба изображение перестанет транслироваться.
### Центровка
Для центровки результирующего изображения (из-за физического сдвига объективов камер термическое будет сдвинутого относительно центра визуального) следует использовать свойства раздела `final_frame_cropping`. Принцип аналогичен предыдущему разделу.
### Детекторы контуров (edge detectors)
Для облегчения понимания термического изображения, есть возможность включения наложения на него соответствующих контуров визуального изображения. В программе реализована поддержка двух алгоритмов детектирования контуров: [Sobel](https://docs.opencv.org/3.4/d2/d2c/tutorial_sobel_derivatives.html) и [Canny](https://docs.opencv.org/3.4/da/d5c/tutorial_canny_detector.html). В соответствующих разделах конфига (`apply_sobel` и `apply_canny`) можно поэкспериментировать с некоторыми свойствами детекторов.
### Колоризация
Для большей наглядности, тепловизионное изображение можно колорифицировать. Для этого необходимо выставить свойство `apply_colormap: yes`.
Конкретную схему колорификации можно выбрать из [списка](https://docs.opencv.org/2.4/modules/contrib/doc/facerec/colormaps.html), указав порядковый номер схемы в свойстве `colormap`.
### Свойства транслируемого видео и сохраняемых файлов
Свойства транслируемого видео можно изменять в разделе `output_video`. Делать это стоит с четким пониманием того, что делаешь - неправильные настройки могут сломать трансляцию. Например, разрешение видео должно совпадать с настройками gstreamer'а, который осуществляет последующее кодирование.
Для настройки сохраняемого на флеш-накопитель видео следует пользоваться группой свойств `encode_video`.
Каталоги для сохранения фото и видеофайлов можно указать в свойствах `path_to_save`.
### Настройки дополнительной отображаемой информации
Скрывать\показывать частоту кадров в секунду визуального и термического изображений можно при помощи свойства `show_fps`.
Показывать\скрывать перекрестие с температурой центрального пикселя можно при помощи свойства `draw_temp`.
### Подстройка температуры
В зависимости от используемого тепловизора, может потребоваться корректировка температурного диапазона. В секции `temperature_calibration` Доступны две настройки:
* Сдвиг (`offset`) - линейный сдвиг температурного диапазон на указанное число.
* Масштаб (`scale`) - пропорциональное изменение шкалы.
### Выравнивание градиента температуры от центра к краям
Если на тепловизионном изображении наблюдается "рамка", вызванная увеличением определяемой температуры к краям, то следует применить выравнивающий фильтр (виньетирование). Настройки располагаются в секции `vignette`:
* `enable` - включить-выключить наложение фильтра.
* `show_center` - показать точку "центра" для отладки ее положения.
* `center_x` - X-координата "центра".
* `center_y` - Y-координата "центра".
* `max_decrement_relative` - максимальное уменьшение температуры к краям.
## Виджет управления камерой для QGroundControl
![QGC_widget](../assets/duocam/qgc_duocam_widget.png)
### Где взять
QGC c необходимый функционалом для управления "COEX DuoCam" можно скачать в нашем [репозитории](https://github.com/CopterExpress/qgroundcontrol/releases). Скачивать следует тот релиз, в названии которого присутствует слово `duocam` с максимальным порядковым номером.
### Как использовать
При открытии виджета QGC пошлет MAVLink-сообщения с запросом текущих значений свойств. Необходимо дождаться, пока они все до конца загрузятся. Если загрузка не завершается в течение минуты, необходимо нажать кнопку "Refresh values".
При изменении значений свойств QGC осуществляет коммуникацию с DuoCam посредством протокола MAVLink, поэтому нет смысла очень часто нажимать контролы - наоборот, после нажатия следует дождаться изменения картинки и только потом переходить к следующему свойству.
[Подробнее об архитектуре DuoCam и программе `duocam-mavlink`](duocam_mavlink.md).
## Конфигурационный файл
Для более глубокой настройки DuoCam можно использовать конфигурационный файл.
### Как добраться
Для редактирования конфигурационного файла необходимо извлечь microSD-карту из RPi4, вставить в кард-ридер своего компьютера (от операционной системы требуется возможность читать файловую систему ext4), открыть файл по адресу `<microSD>/etc/duocam/camera.yaml`.
Также можно зайти по SSH на работающую RPi4 и отредактировать конфигурационный файл внутри системы по тому же пути.
### Образец конфигурационного файла
```yaml
show_visual: yes
show_thermal: yes
flip_thermal: no
apply_sobel:
enable: yes
sobel_scale: 3
sobel_delta: 0
apply_canny: no
draw_temp: yes
output_video:
device: /dev/video1
width: 1280
height: 720
bytes_per_pixel: 3
framerate: 20
path_to_save_photos: /media/usb0/
path_to_save_videos: /media/usb0/
encode_video:
width: 720
height: 480
framerate: 10
thermal_camera_models:
seek_thermal_pro:
enable: no
sensor_resolution:
width: 320
height: 240
overlay_thermal_on_visual:
# These values are for GitUp3
x_start: 282
y_start: 102
thermal_region_width: 600
thermal_region_height: 400
transparency: 0.3
# These values are for Raspicam
# x_start: 425
# y_start: 155
# thermal_region_width: 900
# thermal_region_height: 600
final_frame_cropping:
enable: yes
x_start: 0
y_start: 0
width: 1160
height: 610
seek_thermal:
enable: yes
sensor_resolution:
width: 206
height: 156
overlay_thermal_on_visual:
x_start: 282
y_start: 102
thermal_region_width: 600
thermal_region_height: 400
transparency: 0.3
final_frame_cropping:
enable: yes
x_start: 0
y_start: 0
width: 1160
height: 610
# Colormaps are taken from: https://docs.opencv.org/2.4/modules/contrib/doc/facerec/colormaps.html
# COLORMAP_AUTUMN = 0,
# COLORMAP_BONE = 1,
# COLORMAP_JET = 2,
# COLORMAP_WINTER = 3,
# COLORMAP_RAINBOW = 4,
# COLORMAP_OCEAN = 5,
# COLORMAP_SUMMER = 6,
# COLORMAP_SPRING = 7,
# COLORMAP_COOL = 8,
# COLORMAP_HSV = 9,
# COLORMAP_PINK = 10,
# COLORMAP_HOT = 11
apply_colormap:
enable: yes
colormap: 4
```

104
docs/ru/duocam_mavlink.md Normal file
View File

@@ -0,0 +1,104 @@
# Виртуальная MAVLink-камера COEX DuoCam
Полётные контроллеры поддерживают разные способы взаимодействия с внешними камерами, включая протокол MAVLink. Обычно коммуникация с помощью данного протокола требует использования UART-порта на полётном контроллере, но есть возможность работать с камерой в основном потоке MAVLink-телеметрии с БПЛА.
Утилита `duocam-mavlink` отвечает за работу виртуальной MAVLink-камеры и встраивается в общую телеметрию между полётным контроллером и QGroundControl.
![Блок-схема COEX DuoCam](../assets/duocam/duocam.png)
На блок-схеме прямыми линиями обозначены взаимодействия между блоками, пунктирными линиями уточняется характер взаимодействия.
> **Warning** Протокол взаимодействия находится в процессе модификации. В новых версиях планируется избавиться от прямой отправки значений параметров и их количества от `duocam-mavlink` к QGroundControl.
`duocam-camera` и `duocam-mavlink` обмениваются данными с помощью очередей POSIX. Имена очередей и формат сообщений доступен в репозитории [duocam-common](https://github.com/CopterExpress/duocam-common).
Для объединения блоков, взаимодействующих через MAVLink, можно использовать любой MAVLink-коммутатор/маршрутизатор, который либо позволяет отключить таблицу коммутации, либо заполняет её по схеме *MAVLink ID:Component ID* (например, `cmavnode`, `mavlink-fast-switch`, `mavlink-switch`).
> **Warning** При использовании `mavlink-fast-switch` требуется использовать `mavlink-serial-bridge`, либо любой другой мост для передачи MAVLink из последовательного порта в UDP, так как `mavlink-fast-switch` работает только с UDP.
## Конфигурационный файл
Для редактирования конфигурационного файла необходимо извлечь microSD-карту из RPi4, вставить в кард-ридер своего компьютера (от операционной системы требуется возможность читать файловую систему ext4), открыть файл по адресу `<microSD>/etc/duocam/mavlink.yaml`.
Также можно зайти по SSH на работающую RPi4 и отредактировать конфигурационный файл внутри системы по тому же пути.
Для корректной работы `duocam-mavlink` требуется *MAVLink ID* полётного контроллера (параметр `vehicle_id`) и `MAVLink ID` QGroundControl (параметр `qgc_vehicle_id`). `duocam-mavlink` ожидает телеметрию на UDP (параметры `ip` и `port`) и отправляет сообщения HEARTBEAT с частотой, согласно параметру `heartbeat_frequency`, представляясь, как компонент полётного контроллера `MAV_COMP_ID_CAMERA`.
Максимальная задержка от `duocam-camera` задаётся параметром `command_timeout`.
Если система DuoCam используется для полётов внутри помещений, то должен быть включен параметр `no_gps`.
## Пример конфигурационного файла
```yaml
# MAVLink vehicle ID that owns the camera
vehicle_id: 1
# Enable this flag for indoor use
no_gps: False
# QGC vehicle ID
qgc_vehicle_id: 255
mavlink:
# IP address of the interface to listen port on (0.0.0.0 for all interfaces)
ip: 127.0.0.1
# UDP port
port: 14540
# Heartbeat frequency (Hz)
heartbeat_frequency: 1.0
# Camera driver command timeout (s)
command_timeout: 3.0
```
## Пример конфигурационного файла для `mavlink-fast-switch`
```yaml
# MAVLink endpoints
endpoints:
# UAV endpoint
- name: "uav"
local:
port: 14588
# DuoCam MAVLink endpoint
- name: "duocam-mavlink"
remote:
ip: "127.0.0.1"
port: 14540
# GCS endpoint
- name: "gcs"
remote:
ip: "127.0.0.1"
port: 14550
# Enable MAVLink ID table
# HINT: Can't use this feature with duocam
id-table: False
```
## Пример конфигурационного файла для `mavlink-serial-bridge`
```yaml
# Serial device settings
serial:
# Device file
device: "/dev/ttyS0"
# Baudrate
baudrate: 57600
# Flow control (hardware, none)
flow: none
# Software serial TX buffer (bytes) (2048 by default)
tx-buffer: 2048
# UDP port settings
udp:
# Remote host settings (optional, listening mode if not presented)
remote:
ip: 127.0.0.1
port: 14588
# Lock remote host on the initial value (optional, False by default)
lock: True
# Broadcast mode (optional, False by default)
broadcast: False
# Local settings (optional, all interfaces and a random port by default)
local:
# Local IP address (0.0.0.0 to listen on all interfaces) (optional, all interfaces by default)
ip: 127.0.0.1
# Local UDP port (0 to select a random free port) (optional, 0 by default)
port: 0
```

173
docs/ru/easytofly.md Normal file
View File

@@ -0,0 +1,173 @@
# EasyToFly
## Информация о команде
[CopterHack-2021](copterhack2021.md), название команды: **EasyToFly**.
В команде 5 человек:
- Игорь Сидорин [@maerans12](https://github.com/maerans12) (TeamLead)
- Артём Баталов [@bart02](https://github.com/bart02) (Full-Stack разработчик)
- Карина Янышевская [@fanot](https://github.com/fanot) (Веб-разработчик)
- Никита Локтев [@nikilokser](https://github.com/nikilokser) (Специалист отдела Hard)
- Даниил Руфин (Специалист отдела Hard)
E-mail: a@batalov.me<br>
Telegram: [@bart02](https://t.me/bart02), [@maerans](https://t.me/maerans)
## Введение
В работе рассматривается процесс разработки образовательного аппаратно-программного комплекса (далее АПК, система) для безопасного обучения специалистов по профилю "Летающая робототехника".
Основной **проблемой данной сферы** является недостаточная безопасность открытых систем беспилотных летательных аппаратов (далее БПЛА), а также сложность в их управлении и программировании для использования в обучении, промышленности и т.д.
**Объектом проектной работы** являются учебные комплексы для изучения процессов автоматизации. **Предметом** является АПК для безопасного обучения специалистов по профилю "Летающая робототехника".
**Цель**: Разработка АПК для простого и безопасного обучения специалистов по профилю "Летающая робототехника".
**Задачи**:
1. Проведение исследования среди потенциальных потребителей об их необходимостях при обучении специалистов.
2. Проведение анализа существующих решений.
3. Разработка технического задания (далее ТЗ) на АПК.
4. Изучение литературы, необходимой для реализации проекта.
5. Формирование команды исполнителей на основании технического задания.
6. Разработка программной подсистемы АПК «Предотвращение столкновений».
7. Разработка программной подсистемы АПК «Мастер первоначальной настройки БПЛА».
8. Разработка программной подсистемы АПК «Монитор состояния БПЛА».
9. Разработка аппаратной составляющей АПК.
![Лого](../assets/easytofly/logo.png)
## Выбор платформы
Платформа Clover 4 позволяет подключать дополнительные устройства и обеспечивать связь между ними и оборудованием на борту; а также тем, что программная архитектура данного набора основана на открытом полетном стеке PX4 и операционной системе для роботов ROS (далее ROS), что предоставляет возможность ее использования в том числе и на других беспилотных летательных аппаратах, в которых используется такие же программные компоненты. После изучения рынка образовательных дронов в России, мы пришли к выводу, что данная платформа станет хорошим стартом разработки проекта.
## Опрос потенциальных заказчиков. Разработка ТЗ
По результатам опроса потенциальных потребителей системы педагогов детского технопарка «Кванториум» и других ОУ, было выяснено, что многие учреждения не имеют специально оборудованных зон для полетов, вследствие чего обучающиеся проводят настройку БПЛА и, в редких случаях, полет только под присмотром руководителя, на котором лежит ответственность за аппарат и окружающие предметы, жизнь и здоровье обучающихся.
Также нам стало известно о сложностях при настройке автономного полета, из-за частого использования консоли операционной системы Linux в процессе настройки, а также необходимости установки дополнительных программ.
Помимо этого, одним из запросов была компактная аппаратная составляющая системы, которая представляет собой защищенный корпус БПЛА, с возможностью быстрой установки используемого оборудования.
В качестве рассмотрения возможного места пилотного запуска системы, были проведены переговоры с Кванториумом г. Томска, об использовании АПК в обучающем процессе Аэроквантума.
## Процесс разработки
### Программная подсистема «Предотвращение столкновений»
Первым приоритетом стала программная подсистема «Предотвращение столкновений». Создав систему автономной защиты от “влетания” БПЛА в предметы, стоящие в учебной аудитории как во время ручного управления, так и тестировании программ автономного полета, а, при необходимости, и облета препятствий, мы сможем организовать более безопасное и продуктивное обучение.
Для разработки данной подсистемы, нами была изучена документация полетного стека PX4. Было выяснено, что полетный контроллер поддерживает эту функцию при передаче физически и геометрически обработанных данных с компьютера на борту. На борту Clover 4 установлен микрокомпьютер Raspberry Pi (далее микрокомпьютер, компьютер на борту), мощности которого будут использоваться для этих целей.
Далее встал вопрос об использовании датчиков для разработки данной подсистемы.
#### LIDAR
Первое, что приходит в голову при разработке подобной системы круговые LIDAR-датчики (далее лидар). Самым популярным похожим решением на сегодняшний день является RPLIDAR A1.
Датчик основан на принципе лазерной триангуляции и использует высокоскоростное оборудование для получения и обработки изображений, система измеряет данные о расстоянии более 8000 раз в секунду. Лидар вращается по часовой стрелке для выполнения всенаправленного лазерного сканирования окружения на 360 градусов.
Результатом является облако точек, которое можно использовать при дальнейшей работе с пакетами ROS, позволяющими производить действия с этой структурой данных (такие как: перевод в другие структуры данных, построение карты, передача данных на другое оборудование).
Для установки датчика на Clover 4 было разработано и подготовлено для печати на 3D принтере специальное крепление, которое для экономии высоты было совмещено с креплением для аккумулятора.
Далее предстояла разработка программного обеспечения, которое выполняло все преобразования, как типов данных, так и геометрии (соглашения о системах координат полетного контроллера и ROS отличаются). После этого обработанные данные направляются в полетный контроллер, который отвечает за принятие решения: остановить летящий БПЛА или продолжать полет.
#### Аппаратное решение из 4-х лазерных дальномеров
Помимо лидара, было принято решение использовать статические дальномеры для удешевления системы. Нами было разработано аппаратное решение на базе Arduino Nano и дальнедистанционных датчиков времени пролета VL53L1X. Изделие совместимо с разработанным нами креплением.
Далее было написано программное обеспечение для работы с оборудованием. Было необходимо передать данные с микроконтроллера, установленного на Arduino Nano на микрокомпьютер, представить показания с датчиков в том же виде, в котором они представлены при получении данных с лидара. И после этого произвести те же действия, что и с лидаром.
### Программная подсистема «Мастер первоначальной настройки БПЛА»
Нами была запланирована разработка еще одной программной подсистемы, которая позволит настроить БПЛА, используя единый пользовательский веб-интерфейс, который «проведет» пользователя через весь процесс настройки. Также в данный веб-интерфейс должен быть встроен монитор текущего состояния БПЛА и редактор настроек.
В первую очередь нами был сделан каркас будущего интерфейса.
Также на данный момент реализован интерфейс калибровки датчиков БПЛА со встроенной анимацией для удобной работы с ним. Работу интерфейса калибровки можно увидеть на видео.
<iframe width="560" height="315" src="https://www.youtube.com/embed/7pV9BsczxMY" frameborder="0" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
### Аппаратная составляющая АПК
Также перед нами стояла задача разработать защищенный корпус БПЛА, с возможностью быстрой установки используемого оборудования, который не будет готов к полету и обучающимся не будет необходимости его собирать. На данный момент готова конструкторская документация изделия, а само изделие проходит апробацию.
## Использование нашего продукта
Репозиторий проекта доступен по ссылке https://github.com/easy-to-fly/easy-to-fly.
### Сборка крепления для датчиков
Вам понадобится:
- **4x** стойки M3x26
- **1x** [крепление для батареи](https://github.com/easy-to-fly/easy-to-fly/blob/master/hard/3d_models/case.stl)
- **1x** [платформа для крепления](https://github.com/easy-to-fly/easy-to-fly/blob/master/hard/dwgs/sensors_mount.dwg)
Соедините всё как показано на [модели](https://a360.co/2ZfKyW8).
### Сборка системы из 4-х лазерных дальномеров
![Общий вид](../assets/easytofly/sensors.jpg)
Вам понадобится:
- **4x** дальнедистанционный датчик времени пролета VL53L1X
- **1x** Arduino Nano
1. Разведите платы согласно развертке из [файлов](https://github.com/easy-to-fly/easy-to-fly/raw/master/hard/pcb/sensors_4.zip) (вы можете использовать http://gerbv.geda-project.org/ для открытия)
2. Припаять пины для установки Arduino Nano и датчиков на каждую из плат.
3. Расположить платы как показано на развёртке.
<img src="../assets/easytofly/pcb_scan.jpg" width=400 alt="Развертка" class="center zoom">
4. Составить из плат параллелепипед.
5. Спаять все платы между собой по соответствующим контактным группам.
6. Установить в пины датчики и Arduino nano.
7. Убедиться в отсутствии короткого замыкания.
### Установка ПО на Raspberry Pi
В первую очередь необходимо подключить ваш коптер к Интернету, один из способов это сделать - [перевести его в режим клиента](network.md#переключение-адаптера-в-режим-клиента) и подключить в Wi-Fi, имеющему доступ в Интернет.
Склонируйте репозиторий проекта в `catkin_ws` и перейдите в него:
```bash
cd ~/catkin_ws/src
git clone https://github.com/easy-to-fly/easy-to-fly
cd easy-to-fly
```
Установите необходимые зависимости
```bash
./install/ros_deps.sh
./install/arduino_deps.sh # только если собираетесь использовать систему из 4-х лазерных дальномеров
```
### Запуск предотвращения столкновений
Для работы с лидаром необходимо изменить параметр `CP_DIST` PX4. Рекомендуется установить 0.5 м.
Теперь полетный контроллер будет получать сообщения от компьютера о расстоянии вокруг в специальном формате (читать доп. [https://mavlink.io/en/messages/common.html#OBSTACLE_DISTANCE](https://mavlink.io/en/messages/common.html#OBSTACLE_DISTANCE)).
Теперь задача заключается в передаче сообщения такого типа на полетный контроллер.
В библиотеке MAVROS есть специальный плагин для этих целей: [https://github.com/mavlink/mavros/tree/master/mavros_extras#obstacle_distance](https://github.com/mavlink/mavros/tree/master/mavros_extras#obstacle_distance).
Таким образом, достаточно ее включить в `<rosparam param="plugin_whitelist">` в файле `mavros.launch`.
Далее, запускаем один из `.launch` файлов.
## Заключение
В ходе выполнения проекта были проанализированы существующие разработки в области образовательной «Летающей робототехники», описаны их достоинства и недостатки. Выбрана платформа для старта проекта.
Реализована и протестирована основная часть проекта программная подсистема «Предотвращение столкновений». Веб-интерфейс, согласно плану, находится в разработке до конца марта 2021 года.
Для реализации аппаратной составляющей был выполнен сборочный чертеж в системе автоматизированного проектирования Fusion 360. Полученные чертежи позволят производить БПЛА для реализации проекта. В будущем на основе конструкторской документации будут изготовлены дополнительные БПЛА.
В следующие два года планируется совершенствование проекта и выход на рынок. Некоторые из основных задач на 2021-2023 год: более подробное исследование рынка для выделения основных задач дальнейшей разработки системы, апробация системы в целом в Кванториуме, разработка системы навигации БПЛА по карте с использованием оборудования, которое будет установлено на аппаратной составляющей.

94
docs/ru/fpv_clover_4_2.md Normal file
View File

@@ -0,0 +1,94 @@
# Установка и настройка FPV-оборудования
## Подготовка и установка камеры и передатчика
1. Установите малую монтажную деку на основную раму.
<div class="image-group">
<img src="../assets/fpv/fpv_1.png" width=300 class="zoom border">
<img src="../assets/fpv/fpv_2.png" width=300 class="zoom border">
</div>
2. Установите скобу для крепления камеры в соответствующие отверстия.
<div class="image-group">
<img src="../assets/fpv/fpv_3.png" width=300 class="zoom border">
<img src="../assets/fpv/fpv_4.png" width=300 class="zoom border">
</div>
3. Обрежьте трехпиновый комплектный кабель камеры.
<div class="image-group">
<img src="../assets/fpv/fpv_5.png" width=300 class="zoom border">
<img src="../assets/fpv/fpv_6.png" width=300 class="zoom border">
</div>
4. Залудите провода
<img src="../assets/fpv/fpv_7.png" width=300 class="zoom border center">
5. К силовым проводам камеры припаяйте разъем JST-папа.
<div class="image-group">
<img src="../assets/fpv/fpv_8.png" width=300 class="zoom border">
<img src="../assets/fpv/fpv_9.png" width=300 class="zoom border">
</div>
> **Hint** Перед спаиванием проводов не забудьте надеть термоусадку на провода.
6. К передатчику припаяйте разъем JST-папа.
<div class="image-group">
<img src="../assets/fpv/fpv_10.png" width=300 class="zoom border">
<img src="../assets/fpv/fpv_11.png" width=300 class="zoom border">
</div>
7. К передатчику припаяйте желтый сигнальный кабель камеры.
<div class="image-group">
<img src="../assets/fpv/fpv_12.png" width=300 class="zoom border">
<img src="../assets/fpv/fpv_13.png" width=300 class="zoom border">
</div>
8. Подключите антенну к передатчику.
<img src="../assets/fpv/fpv_14.png" width=300 class="zoom border center">
> **Caution** Если на передатчик без антенны подать напряжение есть большая вероятность, что он сгорит.
9. На монтажную деку установите приемник, закрепив его стяжками.
<img src="../assets/fpv/fpv_15.png" width=300 class="zoom border center">
10. Установите монтажную деку вместе с приемником снизу коптера.
<img src="../assets/fpv/fpv_16.png" width=300 class="zoom border center">
11. Установите камеру в скобу и закрепите ее с помощью 4-х комплектных болтов. Камера должна быть под углом 15°-20° относительно плоскости коптера.
<div class="image-group">
<img src="../assets/fpv/fpv_17.png" width=300 class="zoom border">
<img src="../assets/fpv/fpv_18.png" width=300 class="zoom border">
</div>
<div class="image-group">
<img src="../assets/fpv/fpv_19.png" width=300 class="zoom border">
<img src="../assets/fpv/fpv_20.png" width=300 class="zoom border">
</div>
12. Подключите сигнальный кабель к камере.
<img src="../assets/fpv/fpv_21.png" width=300 class="zoom border center">
13. Подключите кабель питания камеры к силовому JST, припаянному к площадкам *BAT+* и *GND* на плате распределения питания.
14. Подключите кабель питания передатчика к JST на 5В.
<img src="../assets/fpv/fpv_22.png" width=300 class="zoom border center">
## Настройка и подключение FPV-очков
1. Установите на очки две комплектные антенны.
2. Включите очки удерживая кнопку питания 34 секунды.
3. Включите коптер и убедитесь, что светодиод передатчика светится синим цветом.
4. Нажмите на очках кнопку *Auto Search*, для автоматического поиска доступного радиоканала.

View File

@@ -0,0 +1,103 @@
# Хардатон Квиддич
[CopterHack-2021](copterhack2021.md), команда **Хардатон**.
Название проекта: Инженерное командное соревнование - хардатон «Квиддич на квадрокоптерах».
![Название проекта](../assets/Hardaton_Quidditch/Hardaton.jpg)
## Команда проекта
![Команда проекта](../assets/Hardaton_Quidditch/team.jpg)
* Бокта Оксана Александровна - лидер проекта, руководитель Центра по работе с одарёнными детьми МАОУ «Лицей № 176» г.Новосибирска.
* Шунаев Никита Александрович проектный менеджер, куратор IT-направления.
* Алеков Иван Анатольевич - эксперт по программированию, преподаватель спецкурсов МАОУ «Лицей № 176».
* Жданов Олег Игоревич - эксперт по 3D-моделированию, преподаватель спецкурсов МАОУ «Лицей № 176».
## Цель проекта
Развитие инженерных hard-компетенций школьников 7-11 классов по направлению «Беспилотные авиационные системы» с использованием платформы «COEX Клевер 3, 4».
## Задачи проекта
1. Привлечение образовательных организаций, наставников, школьников, партнёров в направление «Беспилотные авиационные системы», к занятиям инженерным творчеством с использованием платформы «COEX Клевер 3,4».
2. Развитие hard-компетенций школьников (программирование, моделирование, пилотирование, в том числе автономно).
3. Развитие soft-компетенций (умение распределять роли, работать в команде, нестандартно мыслить, презентовать проект и др.).
4. Подготовка к инженерным соревнованиям, конкурсам и научно-практическим конференциям инженерно-технологической направленности (Олимпиада НТИ, WorldSkills и др.).
5. Создание условий для раннего выявления и сопровождения талантов НТИ.
6. Формирование среды, способствующей вовлечению в сообщества технологических энтузиастов, зарождению и развитию кружков НТИ по направлению «Беспилотные авиационные системы».
## Актуальность проекта
В России с зарождением Национальной технологической инициативы растёт число школьников, наставников, энтузиастов, вовлечённых в техническое творчество. Современным школьникам доступны соревнования, чемпионаты, конкурсы инженерно-технологической направленности. Набирают обороты по количеству участников Олимпиада НТИ, чемпионат WorldSkills и другие. Профиль ОНТИ «Летающая робототехника», компетенция WorldSkills «Эксплуатация беспилотных авиационных систем» основаны на умениях осуществлять сборку, дефектовку, программирование, управление квадрокоптером с использованием платформы «COEX Клевер 3,4». Но сегодня очень мало соревнований, подготавливающих школьников к участию в таких сложных инженерных олимпиадах и конкурсах, вовлекающих в техническое творчество с использованием программируемых квадрокоптеров. Мы предлагаем концепцию инженерного командного соревнования - хардатон «Квиддич на квадрокоптерах», в котором школьник с разным уровнем подготовки (начинающий, продолжающий, продвинутый), работая в команде, сможет проявить инженерное мышление, умение программировать, моделировать и управлять квадрокоптером. Вовлечению будет способствовать игровая модель, основанная на известном фильме «Гарри Поттер» и разные форматы проведения (очный и дистанционный).
## Концепция проекта
Хардатон «Квиддич на квадрокоптерах» представляет собой инженерное командное соревнование под руководством наставника (3 человека в команде, роли распределяются по компетенциям - моделист, программист, пилот), в котором необходимо максимально проявить свои умения в испытаниях (как личностных, так и командных).
Соревнование проходит с использованием следующего оборудования.
Для команды: конструктор программируемого квадрокоптера «COEX Клевер 3, 4» (либо другой с возможностью установления захвата и камеры), ресурсный набор для ремонта (по необходимости), оборудование для изготовления захвата (можно использовать оборудование площадки проведения), инструменты, запасные аккумуляторы не менее 3 штук с возможностью подзарядки, ноутбук, флешка с файлами.
Для площадки проведения: оборудование для изготовления захвата - материал и обработку команда выбирает самостоятельно (3D-принтер, станок с ЧПУ, ручная обработка, композитные материалы и др.). Площадка проведения финала - спортивный зал (другое помещение), распределённый на зоны (входная зона, зона моделирования, зона программирования, полётная зона, коворкинг-зона с панелью для защиты презентаций и просмотра фильмов о Гарри Поттере, защитная сетка, разметка, 6 колец (размер колец 70-90), 10 подставок для мячей, 2 маленьких квадрокоптера-сничи, открытые лаборатории, ремонтная зона (паяльники, провода, запасные части), метки, Raspberry Pi, FPV, камера, 10 теннисных мячей, ноутбуки, удлинители, интернет.
Пример оформления и зонирования площадки:
![Картинка 1](../assets/Hardaton_Quidditch/1.jpg)
![Картинка 2](../assets/Hardaton_Quidditch/2.jpg)
![Картинка 3](../assets/Hardaton_Quidditch/3.jpg)
![Картинка 4](../assets/Hardaton_Quidditch/4.jpg)
Дизайн помещений, названия и содержание испытаний схожи со сценами из знаменитого фильма «Гарри Поттер». Задания по компетенциям имеют дифференциацию по уровню подготовки участников (начальный, продолжающий, продвинутый). Ключевым испытанием является квиддич на квадрокоптерах. Победу одерживает команда, набравшая большее количество очков по всем испытаниям. К судейству могут привлекаться эксперты в компетенциях, не заинтересованные наставники команд, представители компаний-партнёров из реального сектора экономики, представители инженерных ВУЗов и др. Все участники, не прошедшие в финал хардатона, получают сертификаты участников; участники финала, не занявшие места, получают диплом участника финала; команды, занявшие места в квиддиче, получают дипломы победителей или призёров и ценные подарки.
## Этапы соревнования
1. Отборочный этап (командам необходимо разработать идею, изготовить захват и защиту на квадрокоптер).
2. Основной личный этап хардатона для команд начинающего, продолжающего и продвинутого уровня по моделированию, программированию и пилотированию.
3. Основной командный этап (квиддич на квадрокоптерах).
4. Заключительный этап (подведение итогов, награждение победителей).
## Задания хардатона
Разработаны разноуровневые задания для очного и дистанционного формата проведения мероприятия.
* [Ссылка на задания отборочного этапа](https://disk.yandex.ru/d/6obCbcUGKx74WQ?w=1).
* [Ссылка на задания по программированию](https://disk.yandex.ru/d/AzBWLAr0_AFDmg?w=1).
* [Ссылка на задания по моделированию](https://disk.yandex.ru/d/teqzvDy_3QQHJw?w=1).
* [Ссылка на задания квиддича на квадрокоптерах](https://disk.yandex.ru/d/hq--WyXn0QRcIQ?w=1).
* [Для оценивания выполнения заданий разработаны критерии](https://disk.yandex.ru/d/5BUMq2tf1Wz6wA?w=1).
## Апробация проекта
Инженерное командное соревнование по беспилотным авиационным системам «Квиддич на квадрокоптерах» было апробировано на площадке МАОУ «Лицей № 176» города Новосибирска:
1. Дистанционный отборочный этап со 2 ноября по 20 ноября 2020 года.
2. Очный подготовительный этап - организаторами мероприятия проведено установочное совещание с наставниками команд, экспертами организована подготовка команд с предоставлением оборудования лабораторий электроники и прототипирования, новых производственных технологий со станками с ЧПУ, лаборатории DronLab.
3. Финал прошел с 4 по 6 декабря 2020 года.
В очном мероприятии приняли участие 27 команд из города Новосибирска, 81 участник из образовательных организаций и организаций дополнительного образования детей города Новосибирска, 14 наставников, 5 волонтёров, 3 эксперта, 5 помощников эксперта, 3 организатора. Общий охват мероприятия 111 человек.
![Картинка 5](../assets/Hardaton_Quidditch/5.jpg)
![Картинка 6](../assets/Hardaton_Quidditch/6.jpg)
![Картинка 7](../assets/Hardaton_Quidditch/7.jpg)
![Картинка 8](../assets/Hardaton_Quidditch/8.jpg)
Предложенные участниками хардатона [инженерные решения](https://disk.yandex.ru/d/2TbB8SSM4a6jsw?w=1) по разработке захвата и защиты на квадрокоптер:
[Видео](https://disk.yandex.ru/d/6kNI1smfWhWYXA?w=1) о команде и с полётной зоны.
<iframe width="560" height="315" src="https://www.youtube.com/embed/6R4tLkZVmcs" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
## Освещение мероприятия в СМИ
* https://nsknews.info/materials/kviddich-na-kvadrokopterakh-ustroili-v-novosibirskoy-shkole/ (городской новостной сайт).
* http://www.nios.ru/news/24302 (сайт департамента мэрии города Новосибирска).
* http://xn--176-qddohl3g.xn--p1ai/index.php/dostizheniya-litseistov/1627-kviddich-na-kvadrokopterakh (сайт МАОУ “Лицей №176”)
* https://www.facebook.com/633602557253181/posts/739165210030248/.
## Перспективы развития проекта
* Проведение мероприятий продолжающего и продвинутого уровня с целью подготовки школьников к олимпиадам, чемпионатам и инженерным конкурсам по направлению «Беспилотные авиационные системы» с использованием платформы «COEX Клевер 3,4» как в очном, так и в дистанционном формате.
* Привлечение партнёров, экспертного сообщества к доработке заданий, организации и совместному проведению инженерного командного соревнования «Квиддич на квадрокоптерах» на Всероссийском уровне.
* Трансляция опыта проведения мероприятия на различных уровнях с целью вовлечения школьников в занятия инженерным творчеством, технологические кружки, развитие hard и soft-компетенций.

65
docs/ru/magnetic_grip.md Normal file
View File

@@ -0,0 +1,65 @@
# Сборка и настройка электромагнитного захвата
Магнитный захват можно собрать различными способами в соответствии с электрической схемой.
<img src="../assets/magnet_grip/scheme.jpg" width=300 class="zoom border center">
Ниже представлен пример сборки схемы электромагнитного захвата на макетной плате.
> **Info** Рекомендуется проложить проводку между элементами с обратной стороны платы (на дальнейших изображениях проводка сделана поверх схемы, для наглядности).
1. На паечной плате разместите диод Шоттки, резистор на 10 кОм и транзистор.
<img src="../assets/magnet_grip/magnet1.png" width=300 class="zoom border center">
2. Припаяйте контакты с другой стороны платы и откусите оставшиеся ножки элементов.
3. Соедините контакты резистора и двух крайних ножек транзистора.
<img src="../assets/magnet_grip/magnet2.png" width=300 class="zoom border center">
4. Соедините центральную ножку транзистора и ножку диода Шоттки (противоположную серой маркировочной полоске).
<img src="../assets/magnet_grip/magnet3.png" width=300 class="zoom border center">
5. Обрежьте необходимое количество провода магнитного захвата и припаяйте его к контактам диода Шоттки.
<img src="../assets/magnet_grip/magnet4.png" width=300 class="zoom border center">
6. Припаяйте провода *Dupont*-папа к ножке транзистора и диода (красный, черный провода), а также провод *Dupont*-мама на противоположную ножку транзистора (белый провод).
<img src="../assets/magnet_grip/magnet5.png" width=300 class="zoom border center">
## Проверка работы электромагнитного захвата
Для того, чтобы проверить работу захвата, подайте на сигнальный провод напряжение 5В. Для этого можно использовать провод *Dupont* папа-папа.
<img src="../assets/magnet_grip/magnet_check.png" width=300 class="zoom border center">
После подачи напряжения магнит должен включиться.
## Подключение к Raspberry Pi
Подключите магнитный захват к плате Raspberry Pi для программного использования
<img src="../assets/magnet_grip/magnet_raspberry.png" width=300 class="zoom border center">
Пример кода, активирующего магнитный захват, можно посмотреть [тут](gpio.md#подключение-электромагнита).
## Подключение к Arduino
Подключите захват плате Arduino Nano, чтобы использовать его в ручном режиме.
Удобно ее располагать на той же паечной плате -- вставьте ее в подходящие отверстия и припаяйте с обратной стороны к плате.
<img src="../assets/magnet_grip/magnet_arduino1.png" width=300 class="zoom border center">
Затем подключите сигнальный выход схемы к выбранному порту и припаяйте провод *Dupont*-мама к выбранному сигнальному порту на плате.
<img src="../assets/magnet_grip/magnet_arduino2.png" width=300 class="zoom border center">
## Установка электромагнитного захвата
1. В центральное отверстие на деке захвата установите электромагнит.
2. Стяжкой притяните собранную схему к обратной стороне деки.
3. Сигнальный вывод Arduino *D11* вставьте в один из выводов *AUX* на полетном контроллере.
4. Вставьте силовой вывод электромагнитного захвата в JST 5В.

View File

@@ -0,0 +1,69 @@
# Сборка и настройка механического захвата
1. Совместите главные пластины захвата.
<img src="../assets/mechanical_grip/mech_grip_1.png" width=300 class="zoom border center">
2. Установите сервопривод в соответствующий паз в центре пластин, таким образом, чтобы осевая шестерня находилась посередине захвата.
<img src="../assets/mechanical_grip/mech_grip_2.png" width=300 class="zoom border center">
3. Прижмите пластины захвата небольшими проставками.
<div class="image-group">
<img src="../assets/mechanical_grip/mech_grip_3.png" width=300 class="zoom border">
<img src="../assets/mechanical_grip/mech_grip_4.png" width=300 class="zoom border">
</div>
4. Установите деку захвата таким образом, чтобы крепежные отверстия в захвате совпадали с отверстиями для саморезов в пластине.
<img src="../assets/mechanical_grip/mech_grip_5.png" width=300 class="zoom border center">
5. Закрепите конструкцию захвата саморезами.
<img src="../assets/mechanical_grip/mech_grip_6.png" width=300 class="zoom border center">
6. Поверните шестерню сервопривода в крайнее положение.
<img src="../assets/mechanical_grip/mech_grip_7.png" width=300 class="zoom border center">
7. Установите на шестерню крестообразное крепление и закрепите его помощью винта, прилагающегося к сервоприводу.
<img src="../assets/mechanical_grip/mech_grip_8.png" width=300 class="zoom border center">
8. Обрежьте крестообразное крепление.
<div class="image-group">
<img src="../assets/mechanical_grip/mech_grip_9.png" width=300 class="zoom border">
<img src="../assets/mechanical_grip/mech_grip_10.png" width=300 class="zoom border">
</div>
9. Завяжите сервоприводную нить таким образом, чтобы оставалось 2-3 см запаса.
<div class="image-group">
<img src="../assets/mechanical_grip/mech_grip_11.png" width=300 class="zoom border">
<img src="../assets/mechanical_grip/mech_grip_12.png" width=300 class="zoom border">
</div>
10. Проденьте сервоприводную нить в соответствующие натягивающие пазы.
<img src="../assets/mechanical_grip/mech_grip_13.png" width=300 class="zoom border center">
11. Закрепите клешни захвата маленькими саморезами таким образом, чтобы их угол составлял 25°40°.
<img src="../assets/mechanical_grip/mech_grip_14.png" width=300 class="zoom border center">
12. Установите собранный захват на коптер снизу.
<div class="image-group">
<img src="../assets/mechanical_grip/mech_grip_15.png" width=300 class="zoom border">
<img src="../assets/mechanical_grip/mech_grip_16.png" width=300 class="zoom border">
</div>
13. Протяните кабель сервопривода и вставьте его в выход *AUX* 1-2 на полетном контроллере.
<img src="../assets/mechanical_grip/mech_grip_17.png" width=300 class="zoom border center">
14. Для того, чтобы настроить управление захватом с пульта, зайдите во вкладку *Radio*.
15. В параметре *AUX 1/2 Passthrough RC channel* укажите необходимый вам канал.
16. Теперь при переключении тумблера соответствующего канала захват будет закрываться или открываться.

View File

@@ -80,13 +80,31 @@
</tr>
</table>
## Клевер 4.2 WorldSkills
### Фрезеровка
<table>
<tr><th width=150>Изображение</th><th>Деталь</th><th width=1>Файл</th></tr>
<tr>
<td><img src="../assets/dxf/4.2/big_leg.png"></td>
<td>
<b>Ножка большая</b>.<br>
Функция: Опорный элемент увеличенной высоты.<br>
Материал: Монолитный поликарбонат 2мм.<br>
Количество: 2 шт.
</td>
<td><a href="https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/4.2/big_leg.dxf"><code>big_leg.dxf</code></a></td>
</tr>
</table>
## Клевер 4
### 3D печать
* **АКБ холдер** [`battery_holder.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/battery_holder.stl)
Функция: Фиксация АКБ и тестера напряжения.
Материал: ABS пластик(или аналог). Заполнение не менее 50%.
* **АКБ холдер** [`battery_holder.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/battery_holder.stl)
Функция: Фиксация АКБ и тестера напряжения.
Материал: ABS пластик(или аналог). Заполнение не менее 50%.
Количество: 1шт.
## Дополнительные модели для Клевер 4
@@ -95,16 +113,16 @@
### Лазерная резка
* **Усиленная пластина - основа** [`reinforced_plate_base.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/reinforced_plate_base.dxf)
Функция: Крепление компьютеров формата Jetson Nano и виброразвязок на раме Клевер 4.
Материал: Монолитный поликарбонат 2мм.
* **Усиленная пластина - основа** [`reinforced_plate_base.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/reinforced_plate_base.dxf)
Функция: Крепление компьютеров формата Jetson Nano и виброразвязок на раме Клевер 4.
Материал: Монолитный поликарбонат 2мм.
Количество: 1шт.
* **Ребро жёсткости усиленной пластины** [`reinforced_plate_rib.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/reinforced_plate_rib.dxf)
Функция: Увеличение жёсткости сборки.
* **Ребро жёсткости усиленной пластины** [`reinforced_plate_rib.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/reinforced_plate_rib.dxf)
Функция: Увеличение жёсткости сборки.
Материал: Монолитный поликарбонат 2мм.
Количество: 2шт.
* **Пластина для камеры** [`reinforced_plate_camera_pad.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/reinforced_plate_camera_pad.dxf)
Функция: Крепление камеры при использовании усиленной пластины.
Функция: Крепление камеры при использовании усиленной пластины.
Материал: Монолитный поликарбонат 2мм.
Количество: 1шт.
@@ -112,65 +130,65 @@
### 3D печать
* **Кейс для камеры** [`camera_case.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/camera_case.stl)
Функция: Кейс для крепления модуля камеры.
Материал: PLA/ABS(или аналог). Заполнение 30%.
Количество: 1шт.
**Крепежная пластина для камеры** [`camera_mount.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/camera_mount.stl).
Функция: Крепежный модуль, для монтажа кейса.
Материал: PLA/ABS(или аналог). Заполнение 30%.
Количество: 1шт.
**Пластина для камеры** [`camera_plate.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/camera_plate.stl).
Функция: Пластина для закрепление модуля камеры в кейсе.
Материал: PLA/ABS(или аналог). Заполнение 30%.
* **Кейс для камеры** [`camera_case.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/camera_case.stl)
Функция: Кейс для крепления модуля камеры.
Материал: PLA/ABS(или аналог). Заполнение 30%.
Количество: 1шт.
**Крепежная пластина для камеры** [`camera_mount.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/camera_mount.stl).
Функция: Крепежный модуль, для монтажа кейса.
Материал: PLA/ABS(или аналог). Заполнение 30%.
Количество: 1шт.
**Пластина для камеры** [`camera_plate.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/camera_plate.stl).
Функция: Пластина для закрепление модуля камеры в кейсе.
Материал: PLA/ABS(или аналог). Заполнение 30%.
Количество: 1шт.
* **Малая монтажная дека** [`mounting_deck_small.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/mounting_deck_small.stl).
Функция: Крепление камеры и полетного контроллера.
Материал: PLA/ABS(или аналог). Заполнение 60%.
Функция: Крепление камеры и полетного контроллера.
Материал: PLA/ABS(или аналог). Заполнение 60%.
Количество: 1шт.
### Лазерная резка
* **Ножка** (вариант с захватом) [`big_leg.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/big_leg.dxf)
Функция: Опорный элемент для ситуации установки захвата.
Материал: Монолитный поликарбонат 2мм.
* **Ножка** (вариант с захватом) [`big_leg.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/big_leg.dxf)
Функция: Опорный элемент для ситуации установки захвата.
Материал: Монолитный поликарбонат 2мм.
Количество: 4шт.
* **Дека монтажная** [`deck.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/deck.dxf)
Функция: Крепление АКБ сопутствующей периферии.
Материал: Монолитный поликарбонат 2мм.
* **Дека монтажная** [`deck.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/deck.dxf)
Функция: Крепление АКБ сопутствующей периферии.
Материал: Монолитный поликарбонат 2мм.
Количество: 1шт.
* **Дуга** [`prop_guard.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/prop_guard.dxf)
Функция: Элемент каркаса защиты.
Материал: Монолитный поликарбонат 2мм.
* **Дуга** [`prop_guard.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/prop_guard.dxf)
Функция: Элемент каркаса защиты.
Материал: Монолитный поликарбонат 2мм.
Количество: 16шт.
* **Рогатка + ушко** [`prop_guard_mount.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/prop_guard_mount.dxf)
Функция: Крепление защиты пропеллеров к раме.
Материал: Монолитный поликарбонат 2мм.
* **Рогатка + ушко** [`prop_guard_mount.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/prop_guard_mount.dxf)
Функция: Крепление защиты пропеллеров к раме.
Материал: Монолитный поликарбонат 2мм.
Количество: 4шт.
* **Проставка** [`grab_spacer.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/grab_spacer.dxf).
Функция: Монтаж сервопривода к деке захвата.
Материал: Монолитный поликарбонат 2мм.
* **Проставка** [`grab_spacer.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/grab_spacer.dxf).
Функция: Монтаж сервопривода к деке захвата.
Материал: Монолитный поликарбонат 2мм.
Количество: 1шт.
* **Ножка** [`leg.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/leg.dxf).
Функция: Опорный элемент.
Материал: Монолитный поликарбонат 2мм.
* **Ножка** [`leg.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/leg.dxf).
Функция: Опорный элемент.
Материал: Монолитный поликарбонат 2мм.
Количество: 4шт.
* **Обруч (LED)** [`led_mount_plate.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/led_mount_plate.dxf).
Функция: Крепление светодиодной ленты.
Материал: Монолитный поликарбонат 2мм.
* **Обруч (LED)** [`led_mount_plate.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/led_mount_plate.dxf).
Функция: Крепление светодиодной ленты.
Материал: Монолитный поликарбонат 2мм.
Количество: 4шт.
* **Малая монтажная дека** [`mounting_deck_small.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/mounting_deck_small.dxf).
Функция: Крепление камеры и полетного контроллера.
Материал: Монолитный поликарбонат 2мм.
Функция: Крепление камеры и полетного контроллера.
Материал: Монолитный поликарбонат 2мм.
Количество: 1шт.
### Фрезеровка
* **Дека центральная**  [`central_plate.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/central_plate.dxf).
Функция: Несущая часть коптера.
Материал: Стеклотекстолит/карбон 2мм.
* **Дека центральная**  [`central_plate.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/central_plate.dxf).
Функция: Несущая часть коптера.
Материал: Стеклотекстолит/карбон 2мм.
Количество: 1шт.
* **Луч**  [`arm.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/arm.dxf).
Функция: Крепление моторов.
Материал: Стеклотекстолит/карбон 2мм.
* **Луч**  [`arm.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/arm.dxf).
Функция: Крепление моторов.
Материал: Стеклотекстолит/карбон 2мм.
Количество: 4шт.

View File

@@ -6,7 +6,7 @@
1. Зайдите во вкладку *Vehicle Setup*.
2. Выберите меню *Flight Modes*.
3. Установите переключатель режимов на переключатель SwC (Channel 5).
3. Установите переключатель режимов на переключатель SwC (Channel 6).
4. Выберите необходимые полетные режимы.
Рекомендуемые полетные режимы:
@@ -16,7 +16,7 @@
* Flight Mode 6: *Position*.
5. Проверьте корректность переключения режимов, переключая переключатель на пульте.
6. Назначьте аварийное отключение моторов (*Kill switch*) на переключатель SwA (Channel 6).
6. Назначьте аварийное отключение моторов (*Kill switch*) на переключатель SwA (Channel 5).
<img src="../assets/qgc-modes.png" class="zoom" alt="QGroundControl modes">

126
docs/ru/oktazodg.md Normal file
View File

@@ -0,0 +1,126 @@
# Октокоптер со специфичным расположением пропеллеров
[CopterHack-2021](copterhack2021.md), команда **PаD30DЖ**.
<img src="../assets/oktapadzog/image.gif" class="center">
## Введение
Наверное каждый, когда видит впервые летающий дрон, задается рядом вопросов типа:"А сколько он может летать так?","А как далеко он может улететь?","А сколько он может поднять?". Наша команда, проявила интерес к последнему из них, а именно к вопросу грузоподъёмности квадрокоптера компании COEX - Clover 4. Имея на руках сопутствующее оборудование и тягу к полетам, мы экспериментально выяснили, что полезная нагрузка данной модели коптера является масса от 800 до 1000 грамм. Но почему так мало и что с этим делать? Ведь в недалеком будующем уже должна развиться повсеместная доставка товаров на дронах и данное направление не должно ограничиваться 1 килограммом полезной нагрузки. Пребывая в поисках решений этой проблемы, мы решили реализовать самое элементарное что может прийти в голову - просто присоединить к одному дрону второй! Изучая список рекомендованных организаторами тем на конкурс CopterHack2021, мы нашли такую тему как "Два дрона в твердой связке", что являлось 100-процентным попаданием в интересующую нас область летательной робототехники.
<img src="../assets/oktapadzog/24-5.jpg">
## Разработка
В результате поиска решения, удовлетворяющего всем нашим требованиям, мы остановились на нескольких вариантах. Было решено для начала сделать октокоптер со специфичным расположением пропеллеров, собственно как если бы два дрона соединили вместе на стандартном расстоянии двух парных пропеллеров квадрокоптера. Промежуточную часть было решено делать из стандартных соединительных деталей дрона (центральная дека, 4 луча, 2 крестовины), которые идут в базовой комплектации Clover 4.
<img src="../assets/oktapadzog/frame_assembly_4.png">
В качетве полетного контролера был выбран Pixhawk v.4, т.к. он, в отличии от стандартных на Клеверах Pixracer и CoexPix имеет больше сигнальных портов для движков.
<img src="../assets/oktapadzog/Pixhawk.png">
В качестве радиоприемника и радиопередатчика использовались стандартное оборудование FlySky.
Чтобы не отходить от темы "двух дронов в твердой связке", было принято решение использовать для одного октокптера две стандартные платы распределения питания. Вопрос питания временно остается открытым. Сейчас к двум отдельным PDB подсоединяются два отдельных аккумулятора, провода к контроллеру идут только от одной из плат распределения питания. Можно было бы использовать специализированную PDB и один обычный акквмулятор на 5200 mA/h, но тогда бы наш проект потерял свою "изюминку" и основную идею для развития.
## Прошивка
https://drive.google.com/drive/folders/1Zc878JuDw_4FKSvvzibzGLVOnaxFhiqL?usp=sharing - ссылка на прошивку октокоптера с расширением PX4.
https://github.com/matveylapin/PX4-Autopilot - ссылка на прошивку октокоптера со всеми исходниками.
Основное отличие нашей прошивки, от прошивки Clover 4, не считая того, что первый окто-, а второй квадро-коптер, является наличие нескольких новых особых файлов, они и будут описаны ниже.
Первый файл - это файл геометрии.В нем прописываются координаты моторов в локальной системе координат дрона. Это требуется для составления обратной кинематической модели.
```python
# Firmware/src/lib/mixer/geometries/MultirotorMixer/octa_h.toml
[info]
key = "8h"
description = "the coolest geometry on the planet"
[rotor_default]
axis = [0.0, 0.0, -1.0]
Ct = 1.0
Cm = 0.05
[[rotors]]
name = "front_right"
position = [0.5, 1, 0.0]
direction = "CCW"
[[rotors]]
name = "rear_left"
position = [-0.5, -1, 0.0]
direction = "CCW"
[[rotors]]
name = "mid_front_right"
position = [0.5, 0.5, 0.0]
direction = "CW"
[[rotors]]
name = "rear_right"
position = [-0.5, 1, 0.0]
direction = "CW"
[[rotors]]
name = "front_left"
position = [0.5, -1, 0.0]
direction = "CW"
[[rotors]]
name = "mid_rear_left"
position = [-0.5, -0.5, 0.0]
direction = "CW"
[[rotors]]
name = "mid_front_left"
position = [0.5, -0.5, 0.0]
direction = "CCW"
[[rotors]]
name = "mid_rear_right"
position = [-0.5, 0.5, 0.0]
direction = "CCW"
```
Вторым файлом является миксер. В нем можно задать ограничения как всех моторов сразу, так и для отдельных групп.
```python
# Firmware/ROMFS/px4fmu_common/mixers/octo_h.main.mix
# Octo H
R: 8h 10000 10000 10000 0
```
Третий и последний файл является основным файлом эирфпейма. В нем записываются дефолтные конфиги самой прошивки PX4. Также прописывается сам миксер и выход
```python
#!/bin/sh
# Firware/ROMFS/px4fmu_common/init.d/airframes/8111_octo_h
sh /ect/init.d/rc.mc_defaults
set MIXER octo_h
set PWM_OUT 12345678
```
## 3D-модель
Изначально, при принятии решения взяться за проект, нашим программистом был предложен вариант протестить все в симуляторе Gazebo. Ввиду недостатка времени над работой связанной с проектом, реализация предложения оттянута на неопределенный срок. Но, не смотря на этот факт, для более лучшей визуализации проекта, была сделана 3D-модель октокоптера. Все детали для сборки можно скачать по ссылке - https://drive.google.com/drive/folders/1TuxiSWmiPWIslp03GDKJL4yQ729Cn70I?usp=sharing.
<img src="../assets/oktapadzog/octo.png">
## Ожидание
Изначально у команды имелось намерение реализовать все в очень короткие сроки, сделав акцент на презентации и дальнейшем развитии.
## Реальность
Ввиду многих отвлекающих факторов, таких как: учеба, работа, проживание в условиях пандемии, невозможность собраться всем сокомандникам вместе на одной площадке, выполнение проекта долго оттягивалось и конкретика по этому вопросу каждый раз переносилась на следующую неделю. За достаточно малый промежуток времени, а именно за три недели до финала конкурса, мы взялись за дело. Вплоть до дня проведения финала CopterHack2021 команда будет работать над рабочим прототипом, чтобы 20-21 марта 2021 года показать реализованный проект. Данная статья также подлежит редактированию, по мере нашего прогресса.
С наилучшими пожеланиями и воодушевленным настроем, команда PаD30DЖ!

View File

@@ -15,7 +15,7 @@
* Введите в открывшемся поле суммарное значение напряжения с индикатора напряжения.
* Нажмите *Close*, чтобы сохранить рассчитанное значение.
<img src="../assets/qgc-battery.png" class="zoom">
<img src="../assets/qgc-voltage-divider.png" class="zoom">
Дополнительная информация: https://docs.qgroundcontrol.com/en/SetupView/Power.html.
@@ -28,7 +28,7 @@
3. После появлении надписи *Connect the battery now* подсоедините АКБ.
4. Дождитесь появления надписи *Calibration complete*.
<img src="../assets/qgc-esc.png" class="zoom">
<img src="../assets/qgc-power.png" class="zoom">
Дополнительная информация: https://docs.px4.io/v1.9.0/en/advanced_config/esc_calibration.html.

View File

@@ -13,7 +13,7 @@
|Интеграция системы позиционирования [Pozyx](https://www.pozyx.io)|[Наработки](https://github.com/goldarte/pozyx_clever).|
|Интеграция системы позиционирования типа Motion Capture||
|Разработка и интеграция дешевого Motion Capture||
|Интеграция блочного программирования (Scratch, Blockly)|[Решение с программы стажировок](clever_blocks.md). Официальное решение COEX [в разработке](https://github.com/CopterExpress/clover/tree/blockly).|
|Интеграция блочного программирования (Scratch, Blockly)|[Решение от COEX](blocks.md).|
|Улучшение алгоритма визуального позиционирования (optical flow): трекинг по фичам, расчет угла по yaw||
|Симулятор Клевера|[Решение от COEX](https://github.com/CopterExpress/clover_vm) (на основе Gazebo). Проект продолжает разрабатываться.|
|Облачная платформа для симулятора Клевера|По аналогии или на основе [ROS Development Studio](http://rosds.online/).|

View File

@@ -0,0 +1,94 @@
# Система засечки (хронометража) для дронов
[CopterHack-2021](copterhack2021.md), команда **Atomic Ferrets**.
Наша команда состоит из двух человек - Стецкий Сергей и Давлетшин Денис.
По всем вопросам обращаться на почту (bashirianboy@gmail.com) или [Телеграм](https://t.me/DenisNoLimit).
## Идея
На сегодняшний день существует множество засечек для дронов, но тех, которые производят в России, мало, а таких, которые бы имели приемлемую цену, еще меньше. Поэтому было решено сделать собственную систему засечки, которая давала бы весь нужный функционал, и производство которого было бы не столь затратным.
Ознакомиться с кодом проекта вы можно через репозиторий: https://github.com/stinger000/CopterHack2020_IR_LED.
## Принцип работы
Прелесть нашей системы в том, что ее концепция проста - использование чувствительного фотодатчика - фотодиода, и светодиода. Фотодатчик и ИК светодиод крепятся на ворота друг напротив друга, и светодиод все время направлен на датчик. Когда дрон пролетает через ворота, он на какое-то время перекрывает собой светодиод, и показания на датчике тут же меняются. На этом и основан принцип работы. Остается только подключить датчик к схеме, способной считывать световой поток, падающий на него, и затем отправлять сигнал о детектировании пролета на компьютер. Для наших целей мы использовали Arduino.
Для Arduino написан код, который обрабатывает постоянно поступающие на него сигналы с фотодиода. Затем используется имитация фильтра низких частот, сглаживающий шумы, которые по сравнению с реальным сигналами более низкочастотные. Фильтрация шумов помогает в том случае, когда датчик и светодиод разнесены далеко друг от друга, и световой поток в этом случае может смешаться с шумом.
На рисунке ниже изображена типичная временная диаграмма сигнала. "Ямы" образуются во время пролета через засечку. Синим цветом показан "сырой" сигнал, а красным - обработанный с помощью low-pass фильтра. Подбором параметров фильтра можно добиться того, чтобы принципиальный вид сигнала не менялся, а шумы сглаживались.
![diagram example](../assets/race_timing_sys_copterhack/diagram.jpg)
Алгоритм работает так, что пролет засчитывается поле того, как будет обнаружен спад и последующий подъем сигнала, а также амплитуда сигнала должна больше некоторого выставленного вручную минимума (зависит от шумов собранной системы).
Затем по Serial-порту Arduino отправляет специальный символ, который обозначает обнаружение пролета.
Компьютер, к которому подключена засечка, может считывать этот сигнал, и затем выводить на любой интерфейс.
## Результат работы
Вы можете посмотреть короткую видеопрезентацию:
<iframe width="640" height="480"src="https://www.youtube.com/embed/MEJdM9arz5c" frameborder="0" ; autoplay; encrypted-media; gyroscope; picture-in-picture"> </iframe>
## Использование
Данный проект можно использовать для любых квадрокоптеров достаточно больших размеров. Условие, которое необходимо выполнить, это то, чтобы дрон при пролете перекрывал собой светодиод. То есть дрон должен попадать в довольно узкий диапазон. Это наглядно проиллюстрировано на рисунке ниже:
![system work](../assets/race_timing_sys_copterhack/system_work.png)
Для начала работы скачайте репозиторий с кодом обработки пролетов и репозиторий с пользовательским интерфейсом:
```bash
git clone https://github.com/stinger000/CopterHack2020_IR_LED
git clone https://github.com/stinger000/CopterHack2020_IR_LED_Desktop_GUI
```
Зайдите в папку Signal_handler репозитория `CopterHack2020_IR_LED` и откройте в Arduino IDE файл `AnalogReadSerial_filtered_v2.ino`.
Надо раскомментировать строки:
```cpp
//debug in plotter
//Serial.print(sensorValue); // uncomment this 4 rows
//Serial.print(" ");
//Serial.println(value);
//...
```
и закомментировать строку вывода символа в Serial-порт:
```cpp
// ...
if ( rising_edge & falling_edge )
{
// ...
// Send time by serial port to GUI
Serial.println(millis()); //comment this line
//...
}
```
Перепрошейте ваше Arduino этим файлом. Затем проверьте сигнал в плоттере.
![set noise](../assets/race_timing_sys_copterhack/set_noise.jpg)
По нему задать величину шума, получившуюся для вашей системы: за это отвечает переменная `noise`.
Например на рисунке ниже величина шумов (для отфильтрованного красного сигнала) достигает 10 единиц.
Затем закомментируйте и раскомментируйте обратно строки кода и перепрошейте Arduino.
В терминале запустите файл с графическим интерфейсом (# такой то файл):
```bash
cd CopterHack2020_IR_LED_Desktop_GUI
python main.py
```
Затем подключите Arduino через USB-кабель в ваш компьютер и нажмите "Connect".
Начало и конец отсчета замеров производится кнопками "start" и "stop".

View File

@@ -0,0 +1,155 @@
# Разработка системы для управления БПЛА с помощью шлема виртуальной реальности
[CopterHack-2021](copterhack2021.md), команда: **ProCleVeR**.
## Команда
- [Давыденко Галина](https://github.com/GalinaDa), e-mail: [galyadavydenko@yandex.ru](mailto:galyadavydenko@yandex.ru).
## Введение
Сейчас существует несколько способов управления квадрокоптером: первый и самый простой, управление через аппаратуру, у данного метода имеется несколько недостатков, управление идет до тех пор, пока человек может видеть квадрокоптер, или же пока не будет потерян сигнал. Второй способ FPV, такое управление уже более удобно и наиболее распространено, по сравнению с предыдущим. В данном случае осуществляется не только управление коптером, но и также получения видео-изображения по дополнительному видео-каналу в режиме реального времени. Третий способ, автономный полет - позволяет БПЛА работать в среде, куда не проникает сигнал GPS и без оператора.
Рассмотрев все способы управления, я выявила, что похожим на систему, которую я разрабатываю, будет FPV. В моей разработке присутствует несколько компонентов, квадрокоптер, шлем виртуальной реальности и манипуляторы. И сравнив, то что я хочу получить в итоге и то что есть на данный момент, выявилось, что у моей разработки будут преимущества, например, как я считаю главным минусом FPV управления является то, что коптер не сможет летать на большие расстояния из-за сигнала аппаратуры.
## Разработка
Было принято решение делать систему такой: управление квадрокоптером будет проходить через манипуляторы, а также через шлем виртуальной реальности. Какое же управление идет через шлем? На шлем будет перенесен поворот квадрокоптера по рысканью. При помощи поворота головы, будет поворачиваться коптер.
## Настройка Clover OS
Настройка включает в себя переключение Raspberry из режима точки доступа в режим клиента. На начало работы была установлена [следующая операционная система](https://github.com/CopterExpress/clover). После установки можно было приступить непосредственно к настройкам системы. Как перевести Raspberry Pi в режим клиента, рассказывается в статье: [Настройка Wi-Fi](https://clover.coex.tech/ru/network.html). После того, как была произведена данная настройка Raspberry будет автоматически подключаться к Wi-Fi, после можно подключаться к Raspberry по SSH, также в дальнейшем подключение к Wi-Fi пригодится для подключения к серверу и передачи данных между клиентом и серверу (в разрабатываемой мной системе клиентом является квадрокоптер и сервером компьютер).
## Подключение и проверка подключения
Для начала проверим и попробуем подключиться к Raspberry по сети Wi-Fi. Узнать подключается ли Raspberry, а также узнать его IP-address для дальнейшей работы. Подключаемся к маршрутизатору по локальному адресу 192.168.0.1, затем переходим к списку подключённых устройств и находим устройство с названием: cloverXXXX, где Х любое число.
![Список клиентов, подключённых к маршрутизатору](https://user-images.githubusercontent.com/60854798/111508088-e1917480-877d-11eb-80c1-58a0fd6df65b.jpg)
## Удаленное управление
Для дальнейшей работы, будет проходить несколько тестов. Первые два теста используют светодиоды. 1 отправление и получение данных с проверкой на светодиоде. Данные отправляются с сервера и приходят клиенту, клиент также отправляет данные о своем состоянии серверу.
Для начала подключим библиотеку, используемую при работе со светодиодами RPi.GPIO. Затем поле того как было получено сообщение от сервера, включаем(выключаем) светодиод, в строке мы будем указывать порт, к которому подключен светодиод, а также значение 1 или 0 в зависимости от того, что требуется сделать со светодиодом. Познакомится с программным управление светодиода можно познакомится здесь.
Далее рассмотрим вариант управлении непосредственно через среду Unity, которая и использовалась при разработке системы. Для данного теста было написано два кода один из низ написан на C# и является сервером в данном подключении, другой на Python клиент.
Откроем соединение и подключимся к клиенту по протоколу ТСР при помощи следующих строк:
```csharp
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.0.107"), 9090);
socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketServer.Bind(ipPoint);
```
Для прослушивания каналов используем метод:
```csharp
socketServer.Listen(10);
```
Так как потребуется начать асинхронную операцию, создадим объект асинхронных событий.
```csharp
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
```
Для того, чтобы определить нажата ли клавиша, будем использовать следующее:
```csharp
Input.GetKey(KeyCode.Space)
```
Для отправки используем:
```csharp
socketClient.Send(Encoding.ASCII.GetBytes("1"));
```
Для принятия данных используем:
```csharp
socketClient.Receive(Encoding.ASCII.GetBytes("1024"));
```
Видео демонстрации работоспособности результата:
<iframe width="560" height="315" src="https://www.youtube.com/embed/mBE2WYu0zOg" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
## Отправка изображения и передача видео в среду Unity
Для начала будем отправлять пакет данных, который содержит в себе информацию: тип передаваемых данных и если это изображение, то его размер. Это делается потому, что клиент(квадрокоптер) помимо изображения будет отправлять данные, например, местоположение, заряд аккумулятора, мощность и так далее. Для этого, было необходимо различать пакеты. В программе это реализуется следующим образом:
```csharp
socketClient.Receive(buffer);
Array.Copy(buffer, 0, image, i, buffer.Length > size - i ? size - i : buffer.Length);
```
Для вывода изображения используем:
```csharp
Texture2D tex = new Texture2D(2, 2);
tex.LoadImage(image);
GetComponent<Renderer>().material.mainTexture = tex;
```
В свою очередь клиент отправляет изображение, которое предварительно загрузили на Raspberry.
Для определения размера передаваемого изображения используем:
```python
filesize = os.stat(filename).st_size
```
Пакуем данные:
```python
d = struct.pack('>bI', 0, filesize)
```
Также для отправки данных может использоваться другой метод:
```python
s.sendall(bytes_read)
```
Перейдем к передаче видеопотока и его отображении:
Для вывода напишем следующие строчки кода:
```csharp
yield return new WaitWhile(() => socketClient.Available < size);
Debug.Log(socketClient.Available);
socketClient.Receive(image, 0, image.Length, SocketFlags.None);
Texture2D tex = new Texture2D(2, 2);
tex.LoadImage(image);
GetComponent<Renderer>().material.mainTexture = tex;
```
У клиента добавляем передачу видео с подключенной камеры:
```python
ret, frame = cam.read() # считываем изображения с камеры
result, frame = cv2.imencode('.jpg', frame, encode_param) # записываем в переменные нужные данные
client_socket.send(struct.pack("<bI", 1, size))
client_socket.sendall(frame)
```
Видеодемонстрация работоспособности результата:
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/1DCW51B4-7E" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
## Функции при управлении
- Индикация управления.
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/amvE6X-MNOk" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
- Поворот квадрокоптера по рысканью при помощи шлема виртуальной реальности.
## Тестовые запуски системы
- Запуск без индикации.
- Запуск с индикацией.
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/buWxqovM0Rg" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

323
docs/ru/seeding_drone.md Normal file
View File

@@ -0,0 +1,323 @@
# Дрон для высаживания семян
[CopterHack-2021](copterhack2021.md), команда **MINIONS**.
Вы когда-нибудь задумывались, как будет выглядеть мир без деревьев? Закройте глаза и попробуйте представить себе безлюдную Землю. Деревья являются решающим фактором нашего существования не только потому, что они производят бумагу, пиломатериалы и жевательную резинку, но и потому, что они играют важную роль в углеродном цикле.
Со времени промышленной революции 17601840 годов мир пребывает в нескончаемом углеродном хаосе. Деревья и планктон - наши единственные спасители с точки зрения решения этой проблемы, и мы можем контролировать только одно из них - деревья.
Нам нужно спасать деревья, защищая их от разрушительной деятельности человека, такой как вырубка лесов, вырубка лесов в целях урбанизации и т. д. Деревья - легкие для земли. Это важная часть природной экосистемы. Они уравновешивают состав почвы, а также служат барьером для ветра и шторма. Таким образом, они обеспечивают различное использование экосистемы. По этим причинам крайне важно спасать деревья.
Поскольку существует множество опасных и труднодоступных участков для посадки людей, наиболее жизнеспособной альтернативой является использование дронов для посадки в этих регионах.
Как следует из названия, дроны, стреляющие семенами, будут стрелять семенами в плодородную почву, чтобы позволить миллионам деревьев вырасти снова после вырубки для промышленного использования. Если скорость посадки превышает скорость вырубки, в конечном итоге мы восстановим деревья, которые когда-то срубили.
<img src="../assets/seeding_drone/image.jpg" width="400px" class="center" />
## Наша цель
Мы сделаем дроны способными удерживать семена на борту и сбрасывать их в область, которую мы проехали в специальном приложении. Мы можем контролировать плотность семян и высоту капли. Мы также думали о защите семян от насекомых, животных и обезвоживания. Мы выбираем технику шара земли, изобретенную Масанобу Фукуока, также известную как Техника Фукуока. Этот земной шар содержит все необходимые элементы для выращивания, семена растений и землю для защиты. Когда мы бросаем его на землю, земной шар будет удерживать семена, пока он не получит необходимое количество воды, и семена не начнут прорастать.
Видео с YouTube:
<iframe width="560" height="315" src="https://www.youtube.com/embed/Nz1w59v451U" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Нам удалось выполнить небольшие посевные миссии, но мы столкнулись с некоторыми проблемами, связанными с автономным полетом с GPS.
Мы покрыли нашу батарею, чтобы защитить ее от холода, посевные работы нужно начинать зимой, так как семена яблони должны оставаться в холодном месте в течение некоторого времени, чтобы акклиматизироваться.
- [Капсулы с семенами](#семенные-капсулы).
- [Как собрать высевающий механизм на дрон Clover 4.2](#как-собрать-высевной-механизм-на-дрон-clover-42).
- [Как управлять механизмом раздачи](#как-управлять-механизмом-высева).
- [Программирование](#программирование).
## Файлы
Ссылка на все файлы, используемые в этом проекте: [https://github.com/Sahinysf/TreeSeedQuad](https://github.com/Sahinysf/TreeSeedQuad).
## Капсулы с семенами
### Техника Фукуока
На юге Японии японский фермер и философ Масанобу Фукуока изобрел технику посадки семенных шариков. Этот метод считается естественной техникой земледелия, не требующей машин, химикатов и очень небольшого количества прополки. При использовании семенных шариков земля обрабатывается без какой-либо подготовки почвы.
<img src = "../assets/seeding_drone/seedcapsules/1.jpg" width="250px" class="center" />
### Преимущества семенных шариков
- Делать шарики с семенами проще и проще без использования машин.
- Легче для лесовосстановления и посадки на труднопроходимой местности
- Способствовать защите почвы, окружающей среды и средств к существованию
- Это органический метод, без использования каких-либо химикатов.
- Это недорогой метод по сравнению с традиционными методами облесения / лесовозобновления.
- Требует низких эксплуатационных расходов.
### Какие семена можно использовать?
Любое семя, которое растет в вашем районе (у нас это семя яблока).
Размер и вес семенной капсулы:
Размер и вес семенных коробочек очень важны для этого проекта. После некоторых экспериментов мы решили, что лучший размер - диаметр 16-18 мм, а максимальный вес - 10 грамм.
Необходимые материалы для изготовления семенных шариков:
1. 1 ведро глины;
2. 1 ведро органической темной почвы / компоста;
3. 1 ведро воды (количество воды может варьироваться в зависимости от типа почвы);
4. ¼ ведро семян.
Шаги по изготовлению семенных шариков:
<!-- markdownlint-disable MD044 -->
1. Соберите одинаковое количество глины и органической почвы. Например, если вы используете одно ведро глины, вам следует смешать его с одним ведром органической почвы.
2. Убедитесь, что глина и органические частицы почвы мелкие.
3. Текстура глины и органической почвы должна быть влажной, но не липкой.
4. Возьмите немного смеси и скатайте ее в шарики. Проверьте мяч, бросив его на плоскую поверхность. Если мяч не ломается легко, значит, у него хорошее сцепление.
5. Шарики с семенами должны быть идеально круглой формы, иначе они застрянут при броске квадрокоптером.
6. Вставьте семена (от 1 до 2 семян на семенной шарик для постоянных деревьев, таких как красное дерево, сандал, апельсин, моринга…) (± 5 семян на семенной шарик для овощей, цветов, трав, клевера…)
7. Сушите семенные шарики в течение одного-двух дней в затененном месте, если высохнуть должным образом, семенные шарики будут защищены от внешних хищников, таких как птицы, грызуны…
<!-- markdownlint-enable MD044 -->
<img src="../assets/seeding_drone/seedcapsules/3.jpg" width="250px" class="center" />
Вторая техника - бумажные капсулы с семенами.
На этот метод повлияла корейская газета, в которой были семена, которые можно было посадить на улице после прочтения.
Бумажные капсулы с семенами:
Необходимые материалы:
1. любая бумага;
2. вода;
3. блендер;
4. семена.
Шаги по изготовлению шариков из бумаги:
1. Измельчение всей вашей бумаги,
2. Положите бумагу в блендер и добавьте воды, через 2 минуты перемешайте.
3. Выдавить всю воду бумагой,
4. Добавьте семена и придайте круглую форму.
5. Дайте высохнуть на ночь.
<img src="../assets/seeding_drone/seedcapsules/2.jpg" alt="" width="400px" class="center" />
Преимущества бумажных шаров:
- легко найти материалы;
- экологически чистый.
## Как собрать высевной механизм для Clover 4.2
1. Установите нижние держатели бака на крепление верхней палубы и закрепите винтами M3x8.
<img src = "../assets/seeding_drone/mechanismpictures/1.PNG" width = "400px" class = "center" />
2. Установите нейлоновую стойку (40 мм) с 4 сторон крепления для деки.
<img src = "../assets/seeding_drone/mechanismpictures/2.PNG" width = "400px" class= "center" />
3. Установите поручень и закрепите винтами M3x8.
<img src = "../assets/seeding_drone/mechanismpictures/3.PNG" width = "400px" class = "center" />
4. Установите верхние держатели бака на верхнее захватное крепление и закрепите винтами M3x8.
<img src = "../assets/seeding_drone/mechanismpictures/4.PNG" width = "400px" class = "center" />
5. Осторожно подсоедините резервуары к держателям резервуаров.
<img src = "../assets/seeding_drone/mechanismpictures/5.PNG" width = "400px" class = "center" />
6. Подсоедините серводвигатели SG90 к резервуару с помощью стяжки.
Окончательный вид сеялки дрона:
<img src = "../assets/seeding_drone/mechanismpictures/6.jpg" width = "400px" class = "center" />
### Модуль GPS
Мы установили модуль GPS наверх, используя 2 нейлоновые стойки (40 мм).
<img src = "../assets/seeding_drone/mechanismpictures/7.jpg" alt = "" width = "400px" class = "center" />
Мы покрыли аккумулятор, чтобы защитить его от холода.
<img src = "../assets/seeding_drone/mechanismpictures/8.jpg" alt = "" width = "400px" class = "center" />
## Как управлять механизмом высева
Электронная часть механизма высева семян состоит из:
- Raspberry Pi 4 B из COEX Clover 4.
- 2 микро-серводвигателя SG90.
- PDB (блок распределения питания) COEX Clover 4.
Сигнальные контакты серводвигателя подключены к контактам 32 и 33 аппаратной ШИМ Raspberry Pi, а питание снимается с платы распределения питания (5 В).
<img src = "../assets/seeding_drone/electronicspictures/electronic1.png" width = "400px" class = "center" />
### Пояснение кода для управления серводвигателями
Сервомоторы управляются с помощью сигнала ШИМ (широтно-импульсной модуляции) от Raspberry Pi. ШИМ контролирует количество времени, когда сигнал ВЫСОКИЙ или НИЗКИЙ в течение определенного периода времени. Рабочий цикл - процент времени, когда сигнал ВЫСОКИЙ.
В таблице ниже представлен рабочий цикл серводвигателя SG90 для каждого угла серводвигателя. Чтобы использовать рабочий цикл в коде, нам нужно преобразовать время в проценты, разделив время рабочего цикла на общий период ШИМ.
Что мы получаем:
- Угол поворота -90° или рабочий цикл 2 мс => 1/20 * 100% = рабочий цикл 5%.
- Угол поворота 90° или рабочий цикл 2 мс => 2/20 * 100% = рабочий цикл 10%.
- Угол поворота 0° или рабочий цикл 1,5 мс => 1,5 / 20 * 100% = 7,5% рабочий цикл.
<img src = "../assets/seeding_drone/electronicspictures/electronic2.png" width = "400px" class = "center" />
Мы сделаем это с помощью библиотеки RPi.GPIO и написания кода Python на Raspberry Pi.
Сначала импортируйте библиотеку RPi.GPIO и функцию сна:
```python
import RPi.GPIO as GPIO
from time import sleep
```
Затем установите режим GPIO как BOARD:
```python
servo = 33
GPIO.setmode(GPIO.BOARD)
GPIO.setup(servo, GPIO.OUT)
```
Далее создайте переменную для сервопривода ШИМ. Затем отправьте сигнал ШИМ 50 Гц на этот вывод GPIO с помощью функции GPIO.PWM(). Начните сигнал с 0.
```python
pwm=GPIO.PWM(servo, 50)
pwm.start(0)
```
Используйте функцию `ChangeDutyCycle()`, чтобы записать проценты рабочего цикла в серводвигатель.
```python
pwm.ChangeDutyCycle(5) # left -90 deg position
sleep(1)
pwm.ChangeDutyCycle(7.5) # neutral position
sleep(1)
pwm.ChangeDutyCycle(10) # right +90 deg position
sleep(1)
```
## Программирование
Чтобы миссия была достигнута наилучшим образом и в пределах нашей досягаемости, от нас требовалось использовать многопоточность в Python.
Простой код миссии.
```python
import threading
import time
import rospy
from clover import srv
from std_srvs.srv import Trigger
import RPi.GPIO as GPIO
rospy.init_node('flight')
get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
navigate = rospy.ServiceProxy('navigate', srv.Navigate)
navigate_global = rospy.ServiceProxy('navigate_global', srv.NavigateGlobal)
set_position = rospy.ServiceProxy('set_position', srv.SetPosition)
set_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity)
set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude)
set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)
land = rospy.ServiceProxy('land', Trigger)
servo1 = 33 # PWM pins
servo2 = 32
GPIO.setmode(GPIO.BOARD) #set pin numbering system
GPIO.setup(servo1,GPIO.OUT)
GPIO.setup(servo2,GPIO.OUT)
pwm1 = GPIO.PWM(servo1,50) #create PWM instance with frequency
pwm2 = GPIO.PWM(servo2,50)
pwm1.start(0) #start PWM of required Duty Cycle
pwm2.start(0)
def servo_drop(seconds): #function to drop seed capsules from 2 tanks
print("Dropping")
i = 1 #variable to choose which tank
for num in range(seconds/2):
if(i == 1): #first tank
pwm1.ChangeDutyCycle(10) # release one seed capsule
time.sleep(0.5)
pwm1.ChangeDutyCycle(5) # push then drop the capsule
time.sleep(0.5)
i = 2 #changing the variable for to use the second tank in next dropping
elif(i == 2): #first tank
pwm2.ChangeDutyCycle(10) # release one seed capsule
time.sleep(0.5)
pwm2.ChangeDutyCycle(5) # push then drop the capsule
time.sleep(0.5)
i = 1 #changing the variable for to use the first tank in next dropping
print(num)
time.sleep(2)
if name == "main":
# Take off and drone 10m above the ground
navigate(x=0, y=0, z=10, frame_id='body', auto_arm=True)
# rospy waits for 10 seconds to take off
rospy.sleep(10)
# Dropping starts simultaneuously with flying forwards 5 meters
d = threading.Thread(target=servo_drop, args=(18,)) # 18 is the sum of all the time that the drone hovers after take off
d.start()
navigate(x=5, y=0, z=0, frame_id='body')
#rospy waits for 8 seconds to fly foward
rospy.sleep(8)
# Fly right 1 m
navigate(x=0, y=1, z=0, frame_id='body')
#rospy waits for 2 seconds to fly right
rospy.sleep(2)
# Fly backward 5 m
navigate(x=-5, y=0, z=0, frame_id='body')
#rospy waits for 8 seconds to fly backward
rospy.sleep(8)
# Perform landing
land()
pwm1.stop()
pwm2.stop()
GPIO.cleanup()
```
### Литература
- [Deforestation explained](https://www.nationalgeographic.com/environment/article/deforestation)
- http://www.fao.org/fileadmin/templates/rap/files/NRE/Forestry_Group/Landslide_PolicyBrief.pdf
- [Global Forest Change](https://earthenginepartners.appspot.com/)
- https://web.archive.org/web/20090115211020/http://www.rmaf.org.ph/Awardees/Biography/BiographyFukuokaMas.htm
- http://www.guerrillagarpting.org/ggseedbombs.html
## Разработано командой MINIONS
Особая благодарность Международному университету Ала-Тоо за финансирование наборов Clover 4.
<img src = "https://pms.alatoo.edu.kg/images/logo_text.png">

View File

@@ -29,7 +29,9 @@
Для Клевера, в особенности для осуществления автономных полетов, рекомендуется использовать версию прошивки PX4 от Copter Express. Скачайте актуальную версию прошивки на GitHub — **<a class="latest-firmware v4" href="https://github.com/CopterExpress/Firmware/releases">скачать</a>**.
Далее загрузите прошивку в полетный контролер.
> **Info** Для квадрокоптеров с Pixhawk (Клевер 2) существует отдельная версия прошивки. Подробности смотрите в статье "[Прошивка полетного контроллера](firmware.md)".
Загрузите прошивку в полетный контролер:
<img src="../assets/qgc-firmware.png" alt="QGroundControl firmware upload" class="zoom">
@@ -68,12 +70,12 @@
### Выбор рамы
<img src="../assets/qgc-frame-apply.png" alt="QGroundControl frame selection" class="zoom">
<img src="../assets/qgc-frame-apply-clover4.png" alt="QGroundControl frame selection" class="zoom">
1. Зайдите во вкладку *Vehicle Setup*.
2. Выберите меню *Airframe*.
3. Выберите тип рамы *Quadrotor X*.
4. Выберите подтип рамы *Generic Quadrotor X*.
4. Для Клевера 4 выберите подтипа рамы *COEX Clover 4*. В ином случае *Generic Quadrotor X*.
5. Переместитесь в начало списка и нажмите кнопку *Apply and Restart*, подтвердите нажатием *Apply*.
6. Дождитесь применения настроек и перезагрузки полетного контроллера.
@@ -87,6 +89,8 @@
#### Настройка PID-регуляторов
> **Info** Использование типа рамы *COEX Clover 4* не требует ввода коэффициентов PID.
##### Усредненные коэффициенты PID для Клевера 4
* `MC_PITCHRATE_P` = 0.087

View File

@@ -295,6 +295,8 @@ set_velocity(vx=0.4, vy=0.0, vz=0, yaw=float('nan'), yaw_rate=0.4, frame_id='bod
* `thrust` уровень газа от 0 (нет газа, пропеллеры остановлены) до 1 (полный газ).
* `auto_arm` перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит**);
Положительное направление вращения `yaw_rate` (при виде сверху) против часовой, `pitch_rate` вперед, `roll_rate` влево.
### land
Перевести коптер в [режим](modes.md) посадки (`AUTO.LAND` или аналогичный).

View File

@@ -34,3 +34,9 @@
* пакеты ROS и плагины Gazebo;
<!-- TODO: Write more, add a diagram, etc -->
## Видео
Короткий видеообзор симулятора:
<iframe width="560" height="315" src="https://www.youtube.com/embed/8HYXREMDfzQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

View File

@@ -198,7 +198,7 @@ catkin_make
```bash
. devel/setup.bash
roslaunch clover sitl.launch
roslaunch clover_simulation simulator.launch type:=none
```
Для того, чтобы воспользоваться функциями предоставляемыми нашим пакетом, в новом окне терминала подтяните зависимости из файла `setup`:
@@ -207,4 +207,4 @@ roslaunch clover sitl.launch
source ~/catkin_ws/devel/setup.bash
```
Теперь вы можете воспользоваться всеми возможностями пакета `Clover` в вашем симуляторе.
Теперь вы можете воспользоваться всеми возможностями пакета `clover` в вашем симуляторе.

View File

@@ -1,47 +1,47 @@
# Навигация по вертикальным ArUco-маркерам
Алгоритм навигации по визуальным ArUco-маркерам, реализованный в образе Клевера поддерживает гибкую настройку положения маркеров в пространстве, что позволяет располагать их на любой поверхности, под любым углом.
Алгоритм навигации по визуальным ArUco-маркерам, реализованный в образе Клевера, поддерживает гибкую настройку положения маркеров в пространстве, что позволяет располагать их на любой поверхности, под любым углом.
## Установка вертикального крепления камеры
Для более точного распознавания маркеров необходимо установить камеру вертикально, таким образом, чтобы объектив был направлен параллельно горизонту.
Для более точного распознавания маркеров необходимо установить камеру вертикально таким образом, чтобы объектив был направлен параллельно горизонту.
> **Note** Конфигурационный файл позволяет настраивать расположение камеры в пространстве относительно коптера любым образом. Для удобства, далее будет рассматриваться вариант установки камеры под 90° к горизонту, по направлению носа коптера.
> **Note** Конфигурационный файл позволяет настраивать расположение камеры в пространстве относительно коптера любым образом. Для удобства далее будет рассматриваться вариант установки камеры под 90° к горизонту, по направлению носа коптера.
### Крепление камеры, 3D печать
Распечатайте [крепление камеры](models.md#клевер-3).
Установите крепление в удобное место, таким образом, чтобы в камере было минимальное количество лишних объектов(защита, ножки, пропеллеры, лучи), все эти части будут негативно сказываться на распознавании маркеров.
Установите крепление в удобное место таким образом, чтобы в камере было минимальное количество лишних объектов (защита, ножки, пропеллеры, лучи) все это будет негативно сказываться на распознавании маркеров.
## Настройка расположения камеры
Чтобы установить расположение камеры под необходимым углом, откройте файл `main_camera.launch`, расположенный в `~/catkin_ws/src/clover/clover/launch/`.
Чтобы задать расположение камеры под необходимым углом, откройте файл `main_camera.launch`, расположенный в `~/catkin_ws/src/clover/clover/launch/`.
```bash
nano ~/catkin_ws/src/clover/clover/launch/main_camera.launch
```
### Версии 0.20>
### Версии 0.20+
В параметрах `direction_x`, `direction_y`, установите пустые значения вручную или введите строки:
В параметрах `direction_x`, `direction_y` установите пустые значения вручную или введите строки:
```bash
sed -i "/direction_z/s/default=\".*\"/default=\"\"/" /home/pi/catkin_ws/src/clover/clover/launch/main_camera.launch
sed -i "/direction_y/s/default=\".*\"/default=\"\"/" /home/pi/catkin_ws/src/clover/clover/launch/main_camera.launch
```
Отредактируйте одну из конфигурационных строк или добавьте строку представленную ниже:
Отредактируйте одну из конфигурационных строк или добавьте строку, представленную ниже:
```
```xml
<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 0.05 -1.5707963 0 -1.5707963 base_link main_camera_optical"/>
```
> **Note** Единовременно может использоваться только одна конфигурация камеры, если вы вставляете представленную выше строку, не забудьте закомментировать активную на данный момент. Для определения этого, вам поможет подсветка синтаксиса, используемая строка будет подсвечена другим цветом, нежели комментарии. Для комментирования в начало и конец строки добавьте символы *<!-- и -->* соответственно.
> **Note** Одновременно может использоваться только одна конфигурация камеры если вы вставляете представленную выше строку, не забудьте закомментировать активную на данный момент. Для определения этого вам поможет подсветка синтаксиса — активная строка будет подсвечена отличным от комментариев цветом. Для комментирования в начало и конец строки добавьте символы `<!--` и `-->` соответственно.
Если используемая вами карта маркеров имеет равномерные расстояния между ними, можете воспользоваться [утилитой для создания карт `gen_map.py`](aruco_map.md#настройка-карты-маркеров). В случае если ваши маркеры расположены в случайном порядке вам потребуется задать их вручную, для этого перейдите в директорию `~/catkin_ws/src/clover/aruco_map/map` и создайте файл карты `map_name.txt`. Заполните вашу карту в соответствии с [синтаксисом карт](aruco_map.md#настройка-карты-маркеров). Пример карты маркеров со случайным расположением маркеров:
Если на используемой вами карте, маркеры имеют равное расстояние по осям *X* и *Y*, можете воспользоваться [утилитой для создания карт `gen_map.py`](aruco_map.md#настройка-карты-маркеров). В ином случае, вам потребуется задать их вручную для этого перейдите в директорию `~/catkin_ws/src/clover/aruco_map/map` и создайте файл карты `map_name.txt`. Заполните вашу карту в соответствии с [синтаксисом карт](aruco_map.md#настройка-карты-маркеров). Пример карты маркеров со случайным расположением маркеров:
> **Hint** При введении карты, выберите один из маркеров, как начало координат, и относительно него отмеряйте расстояние до всех остальных маркеров. Вы можете не указывать все 8 параметров, в случае если все ваши маркеры ориентированы одинаково, можно указывать только первые 5: индекс маркера, размер и его расположение в пространстве по осям x, y, z соответственно.
> **Hint** При введении карты выберите один из маркеров в качестве начала координат и относительно него отмеряйте расстояние до всех остальных маркеров. Если все ваши маркеры ориентированы одинаково, вы можете не указывать все 8 параметров, а указать только первые 5: индекс маркера, размер и его расположение в пространстве по осям x, y, z соответственно.
```
106 0.33 0 0 0
@@ -49,9 +49,9 @@ sed -i "/direction_y/s/default=\".*\"/default=\"\"/" /home/pi/catkin_ws/src/clov
153 0.40 -0.56 1.36 0
```
После того, как карта введена, необходимо применить ее, для этого отредактируйте файл `aruco.launch`, расположенный в `~/catkin_ws/src/clover/clover/launch/`. Измените в нем строку `<param name="map" value="$(find aruco_pose)/map/map_name.txt"/>`, где `map_name.txt` название вашего файла с картой.
После того, как вы заполните карту, необходимо применить ее для этого отредактируйте файл `aruco.launch`, расположенный в `~/catkin_ws/src/clover/clover/launch/`. Измените в нем строку `<param name="map" value="$(find aruco_pose)/map/map_name.txt"/>`, где `map_name.txt` название вашего файла с картой.
При использовании маркеров не привязанных к горизонтальным плоскостям(пол, потолок), необходимо отключить параметр `known_tilt`, как в модуле `aruco_detect`, так и в модуле `aruco_map` в том же файле. Для того, чтобы сделать это автоматически, введите:
При использовании маркеров, не привязанных к горизонтальным плоскостям(пол, потолок), необходимо отключить параметр `known_tilt` как в модуле `aruco_detect`, так и в модуле `aruco_map` в том же файле. Для того, чтобы сделать это автоматически, введите:
```bash
sed -i "/known_tilt/s/value=\".*\"/value=\"\"/" /home/pi/catkin_ws/src/clover/clover/launch/aruco.launch

58
docs/ru/zaural_viking.md Normal file
View File

@@ -0,0 +1,58 @@
# Программируемый летающий автомобиль
Автор: [**Колмаков Станислав Витальевич**](https://t.me/stassauer).
[CopterHack-2021](copterhack2021.md), команда Зауральский викинг. Место работы: ГАНОУ КО «ЦРСК», г. Курган.
В мире широко разрабатываются и применяются новые модели мультироторных беспилотных летательных аппаратов (БПЛА). Самый распространенный и доступный способ знакомства с БПЛА покупка квадрокоптера в магазине бытовой технике. В таком случае потребитель сможет лишь развить навыки пилотирования и производить аэрофотосъемку.
Для получения большего количества навыков и возможностью дополнить квадрокоптер лучше заплатить больше. Речь идет о конструкторах для сборки пилотируемого летательного аппарата.
В ногу со временем идет компания Copter Express (COEX), разрабатывая и модернизируя программируемые квадрокоптеры Clover.
Проект летающего автомобиля был разработан на основе программируемого квадрокоптера Clover 4 Code с возможностью двигаться по ровной горизонтальной поверхности, используя колесную базу. Данная возможность позволит расширить функционал использования программируемого квадрокоптера.
Задумка проекта началась с конструирования основы под электронные компоненты на гусеничной базе (рис. 1). В качестве основных компонентов выбрал полетный контроллер COEX Pix и микрокомпьютер Raspberry Pi 3 B+. Используя среду программирования [Blockly](blocks.md), получилось привести робота в движение.
<div class="image-group">
<img src="../assets/zaural_viking/1.jpg" width=300 class="zoom border">
<img src="../assets/zaural_viking/2.jpg" width=300 class="zoom border">
</div>
*Рис. 1. Гусеничный робот с COEX Pix и Raspberry Pi 3 B+.*
Следующим этапом разработки колесной базы для квадрокоптера стало использование конструктора четырехколесной платформы Pirate. Вес платформы с драйвером моторов составил 345 грамм (рис. 2). С учетом увеличения взлетной массы и для увеличения мощности, принято использовать пропеллеры 3-лопастные 6040 (рис. 3).
<div class="image-group">
<img title="Рис. 2. Вес платформы" src="../assets/zaural_viking/3.jpg" width=300 class="zoom border">
<img title="Рис. 3. Собранная конструкция" src="../assets/zaural_viking/4.jpg" width=300 class="zoom border">
</div>
*Рис. 2. Вес платформы. Рис. 3. Собранная конструкция.*
Для облегчения веса двухколесной платформы решено смоделировать и распечатать на 3D-принтере основу для колесной платформы (рис. 4), используя PETG пластик. Данный пластик обладает более высокими прочностными характеристиками, чем распространенные ABS и PLA пластики.
<img title="Рис. 4. Основа из пластика" src="../assets/zaural_viking/5.jpg" width=400 class="center zoom">
*Рис. 4. Основа из пластика.*
Ссылка на модель: https://drive.google.com/file/d/1_KPZfldSXNGiHbgnVBgMle-JvKtcDZHm/view?usp=sharing.
Платформа содержит: крепления под мотор-редукторы, отверстия для лазерного дальномера и Pi камеру. Также в основе предусмотрены монтажные отверстия для монтажа к квадрокоптеру и облегчения конструкции.
Следующим шагом для снижения веса, стало решение использовать микросхему драйвера двигателей L293D (рис. 5), вместо модуля драйвера двигателей L298N (рис. 6).
<div class="image-group">
<img title="Рис. 5. Драйвер двигателей L293D" src="../assets/zaural_viking/6.jpg" width=300 class="zoom border">
<img title="Рис. 6. Драйвер двигателей L298N" src="../assets/zaural_viking/7.jpg" width=300 class="zoom border">
</div>
*Рис. 5. Драйвер двигателей L293D. Рис. 6. Драйвер двигателей L298N.*
С учетом всех облегчений, вес летающей машины составил 1 кг (рис. 7).
<img title="Рис. 7. Общий вид программируемого летающего автомобиля" src="../assets/zaural_viking/8.jpg" width=400 class="center zoom">
*Рис. 7. Общий вид программируемого летающего автомобиля.*
Испытания квадрокоптера, скрещенного с мобильной платформой, доказали работоспособность проекта с возможностью расширенного функционала программируемого квадрокоптера.
Следующим шагом развития проекта станет разработка алгоритмов распознавания линии, цветов и других образов.

185
docs/ru/zerotire_vpn.md Normal file
View File

@@ -0,0 +1,185 @@
# Создание виртуальной сети ZeroTire и подключение к ней
## Создание и настройка сети ZeroTire
1. Зайдите на сайт [ZeroTire](https://www.zerotier.com/).
<img src="../assets/zerotire/login_1.png" width=300 class="zoom border center">
2. Зарегистрируйтесь в ZeroTire.
<img src="../assets/zerotire/login_2.png" width=300 class="zoom border center">
3. Зайдите в свой аккаунт.
4. Нажмите кнопку *Create A Network*.
<img src="../assets/zerotire/network_1.png" width=300 class="zoom border center">
5. После этого вы увидите созданную вами сеть, ее ID и название. Для настройки сети нажмите на нее.
<img src="../assets/zerotire/network_2.png" width=300 class="zoom border center">
6. В открывшемся окне можно изменить имя сети и приватность подключения.
<img src="../assets/zerotire/network_3.png" width=300 class="zoom border center">
7. Пролистайте ниже, до графы *Members*. В ней будет написано о том, что в сети нету пользователей.
<img src="../assets/zerotire/network_4.png" width=300 class="zoom border center">
8. Устройства подключенные к сети будут отображаться в данной графе, для того, чтобы позволить им подключиться к сети, активируйте чекбокс *Auth?*. При этом, подключенному устройству автоматически выдастся внутренний IP адрес, в дальнейшем он будет использоваться для связи с данным устройством.
<div class="image-group">
<img src="../assets/zerotire/network_5.png" width=300 class="zoom border">
<img src="../assets/zerotire/network_6.png" width=300 class="zoom border">
</div>
> **Hint** Указывайте имена для новых устройств, этом поможет вам в дальнейшем отличать их друг от друга.
9. Повторите последний шаг для всех подключаемых устройств.
> **Info** Сеть ZeroTire в случае бесплатного использования поддерживает до 50 пользователей одновременно.
## Настройка на Windows
### Установка приложения
1. Перейдите на сайт ZeroTire.
<img src="../assets/zerotire/download_1.png" width=300 class="zoom border center">
2. Нажмите на иконку Windows.
<img src="../assets/zerotire/download_2.png" width=300 class="zoom border center">
3. Скачайте и запустите файл `ZeroTire One.msi`.
<div class="image-group">
<img src="../assets/zerotire/windows_1.png" width=300 class="zoom border">
<img src="../assets/zerotire/windows_2.png" width=300 class="zoom border">
</div>
### Подключение к сети
1. Запустите ZeroTire One.
2. Нажмите на иконку ZeroTire One в панели задач.
3. Нажмите на кнопку *Join Network...* для подключения к сети.
<img src="../assets/zerotire/windows_3.png" width=300 class="zoom border center">
4. В появившемся окне введите ID вашей сети и нажмите кнопку *Join*.
<img src="../assets/zerotire/windows_4.png" width=300 class="zoom border center">
5. Разрешите использование новой сети.
<img src="../assets/zerotire/windows_5.png" width=300 class="zoom border center">
## Настройка на iOS
### Установка приложения
1. Перейдите на сайт ZeroTire.
<img src="../assets/zerotire/download_1.png" width=300 class="zoom border center">
2. Нажмите на иконку iOS.
<img src="../assets/zerotire/download_2.png" width=300 class="zoom border center">
3. Установите приложение *ZeroTire One*.
### Подключение к сети
1. Запустите приложение *ZeroTire One*.
2. Нажмите на *+* для добавления нового подключения.
<img src="../assets/zerotire/ios_1.png" width=300 class="zoom border center">
3. Подтвердите политику конфиденциальности.
<img src="../assets/zerotire/ios_2.png" width=300 class="zoom border center">
4. Введите ID вашей сети и нажмите кнопку *Add Network*.
<img src="../assets/zerotire/ios_3.png" width=300 class="zoom border center">
5. Подтвердите добавление новой конфигурации VPN.
6. Подключитесь к VPN сети, сдвинув ползунок активации сети.
<div class="image-group">
<img src="../assets/zerotire/ios_4.png" width=300 class="zoom border">
<img src="../assets/zerotire/ios_5.png" width=300 class="zoom border">
</div>
## Настройка на Linux (PC, Raspberry Pi)
### Установка приложения
1. Откройте консоль, для этого нажмите сочетание клавиш *Ctrl* + *Alt* + *T* или в строке поиска программ введите *Terminal*
2. Введите команду установки ZeroTire.
```bash
curl -s https://install.zerotier.com | sudo bash
```
### Подключение к сети
1. Откройте консоль.
2. Введите команду `sudo zerotire-cli join network-id`, где `netwirk-id` это ID вашей сети.
<img src="../assets/zerotire/linux_1.png" width=300 class="zoom border center">
3. При успешном подключении, в консоль будет выведено соответствующее сообщение.
## Установка и настройка на macOS
### Установка приложения
1. Перейдите на сайт ZeroTire.
<img src="../assets/zerotire/download_1.png" width=300 class="zoom border center">
2. Нажмите на иконку macOS.
<img src="../assets/zerotire/download_2.png" width=300 class="zoom border center">
3. Скачайте и запустите файл `ZeroTire One.pkg`.
4. Установите приложение ZeroTire One.
### Подключение к сети
1. Запустите приложение ZeroTire One.
2. В панеле задач нажмите на иконку ZeroTire One.
3. В открывшемся окне нажмите *Join Network...*.
<img src="../assets/zerotire/macos_1.png" width=300 class="zoom border center">
4. В поле *Enter Network ID* введите ID вашей сети.
<img src="../assets/zerotire/macos_2.png" width=300 class="zoom border center">
## Подключение к коптеру
1. Убедитесь, что ZeroTire работает и имеет соединение с сетью на дроне и управляющем устройстве. Для этого убедитесь, что интересующие вас устройства имеют статус *Online*.
<img src="../assets/zerotire/qgc_1.png" width=300 class="zoom border center">
2. Убедитесь, что у всех устройств есть локальные IP адреса - *Managed IPs*.
3. Откройте GQC и во вкладке *Comm Links* добавьте TCP подключение, указав IP дрона. Подробнее про удаленное подключение читайте [тут](gcs_bridge.md).
<div class="image-group">
<img src="../assets/zerotire/qgc_2.png" width=300 class="zoom border">
<img src="../assets/zerotire/qgc_3.png" width=300 class="zoom border">
</div>