mirror of
https://github.com/CopterExpress/clover.git
synced 2026-05-30 06:49:32 +00:00
Merge branch 'master' into ros-book
This commit is contained in:
@@ -17,6 +17,9 @@
|
||||
* [Полетные режимы](modes.md)
|
||||
* [Настройка питания](power.md)
|
||||
* [Настройка failsafe](failsafe.md)
|
||||
* Ручной полет
|
||||
* [Основы](flight.md)
|
||||
* [Упражнения](flight_exercises.md)
|
||||
* Работа с Raspberry Pi
|
||||
* [Raspberry Pi](raspberry.md)
|
||||
* [Образ для RPi](image.md)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
|
||||
|
||||
# Пульт на Android
|
||||
|
||||
Все владельцы мобильных устройств фирмы *Apple* ещё морозным январем 2018го обзавелись приятным приложением под *iOS* для пилотирования квадрокоптеров с помощью **WiFi**. И вот, спустя год вышло такое же приложение но уже для другой операционной системы. Актуальную версию вы можете скачать [**тут**](https://vk.com/away.php?to=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dexpress.copter.cleverrc&cc_key=) .
|
||||
|
||||
|
||||
## Введение
|
||||
|
||||
В данной статье я расскажу вам о том, как можно написать свой или доработать уже имеющийся пульт для Андроид своими руками. Для работы будем использовать модный язык *Kotlin*, а в качестве среды разработки возьмем *Android Studio*. Для тех кто ни разу ей не пользовался рекомендую к ознакомлению следующие [*материалы*](https://www.google.com/search?ei=xQxDXMH0C8OOmgW4mYigDQ&q=%D0%A7%D1%82%D0%BE+%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C+%D0%B5%D1%81%D0%BB%D0%B8+%D1%8F+%D0%BD%D0%B5+%D1%83%D0%BC%D0%B5%D1%8E+%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C+%D0%BF%D0%BE%D0%B4+%D0%B0%D0%BD%D0%B4%D1%80%D0%BE%D0%B8%D0%B4%3F&oq=%D0%A7%D1%82%D0%BE+%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C+%D0%B5%D1%81%D0%BB%D0%B8+%D1%8F+%D0%BD%D0%B5+%D1%83%D0%BC%D0%B5%D1%8E+%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C+%D0%BF%D0%BE%D0%B4+%D0%B0%D0%BD%D0%B4%D1%80%D0%BE%D0%B8%D0%B4%3F&gs_l=psy-ab.3...4413.17423..17726...9.0..2.442.4577.45j5j1j0j1....2..0....1..gws-wiz.....6..0i71j35i39j0i131j0j0i67j0i131i67j0i22i30j33i22i29i30j33i21j33i160.0bZz-WGxoHY). Весь код приложения можно найти [**тут**](https://github.com/Tennessium/android). Если вы хотите сразу получить приложение с целью дальнейшей доработки, выполните следующую команду:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Сборка Клевера 4
|
||||
# Сборка Клевера 4.2
|
||||
|
||||
## Размер крепежа
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
|
||||
<img src="../assets/assembling_clever4_2/frame_6.png" width=300 class="zoom border center">
|
||||
|
||||
6. Установите 4 нейлоновые стойки 6мм и закрепите их с помощью винтов М3х8.
|
||||
6. Установите 4 нейлоновые стойки 6мм и закрепите их с помощью винтов М3х5.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/frame_7.png" width=300 class="zoom border center">
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
|
||||
<img src="../assets/assembling_clever4_2/final_2.png" width=300 class="zoom border">
|
||||
|
||||
## Установка LED ленты
|
||||
## Установка LED ленты и ножек
|
||||
|
||||
1. Соберите обруч для светодиодной ленты, объединив замок на концах.
|
||||
|
||||
|
||||
@@ -78,3 +78,13 @@ sudo reboot
|
||||
```
|
||||
|
||||
Для редактирования файлов также можно использовать и другие редакторы, например, **vim**.
|
||||
|
||||
## Сброс изменений
|
||||
|
||||
Для сброса изменений всех файлов, относящихся к пакету Клевера (`launch`-файлы) используйте git:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/src/clover
|
||||
git checkout .
|
||||
sudo systemctl restart clover
|
||||
```
|
||||
|
||||
108
docs/ru/flight.md
Normal file
108
docs/ru/flight.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# Полет
|
||||
|
||||
Этот раздел объясняет основы управление квадрокоптером с использование пульта радиоуправления в различных режимах (для автономных полетов смотрите раздел "[Программирование](programming.md)").
|
||||
|
||||
## Основные возможности радиоаппаратуры
|
||||
|
||||
Прежде чем запускать ваш коптер, необходимо разобраться, как работает пульт радиоуправления ("аппаратура" в общепринятой терминологии авиамоделизма).
|
||||
|
||||
Управление дроном происходит с помощью двух стиков на аппаратуре. По умолчанию левый стик отвечает за газ и рысканье, а правый за крен и тангаж. Данные термины используются для всех летательных судов, от самолетов до квадрокоптеров.
|
||||
|
||||
<img src="../assets/flight/rc_basic_commands.svg" width=400 class="zoom center">
|
||||
|
||||
* Газ (*throttle*) – отвечает за скорость вращения двигателей.
|
||||
* Рысканье (*yaw*) – отвечает за повороты вокруг вертикальной оси (Z), по часовой (при наклоне вправо) и против часовой (при наклоне влево) стрелки.
|
||||
* Тангаж (*pitch*) – отвечает за наклон или движение вперёд/назад.
|
||||
* Крен (*roll*) – отвечает за наклон или движение влево/вправо.
|
||||
|
||||
Данные описания предполагают, что коптер находится задней частью к пилоту.
|
||||
|
||||
<img src="../assets/flight/basic_movements_multicopter.svg" width=400 class="zoom center">
|
||||
|
||||
## Полетные режимы
|
||||
|
||||
Ручное полет с использованием полетного контроллера PX4 может происходит с использованием разных полетных режимов, которые определяют назначения стиков радиопульта и другие характеристики полета. Полный список полетных режимов приведен в статье "[Полетные режимы](modes.md)".
|
||||
|
||||
Основные ручные режимы разобраны далее.
|
||||
|
||||
**STABILIZED** - режим стабилизации горизонтального положения. В данном режиме коптер будет удерживать горизонт, если им не управлять. Назначение стиков:
|
||||
|
||||
* Газ – усредненная скорость вращения моторов.
|
||||
* Рысканье – угловая скорость вокруг вертикальной оси.
|
||||
* Тангаж – угол наклона вокруг поперечной оси (вперед/назад).
|
||||
* Крен – угол наклон вокруг продольной оси (влево/вправо).
|
||||
|
||||
**POSCTL** – режим удержания позиции (требуется включенная система позиционирования). Назначение стиков:
|
||||
|
||||
* Газ - вертикальная скорость полета.
|
||||
* Рысканье - угловая скорость вокруг вертикальной оси.
|
||||
* Тангаж - линейная скорость полета дрона (вперед/назад).
|
||||
* Крен - линейная скорость полета дрона (влево/вправо).
|
||||
|
||||
**ACRO** – режим управление средней скоростью вращения моторов и угловыми скоростями дрона. Этот режим является наиболее сложным для пилотирования и чаще всего применяется дрон-рейсерами и в шоу 3D-пилотирования для выполнения трюков. Назначение стиков:
|
||||
|
||||
* Газ – усредненная скорость вращения моторов.
|
||||
* Рысканье – угловая скорость вокруг вертикальной оси.
|
||||
* Тангаж – угловая скорость вокруг поперечной оси (вперед/назад).
|
||||
* Крен – угловая скорость вокруг продольной оси (влево/вправо).
|
||||
|
||||
> **Info** В других полетных контроллерах аналогичные полетные режимы могут называться по-другому.
|
||||
|
||||
## Подготовка к полету
|
||||
|
||||
### Установка пропеллеров и АКБ
|
||||
|
||||
1. Установите ремешок для аккумулятора.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/final_1.png" width=300 class="zoom border center">
|
||||
|
||||
2. Установите пропеллеры в соответствии со [схемой направления движения моторов](#prop_rotation).
|
||||
|
||||
<img src="../assets/assembling_clever4_2/final_3.png" width=300 class="zoom border center">
|
||||
|
||||
3. Закрепите пищалку и установите аккумулятор.
|
||||
|
||||
<div class="image-group">
|
||||
<img src="../assets/flight/buzzer_acb.jpg" width=200 class="zoom border">
|
||||
<img src="../assets/assembling_clever4_2/final_4.png" width=300 class="zoom border">
|
||||
</div>
|
||||
|
||||
### Настройка пищалки
|
||||
|
||||
Для того, чтобы не переразрядить и не испортить аккумулятор, рекомендуется использовать индикатор напряжения (*пищалка*).
|
||||
|
||||
Для настройки *пищалки* подключите ее к балансировочному разъему вашего аккумулятора. Теперь, нажимая на кнопку в основании будет изменяться минимальное напряжение на ячейках. Оптимальное значение минимального напряжения является *3.5-3.6 V*.
|
||||
|
||||
<div class="image-group">
|
||||
<img src="../assets/flight/buzzer_connection.jpg" width=300 class="zoom border">
|
||||
<img src="../assets/flight/buzzer.jpg" width=300 class="zoom border">
|
||||
</div>
|
||||
|
||||
### Состояния готовности к полету
|
||||
|
||||
Прежде чем начинать полет, необходимо перевести коптер в состояние *Armed*.
|
||||
|
||||
* Состояние *Armed* – моторы вращаются в соответсвии с положением стика газа, коптер готов к полету.
|
||||
* Состояние *Disarmed* – моторы не вращаются, коптер не реагирует на стик газа.
|
||||
|
||||
По умолчанию коптер находится в состоянии *Disarmed* и переходит в него в случае если вы долго не взлетаете.
|
||||
|
||||
Для перевода коптера в состояние *Armed* есть несколько способов:
|
||||
|
||||
* С помощью стика – переведите левый стик вниз вправо и подождите пару секунд.
|
||||
|
||||
<img src="../assets/flight/controller_arm.jpg" width=300 class="zoom center">
|
||||
|
||||
* С помощью тумблера – состояния Armed/Disarmed можно настроить на один из тумблеров. Подробнее о настройке в смотрите в статье про [полетные режимы](modes.md).
|
||||
* С помощью QGC – вы можете заармить ваш дрон программно. Для этого нажмите на надпись *Disarmed* в шапке и выберите другое состояние.
|
||||
* С помощью [программы](programming.md) - коптер может перейти в состояние *Armed*, если в навигационной команде, такой как `navigate`, `set_position` и т.д., указан параметр `auto_arm=True`.
|
||||
|
||||
### Kill switch
|
||||
|
||||
При активации тумблера *Kill Switch* на моторы перестают посылаться сигналы управления, и моторы перестают вращаться. Эта функция используется в крайних случаях, к примеру, если вы потеряли управление над коптером.
|
||||
|
||||
> **Caution** Будьте внимательны, *Kill Switch* не переводит коптер в состояние *Disarmed*!
|
||||
|
||||
Перед отключением *Kill Switch* убедитесь, что стик газа находится в нижнем положении и коптер находится в состоянии *Disarmed*. В случае, если стик газа не находится в нижнем положении, при отключении *Kill Switch* на моторы будет подан сигнал соответствующий положению стика в данный момент, что приведет к резкому рывку коптера.
|
||||
|
||||
**Далее**: [Упражнения для управления коптером](flight_exercises.md).
|
||||
149
docs/ru/flight_exercises.md
Normal file
149
docs/ru/flight_exercises.md
Normal file
@@ -0,0 +1,149 @@
|
||||
# Упражнения для управления коптером
|
||||
|
||||
Далее описаны рекомендуемые упражнения для тех, кто учится летать на коптере в первый раз. Повторяйте каждое упражнение необходимое количество раз, пока не будете чувствовать себя уверенно в нем.
|
||||
|
||||
> **Hint** В случае, если рядом есть человек умеющий управлять коптером, используйте [режим тренера](trainer_mode.md).
|
||||
|
||||
<!-- -->
|
||||
|
||||
> **Hint** Настоятельно рекомендуется первые полеты проводить за защитной сеткой. В случае отсутствия таковой, полетная зона должна быть не менее 6x6 м.
|
||||
|
||||
## Включение, выключение моторов, изменение режимов
|
||||
|
||||
> **Hint** Для удобства подключитесь к коптеру с помощью [QGC через Wi-Fi](gcs_bridge.md) и включите звук. Это позволит наблюдать за изменением полетных режимов. Если не имеется возможности подключиться через Wi-Fi, для проверки полетных режимов подключитесь по USB.
|
||||
|
||||
Убедитесь, что настроили полетные режимы на один из тумблеров. Для этого переключите тумблер, в разные позиции и убедитесь, что режимы изменяются.
|
||||
|
||||
Рекомендуется настроить *Kill Switch*. Для его проверки совершите следующие действия:
|
||||
|
||||
* Включите *Kill Switch*, проверьте, что в QGC появилось соответствующее уведомление.
|
||||
* Переведите коптер в состояние *Armed*, а затем включите *Kill Switch*. Убедитесь, что моторы выключились. Затем переключите тумблер *Kill Switch* в изначальное положение. Если коптер автоматически не перешел в состояние *Disarmed* из-за бездействия, моторы снова начнут вращаться.
|
||||
|
||||
> **Caution** Переводите коптер в состояние *Armed* только на полетной зоне.
|
||||
|
||||
Убедитесь, что режимы переключаются удобными для вас тумблерами. В противном случае измените их в соответствии со [статьей по настройке полетных режимов](modes.md). Повторите приведенные действия несколько раз, для того, чтобы запомнить какие тумблеры за что отвечают.
|
||||
|
||||
## Работа с газом
|
||||
|
||||
Первым делом необходимо почувствовать отзывчивость коптера на движение стика газа и научиться им управлять. Каждый коптер имеет немного различные запасы мощности и соответственно отрывается от земли при разных положениях стика.
|
||||
|
||||
В данном упражнении необходимо использовать только стик газа. Во время выполнения упражнения рекомендуется не использовать остальные стики.
|
||||
|
||||
Основные задания упражнения:
|
||||
|
||||
1. Дрейф коптера по земле, не отрываясь от земли.
|
||||
|
||||
### Предполетные проверки
|
||||
|
||||
Перед взлетом выполняйте следующие действия:
|
||||
|
||||
1. Проверьте целостность коптера и возможность вращения пропеллеров.
|
||||
2. Убедитесь, что коптер находится задней частью к вам.
|
||||
3. Включите коптер путем подключения АКБ.
|
||||
4. Отойдите на безопасное расстояние. Рекомендуется соблюдать расстояние до коптера минимум 4–5 м.
|
||||
5. Убедитесь, что коптер находится в режиме *Stabilized*.
|
||||
|
||||
Не пытайтесь сразу оторвать коптер от земли, найдите минимально возможное положение стика для того, чтобы коптер начал дрейфовать по земле. В противном случае это может привести к поломкам или травмам.
|
||||
|
||||
> **Caution** В случае потери контроля над коптером необходимо сразу включать *Kill Switch*.
|
||||
|
||||
**Упражнение №1**. Медленно поднимайте стик газа вверх, пока коптер не начнет двигаться. В этот момент он начнет медленно дрейфовать по земле. Оставьте стик газа в таком положении и подождите пару секунд, затем переведите стик в изначальное положение, чтобы посадить коптер. После посадки коптера выключите моторы переведя в состояние *Disarmed*. Повторите упражнение 5-10 раз, чтобы лучше чувствовать отзывчивость коптера на стик газа.
|
||||
|
||||
**Упражнение №2**. Медленно поднимайте стик газа вверх, пока коптер на начнет немного отрываться от земли. Оставьте стик газа в таком положении и подождите пару секунд, затем посадите коптер аналогично упражнению №1. Повторите упражнение 10-15 раз.
|
||||
|
||||
**Упражнение №3**. Поднимайте стик газа, пока коптер не начнет дрейфовать по земле, подождите секунду и продолжайте увеличивать газ до момента, когда коптер начнет отрываться от земли, подождите секунду и посадите коптер. Для закрепления повторяйте упражнения 10-15 раз, при необходимости увеличивая количество повторений.
|
||||
|
||||
## Работа с креном и тангажом
|
||||
|
||||
После освоения управления газом коптера, необходимо научиться управлять его горизонтальным положением. За это отвечает правый стик на радоаппаратуре.
|
||||
|
||||
Управление данными осями интуитивно понятно:
|
||||
|
||||
* Стик наклонен вперед (вверх) – коптер движется вперед.
|
||||
* Стик наклонен назад (вниз) – коптер движется назад.
|
||||
* Стик наклонен вправо – коптер движется вправо.
|
||||
* Стик наклонен влево – коптер движется влево.
|
||||
|
||||
Чем сильнее стик будет наклонен в сторону, тем сильнее коптер будет наклоняться в сторону быстрее двигаться.
|
||||
|
||||
Основные задания упражнения:
|
||||
|
||||
1. Полет по оси X, вперед/назад.
|
||||
2. Полет по оси Y, влево/вправо.
|
||||
3. Стабилизация коптера на одном месте.
|
||||
4. Полет по квадрату по часовой стреле и против.
|
||||
|
||||
> **Hint** Старайтесь всегда находится позади коптера, таким образом, чтобы его задняя часть была направлена к вам, иначе вы можете потерять управление над ним, перепутав стороны.
|
||||
|
||||
Как и в случае с управлением газом, перед полетом выполняйте [следующие действия](#предполетные-проверки).
|
||||
|
||||
> **Hint** Если коптер сильно вращается вокруг своей оси, посадите его и повторно откалибруйте магнитометр и гироскоп.
|
||||
|
||||
**Упражнение №1**. Аналогично упражнениям по управлению газом поднимайте стик газа, пока коптер на начнет дрейфовать по земле или немного подпрыгивать, затем отпустите стик газа, оставив его в таком положении, и поднимайте стик тангажа, сначала вверх, на протяжении секунды, затем вниз. При этом коптер будет постепенно перемещаться сначала от вас, а затем к вам. Повторите упражнение 5-10 раз, пока не почувствуете отзывчивость коптера на движение стика.
|
||||
|
||||
**Упражнение №2**. Поднимайте стик газа, пока коптер не начнет дрейфовать, затем оставьте его и перемещайте стик крена сначала вправо, на протяжении секунды, затем влево. При этом коптер будет постепенно перемещаться сначала вправо, а затем влево. Повторите упражнение 5-10 раз, пока не почувствуете отзывчивость коптера на движение стика.
|
||||
|
||||
**Упражнение №3**. Поднимайте стик газа, пока коптер не начнет дрейфовать, затем оставьте его. Совместите первое и второе упражнение и постарайтесь стабилизировать коптер в одной точке, компенсируя его дрейф с помощью стика. Удерживайте коптер 20-30 секунд.
|
||||
|
||||
**Упражнение №4**. Поднимайте стик газа, пока коптер не начнет дрейфовать, затем оставьте его. Почувствовав отзывчивость коптера на изменения стиков выполните фигуру "квадрат" со стороной 1 м, сначала по часовой стрелке, а затем против. Выполняйте фигуры по 2-3 раза.
|
||||
|
||||
## Воздушная подушка и управление в ней
|
||||
|
||||
Понятие *воздушной подушки* очень важно во всей летательной технике. Сама по себе воздушная подушка является зоной повышенного давления, возникающая за счет воздуха пропускаемого через пропеллеры. Данная область харрактеризуется турбелентностями и воздушными потоками влияющими на полет коптера.
|
||||
|
||||
Пилоты стараются избегать полетов в воздушной подушке, но на ее границе имеется стабильная область, в которой коптер может зависнуть при минимальном значении газа. В таком случае создается ощущение, что коптер "сел" на воздушную подушку.
|
||||
|
||||
Главная особенность и приемущество такого полета заключается в том, что коптер не будет изменять высоту при одном значении газа.
|
||||
|
||||
Основные задания:
|
||||
|
||||
1. Стабилизация коптера на одном месте.
|
||||
2. Полет по квадрату.
|
||||
3. Полет по кругу.
|
||||
|
||||
Аналогично с предыдущими упражнениями перед взлетом выполните [следующие действия](#предполетные-проверки).
|
||||
|
||||
**Упражнение №1**. Поднимайте стик газа, пока коптер не пролетит воздушную подушку и не окажется над ней (высота от пола ~25-30 см, для коптера Клевер 4). Коптер не должен подниматься вверх или проваливаться вниз, высота полета должа стабилизироваться. Как и в предыдущем упражнении корректируйте позицию коптера по осям X, Y с помощью стика крена и тангажа. В результате коптер должен зависнуть в одной точке с небольшими покачиваниями по сторонам. Удерживайте коптер 30-40 секунд.
|
||||
|
||||
**Упражнение №2**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Далее пролетите по квадрату со стороной 1 м сначала по часовой стрелке, потом против часовой стрели. Повторите траекторию в каждую сторону 2-3 раза.
|
||||
|
||||
**Упражнение №3**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Попробуйте описать коптером круг с диаметром 1 м, по часовой и против часовой стрелки. Повторите траекторию в каждую сторону 2-3 раза.
|
||||
|
||||
## Работа с рысканьем
|
||||
|
||||
При визуальном управлении мультикоптерными устройствами, рысканье не играет на столько важной роли, как с самолетной технике, поскольку коптер может передвигаться в любую сторону вне зависимости от того, куда он направлен.
|
||||
|
||||
> **Info** Термин *рысканье* (*yaw*) обозначает поворот коптера вокруг вертикальной оси.
|
||||
|
||||
Основные задания:
|
||||
|
||||
1. Оборот коптера вокруг себя, ориентируя заднюю часть коптера к себе.
|
||||
2. Оборот вокруг коптера, ориентируя заднюю часть к себе.
|
||||
|
||||
Для выполнения представленных упражнений рекомендуется найти большое свободное пространство.
|
||||
|
||||
Аналогично с предыдущими упражнениями перед взлетом выполните [предполетные проверки](#предполетные-проверки).
|
||||
|
||||
**Упражнение №1**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Описывайте коптером круг вокруг себя, на расстоянии 2-3 м, при этом поворачивая его таким образом, чтобы задняя часть коптера всегда была направлен на вас. Выполняйте упражнение по часовой стрелке и против. Повторите упражнение 4-5 раз.
|
||||
|
||||
**Упражнение №2**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Обойдите коптер вокруг, при этом поворачивая его таким образом, чтобы задяя часть была направлена на вас. Обходите коптер по часовой стрелке и против. Повторите упражнение 4-5 раз.
|
||||
|
||||
> **Caution** Дополнительные упражнения значительно сложнее обычных и не обязательны к выполнению. Приступайте к ним, только если вы уже уверенно управляете коптером.
|
||||
|
||||
**Дополнительное упражнение №1**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Разверните коптер передней частью к себе и пробуйте управлять им задом наперед.
|
||||
|
||||
**Дополнительное упражнение №2**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Выполняйте полет таким образом, чтобы передняя часть коптера всегда смотрела в сторону его движения.
|
||||
|
||||
## Свободный полет
|
||||
|
||||
Если вы можете выполнить каждое из описанных выше упражнений, скорее всего, вы уже умеете свободно взлетать и управлять коптером. Далее будут представленны некоторые упражнения для закрепления полученных навыков.
|
||||
|
||||
Упражнения:
|
||||
|
||||
* Полет по вертикальному квадрату.
|
||||
* Полет по граням куба.
|
||||
* Полет по вертикальному кругу.
|
||||
* Полет по восьмерке.
|
||||
* Подъем коптера по спирали.
|
||||
|
||||
Закрепляйте полученные навыки необходимое для вас количество раз.
|
||||
@@ -10,7 +10,7 @@
|
||||
* `map` — координаты относительно точки инициализации полетного контроллера: белая сетка на иллюстрации;
|
||||
* `base_link` — координаты относительно квадрокоптера: схематичное изображение квадрокоптера на иллюстрации;
|
||||
* `body` — координаты относительно квадрокоптера без учета наклонов по тангажу и крену: красная, синяя и зеленая линии на иллюстрации;
|
||||
* `navigate_target` – координаты точки, в которую сейчас летит дрон (с использованием [navigate](simple_offboard.md#navigate));
|
||||
* <a name="navigate_target"></a>`navigate_target` – координаты точки, в которую сейчас летит дрон (с использованием [navigate](simple_offboard.md#navigate));
|
||||
* `setpoint` – текущий setpoint по позиции.
|
||||
|
||||
При использовании [системы позиционирования по ArUco-маркерам](aruco.md) появляются дополнительные фреймы:
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
// Connection callback
|
||||
alert('Connected');
|
||||
});
|
||||
|
||||
|
||||
// Declare get_telemetry service client
|
||||
var getTelemetry = new ROSLIB.Service({ ros: ros, name : '/get_telemetry', serviceType : 'clover/GetTelemetry' });
|
||||
|
||||
@@ -49,6 +49,6 @@
|
||||
|
||||
## Браузерная GCS
|
||||
|
||||
Смотрите также пример реализации упрощенной браузерной наземной станции (GCS) на Клевере по адресу http://192.168.11.1/clover/gcs.html.
|
||||
Смотрите также пример реализации ([`gcs.html`](https://github.com/CopterExpress/clover/blob/master/clover/www/gcs.html), [`gcs.js`](https://github.com/CopterExpress/clover/blob/master/clover/www/js/gcs.js)) упрощенной браузерной наземной станции (GCS) на Клевере по адресу http://192.168.11.1/clover/gcs.html.
|
||||
|
||||
<img src="../assets/web-gcs.png" class="center zoom"/>
|
||||
|
||||
@@ -52,15 +52,18 @@ rostopic echo /rangefinder/range
|
||||
Для получения данных из топика создайте подписчика:
|
||||
|
||||
```python
|
||||
import rospy
|
||||
from sensor_msgs.msg import Range
|
||||
|
||||
# ...
|
||||
rospy.init_node('flight')
|
||||
|
||||
def range_callback(msg):
|
||||
# Обработка новых данных с дальномера
|
||||
print 'Rangefinder distance:', msg.range
|
||||
|
||||
rospy.Subscriber('rangefinder/range', Range, range_callback)
|
||||
|
||||
rospy.spin() # дальнейший код программы
|
||||
```
|
||||
|
||||
Также существует возможность однократного получения данных с дальномера:
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
## Система позиционирования {#positioning}
|
||||
|
||||
Для того, чтобы дрон мог зависать на месте или летать между точками, необходимо использование система позиционирования. Такая система должна вычислять и сообщать дрону, где он находится. Клевер предполагает использование нескольких систем позиционирования: [optical flow](optical_flow.md) (используется [камера](camera.md) и [лазерный дальномер](laser.md)), [визуальные маркеры](aruco.md) (используется камера и маркеры, наклеенные на пол или потолок), GPS и других.
|
||||
Для того, чтобы дрон мог зависать на месте или летать между точками, необходимо использование системы позиционирования. Такая система должна вычислять и сообщать дрону, где он находится. Клевер предполагает использование нескольких систем позиционирования: [optical flow](optical_flow.md) (используется [камера](camera.md) и [лазерный дальномер](laser.md)), [визуальные маркеры](aruco.md) (используется камера и маркеры, наклеенные на пол или потолок), GPS и других.
|
||||
|
||||
### Optical flow
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
|
||||
## Автономный полет {#flight}
|
||||
|
||||
> **Info** Для изучения языка программирования Python обращайтесь к [самоучителю](https://pythonworld.ru/samouchitel-python).
|
||||
|
||||
После настройки системы позиционирования становится возможным написание скриптов для автономных полетов. Для выполнения скриптов [подключитесь в Raspberry Pi по SSH](ssh.md). Для того, чтобы запустить Python-скрипт, используйте команду `python`:
|
||||
|
||||
```bash
|
||||
@@ -74,7 +76,7 @@ rospy.sleep(3)
|
||||
land()
|
||||
```
|
||||
|
||||
> **note** Функция navigate не ожидает, пока дрон долетит до целевой точки; скрипт продолжит выполнение сразу. Для блокирующей версии смотрите пример функции [`navigate_wait`](snippets.md#block-nav).
|
||||
> **note** Функция navigate не ожидает, пока дрон долетит до целевой точки; скрипт продолжит выполнение сразу. Для блокирующей версии смотрите пример функции [`navigate_wait`](snippets.md#navigate_wait).
|
||||
|
||||
Обратите внимание, что параметр `auto_arm` установлен на `True` только у первого вызова функции `navigate`. Этот параметр армит дрон и переводит его в режим автономного полета (OFFBOARD).
|
||||
|
||||
|
||||
@@ -2,20 +2,34 @@
|
||||
|
||||
Список возможных проектов для стажировок и практических работ в вузах и колледжах.
|
||||
|
||||
|Проект|Примечания|
|
||||
|Проект/Идея|Примечания|
|
||||
|------|----------|
|
||||
|Шоу дронов|[Решение от COEX](https://github.com/CopterExpress/clever-show) (разработка началась по программе стажировок).|
|
||||
|Интеграция позиционирования по [Vive Tracker](https://www.vive.com/ru/accessory/vive-tracker/)|[Наработки](https://github.com/goldarte/roslibsurvive)|
|
||||
|Интеграция системы позиционирования [Pozyx](https://www.pozyx.io)|[Наработки](https://github.com/goldarte/pozyx_clever)|
|
||||
|Шоу дронов|[Решение от COEX](https://github.com/CopterExpress/clever-show) (разработка началась по программе стажировок). Проект продолжает разрабатываться.|
|
||||
|Интеграция позиционирования по [Vive Tracker](https://www.vive.com/ru/accessory/vive-tracker/)|[Наработки](https://github.com/goldarte/roslibsurvive).|
|
||||
|Интеграция системы позиционирования [Pozyx](https://www.pozyx.io)|[Наработки](https://github.com/goldarte/pozyx_clever).|
|
||||
|Интеграция системы позиционирования типа Motion Capture||
|
||||
|Разработка и интеграция дешевого Motion Capture||
|
||||
|Интеграция блочного программирования (Scratch, Blockly)|[Решение с программы стажировок](clever_blocks.md). Официальное решение COEX в разработке.|
|
||||
|Интеграция блочного программирования (Scratch, Blockly)|[Решение с программы стажировок](clever_blocks.md). Официальное решение COEX [в разработке](https://github.com/CopterExpress/clover/tree/blockly).|
|
||||
|Улучшение алгоритма визуального позиционирования (optical flow): трекинг по фичам, расчет угла по yaw||
|
||||
|Симулятор Клевера|[Решение COEX](https://github.com/CopterExpress/clover_vm) (на основе Gazebo)|
|
||||
|Автоматический захват грузов Клевером|Впервые было [реализовано](https://www.youtube.com/watch?v=E1_ehvJRKxg) на Олимпиаде НТИ 2019|
|
||||
|Симулятор Клевера|[Решение от COEX](https://github.com/CopterExpress/clover_vm) (на основе Gazebo). Проект продолжает разрабатываться.|
|
||||
|Облачная платформа для симулятора Клевера|По аналогии или на основе [ROS Development Studio](http://rosds.online/).|
|
||||
|Автоматический захват грузов Клевером|Впервые было [реализовано](https://www.youtube.com/watch?v=E1_ehvJRKxg) на Олимпиаде НТИ 2019.|
|
||||
|Распознавание и ловля летящих объектов (шариков)||
|
||||
|Веб-инструмент для калибровки камеры||
|
||||
|Инструмент для редактирования карт маркеров|[Решение с программы стажировок](arucogenmap.md)|
|
||||
|Точный полет по линии|[Решение с программы стажировок](https://github.com/Tennessium/robohuyna)|
|
||||
|Двойные, тройные, четверные флипы||
|
||||
|Граффити-дрон|https://tsuru.su/project/graffiti-drone/|
|
||||
|Двойные, тройные, четверные флипы|Исследование стратегий и конфигураций. [Двойные флипы на Клевере](https://www.youtube.com/watch?v=AzVs-DRPE5A).<br>["A Simple Learning Strategy for High-Speed Quadrocopter Multi-Flips"](https://ethz.ch/content/dam/ethz/special-interest/mavt/dynamic-systems-n-control/idsc-dam/Research_DAndrea/FMA/LupashinSchoellig_ICRA2010.pdf).|
|
||||
|Граффити-дрон|[Пример реализации на другой платформе](https://tsuru.su/project/graffiti-drone/).|
|
||||
|Коптер-официант||
|
||||
|Автоматическая зарядная станция для Клевера||
|
||||
|Полет за другим дроном / перехват другого дрона||
|
||||
|Рама Клевера 4 на 3D-принтере||
|
||||
|Измерения уровня загрязнения воздуха / газоанализатор на дроне||
|
||||
|Полет двух коптеров в жесткой связке||
|
||||
|Автоматический подсчёт автомобилей на трассах||
|
||||
|Программное определение падений в PX4||
|
||||
|Начало полета в броске|[Throw Mode](https://ardupilot.org/copter/docs/throw-mode.html) в ArduPilot.|
|
||||
|Полет коптера на точку на изображении с камеры, направленной вертикально вниз||
|
||||
|Зарядная станция для коптера на солнечном концентраторе|<!-- placeholder for gitbook-->|
|
||||
|
||||
Вышеперечисленные и другие проекты вы также можете реализовать в рамках конкурса проектов [Copter Hack](https://ru.coex.tech/copterhack). Мы приглашаем команды для реализации проектов и в других форматах.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Общая информация
|
||||
# Симулятор
|
||||
|
||||
Среда симуляции Клевера позволяет пользователям запускать и отлаживать свой код в симуляторе, используя большинство функций, доступных на реальном дроне. Симулятор использует [режим PX4 SITL](sitl.md) и тот же код, использующий ROS, что и настоящий дрон. Большинство железа также симулируется.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Сборка на собственной машине
|
||||
|
||||
Настройка среды для симуляции с нуля требует некоторых усилий, однако это приведет к улучшению производительности и к уменьшению вероятности появления проблем с драйверами.
|
||||
Настройка среды для симуляции с нуля требует некоторых усилий, однако это приведет к улучшению производительности и к уменьшению вероятности появления проблем с драйверами.
|
||||
|
||||
Требования для сборки: установлены Ubuntu 18.04 и [ROS](ros-install.md).
|
||||
|
||||
@@ -57,10 +57,10 @@ sudo ./ubuntu.sh --no-nuttx
|
||||
Пакет `sitl_gazebo`, содержащий плагины нужно пропатчить, из-за недавних изменений в MAVLink. Эти патчи уже применены в [образе виртуальной машины](simulation_vm.md) и хранятся в репозитории CopterExpress/VM. Запустите следующие команды для загрузки и применения патчей:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/src/Firmware/Tools/sitl_gazebo
|
||||
wget https://raw.githubusercontent.com/CopterExpress/clover_vm/master/assets/patches/sitl_gazebo.patch
|
||||
cd ~/catkin_ws/src/Firmware/Tools/sitl_gazebo
|
||||
wget https://raw.githubusercontent.com/CopterExpress/clover_vm/master/assets/patches/sitl_gazebo.patch
|
||||
patch -p1 < sitl_gazebo.patch
|
||||
rm sitl_gazebo.patch
|
||||
rm sitl_gazebo.patch
|
||||
```
|
||||
|
||||
## Установка датасетов geographiclib
|
||||
@@ -69,7 +69,7 @@ rm sitl_gazebo.patch
|
||||
|
||||
```bash
|
||||
cd ~
|
||||
wget https://raw.githubusercontent.com/mavlink/mavros/6f5bd5a1a67c19c2e605f33de296b1b1be9d02fc/mavros/scripts/install_geographiclib_datasets.sh
|
||||
wget https://raw.githubusercontent.com/mavlink/mavros/6f5bd5a1a67c19c2e605f33de296b1b1be9d02fc/mavros/scripts/install_geographiclib_datasets.sh
|
||||
chmod +x ./install_geographiclib_datasets.sh
|
||||
sudo ./install_geographiclib_datasets.sh
|
||||
rm ./install_geographiclib_datasets.sh
|
||||
|
||||
@@ -12,7 +12,7 @@ source ~/catkin_ws/devel/setup.bash
|
||||
roslaunch clover_simulation simulator.launch
|
||||
```
|
||||
|
||||
> **Note** Кроме того, если вы используете виртуальную машину, просто дважды щелкните `Gazebo PX4` на рабочем столе.
|
||||
> **Note** Кроме того, если вы используете виртуальную машину, просто дважды щелкните `Gazebo PX4` на рабочем столе.
|
||||
|
||||
Это запустит Gazebo сервер и клиент, бинарные файлы PX4 и ноды Клевера. Терминал, в котором была запущена команда, будет отображать отладочные сообщения от нод и PX4, а также принимать входные данные для интерпретатора команд PX4:
|
||||
|
||||
@@ -79,7 +79,7 @@ PX4, начиная с версии 1.9, поддерживает [принуд
|
||||
PX4_SIM_SPEED_FACTOR=0.42 roslaunch clover_simulation simulator.launch
|
||||
```
|
||||
|
||||
> **Note** При использовании виртуальной машины удобнее добавить эту переменную в ярлык запуска Gazebo на рабочем столе. Нажмите правой кнопкой на значок Gazebo, выберите "Properties..." и добавьте `PX4_SIM_SPEED_FACTOR=0.42` в поле Command, как показано на иллюстрации:
|
||||
> **Note** При использовании виртуальной машины удобнее добавить эту переменную в ярлык запуска Gazebo на рабочем столе. Нажмите правой кнопкой на значок Gazebo, выберите "Properties..." и добавьте `PX4_SIM_SPEED_FACTOR=0.42` в поле Command, как показано на иллюстрации:
|
||||

|
||||
|
||||
### Выделение ресурсов для виртуальной машины
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
Примеры кода
|
||||
===
|
||||
# Примеры кода
|
||||
|
||||
Python
|
||||
---
|
||||
## Python
|
||||
|
||||
<!-- markdownlint-disable MD031 -->
|
||||
|
||||
@@ -13,7 +11,80 @@ Python
|
||||
|
||||
<!-- markdownlint-enable MD031 -->
|
||||
|
||||
### # {#distance}
|
||||
### # {#navigate_wait}
|
||||
|
||||
<a name="block-nav"></a><!-- old name of anchor -->
|
||||
|
||||
<a name="block-takeoff"></a><!-- old name of anchor -->
|
||||
|
||||
Полет в точку и ожидание окончания полета:
|
||||
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
def navigate_wait(x=0, y=0, z=0, yaw=float('nan'), speed=0.5, frame_id='', auto_arm=False, tolerance=0.2):
|
||||
navigate(x=x, y=y, z=z, yaw=yaw, speed=speed, frame_id=frame_id, auto_arm=auto_arm)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
if math.sqrt(telem.x ** 2 + telem.y ** 2 + telem.z ** 2) < tolerance:
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Для того, чтобы определить расстояние до целевой точки, функция использует фрейм [`navigate_target`](frames.md#navigate_target).
|
||||
|
||||
Использование функции для полета в точку x=3, y=2, z=1 [относительно карты маркеров](aruco_map.md):
|
||||
|
||||
```python
|
||||
navigate_wait(x=3, y=2, z=1, frame_id='aruco_map')
|
||||
```
|
||||
|
||||
Эту функцию можно использовать и для взлета:
|
||||
|
||||
```python
|
||||
navigate_wait(z=1, frame_id='body', auto_arm=True)
|
||||
```
|
||||
|
||||
### # {#land_wait}
|
||||
|
||||
<a name="block-land"></a><!-- old name of anchor -->
|
||||
|
||||
Посадка и ожидание окончания посадки:
|
||||
|
||||
```python
|
||||
def land_wait():
|
||||
land()
|
||||
while get_telemetry().armed:
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Использование:
|
||||
|
||||
```python
|
||||
land_wait()
|
||||
```
|
||||
|
||||
### # {#wait_arrival}
|
||||
|
||||
Ожидание окончания прилета в [navigate](simple_offboard.md#navigate)-точку:
|
||||
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
def wait_arrival(tolerance=0.2):
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
if math.sqrt(telem.x ** 2 + telem.y ** 2 + telem.z ** 2) < tolerance:
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
### # {#get_distance}
|
||||
|
||||
Функция определения расстояния между двумя точками (**важно**: точки должны быть в одной [системе координат](frames.md)):
|
||||
|
||||
@@ -26,7 +97,7 @@ def get_distance(x1, y1, z1, x2, y2, z2):
|
||||
return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2)
|
||||
```
|
||||
|
||||
### # {#distance-global}
|
||||
### # {#get_distance_global}
|
||||
|
||||
Функция для приблизительного определения расстояния (в метрах) между двумя глобальными координатами (широта/долгота):
|
||||
|
||||
@@ -39,111 +110,6 @@ def get_distance_global(lat1, lon1, lat2, lon2):
|
||||
return math.hypot(lat1 - lat2, lon1 - lon2) * 1.113195e5
|
||||
```
|
||||
|
||||
### # {#block-takeoff}
|
||||
|
||||
Взлет и ожидание окончания взлета:
|
||||
|
||||
```python
|
||||
z = 2 # высота
|
||||
tolerance = 0.2 # точность проверки высоты (м)
|
||||
|
||||
# Запоминаем изначальную точку
|
||||
start = get_telemetry()
|
||||
|
||||
# Взлетаем на 2 м
|
||||
print navigate(z=z, speed=0.5, frame_id='body', auto_arm=True)
|
||||
|
||||
# Ожидаем взлета
|
||||
while not rospy.is_shutdown():
|
||||
# Проверяем текущую высоту
|
||||
if start.z + z - get_telemetry().z < tolerance:
|
||||
# Взлет завершен
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Вышеприведенный код может быть обернут в функцию:
|
||||
|
||||
```python
|
||||
def takeoff_wait(alt, speed=0.5, tolerance=0.2):
|
||||
start = get_telemetry()
|
||||
print navigate(z=alt, speed=speed, frame_id='body', auto_arm=True)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
if start.z + alt - get_telemetry().z < tolerance:
|
||||
break
|
||||
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
### # {#block-nav}
|
||||
|
||||
Лететь в точку и ждать пока коптер долетит в нее:
|
||||
|
||||
```python
|
||||
tolerance = 0.2 # точность проверки прилета (м)
|
||||
frame_id='aruco_map'
|
||||
|
||||
# Летим в точку 1:2:3 в поле ArUco-маркеров
|
||||
print navigate(frame_id=frame_id, x=1, y=2, z=3, speed=0.5)
|
||||
|
||||
# Ждем, пока коптер долетит до запрошенной точки
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id=frame_id)
|
||||
# Вычисляем расстояние до заданной точки
|
||||
if get_distance(1, 2, 3, telem.x, telem.y, telem.z) < tolerance:
|
||||
# Долетели до необходимой точки
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Вышеприведенный код может быть обернут в функцию:
|
||||
|
||||
```python
|
||||
def navigate_wait(x, y, z, speed, frame_id, tolerance=0.2):
|
||||
navigate(x=x, y=y, z=z, speed=speed, frame_id=frame_id)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id=frame_id)
|
||||
if get_distance(x, y, z, telem.x, telem.y, telem.z) < tolerance:
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Более универсальная функция с использованием фрейма `navigate_target`, который совпадает с целевой точкой навигации дрона:
|
||||
|
||||
```python
|
||||
def navigate_wait(x, y, z, speed, frame_id, tolerance=0.2):
|
||||
navigate(x=x, y=y, z=z, speed=speed, frame_id=frame_id)
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
if math.sqrt(telem.x ** 2 + telem.y ** 2 + telem.z ** 2) < tolerance:
|
||||
break
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Такой код может быть использован для полета в том числе с использованием фрейма `body`.
|
||||
|
||||
### # {#block-land}
|
||||
|
||||
Посадка и ожидание окончания посадки:
|
||||
|
||||
```python
|
||||
land()
|
||||
while get_telemetry().armed:
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
Вышеприведенный код может быть обернут в функцию:
|
||||
|
||||
```python
|
||||
def land_wait():
|
||||
land()
|
||||
while get_telemetry().armed:
|
||||
rospy.sleep(0.2)
|
||||
```
|
||||
|
||||
### # {#disarm}
|
||||
|
||||
Дизарм коптера (выключение винтов, **коптер упадет**):
|
||||
|
||||
Reference in New Issue
Block a user