diff --git a/README.md b/README.md index 57978ead..bd026317 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,68 @@ -Клевер -====== +# CLEVER -Клевер +CLEVER drone -«Клевер» — это учебный конструктор программируемого квадрокоптера, состоящего из популярных открытых компонентов, а также набор необходимой документации и библиотек для работы с ним. +CLEVER is an educational programmable drone kit consisting of an unassembled quadcopter, open source software and documentation. The kit includes Pixhawk/Pixracer autopilot running PX4 firmware, Raspberry Pi 3 as companion computer, a camera for computer vision navigation as well as additional sensors and peripheral devices. -Набор включает в себя полетный контроллер PixHawk/PixRacer с полетным стеком PX4, Raspberry Pi 3 в качестве управлящего бортового компьютера, модуль камеры для реализации полетов с использованием компьютерного зрения, а также набор различных датчиков и другой периферии. +Copter Express has implemented a large number of different autonomous drone projects using exactly the same platform: [automated pizza delivery](https://www.youtube.com/watch?v=hmkAoZOtF58) in Samara and Kazan, coffee delivery in Skolkovo Innovation Center, [autonomous quadcopter with charging station](https://www.youtube.com/watch?v=RjX6nUqw1mI) for site monitoring and security, winning drones on [Robokross-2016](https://www.youtube.com/watch?v=dGbDaz_VmYU) and [Robokross-2017](https://youtu.be/AQnd2CRczbQ) competitions and many others. -На базе точно такой же платформы были созданы многие «большие» проекты компании Copter Express, например, дроны для [пиар-акций по автономной доставке пиццы](https://www.youtube.com/watch?v=hmkAoZOtF58) (Самара, Казань); дрон-доставщик кофе в Сколково, мониторинговый дрон с зарядной станцией, дроны-победители на полевых испытаниях «[Робокросс-2016](https://www.youtube.com/watch?v=dGbDaz_VmYU)», «[Робокросс-2017](https://youtu.be/AQnd2CRczbQ)» и многие другие. +**The main documentation in Russian is available on our Gitbook:** +**https://copterexpress.gitbooks.io/clever/content/** -Для того, чтобы научиться собирать, настраивать, пилотировать и программировать автономный дрон «Клевер», воспользуйтесь этим учебником. +Use it to learn how to assemble, configure, pilot and program autonomous CLEVER drone. -Основная документация ---------------------- +## Preconfigured RPi 3 image -https://copterexpress.gitbooks.io/clever/content/ +Preconfigured image for Raspberry Pi 3 with installed and configured software, ready to fly, is available [here](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). -**Образ ОС** для RPi 3 с предустановленным и преднастроенным ПО можно скачать [здесь](https://copterexpress.gitbooks.io/clever/content/docs/microsd_images.html). - -Образ включает в себя: +Image includes: * Raspbian Stretch * ROS Kinetic -* Настроенную работу с сетью +* Configured networking * OpenCV * mavros -* Набор ПО для работы с Клевером +* CLEVER software bundle for autonomous drone control -[Описание API](https://copterexpress.gitbooks.io/clever/content/docs/simple_offboard.html) для автономных полетов. +API description in Russian for autonomous flights is available [here](https://copterexpress.gitbooks.io/clever/content/docs/simple_offboard.html). -Ручная установка ---------- +## Manual installation -Установить ROS Kinetic согласно [инструкциям](http://wiki.ros.org/kinetic/Installation). +Install ROS Kinetic according to the [documentation](http://wiki.ros.org/kinetic/Installation). -Склонировать репозиторий в папку `/home/pi/catkin_ws/src/clever`: +Clone repo to directory `/home/pi/catkin_ws/src/clever`: ```bash cd ~/catkin_ws/src git clone https://github.com/CopterExpress/clever.git clever ``` -Пересобрать ROS-пакеты: +Build ROS packages: ```bash cd ~/catkin_ws catkin_make -j1 ``` -Включить сервис roscore (если он не включен): +Enable systemd service `roscore` (if not enabled): ```bash sudo systemctl enable /home/pi/catkin_ws/src/clever/deploy/roscore.service sudo systemctl start roscore ``` -Включить сервис clever: +Enable systemd service `clever`: ```bash sudo systemctl enable /home/pi/catkin_ws/src/clever/deploy/clever.service sudo systemctl start clever ``` -Зависимости ------------ +### Dependencies [ROS Kinetic](http://wiki.ros.org/kinetic). -Необходимые для работы ROS-пакеты: +Necessary ROS packages: * `opencv3` * `mavros` @@ -76,8 +71,6 @@ sudo systemctl start clever * `cv_camera` * `nodelet` * `dynamic_reconfigure` -* `bondcpp`, ветка `master` +* `bondcpp`, branch `master` * `roslint` * `rosserial` - -TODO: внести в package.xml diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index e3715b55..00000000 --- a/SUMMARY.md +++ /dev/null @@ -1,45 +0,0 @@ -# Summary - -* [Введение](README.md) -* [Сборка](docs/assemble.md) -* [Первоначальная настройка](docs/setup.md) -* [Полетные режимы](docs/modes.md) -* [Raspberry Pi](docs/raspberry.md) -* [Образ операционной системы на RPi](docs/microsd_images.md) -* [Подключение Raspberry Pi к PixHawk](docs/connection.md) -* [Подключение по Wi-Fi](docs/wifi.md) -* [Работа с QGroundControl через Wi-Fi](docs/gcs_bridge.md) -* [SSH-доступ](docs/ssh.md) -* [Неисправности радиоаппаратуры](docs/radioerrors.md) -* [Безопасность](docs/safety.md) -* [Техника безопасности по пайке](docs/tb.md) -* [Просмотр видеострима с камер](docs/web_video_server.md) -* [Работа с ROS](docs/ros.md) -* [MAVROS](docs/mavros.md) -* [Автономный полет в OFFBOARD](docs/simple_offboard.md) -* [Навигация по ArUco-маркерам](docs/aruco.md) -* [Взаимодействие с Arduino](docs/arduino.md) -* [Системы координат](docs/frames.md) -* [Работа с камерой \(компьютерное зрение\)](docs/camera.md) -* [Ориентация камеры](docs/camera_frame.md) -* [Визуализация с помощью rviz](docs/rviz.md) -* [Работа с SITL](docs/sitl.md) -* [Подключение GPS](docs/gps.md) -* [Использование 3G-модема](docs/3g.md) -* [Примеры программ](docs/snippets.md) -* Учебник - * [Урок 1](docs/les1.md) - * [Урок 2](docs/les2.md) - * [Урок 7](docs/les7.md) - * [Урок 8](docs/les8.md) - * [Урок 9](docs/les9.md) - * [Урок 11](docs/les11.md) - * [Урок 13](docs/les13.md) - * [Урок 15](docs/les15.md) - * [Урок 16](docs/les16.md) -* [Другое](drugoe.md) - * [CopterHack-2017](docs/copterhack2017.md) - * [Прошивка ESC контроллеров с помощью Arduino](docs/esc_firmware.md) - * [Работа со светодиодной лентой](docs/rabota-so-svetodiodnoi-lentoi.md) -* [Полезные ссылки](docs/links.md) - diff --git a/book.json b/book.json index 17c5df11..a88c2e70 100644 --- a/book.json +++ b/book.json @@ -3,6 +3,7 @@ "description": "Конструктор квадрокоптера «Клевер»", "author": "Copter Express", "language": "ru", + "root": "docs/", "plugins": ["youtube", "richquotes", "disqus", "versions"], "pluginsConfig": { "disqus": { diff --git a/clever/launch/mavros.launch b/clever/launch/mavros.launch index d8a190f1..bc9d8ea4 100644 --- a/clever/launch/mavros.launch +++ b/clever/launch/mavros.launch @@ -17,6 +17,7 @@ + diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..b911aa77 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,30 @@ +Клевер +====== + +Клевер + +«Клевер» — это учебный конструктор программируемого квадрокоптера, состоящего из популярных открытых компонентов, а также набор необходимой документации и библиотек для работы с ним. + +Набор включает в себя полетный контроллер PixHawk/PixRacer с полетным стеком PX4, Raspberry Pi 3 в качестве управлящего бортового компьютера, модуль камеры для реализации полетов с использованием компьютерного зрения, а также набор различных датчиков и другой периферии. + +На базе точно такой же платформы были созданы многие «большие» проекты компании Copter Express, например, дроны для [пиар-акций по автономной доставке пиццы](https://www.youtube.com/watch?v=hmkAoZOtF58) (Самара, Казань); дрон-доставщик кофе в Сколково, мониторинговый дрон с зарядной станцией, дроны-победители на полевых испытаниях «[Робокросс-2016](https://www.youtube.com/watch?v=dGbDaz_VmYU)», «[Робокросс-2017](https://youtu.be/AQnd2CRczbQ)» и многие другие. + +Для того, чтобы научиться собирать, настраивать, пилотировать и программировать автономный дрон «Клевер», воспользуйтесь этим учебником. + +Образ для Raspberry Pi +---------------------- + +**Образ ОС** для RPi 3 с предустановленным и преднастроенным ПО можно скачать [здесь](microsd_images.html). + +Образ включает в себя: + +* Raspbian Stretch +* ROS Kinetic +* Настроенную работу с сетью +* OpenCV +* mavros +* Набор ПО для работы с Клевером + +[Описание API](simple_offboard.html) для автономных полетов. + +Исходный код сборщика образа и всего ПО можно найти на [GitHub](https://github.com/CopterExpress/clever). diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md new file mode 100644 index 00000000..f03cb778 --- /dev/null +++ b/docs/SUMMARY.md @@ -0,0 +1,45 @@ +# Summary + +* [Введение](README.md) +* [Сборка](assemble.md) +* [Первоначальная настройка](setup.md) +* [Полетные режимы](modes.md) +* [Raspberry Pi](raspberry.md) +* [Образ операционной системы на RPi](microsd_images.md) +* [Подключение Raspberry Pi к PixHawk](connection.md) +* [Подключение по Wi-Fi](wifi.md) +* [Работа с QGroundControl через Wi-Fi](gcs_bridge.md) +* [SSH-доступ](ssh.md) +* [Неисправности радиоаппаратуры](radioerrors.md) +* [Безопасность](safety.md) +* [Техника безопасности по пайке](tb.md) +* [Просмотр видеострима с камер](web_video_server.md) +* [Работа с ROS](ros.md) +* [MAVROS](mavros.md) +* [Автономный полет в OFFBOARD](simple_offboard.md) +* [Примеры программ](snippets.md) +* [Навигация по ArUco-маркерам](aruco.md) +* [Взаимодействие с Arduino](arduino.md) +* [Системы координат](frames.md) +* [Работа с камерой \(компьютерное зрение\)](camera.md) +* [Ориентация камеры](camera_frame.md) +* [Визуализация с помощью rviz](rviz.md) +* [Работа с SITL](sitl.md) +* [Подключение GPS](gps.md) +* [Использование 3G-модема](3g.md) +* Учебник + * [Урок 1](les1.md) + * [Урок 2](les2.md) + * [Урок 7](les7.md) + * [Урок 8](les8.md) + * [Урок 9](les9.md) + * [Урок 11](les11.md) + * [Урок 13](les13.md) + * [Урок 15](les15.md) + * [Урок 16](les16.md) +* [Другое](drugoe.md) + * [CopterHack-2017](copterhack2017.md) + * [Прошивка ESC контроллеров с помощью Arduino](esc_firmware.md) + * [Работа со светодиодной лентой](rabota-so-svetodiodnoi-lentoi.md) +* [Полезные ссылки](links.md) + diff --git a/docs/arduino.md b/docs/arduino.md index f5bf5dab..0b99aae7 100644 --- a/docs/arduino.md +++ b/docs/arduino.md @@ -60,7 +60,7 @@ for(int i=0; i<8; i++) { Работа с Клевером --- -Набор сервисов и топиков аналогичен обычному набору в [simple_offboard](/docs/simple_offboard.md) и [mavros](/docs/mavros.md). +Набор сервисов и топиков аналогичен обычному набору в [simple_offboard](simple_offboard.md) и [mavros](mavros.md). Пример программы, контролирующей коптер по позиции, с использованием сервисов `navigate` и `set_mode`: @@ -168,7 +168,7 @@ void loop() Получение телеметрии --- -С Arduino можно использовать [сервис](/docs/simple_offboard.md) `get_telemetry`. Для этого надо объявить его по аналогии с сервисами `navigate` и `set_mode`: +С Arduino можно использовать [сервис](simple_offboard.md) `get_telemetry`. Для этого надо объявить его по аналогии с сервисами `navigate` и `set_mode`: ```cpp #include diff --git a/docs/aruco.md b/docs/aruco.md index 73cd363b..94f58820 100644 --- a/docs/aruco.md +++ b/docs/aruco.md @@ -5,7 +5,7 @@ Пример ArUco-маркеров: -![](/assets/markers.jpg) +![](assets/markers.jpg) > **Hint** При печати визуальных маркеров необходимо использовать максимально матовую бумагу. Глянцевая бумага будет бликовать на свету, сильно ухудшая качество распознавания. @@ -13,11 +13,11 @@ Модуль `aruco_pose` позволяет восстанавливать позицию коптера относительно карты ArUco-маркеров и сообщать ее полетному контролеру, используя механизм [Vision Position Estimation](https://dev.px4.io/en/ros/external_position_estimation.html). -При наличии источника положения коптера по маркерам появляется возможность производить точную автономную indoor-навигацию по позициям при помощи модуля [simple\_offboard](/docs/simple_offboard.md). +При наличии источника положения коптера по маркерам появляется возможность производить точную автономную indoor-навигацию по позициям при помощи модуля [simple\_offboard](simple_offboard.md). ### Включение -Необходимо убедиться, что в launch-файле Клевера \(`~/catkin_ws/src/clever/clever/launch/clever.launch`\) включен запуск aruco\_pose и [камеры для компьютерного зрения](/docs/camera.md): +Необходимо убедиться, что в launch-файле Клевера \(`~/catkin_ws/src/clever/clever/launch/clever.launch`\) включен запуск aruco\_pose и [камеры для компьютерного зрения](camera.md): ```xml @@ -80,9 +80,9 @@ sudo systemctl restart clever Нумерация маркеров ведется с левого верхнего угла поля. -Для контроля карты, по которой в данный момент коптер осуществляет навигацию, можно просмотреть содержимое топика `aruco_pose/map_image`. Через браузер его можно просмотреть при помощи [web\_video\_server](/docs/web_video_server.md) по ссылке [http://192.168.11.1:8080/snapshot?topic=/aruco\_pose/map\_image](http://192.168.11.1:8080/snapshot?topic=/aruco_pose/map_image): +Для контроля карты, по которой в данный момент коптер осуществляет навигацию, можно просмотреть содержимое топика `aruco_pose/map_image`. Через браузер его можно просмотреть при помощи [web\_video\_server](web_video_server.md) по ссылке [http://192.168.11.1:8080/snapshot?topic=/aruco\_pose/map\_image](http://192.168.11.1:8080/snapshot?topic=/aruco_pose/map_image): -![](/assets/Снимок экрана 2017-11-27 в 23.20.49.png) +![](assets/Снимок экрана 2017-11-27 в 23.20.49.png) При полетах необходимо убедиться, что наклеенные на пол метки соответствуют карте. @@ -102,11 +102,11 @@ _Примечание_: указанное выше определение пр Таким образом, нулевой является левая нижня точка маркерного поля. Угол по рысканью считается равным 0, когда коптер смотрит направо \(по оси x\). -![](/assets/aruco-frame.png) +![](assets/aruco-frame.png) ### Настройка полетного контролера -Для правильной работы Vision Position Estimation необходимо \(через [QGroundControl](/docs/gcs_bridge.md)\) убедиться, что: +Для правильной работы Vision Position Estimation необходимо \(через [QGroundControl](gcs_bridge.md)\) убедиться, что: * Для PixHawk: Установлена прошивка с LPE \(local position estimator\). Для PixRacer: параметр `SYS_MC_EST_GROUP` установлен в `local_position_estimator, attitude_estimator_q`. * В параметре `LPE_FUSION` включены **только** флажки `vision position`, `vision yaw`, `land detector`. Итоговое значение _28_. @@ -120,15 +120,15 @@ _Примечание_: указанное выше определение пр * `LNDMC_THR_RANGE` = 0.5 * `LNDMC_Z_VEL_MAX` = 1 m/s -Для простоты настройки можно воспользоваться готовым файлом настроек для [Clever 2](https://github.com/CopterExpress/clever/blob/master/assets/Clever2LPE_160118.params) или для [Clever 3](https://github.com/CopterExpress/clever/blob/master/assets/Clever3_LPE_020218.params) и вгрузить его в контроллер с помощью меню Tools - Load from file из раздела Parameters в QGroundControl. +Для простоты настройки можно воспользоваться готовым файлом настроек для [Clever 2](https://github.com/CopterExpress/clever/blob/masterassets/Clever2LPE_160118.params) или для [Clever 3](https://github.com/CopterExpress/clever/blob/masterassets/Clever3_LPE_020218.params) и вгрузить его в контроллер с помощью меню Tools - Load from file из раздела Parameters в QGroundControl. -![](/assets/Screenshot from 2018-02-27 22-30-50.png) +![](assets/Screenshot from 2018-02-27 22-30-50.png) ### Полет -При правильной настройке коптер начнет удерживать позицию по VPE \(в [режимах](/docs/modes.md) `POSCTL` или `OFFBOARD`\) автоматически. +При правильной настройке коптер начнет удерживать позицию по VPE \(в [режимах](modes.md) `POSCTL` или `OFFBOARD`\) автоматически. -Для [автономных полетов](/docs/simple_offboard.md) можно будет использовать функции `navigate`, `set_position`, `set_velocity`. Для полета в определенные координаты маркерного поля необходимо использовать фрейм `aruco_map`: +Для [автономных полетов](simple_offboard.md) можно будет использовать функции `navigate`, `set_position`, `set_velocity`. Для полета в определенные координаты маркерного поля необходимо использовать фрейм `aruco_map`: ```python # Вначале необходимо взлететь, чтобы коптер увидел карту меток @@ -141,15 +141,15 @@ time.sleep(5) navigate(2, 2, 2, speed=1, frame_id='aruco_map', update_frame=True) # полет в координату 2:2, высота 3 метра ``` -См. [другие функции](/docs/simple_offboard.md) simple offboard. +См. [другие функции](simple_offboard.md) simple offboard. ### Расположение маркеров на потолке > **Info** Образ версии >0.2. -![](/assets/IMG_4175.JPG) +![](assets/IMG_4175.JPG) -Для навигации по маркерам, расположенным на потолке, необходимо поставить основную камеру так, чтобы она смотрела вверх и [установить соответствующий фрейм камеры](/docs/camera_frame.md). +Для навигации по маркерам, расположенным на потолке, необходимо поставить основную камеру так, чтобы она смотрела вверх и [установить соответствующий фрейм камеры](camera_frame.md). Чтобы задавать карту маркеров в "перевернутой" системе координат, необходимо изменить параметр `aruco_orientation` в файле `~/catkin_ws/src/clever/clever/aruco.launch`: diff --git a/docs/assemble.md b/docs/assemble.md index 8314be74..e809b438 100644 --- a/docs/assemble.md +++ b/docs/assemble.md @@ -1,12 +1,12 @@ Инструкция по сборке конструктора Клевер 2 ========================================== -![Clever](../assets/Clevermain.png) +![Clever](assets/Clevermain.png) Состав конструктора ------------------- -![Explosion](../assets/explosion.png) +![Explosion](assets/explosion.png) * Рама центральная x2. * Рама дополнительная х4. @@ -14,14 +14,14 @@ * Ножки x8. * Защита для лучей x8. * Защита пропеллеров x16. -* Защита боковая x16. +* Защита боковая x16. * Пропеллер пластиковый Dalprop 5045 x4. * Бесколлекторный электродвигатель Racerstar BR2205 2300kV x4. * Регуляторы хода ESC, DYS XSD20А x4. * Разъем силовой XT60 pin x1. * Разъем силовой XT60 socket x1. * Трехпроводной шлейф “мама-мама” x2. -* Провод медный многожильный с силиконовой изоляцией 14AWG (красный, черный), длина 50 см. +* Провод медный многожильный с силиконовой изоляцией 14AWG (красный, черный), длина 50 см. * Плата распределения питания PDB BeeRotor Power Distribution Board V2.0 x1. * Аккумуляторная батарея (АКБ) Li-ion 18650 x8. * Зарядное устройство EFEST Luc V4 Li-lon x1. @@ -33,7 +33,7 @@ * Зарядное устройство EFEST LUC V4 x1. * Провод Micro USB - USB x1 * Батарейный отсек 18650 li-Ion x1 -* Провод медный многожильный с силиконовой изоляцией 18AWG (красный, черный), длина 100 см. +* Провод медный многожильный с силиконовой изоляцией 18AWG (красный, черный), длина 100 см. * Батарейка АА х4 * Джампер, Bind-разъем @@ -76,12 +76,12 @@ 16. Ручка A (VrA). 17. Ручка B (VrB). -![radio Transmitter](../assets/radioTransmitter.png) +![radio Transmitter](assets/radioTransmitter.png) Дополнительное оборудование --------------------------- -#### Данное оборудование не входит в состав конструктора Клевер 2, но оно необходимо для реализации сборочного процесса +#### Данное оборудование не входит в состав конструктора Клевер 2, но оно необходимо для реализации сборочного процесса 1. Паяльник 2. Канифоль/ Флюс (нейтральный) @@ -92,10 +92,10 @@ 7. Канцелярский нож 8. Мультиметр -![Дополнительное оборудование](../assets/addEqipment.jpg) - +![Дополнительное оборудование](assets/addEqipment.jpg) -![Техника безопасности при пайке](../docs/tb.md) + +![Техника безопасности при пайке](tb.md) Порядок сборки -------------- @@ -104,7 +104,7 @@ * Распаковать моторы. Используя плоскогубцы, укоротить провода на моторах, обрезать половину длины (оставив 25 мм). -![Мотор brrc2205](../assets/brrc2205.png) +![Мотор brrc2205](assets/brrc2205.png) Зачистить * снять 2мм термоизоляции с конца провода не повредив медные жилы. @@ -112,41 +112,41 @@ Скрутить провода. Залудить -* Нанести флюс на оголенную часть провода. +* Нанести флюс на оголенную часть провода. * Покрыть припоем, используя пинцет. -![Лужение](../assets/zap.jpg) +![Лужение](assets/zap.jpg) #### Закрепить мотор на луче * Установить мотор на сторону луча с гравировкой. * Прикрепить моторы к лучам винтами М3х8, используя отвертку. -![Закрепить мотор на луче](../assets/brrc2205on.png) +![Закрепить мотор на луче](assets/brrc2205on.png) * Лучи с моторами необходимо расположить согласно схеме. Стрелками указано направление вращения моторов. -![Вращение моторов](../assets/brrc2205ondeck.png) +![Вращение моторов](assets/brrc2205ondeck.png) //указать стрелками направление вращения на моторах #### Залудить три контактные площадки регулятора -* Нанести флюс +* Нанести флюс * Нанести припой Чтобы припой аккуратно заполнил всю площадку, необходимо прогреть площадку регулятора. Для этого нужно удерживать жало паяльника на контактной плащадке в течение 2 сек (или больше, если потребуется) -![Лужение контактных площадок регуляторов](../assets/escDYSzap.png) +![Лужение контактных площадок регуляторов](assets/escDYSzap.png) * Повторить данную операцию для оставшихся трех регуляторов #### Припаять провода моторов к регуляторам Припаять ранее приготовленные провода моторов к контактным площадкам регуляторов. -![Припаять провода моторов к регуляторам](../assets/solderingBrrc2205ondeckTOescDYSzap.png) +![Припаять провода моторов к регуляторам](assets/solderingBrrc2205ondeckTOescDYSzap.png) * Повторить данную операцию для оставшихся трех регуляторов ### Монтаж разъемов питания -![Статья про силовые и управляющие цепи](/power.md) +![Статья про силовые и управляющие цепи](power.md) #### Подготовка проводов для силовых разъемов XT60 @@ -155,13 +155,13 @@ * Длина 7 см (Для силового разъема XT60 pin) - 1 красный, 1 черный * Длина 9 см (Для силового разъема XT60 socket) - 1 красный, 1 черный -![Подготовка проводов для силового разъема](../assets/cutwire14AWG.jpg) +![Подготовка проводов для силового разъема](assets/cutwire14AWG.jpg) #### Подготовка силовых разъемов питания XT60 pin и XT60 socket ![Статья про силовые разъемы и их обозначения](../notes/powerConnection.md) -![Силовой разъем XT60](../assets/xt60pinsocket.jpg) +![Силовой разъем XT60](assets/xt60pinsocket.jpg) 1. Под разъем XT60 pin залудить два силовых провода красный и чёрный 14AWG длиной 7 см. 2. Залудить контактные площадки разъема XT60 pin. @@ -171,7 +171,7 @@ 6. Надеть термоусадку ф5 на провода так, чтобы она закрывала контактные площадки проводов с XT60 . 7. Усадить термоусадку феном. -![Монтаж разъемов XT60](../assets/mountxt60pinsocket.png) +![Монтаж разъемов XT60](assets/mountxt60pinsocket.png) 8. Повторить процедуру для разъема XT60 socket. @@ -183,7 +183,7 @@ 3. Убрать 3-й (оранжевый) провод из разъема, за ненадобностью. 4. Длина оставшихся черного и красного проводов 10-12 см. -![Монтаж разъема 5В](../assets/mount5vconnector.png) *было бы круто, если делать такие картинки и в формате гифки +![Монтаж разъема 5В](assets/mount5vconnector.png) *было бы круто, если делать такие картинки и в формате гифки ### Монтаж платы распределения питания @@ -191,31 +191,31 @@ #### Предпаячная проверка -![Статья про прозвонку](/notes/testConnection.md) +![Статья про прозвонку](testConnection.md) -![Предпаячная проверка](../assets/startPDBtest.jpg) +![Предпаячная проверка](assets/startPDBtest.jpg) Прозвонить следующие цепи на НЕЗАМКНУТОСТЬ (отсутствие звукового сигнала мультиметра): -* “BAT+” и “BAT-” +* “BAT+” и “BAT-” * “12V” и “GND” * “5V” и “GND” Прозвонить следующие цепи на ЗАМКНУТОСТЬ (появление звукового сигнала мультиметра): -* “BAT-” c каждым контактом, обозначенным “-” и “GND” +* “BAT-” c каждым контактом, обозначенным “-” и “GND” * “BAT+”, с каждым контактом, обозначенным “+” #### Залудить контактные площадки платы питания -1. ![Залудить*](../notes/zap.md) контактные площадки платы питания. +1. ![Залудить*](zap.md) контактные площадки платы питания. 2. С помощью мультиметра проверить отсутствие контактного замыкания на плате (прозвонить) -![Постпаячная проверка](../assets/zapPDBtest.jpg) +![Постпаячная проверка](assets/zapPDBtest.jpg) Чтобы припой аккуратно заполнил всю площадку, необходимо её прогреть. Для этого нужно удерживать жало паяльника на контактной плащадке в течение 2 сек (или больше, если потребуется) #### Пайка силового разъема питания XT60 Припаять разъем для АКБ, соблюдая полярность на контактных площадках. -![Пайка XT60 на PDB](../assets/solderingxt60socketTOpdb.png) +![Пайка XT60 на PDB](assets/solderingxt60socketTOpdb.png) ВАЖНО о полярности * красный провод - это “+” @@ -225,12 +225,12 @@ Припаять разъем 5В, соблюдая полярность на контактных площадках. (на изображении: красный провод - это питание “+”) -![Пайка 5В на PDB](../assets/soldering5VTOpdb.png) +![Пайка 5В на PDB](assets/soldering5VTOpdb.png) ### Монтаж отсека АКБ #### Подготовка перемычек (3 шт.) -![Перемычка](../assets/jumper.png) +![Перемычка](assets/jumper.png) * Отрезать силовой провод длиной 2 см. * Зачистить с обеих сторон. @@ -240,7 +240,7 @@ * Прозвонить мультиметром. В случае необходимости зачистить наждачной бумагой. #### Подготовка отсека АКБ -![Подготовка отсека АКБ](../assets/casebattery.png) +![Подготовка отсека АКБ](assets/casebattery.png) * Приклеить наклейки с разметкой внутрь отсека АКБ, в соответствии с полярностью. * Приклеить ленту из скотча на дно отсека. @@ -248,34 +248,34 @@ ### Монтаж платы распределения питания * Установить плату питания на раму винтами М3х8 и пластиковыми гайками. -![Установка платы PDB](../assets/mountPDB.png) +![Установка платы PDB](assets/mountPDB.png) * ВАЖНО Стрелочка на плате направлена в сторону носового выреза -![Установка платы PDB](../assets/topviewmountPDB.png) +![Установка платы PDB](assets/topviewmountPDB.png) #### Монтаж элементов 1. Установить гайки в пластиковые держатели -![Монтаж пластиковых держателей](../assets/holderLegs.png) +![Монтаж пластиковых держателей](assets/holderLegs.png) 2. Установить лучи на раму винтами М3х16 -*Лучи устанавливаются поверх рамы +*Лучи устанавливаются поверх рамы *Пластиковые держатели устанавливаются снизу рамы -![Монтаж лучей](../assets/mountBeams.png) +![Монтаж лучей](assets/mountBeams.png) 3. Расположение моторов Проверить расположение моторов (моторы с черной гайкой в левом верхнем углу и в правом нижнем). -![Расположение моторов](../assets/motorsTopview.png) +![Расположение моторов](assets/motorsTopview.png) 4. Продеть силовые провода регуляторов в отверстия. -![силовые провода моторов](../assets/escWires.png) +![силовые провода моторов](assets/escWires.png) #### Пайка силовой цепи платы питания Припаять силовые провода регуляторов к плате питания, соблюдая полярность. -![Пайка силовых проводов на PDB](../assets/solderingPowerwires.png) +![Пайка силовых проводов на PDB](assets/solderingPowerwires.png) ВАЖНО о полярности *красный провод - это “+” @@ -284,14 +284,14 @@ ### Сопряжение приемника и пульта 1. Подключить радиоприемник к разъему 5В. В любой разъем, GND внизу. На схеме питание обозначено как 5V -![Подключение питания приемника](../assets/receiver5V.png) +![Подключение питания приемника](assets/receiver5V.png) 3. Подключить АКБ. Светодиод на радиоприемнике должен мигать. -![Подключение АКБ](../assets/connectBattery.png) +![Подключение АКБ](assets/connectBattery.png) #### БЕЗОПАСНОСТЬ при работе с АКБ -![БЕЗОПАСНОСТЬ при работе с АКБ](../assets/safetyPower.png) +![БЕЗОПАСНОСТЬ при работе с АКБ](assets/safetyPower.png) #### Включение радиопульта 1. На пульте зажать кнопку BIND KEY. @@ -300,45 +300,45 @@ 4. Отсоединить джампер. 5. Светодиод горит непрерывно. -![Подключение питания приемника](../assets/connectingRadio.png) +![Подключение питания приемника](assets/connectingRadio.png) -![Мануал по неисправностям](../docs/radioerrors1.md) +![Мануал по неисправностям](radioerrors1.md) ### Проверка направления вращения моторов 1. Наклеить наклейки на АКБ 18650. 2. Установить 18650 в отсек АКБ, соблюдая полярность. -![Готовность отсека АКБ](../assets/readyBatteryholder.png) +![Готовность отсека АКБ](assets/readyBatteryholder.png) 3. Проверить, что разъем питания 5В подключен к приемнику по схеме. 4. Подключить регулятор мотора к 3 каналу приемника CH3 по схеме. -![Подключение регулятора к приемнику](../assets/connectionESCtoReceiver.png) +![Подключение регулятора к приемнику](assets/connectionESCtoReceiver.png) 5. Подключить внешнее питание (АКБ). 6. Включить пульт. 7. Подать левым стиком газ (throttle) на 10%. 8. Проверить направления вращения мотора по схеме. -![Проверка вращения моторов](../assets/testMotors.png) +![Проверка вращения моторов](assets/testMotors.png) 9. Если необходимо изменить направление вращения, то меняем любые два фазных провода мотора (нужно перепаять). -![Перепайка фазных проводов](../assets/resolderingESC.png) +![Перепайка фазных проводов](assets/resolderingESC.png) ### Монтаж радиоприемника 1. Установить пластиковые стойки 30 мм на раму винтами М3х8. 2. Разъем питания 5В продеть в прорезь. -![Установка стоек и прорезь](../assets/mountReceiverStud.png) +![Установка стоек и прорезь](assets/mountReceiverStud.png) -3. Приемник прикрепить к ![нижней дополнительной раме*](../notes/deck.md), используя двухсторонний скотч и ориентируясь на гравировку. Антенны направлены вперед. +3. Приемник прикрепить к ![нижней дополнительной раме*](../notes/deck.md), используя двухсторонний скотч и ориентируясь на гравировку. Антенны направлены вперед. - ![Установка радиоприемника на деку](../assets/mountReceiverDeck.png) + ![Установка радиоприемника на деку](assets/mountReceiverDeck.png) 4. Установить 3х проводной шлейф в канал PPM / CH1. -![Подключение радиоприемника](../assets/receiverPPM.png) +![Подключение радиоприемника](assets/receiverPPM.png) 5. Продеть в прорезь к разъему 5 В. -6. Прикрутить нижнюю дополнительную раму к стойкам на центральной раме винтами М3х8. -![Установка нижней деки](../assets/mountBottomDeck.png) +6. Прикрутить нижнюю дополнительную раму к стойкам на центральной раме винтами М3х8. +![Установка нижней деки](assets/mountBottomDeck.png) ##### ВАЖНО Направление стрелок на плате питания и на раме дополнительной совпадают @@ -346,11 +346,11 @@ ### Монтаж полетного контроллера #### Переворачиваем сборку -![Переворачиваем сборку](../assets/topPreview.png) +![Переворачиваем сборку](assets/topPreview.png) #### Установка полетного контроллера Pixhawk -1. Клеим 2х сторонний скотч по углам полетного контроллера - ![Полетный контроллер](../assets/pixhawk.png) +1. Клеим 2х сторонний скотч по углам полетного контроллера + ![Полетный контроллер](assets/pixhawk.png) ##### ВАЖНО При работе моторов возникают вибрации, отрицательно влияющие на показания датчиков полетного контроллера Pixhawk. Чтобы избежать этого эффекта, количество слоев двустороннего скотча @@ -358,7 +358,7 @@ 2. Установить полетный контроллер в центр рамы - ![Полетный контроллер](../assets/topviewpixhawk.png) + ![Полетный контроллер](assets/topviewpixhawk.png) ##### ВАЖНО Стрелки на раме и pixhawk должны быть сонаправлены @@ -368,29 +368,29 @@ 2. Моторы к 1,2,3,4 портам MAIN OUT, согласно схеме 3. Питание от PDB (5В/VCC) в любой порт, кроме SB (SBUS) - ![Подключение полетного контроллера](../assets/connectionPixhawk.png) + ![Подключение полетного контроллера](assets/connectionPixhawk.png) ### Сборка регуляторов 1. Клеим 2х сторонний скотч на основание защитного бокса регуляторов -![Скотч на бокс регулей](../assets/escCase.png) +![Скотч на бокс регулей](assets/escCase.png) 2. Укладываем регуляторы в защитные боксы. Крепим полученную сборку к лучам рамы. -![Вид сверху с боксами для регулей](../assets/topESCcaseview.png) +![Вид сверху с боксами для регулей](assets/topESCcaseview.png) ### Установка защиты 1. Закрепить нижнюю защиту винтами М3х16 на лучах рамы -![Установка лучевой защиты](../assets/lowsafeDeck.png) +![Установка лучевой защиты](assets/lowsafeDeck.png) 2. Закрепить ножки к пластиковым держателям винтами М3х16 -![Установка ножек](../assets/safeLegs.png) +![Установка ножек](assets/safeLegs.png) 3. Закрепить стойки 30 мм в отверстия нижней защиты винтами М3х12 -![Установка нижней радиальной защиты](../assets/safelowRadial.png) +![Установка нижней радиальной защиты](assets/safelowRadial.png) 4. Закрепить верхнюю защиту винтами М3х12 -![Установка верхней радиальной защиты](../assets/safehighRadial.png) +![Установка верхней радиальной защиты](assets/safehighRadial.png) ### Монтаж отсека АКБ @@ -402,11 +402,11 @@ * Батарейный отсек (1 шт) 1. Прикрепить батарейный отсек на верхнюю дополнительную раму винтами М3х12 и гайками. -![Монтаж отсека АКБ](../assets/mountHolder.png) +![Монтаж отсека АКБ](assets/mountHolder.png) 2. Прикрепить верхнюю дополнительную раму на стойки винтами М3х8. -![Монтаж отсека АКБ](../assets/isoViewmountHolder.png) +![Монтаж отсека АКБ](assets/isoViewmountHolder.png) 3. Установить АКБ в отсек. @@ -415,12 +415,12 @@ 1. Крепим антенны на 2х сторонний скотч или изоленту, а усики продеваем в передние отверстия верхней дополнительной рамы. -![Монтаж отсека АКБ](../assets/mountAntenna.png) +![Монтаж отсека АКБ](assets/mountAntenna.png) Коптер готов к настройке! -## БЕЗОПАСНОСТЬ ПРИ СБОРКЕ И НАСТРОЙКЕ +## Безопасность при сборке и настройке 1. Снять пропеллеры.“Все наземные операции производить со снятыми пропеллерами. Устанавливать пропеллеры на моторы только перед полётом.” @@ -430,17 +430,15 @@ 3. Позвать на помощь “Если при выполнении работ возникли какие-либо проблемы, необходимо обратиться к преподавателю или учителю, а не пытаться решить проблему самостоятельно.” -![Безопасность при сборке](../assets/safetybyassem.png) +![Безопасность при сборке](assets/safetybyassem.png) ## Безопасность при работе с Li-ion аккумуляторами 18650 -1. Обращаться с аккумуляторами бережно. Не допускать падений, ударов деформаций. +1. Обращаться с аккумуляторами бережно. Не допускать падений, ударов деформаций. 2. При подключении (отключении) аккумуляторов держаться только за разъёмы, тянуть или дергать за провода запрещается. 3. В случае обрыва разъемов, обнаружения нарушений целостности изоляции или корпуса аккумулятора, не трогая его, немедленно сообщить преподавателю. -## ![БЕЗОПАСНОСТЬ ПРИ ЛЁТНОЙ ЭКСПЛУАТАЦИИ КОПТЕРОВ](../docs/safetyDoc.md#ПОЛЁТЫ) - - +## ![БЕЗОПАСНОСТЬ ПРИ ЛЁТНОЙ ЭКСПЛУАТАЦИИ КОПТЕРОВ](safetyDoc.md#ПОЛЁТЫ) diff --git a/assets/11_1.png b/docs/assets/11_1.png similarity index 100% rename from assets/11_1.png rename to docs/assets/11_1.png diff --git a/assets/11_2.png b/docs/assets/11_2.png similarity index 100% rename from assets/11_2.png rename to docs/assets/11_2.png diff --git a/assets/11_3.png b/docs/assets/11_3.png similarity index 100% rename from assets/11_3.png rename to docs/assets/11_3.png diff --git a/assets/11_4.png b/docs/assets/11_4.png similarity index 100% rename from assets/11_4.png rename to docs/assets/11_4.png diff --git a/assets/11_5.png b/docs/assets/11_5.png similarity index 100% rename from assets/11_5.png rename to docs/assets/11_5.png diff --git a/assets/13_1.png b/docs/assets/13_1.png similarity index 100% rename from assets/13_1.png rename to docs/assets/13_1.png diff --git a/assets/13_10.png b/docs/assets/13_10.png similarity index 100% rename from assets/13_10.png rename to docs/assets/13_10.png diff --git a/assets/13_11.png b/docs/assets/13_11.png similarity index 100% rename from assets/13_11.png rename to docs/assets/13_11.png diff --git a/assets/13_2.png b/docs/assets/13_2.png similarity index 100% rename from assets/13_2.png rename to docs/assets/13_2.png diff --git a/assets/13_3.jpg b/docs/assets/13_3.jpg similarity index 100% rename from assets/13_3.jpg rename to docs/assets/13_3.jpg diff --git a/assets/13_4.png b/docs/assets/13_4.png similarity index 100% rename from assets/13_4.png rename to docs/assets/13_4.png diff --git a/assets/13_5.png b/docs/assets/13_5.png similarity index 100% rename from assets/13_5.png rename to docs/assets/13_5.png diff --git a/assets/13_6.png b/docs/assets/13_6.png similarity index 100% rename from assets/13_6.png rename to docs/assets/13_6.png diff --git a/assets/13_7.png b/docs/assets/13_7.png similarity index 100% rename from assets/13_7.png rename to docs/assets/13_7.png diff --git a/assets/13_8.png b/docs/assets/13_8.png similarity index 100% rename from assets/13_8.png rename to docs/assets/13_8.png diff --git a/assets/13_9.png b/docs/assets/13_9.png similarity index 100% rename from assets/13_9.png rename to docs/assets/13_9.png diff --git a/assets/15_1.png b/docs/assets/15_1.png similarity index 100% rename from assets/15_1.png rename to docs/assets/15_1.png diff --git a/assets/15_2.png b/docs/assets/15_2.png similarity index 100% rename from assets/15_2.png rename to docs/assets/15_2.png diff --git a/assets/15_3.png b/docs/assets/15_3.png similarity index 100% rename from assets/15_3.png rename to docs/assets/15_3.png diff --git a/assets/15_4.png b/docs/assets/15_4.png similarity index 100% rename from assets/15_4.png rename to docs/assets/15_4.png diff --git a/assets/15_5.png b/docs/assets/15_5.png similarity index 100% rename from assets/15_5.png rename to docs/assets/15_5.png diff --git a/assets/15_6.png b/docs/assets/15_6.png similarity index 100% rename from assets/15_6.png rename to docs/assets/15_6.png diff --git a/assets/15_7.png b/docs/assets/15_7.png similarity index 100% rename from assets/15_7.png rename to docs/assets/15_7.png diff --git a/assets/16_1.png b/docs/assets/16_1.png similarity index 100% rename from assets/16_1.png rename to docs/assets/16_1.png diff --git a/assets/16_2.png b/docs/assets/16_2.png similarity index 100% rename from assets/16_2.png rename to docs/assets/16_2.png diff --git a/assets/16_3.png b/docs/assets/16_3.png similarity index 100% rename from assets/16_3.png rename to docs/assets/16_3.png diff --git a/assets/16_4.png b/docs/assets/16_4.png similarity index 100% rename from assets/16_4.png rename to docs/assets/16_4.png diff --git a/assets/1_1.png b/docs/assets/1_1.png similarity index 100% rename from assets/1_1.png rename to docs/assets/1_1.png diff --git a/assets/1_10.png b/docs/assets/1_10.png similarity index 100% rename from assets/1_10.png rename to docs/assets/1_10.png diff --git a/assets/1_11.png b/docs/assets/1_11.png similarity index 100% rename from assets/1_11.png rename to docs/assets/1_11.png diff --git a/assets/1_12.png b/docs/assets/1_12.png similarity index 100% rename from assets/1_12.png rename to docs/assets/1_12.png diff --git a/assets/1_13.png b/docs/assets/1_13.png similarity index 100% rename from assets/1_13.png rename to docs/assets/1_13.png diff --git a/assets/1_2.png b/docs/assets/1_2.png similarity index 100% rename from assets/1_2.png rename to docs/assets/1_2.png diff --git a/assets/1_3.png b/docs/assets/1_3.png similarity index 100% rename from assets/1_3.png rename to docs/assets/1_3.png diff --git a/assets/1_4.png b/docs/assets/1_4.png similarity index 100% rename from assets/1_4.png rename to docs/assets/1_4.png diff --git a/assets/1_5.png b/docs/assets/1_5.png similarity index 100% rename from assets/1_5.png rename to docs/assets/1_5.png diff --git a/assets/1_6.png b/docs/assets/1_6.png similarity index 100% rename from assets/1_6.png rename to docs/assets/1_6.png diff --git a/assets/1_7.png b/docs/assets/1_7.png similarity index 100% rename from assets/1_7.png rename to docs/assets/1_7.png diff --git a/assets/1_8.png b/docs/assets/1_8.png similarity index 100% rename from assets/1_8.png rename to docs/assets/1_8.png diff --git a/assets/1_9.png b/docs/assets/1_9.png similarity index 100% rename from assets/1_9.png rename to docs/assets/1_9.png diff --git a/assets/2_1.png b/docs/assets/2_1.png similarity index 100% rename from assets/2_1.png rename to docs/assets/2_1.png diff --git a/assets/2_2.png b/docs/assets/2_2.png similarity index 100% rename from assets/2_2.png rename to docs/assets/2_2.png diff --git a/assets/2_3.png b/docs/assets/2_3.png similarity index 100% rename from assets/2_3.png rename to docs/assets/2_3.png diff --git a/assets/2_4.png b/docs/assets/2_4.png similarity index 100% rename from assets/2_4.png rename to docs/assets/2_4.png diff --git a/assets/2_5.png b/docs/assets/2_5.png similarity index 100% rename from assets/2_5.png rename to docs/assets/2_5.png diff --git a/assets/2_6.png b/docs/assets/2_6.png similarity index 100% rename from assets/2_6.png rename to docs/assets/2_6.png diff --git a/assets/2_7.png b/docs/assets/2_7.png similarity index 100% rename from assets/2_7.png rename to docs/assets/2_7.png diff --git a/assets/2_8.png b/docs/assets/2_8.png similarity index 100% rename from assets/2_8.png rename to docs/assets/2_8.png diff --git a/assets/2_9.png b/docs/assets/2_9.png similarity index 100% rename from assets/2_9.png rename to docs/assets/2_9.png diff --git a/assets/4_1.png b/docs/assets/4_1.png similarity index 100% rename from assets/4_1.png rename to docs/assets/4_1.png diff --git a/assets/4_2.png b/docs/assets/4_2.png similarity index 100% rename from assets/4_2.png rename to docs/assets/4_2.png diff --git a/assets/4_3.png b/docs/assets/4_3.png similarity index 100% rename from assets/4_3.png rename to docs/assets/4_3.png diff --git a/assets/4_4.png b/docs/assets/4_4.png similarity index 100% rename from assets/4_4.png rename to docs/assets/4_4.png diff --git a/assets/4_5.png b/docs/assets/4_5.png similarity index 100% rename from assets/4_5.png rename to docs/assets/4_5.png diff --git a/assets/4_6.png b/docs/assets/4_6.png similarity index 100% rename from assets/4_6.png rename to docs/assets/4_6.png diff --git a/assets/7_1.png b/docs/assets/7_1.png similarity index 100% rename from assets/7_1.png rename to docs/assets/7_1.png diff --git a/assets/7_2.png b/docs/assets/7_2.png similarity index 100% rename from assets/7_2.png rename to docs/assets/7_2.png diff --git a/assets/7_3.png b/docs/assets/7_3.png similarity index 100% rename from assets/7_3.png rename to docs/assets/7_3.png diff --git a/assets/7_4.png b/docs/assets/7_4.png similarity index 100% rename from assets/7_4.png rename to docs/assets/7_4.png diff --git a/assets/8_1.png b/docs/assets/8_1.png similarity index 100% rename from assets/8_1.png rename to docs/assets/8_1.png diff --git a/assets/8_2.png b/docs/assets/8_2.png similarity index 100% rename from assets/8_2.png rename to docs/assets/8_2.png diff --git a/assets/8_3.png b/docs/assets/8_3.png similarity index 100% rename from assets/8_3.png rename to docs/assets/8_3.png diff --git a/assets/8_4.png b/docs/assets/8_4.png similarity index 100% rename from assets/8_4.png rename to docs/assets/8_4.png diff --git a/assets/8_5.png b/docs/assets/8_5.png similarity index 100% rename from assets/8_5.png rename to docs/assets/8_5.png diff --git a/assets/8_6.png b/docs/assets/8_6.png similarity index 100% rename from assets/8_6.png rename to docs/assets/8_6.png diff --git a/assets/9_1.png b/docs/assets/9_1.png similarity index 100% rename from assets/9_1.png rename to docs/assets/9_1.png diff --git a/assets/9_2.png b/docs/assets/9_2.png similarity index 100% rename from assets/9_2.png rename to docs/assets/9_2.png diff --git a/assets/BLHeliSuite 4way-if select.png b/docs/assets/BLHeliSuite 4way-if select.png similarity index 100% rename from assets/BLHeliSuite 4way-if select.png rename to docs/assets/BLHeliSuite 4way-if select.png diff --git a/assets/BLHeliSuite Arduino pinout for 4way-if.png b/docs/assets/BLHeliSuite Arduino pinout for 4way-if.png similarity index 100% rename from assets/BLHeliSuite Arduino pinout for 4way-if.png rename to docs/assets/BLHeliSuite Arduino pinout for 4way-if.png diff --git a/assets/BLHeliSuite ESC Setup Check.png b/docs/assets/BLHeliSuite ESC Setup Check.png similarity index 100% rename from assets/BLHeliSuite ESC Setup Check.png rename to docs/assets/BLHeliSuite ESC Setup Check.png diff --git a/assets/BLHeliSuite ESC Setup Write Setup.png b/docs/assets/BLHeliSuite ESC Setup Write Setup.png similarity index 100% rename from assets/BLHeliSuite ESC Setup Write Setup.png rename to docs/assets/BLHeliSuite ESC Setup Write Setup.png diff --git a/assets/BLHeliSuite ESC setup Connect.png b/docs/assets/BLHeliSuite ESC setup Connect.png similarity index 100% rename from assets/BLHeliSuite ESC setup Connect.png rename to docs/assets/BLHeliSuite ESC setup Connect.png diff --git a/assets/BLHeliSuite arduino select firmware.png b/docs/assets/BLHeliSuite arduino select firmware.png similarity index 100% rename from assets/BLHeliSuite arduino select firmware.png rename to docs/assets/BLHeliSuite arduino select firmware.png diff --git a/assets/BLHeliSuite interface options.png b/docs/assets/BLHeliSuite interface options.png similarity index 100% rename from assets/BLHeliSuite interface options.png rename to docs/assets/BLHeliSuite interface options.png diff --git a/assets/BLHeliSuiteMake interfaces_171206_2.png b/docs/assets/BLHeliSuiteMake interfaces_171206_2.png similarity index 100% rename from assets/BLHeliSuiteMake interfaces_171206_2.png rename to docs/assets/BLHeliSuiteMake interfaces_171206_2.png diff --git a/assets/BLHeliSuiteSiLabs ESC Setup_171206_1.png b/docs/assets/BLHeliSuiteSiLabs ESC Setup_171206_1.png similarity index 100% rename from assets/BLHeliSuiteSiLabs ESC Setup_171206_1.png rename to docs/assets/BLHeliSuiteSiLabs ESC Setup_171206_1.png diff --git a/assets/BLHeliSuiteSiLabs ESC Setup_171207_1.png b/docs/assets/BLHeliSuiteSiLabs ESC Setup_171207_1.png similarity index 100% rename from assets/BLHeliSuiteSiLabs ESC Setup_171207_1.png rename to docs/assets/BLHeliSuiteSiLabs ESC Setup_171207_1.png diff --git a/assets/Clever main.png b/docs/assets/Clever main.png similarity index 100% rename from assets/Clever main.png rename to docs/assets/Clever main.png diff --git a/assets/Clever2LPE_160118.params b/docs/assets/Clever2LPE_160118.params similarity index 100% rename from assets/Clever2LPE_160118.params rename to docs/assets/Clever2LPE_160118.params diff --git a/assets/Clever3_LPE_020218.params b/docs/assets/Clever3_LPE_020218.params similarity index 100% rename from assets/Clever3_LPE_020218.params rename to docs/assets/Clever3_LPE_020218.params diff --git a/assets/Clevermain.png b/docs/assets/Clevermain.png similarity index 100% rename from assets/Clevermain.png rename to docs/assets/Clevermain.png diff --git a/assets/IMG_4175.JPG b/docs/assets/IMG_4175.JPG similarity index 100% rename from assets/IMG_4175.JPG rename to docs/assets/IMG_4175.JPG diff --git a/assets/IMG_4397.PNG b/docs/assets/IMG_4397.PNG similarity index 100% rename from assets/IMG_4397.PNG rename to docs/assets/IMG_4397.PNG diff --git a/assets/Screenshot from 2018-02-27 22-30-50.png b/docs/assets/Screenshot from 2018-02-27 22-30-50.png similarity index 100% rename from assets/Screenshot from 2018-02-27 22-30-50.png rename to docs/assets/Screenshot from 2018-02-27 22-30-50.png diff --git a/assets/addEqipment.jpg b/docs/assets/addEqipment.jpg similarity index 100% rename from assets/addEqipment.jpg rename to docs/assets/addEqipment.jpg diff --git a/assets/airframeSetup.jpg b/docs/assets/airframeSetup.jpg similarity index 100% rename from assets/airframeSetup.jpg rename to docs/assets/airframeSetup.jpg diff --git a/assets/allElements.png b/docs/assets/allElements.png similarity index 100% rename from assets/allElements.png rename to docs/assets/allElements.png diff --git a/assets/aruco-frame.png b/docs/assets/aruco-frame.png similarity index 100% rename from assets/aruco-frame.png rename to docs/assets/aruco-frame.png diff --git a/assets/attentionSave.jpg b/docs/assets/attentionSave.jpg similarity index 100% rename from assets/attentionSave.jpg rename to docs/assets/attentionSave.jpg diff --git a/assets/bridge_tcp.png b/docs/assets/bridge_tcp.png similarity index 100% rename from assets/bridge_tcp.png rename to docs/assets/bridge_tcp.png diff --git a/assets/brrc2205.png b/docs/assets/brrc2205.png similarity index 100% rename from assets/brrc2205.png rename to docs/assets/brrc2205.png diff --git a/assets/brrc2205on.png b/docs/assets/brrc2205on.png similarity index 100% rename from assets/brrc2205on.png rename to docs/assets/brrc2205on.png diff --git a/assets/brrc2205ondeck.png b/docs/assets/brrc2205ondeck.png similarity index 100% rename from assets/brrc2205ondeck.png rename to docs/assets/brrc2205ondeck.png diff --git a/assets/calibrateESC.jpg b/docs/assets/calibrateESC.jpg similarity index 100% rename from assets/calibrateESC.jpg rename to docs/assets/calibrateESC.jpg diff --git a/assets/calibratePIDparams.jpg b/docs/assets/calibratePIDparams.jpg similarity index 100% rename from assets/calibratePIDparams.jpg rename to docs/assets/calibratePIDparams.jpg diff --git a/assets/calibrateView.jpg b/docs/assets/calibrateView.jpg similarity index 100% rename from assets/calibrateView.jpg rename to docs/assets/calibrateView.jpg diff --git a/assets/calibrateViewStart.jpg b/docs/assets/calibrateViewStart.jpg similarity index 100% rename from assets/calibrateViewStart.jpg rename to docs/assets/calibrateViewStart.jpg diff --git a/assets/calibrateaxcel.jpg b/docs/assets/calibrateaxcel.jpg similarity index 100% rename from assets/calibrateaxcel.jpg rename to docs/assets/calibrateaxcel.jpg diff --git a/assets/calibrateaxcelstart.jpg b/docs/assets/calibrateaxcelstart.jpg similarity index 100% rename from assets/calibrateaxcelstart.jpg rename to docs/assets/calibrateaxcelstart.jpg diff --git a/assets/calibratecompass.jpg b/docs/assets/calibratecompass.jpg similarity index 100% rename from assets/calibratecompass.jpg rename to docs/assets/calibratecompass.jpg diff --git a/assets/calibrategyro.jpg b/docs/assets/calibrategyro.jpg similarity index 100% rename from assets/calibrategyro.jpg rename to docs/assets/calibrategyro.jpg diff --git a/assets/casebattery.png b/docs/assets/casebattery.png similarity index 100% rename from assets/casebattery.png rename to docs/assets/casebattery.png diff --git a/assets/chessboard.png b/docs/assets/chessboard.png similarity index 100% rename from assets/chessboard.png rename to docs/assets/chessboard.png diff --git a/assets/chooseSwitch.jpg b/docs/assets/chooseSwitch.jpg similarity index 100% rename from assets/chooseSwitch.jpg rename to docs/assets/chooseSwitch.jpg diff --git a/assets/clever.jpg b/docs/assets/clever.jpg similarity index 100% rename from assets/clever.jpg rename to docs/assets/clever.jpg diff --git a/docs/assets/clever3.png b/docs/assets/clever3.png new file mode 100644 index 00000000..c1066035 Binary files /dev/null and b/docs/assets/clever3.png differ diff --git a/assets/connectBattery.png b/docs/assets/connectBattery.png similarity index 100% rename from assets/connectBattery.png rename to docs/assets/connectBattery.png diff --git a/assets/connectingRadio.png b/docs/assets/connectingRadio.png similarity index 100% rename from assets/connectingRadio.png rename to docs/assets/connectingRadio.png diff --git a/assets/connectionESCtoReceiver.png b/docs/assets/connectionESCtoReceiver.png similarity index 100% rename from assets/connectionESCtoReceiver.png rename to docs/assets/connectionESCtoReceiver.png diff --git a/assets/connectionLost.jpg b/docs/assets/connectionLost.jpg similarity index 100% rename from assets/connectionLost.jpg rename to docs/assets/connectionLost.jpg diff --git a/assets/connectionOK.jpg b/docs/assets/connectionOK.jpg similarity index 100% rename from assets/connectionOK.jpg rename to docs/assets/connectionOK.jpg diff --git a/assets/connectionPixhawk.png b/docs/assets/connectionPixhawk.png similarity index 100% rename from assets/connectionPixhawk.png rename to docs/assets/connectionPixhawk.png diff --git a/assets/consistofTransmitter.jpg b/docs/assets/consistofTransmitter.jpg similarity index 100% rename from assets/consistofTransmitter.jpg rename to docs/assets/consistofTransmitter.jpg diff --git a/assets/cutwire14AWG.jpg b/docs/assets/cutwire14AWG.jpg similarity index 100% rename from assets/cutwire14AWG.jpg rename to docs/assets/cutwire14AWG.jpg diff --git a/assets/escDYSzap.png b/docs/assets/escDYSzap.png similarity index 100% rename from assets/escDYSzap.png rename to docs/assets/escDYSzap.png diff --git a/assets/escWires.png b/docs/assets/escWires.png similarity index 100% rename from assets/escWires.png rename to docs/assets/escWires.png diff --git a/assets/explosion.png b/docs/assets/explosion.png similarity index 100% rename from assets/explosion.png rename to docs/assets/explosion.png diff --git a/assets/firmwarePX4.jpg b/docs/assets/firmwarePX4.jpg similarity index 100% rename from assets/firmwarePX4.jpg rename to docs/assets/firmwarePX4.jpg diff --git a/assets/flightModes.jpg b/docs/assets/flightModes.jpg similarity index 100% rename from assets/flightModes.jpg rename to docs/assets/flightModes.jpg diff --git a/assets/frames.png b/docs/assets/frames.png similarity index 100% rename from assets/frames.png rename to docs/assets/frames.png diff --git a/assets/helphand.jpg b/docs/assets/helphand.jpg similarity index 100% rename from assets/helphand.jpg rename to docs/assets/helphand.jpg diff --git a/assets/holderLegs.png b/docs/assets/holderLegs.png similarity index 100% rename from assets/holderLegs.png rename to docs/assets/holderLegs.png diff --git a/assets/isoViewmountHolder.png b/docs/assets/isoViewmountHolder.png similarity index 100% rename from assets/isoViewmountHolder.png rename to docs/assets/isoViewmountHolder.png diff --git a/assets/jumper.png b/docs/assets/jumper.png similarity index 100% rename from assets/jumper.png rename to docs/assets/jumper.png diff --git a/assets/keep.png b/docs/assets/keep.png similarity index 100% rename from assets/keep.png rename to docs/assets/keep.png diff --git a/assets/lockradio.jpg b/docs/assets/lockradio.jpg similarity index 100% rename from assets/lockradio.jpg rename to docs/assets/lockradio.jpg diff --git a/assets/lockradio.png b/docs/assets/lockradio.png similarity index 100% rename from assets/lockradio.png rename to docs/assets/lockradio.png diff --git a/assets/lowsafeDeck.png b/docs/assets/lowsafeDeck.png similarity index 100% rename from assets/lowsafeDeck.png rename to docs/assets/lowsafeDeck.png diff --git a/assets/mainWindow.jpg b/docs/assets/mainWindow.jpg similarity index 100% rename from assets/mainWindow.jpg rename to docs/assets/mainWindow.jpg diff --git a/assets/markers.jpg b/docs/assets/markers.jpg similarity index 100% rename from assets/markers.jpg rename to docs/assets/markers.jpg diff --git a/assets/motorsTopview.png b/docs/assets/motorsTopview.png similarity index 100% rename from assets/motorsTopview.png rename to docs/assets/motorsTopview.png diff --git a/assets/mount5vconnector.png b/docs/assets/mount5vconnector.png similarity index 100% rename from assets/mount5vconnector.png rename to docs/assets/mount5vconnector.png diff --git a/assets/mountAntenna.png b/docs/assets/mountAntenna.png similarity index 100% rename from assets/mountAntenna.png rename to docs/assets/mountAntenna.png diff --git a/assets/mountBeams.png b/docs/assets/mountBeams.png similarity index 100% rename from assets/mountBeams.png rename to docs/assets/mountBeams.png diff --git a/assets/mountBottomDeck.png b/docs/assets/mountBottomDeck.png similarity index 100% rename from assets/mountBottomDeck.png rename to docs/assets/mountBottomDeck.png diff --git a/assets/mountHolder.png b/docs/assets/mountHolder.png similarity index 100% rename from assets/mountHolder.png rename to docs/assets/mountHolder.png diff --git a/assets/mountPDB.png b/docs/assets/mountPDB.png similarity index 100% rename from assets/mountPDB.png rename to docs/assets/mountPDB.png diff --git a/assets/mountReceiverDeck.png b/docs/assets/mountReceiverDeck.png similarity index 100% rename from assets/mountReceiverDeck.png rename to docs/assets/mountReceiverDeck.png diff --git a/assets/mountReceiverStud.png b/docs/assets/mountReceiverStud.png similarity index 100% rename from assets/mountReceiverStud.png rename to docs/assets/mountReceiverStud.png diff --git a/assets/mountxt60pinsocket.png b/docs/assets/mountxt60pinsocket.png similarity index 100% rename from assets/mountxt60pinsocket.png rename to docs/assets/mountxt60pinsocket.png diff --git a/assets/notmoveslider.jpg b/docs/assets/notmoveslider.jpg similarity index 100% rename from assets/notmoveslider.jpg rename to docs/assets/notmoveslider.jpg diff --git a/assets/pixhawk.png b/docs/assets/pixhawk.png similarity index 100% rename from assets/pixhawk.png rename to docs/assets/pixhawk.png diff --git a/assets/qground.png b/docs/assets/qground.png similarity index 100% rename from assets/qground.png rename to docs/assets/qground.png diff --git a/assets/radioTransmitter.png b/docs/assets/radioTransmitter.png similarity index 100% rename from assets/radioTransmitter.png rename to docs/assets/radioTransmitter.png diff --git a/assets/readyBatteryholder.png b/docs/assets/readyBatteryholder.png similarity index 100% rename from assets/readyBatteryholder.png rename to docs/assets/readyBatteryholder.png diff --git a/assets/receiver5V.png b/docs/assets/receiver5V.png similarity index 100% rename from assets/receiver5V.png rename to docs/assets/receiver5V.png diff --git a/assets/receiverPPM.png b/docs/assets/receiverPPM.png similarity index 100% rename from assets/receiverPPM.png rename to docs/assets/receiverPPM.png diff --git a/assets/resolderingESC.png b/docs/assets/resolderingESC.png similarity index 100% rename from assets/resolderingESC.png rename to docs/assets/resolderingESC.png diff --git a/assets/rosserial.png b/docs/assets/rosserial.png similarity index 100% rename from assets/rosserial.png rename to docs/assets/rosserial.png diff --git a/assets/safeLegs.png b/docs/assets/safeLegs.png similarity index 100% rename from assets/safeLegs.png rename to docs/assets/safeLegs.png diff --git a/assets/safehighRadial.png b/docs/assets/safehighRadial.png similarity index 100% rename from assets/safehighRadial.png rename to docs/assets/safehighRadial.png diff --git a/assets/safelowRadial.png b/docs/assets/safelowRadial.png similarity index 100% rename from assets/safelowRadial.png rename to docs/assets/safelowRadial.png diff --git a/assets/safetyINflight.png b/docs/assets/safetyINflight.png similarity index 100% rename from assets/safetyINflight.png rename to docs/assets/safetyINflight.png diff --git a/assets/safetyPower.png b/docs/assets/safetyPower.png similarity index 100% rename from assets/safetyPower.png rename to docs/assets/safetyPower.png diff --git a/assets/safetyPreflight.png b/docs/assets/safetyPreflight.png similarity index 100% rename from assets/safetyPreflight.png rename to docs/assets/safetyPreflight.png diff --git a/assets/safetybyassem.png b/docs/assets/safetybyassem.png similarity index 100% rename from assets/safetybyassem.png rename to docs/assets/safetybyassem.png diff --git a/assets/soldering5VTOpdb.png b/docs/assets/soldering5VTOpdb.png similarity index 100% rename from assets/soldering5VTOpdb.png rename to docs/assets/soldering5VTOpdb.png diff --git a/assets/solderingBrrc2205ondeckTOescDYSzap.png b/docs/assets/solderingBrrc2205ondeckTOescDYSzap.png similarity index 100% rename from assets/solderingBrrc2205ondeckTOescDYSzap.png rename to docs/assets/solderingBrrc2205ondeckTOescDYSzap.png diff --git a/assets/solderingPowerwires.png b/docs/assets/solderingPowerwires.png similarity index 100% rename from assets/solderingPowerwires.png rename to docs/assets/solderingPowerwires.png diff --git a/assets/solderingxt60socketTOpdb.png b/docs/assets/solderingxt60socketTOpdb.png similarity index 100% rename from assets/solderingxt60socketTOpdb.png rename to docs/assets/solderingxt60socketTOpdb.png diff --git a/assets/stand.jpg b/docs/assets/stand.jpg similarity index 100% rename from assets/stand.jpg rename to docs/assets/stand.jpg diff --git a/assets/startPDBtest.jpg b/docs/assets/startPDBtest.jpg similarity index 100% rename from assets/startPDBtest.jpg rename to docs/assets/startPDBtest.jpg diff --git a/assets/testMotors.png b/docs/assets/testMotors.png similarity index 100% rename from assets/testMotors.png rename to docs/assets/testMotors.png diff --git a/assets/timing_with_thumbs.png b/docs/assets/timing_with_thumbs.png similarity index 100% rename from assets/timing_with_thumbs.png rename to docs/assets/timing_with_thumbs.png diff --git a/assets/topESCcaseview.png b/docs/assets/topESCcaseview.png similarity index 100% rename from assets/topESCcaseview.png rename to docs/assets/topESCcaseview.png diff --git a/assets/topPreview.png b/docs/assets/topPreview.png similarity index 100% rename from assets/topPreview.png rename to docs/assets/topPreview.png diff --git a/assets/topviewmountPDB.png b/docs/assets/topviewmountPDB.png similarity index 100% rename from assets/topviewmountPDB.png rename to docs/assets/topviewmountPDB.png diff --git a/assets/topviewpixhawk.png b/docs/assets/topviewpixhawk.png similarity index 100% rename from assets/topviewpixhawk.png rename to docs/assets/topviewpixhawk.png diff --git a/assets/turnoffSafetyswitch.jpg b/docs/assets/turnoffSafetyswitch.jpg similarity index 100% rename from assets/turnoffSafetyswitch.jpg rename to docs/assets/turnoffSafetyswitch.jpg diff --git a/assets/webrc.png b/docs/assets/webrc.png similarity index 100% rename from assets/webrc.png rename to docs/assets/webrc.png diff --git a/assets/webrc_arm_disarm.gif b/docs/assets/webrc_arm_disarm.gif similarity index 100% rename from assets/webrc_arm_disarm.gif rename to docs/assets/webrc_arm_disarm.gif diff --git a/assets/webrc_header.gif b/docs/assets/webrc_header.gif similarity index 100% rename from assets/webrc_header.gif rename to docs/assets/webrc_header.gif diff --git a/assets/webrc_no_connection.png b/docs/assets/webrc_no_connection.png similarity index 100% rename from assets/webrc_no_connection.png rename to docs/assets/webrc_no_connection.png diff --git a/assets/webrc_notifications.png b/docs/assets/webrc_notifications.png similarity index 100% rename from assets/webrc_notifications.png rename to docs/assets/webrc_notifications.png diff --git a/assets/webrc_offboarding.gif b/docs/assets/webrc_offboarding.gif similarity index 100% rename from assets/webrc_offboarding.gif rename to docs/assets/webrc_offboarding.gif diff --git a/assets/xt60pinsocket.jpg b/docs/assets/xt60pinsocket.jpg similarity index 100% rename from assets/xt60pinsocket.jpg rename to docs/assets/xt60pinsocket.jpg diff --git a/assets/zap.jpg b/docs/assets/zap.jpg similarity index 100% rename from assets/zap.jpg rename to docs/assets/zap.jpg diff --git a/assets/zapPDBtest.jpg b/docs/assets/zapPDBtest.jpg similarity index 100% rename from assets/zapPDBtest.jpg rename to docs/assets/zapPDBtest.jpg diff --git a/assets/Снимок экрана 2017-11-16 в 18.44.41.png b/docs/assets/Снимок экрана 2017-11-16 в 18.44.41.png similarity index 100% rename from assets/Снимок экрана 2017-11-16 в 18.44.41.png rename to docs/assets/Снимок экрана 2017-11-16 в 18.44.41.png diff --git a/assets/Снимок экрана 2017-11-27 в 23.20.49.png b/docs/assets/Снимок экрана 2017-11-27 в 23.20.49.png similarity index 100% rename from assets/Снимок экрана 2017-11-27 в 23.20.49.png rename to docs/assets/Снимок экрана 2017-11-27 в 23.20.49.png diff --git a/assets/Снимок экрана 2017-11-28 в 23.50.36.png b/docs/assets/Снимок экрана 2017-11-28 в 23.50.36.png similarity index 100% rename from assets/Снимок экрана 2017-11-28 в 23.50.36.png rename to docs/assets/Снимок экрана 2017-11-28 в 23.50.36.png diff --git a/docs/bundle.md b/docs/bundle.md index 7ec86a07..17194693 100644 --- a/docs/bundle.md +++ b/docs/bundle.md @@ -3,15 +3,15 @@ Пакет программ clever_bundle, устанавливающийся на Raspberry Pi, позволяет: -* [Настраивать и управлять коптером используя QGroundControl с соединением по Wi-Fi](/docs/gcs_bridge.md) -* [Использовать веб-пульт управления квадрокоптером](/docs/web_rc.md) -* [Получать доступ к Raspberry Pi при помощи SSH](/docs/ssh.md) +* [Настраивать и управлять коптером используя QGroundControl с соединением по Wi-Fi](gcs_bridge.md) +* [Использовать веб-пульт управления квадрокоптером](web_rc.md) +* [Получать доступ к Raspberry Pi при помощи SSH](ssh.md) * Анализировать полеты квадрокоптера с помощью RViz и RosBag -* [Работать с камерой для CV](/docs/camera.md) +* [Работать с камерой для CV](camera.md) * Работать с камерой для FPV -* [Управлять полетом коптера программно, используя модуль offboard](/docs/offboard.md) -* [Осуществлять навигацию в поле ArUco-маркеров](/docs/aruco.md) -* [Использовать внешний 3G-модем для осуществление связи коптера с Интернетом](/docs/3g.md) +* [Управлять полетом коптера программно, используя модуль offboard](offboard.md) +* [Осуществлять навигацию в поле ArUco-маркеров](aruco.md) +* [Использовать внешний 3G-модем для осуществление связи коптера с Интернетом](3g.md) * Разрабатывать произвольные модули и системы Установка clever_bundle @@ -25,7 +25,7 @@ Образ SD-карты включает в себя: * ОС [Raspbian Jessie](https://www.raspberrypi.org/downloads/raspbian/) -* Фреймворк [ROS](/docs/ros.md) -* Пакет [MAVROS](/docs/mavros.md) для связи с PixHawk по MAVLINK +* Фреймворк [ROS](ros.md) +* Пакет [MAVROS](mavros.md) для связи с PixHawk по MAVLINK * Дополнительные пакеты ROS: web_video_server, usb_cam, rosbridge_suite и другие * Пакет программ clever_bundle diff --git a/docs/camera.md b/docs/camera.md index adf4d713..7562b719 100644 --- a/docs/camera.md +++ b/docs/camera.md @@ -6,7 +6,7 @@ ``` -Также нужно убедиться, что для камеры [указано корректное расположение и ориентация](/docs/camera_frame.md). +Также нужно убедиться, что для камеры [указано корректное расположение и ориентация](camera_frame.md). При изменении launch-файла необходимо перезапустить пакет `clever`: @@ -14,11 +14,11 @@ sudo systemctl restart clever ``` -Для мониторинга изображения с камеры можно использовать rqt или [web_video_server](/docs/web_video_server.md). +Для мониторинга изображения с камеры можно использовать rqt или [web_video_server](web_video_server.md). ## Компьютерное зрение -Для реализации алгоритмов компьютерного зрения рекомендуется использовать предустановленную на [образ SD-карты](/docs/microsd_images.md) библиотеку [OpenCV](https://opencv.org). +Для реализации алгоритмов компьютерного зрения рекомендуется использовать предустановленную на [образ SD-карты](microsd_images.md) библиотеку [OpenCV](https://opencv.org). ### Python @@ -56,4 +56,4 @@ image_pub = rospy.Publisher('~debug', Image) image_pub.publish(bridge.cv2_to_imgmsg(cv_image, 'bgr8')) ``` -Получаемые изображения можно просматривать используя [web_video_server](/docs/web_video_server.md). +Получаемые изображения можно просматривать используя [web_video_server](web_video_server.md). diff --git a/docs/camera_frame.md b/docs/camera_frame.md index 7fd899fd..dd15e708 100644 --- a/docs/camera_frame.md +++ b/docs/camera_frame.md @@ -6,7 +6,7 @@ ``` -Эта строка задает статическую трансформацию между фреймом `fcu` ([соответствует корпусу полетного контроллера](/docs/frames.md)) и камерой (`main_camera_optical`) в формате: +Эта строка задает статическую трансформацию между фреймом `fcu` ([соответствует корпусу полетного контроллера](frames.md)) и камерой (`main_camera_optical`) в формате: ``` сдвиг_x сдвиг_y сдвиг_z угол_рысканье угол_тангаж угол_крен @@ -17,7 +17,7 @@ * y указывает вниз на изображении; * z указывает от плоскости матрицы камеры. -Сдвиги задаются в метрах, углы задаются в радианах. Корректность установленной трансформации может быть проверена с использованием [rviz](/docs/rviz.md). +Сдвиги задаются в метрах, углы задаются в радианах. Корректность установленной трансформации может быть проверена с использованием [rviz](rviz.md). ## Настройки для Клевера diff --git a/docs/connection.md b/docs/connection.md index a25bb99d..41e22c9c 100644 --- a/docs/connection.md +++ b/docs/connection.md @@ -1,7 +1,7 @@ Подключение PixHawk/PixRacer к Raspberry Pi === -Для программирования [автономных полетов](/docs/simple_offboard.md), [работы с PixHawk по Wi-Fi](/docs/gcs_bridge.md), использования [веб-пульта](/docs/web_rc.md) и других функций необходимо подсоединить Raspberry Pi к PixHawk. +Для программирования [автономных полетов](simple_offboard.md), [работы с PixHawk по Wi-Fi](gcs_bridge.md), использования [веб-пульта](web_rc.md) и других функций необходимо подсоединить Raspberry Pi к PixHawk. Убедиться в работоспособности подключения, выполнив на Raspberry Pi: @@ -53,7 +53,7 @@ sudo systemctl restart clever Подключение к SITL --- -Для того, чтобы подсоединиться к локально/удаленно запущенному [SITL](/docs/sitl.md), необходимо установить аргумент `fcu_conn` в `udp`, и `fcu_ip` в IP-адрес машины, где запущен SITL (`127.0.0.1` для локального): +Для того, чтобы подсоединиться к локально/удаленно запущенному [SITL](sitl.md), необходимо установить аргумент `fcu_conn` в `udp`, и `fcu_ip` в IP-адрес машины, где запущен SITL (`127.0.0.1` для локального): ```xml diff --git a/docs/deck.md b/docs/deck.md index 5f5a62d6..615f17e4 100644 --- a/docs/deck.md +++ b/docs/deck.md @@ -2,4 +2,4 @@ Они абсолютно одинаковые. Поэтому для дальнейшего удобства понимания инструкции условно разделим их на верхнюю и нижнюю дополнительные рамы -![Общая раскладка](../assets/allElements.png) +![Общая раскладка](assets/allElements.png) diff --git a/docs/esc_firmware.md b/docs/esc_firmware.md index a4126259..d3964747 100644 --- a/docs/esc_firmware.md +++ b/docs/esc_firmware.md @@ -19,19 +19,19 @@ Создание программатора на примере Arduino Mega. 1. Запустить программу BLHeliSuite и выбрать вкладку Make interfaces. - ![](/assets/BLHeliSuiteSiLabs ESC Setup_171207_1.png) + ![](assets/BLHeliSuiteSiLabs ESC Setup_171207_1.png) 2. Нажать Arduino 4way-interface в разделе Make Arduino Interface Boards и выбрать файл прошивки - ![](/assets/BLHeliSuiteMake interfaces_171206_2.png)![](/assets/BLHeliSuite interface options.png)![](/assets/BLHeliSuite arduino select firmware.png) + ![](assets/BLHeliSuiteMake interfaces_171206_2.png)![](assets/BLHeliSuite interface options.png)![](assets/BLHeliSuite arduino select firmware.png) 3. После прошивки Arduino вернуться на вкладку Silabs ESC Setup и подключиться к Arduino, предварительно выбрав интерфейс программатора 4way-if и COM порт Arduino. - ![](/assets/BLHeliSuite 4way-if select.png)![](/assets/BLHeliSuite ESC setup Connect.png) + ![](assets/BLHeliSuite 4way-if select.png)![](assets/BLHeliSuite ESC setup Connect.png) #### Подключение ESC регуляторов к Arduino. Для прошивки или изменения настроек регуляторов необходимо подключить сигнальные порты ESC регуляторов к портам Arduino, предварительно посмотрев в мануале, какие порты используются для прошивки. Так же нужно не забыть соединить GND Arduino с землёй одного из регуляторов. Регуляторы должны быть подключены к питанию, в случае если к регуляторам подключены моторы, **на них не должно быть винтов**. -![](/assets/BLHeliSuite Arduino pinout for 4way-if.png) +![](assets/BLHeliSuite Arduino pinout for 4way-if.png) В случае с Arduino Mega, регуляторы подключаются к портам D43-D49 и D51. @@ -39,7 +39,7 @@ Для загрузки информации о версии прошивки и настроек регуляторов нужно нажать на кнопку Check. -![](/assets/BLHeliSuite ESC Setup Check.png)![](/assets/BLHeliSuiteSiLabs ESC Setup_171206_1.png) +![](assets/BLHeliSuite ESC Setup Check.png)![](assets/BLHeliSuiteSiLabs ESC Setup_171206_1.png) Основные параметры, которые нас интересуют, это: @@ -51,7 +51,7 @@ Самый левый мотор в списке моторов \(Multiple ESC\) считается главным \(мастер\). Нажимая на номера моторов, можно включать/выключать возможность записи в них настроек. После изменения необходимых параметров можно записать в нужные моторы настройки, нажав на кнопку Write Setup. -![](/assets/BLHeliSuite ESC Setup Write Setup.png) +![](assets/BLHeliSuite ESC Setup Write Setup.png) Для отображения настроек со всех регуляторов одновременно можно воспользоваться вкладкой ESC Overview. diff --git a/docs/frames.md b/docs/frames.md index b71d5d3d..04e3fa7a 100644 --- a/docs/frames.md +++ b/docs/frames.md @@ -1,14 +1,14 @@ Системы координат (фреймы) === -![](/assets/frames.png) +![](assets/frames.png) Основные фреймы в пакете `clever`: * `local_origin` — координаты относительно точки инициализации полетного контроллера: белая сетка на иллюстрации; * `fcu` — координаты относительно квадрокоптера: схематичное изображение квадрокоптера на иллюстрации; -* `fcu_horiz` — координаты относительно квадрокоптера без учета наклонов по тангажу и рысканью: красная, синия и зеленая линии на иллюстрации. +* `fcu_horiz` — координаты относительно квадрокоптера без учета наклонов по тангажу и крену: красная, синия и зеленая линии на иллюстрации. > **Hint** В соответствии с [соглашением](http://www.ros.org/reps/rep-0103.html), для фреймов, связанных с коптером, ось X направлена вперед, Y – налево и Z – вверх. -Более наглядно 3D визуализацию систем координат можно наблдюдать, используя [rviz](/docs/rviz.md). +Более наглядно 3D визуализацию систем координат можно наблдюдать, используя [rviz](rviz.md). diff --git a/docs/gcs_bridge.md b/docs/gcs_bridge.md index 16d886cc..bde57cf2 100644 --- a/docs/gcs_bridge.md +++ b/docs/gcs_bridge.md @@ -20,11 +20,30 @@ sudo systemctl restart clever Затем в программе QGroundControl нужно выбрать Application Settings -> Comm Links -> Add. Создать подключение со следующими настройками: -![](/assets/bridge_tcp.png) +![](assets/bridge_tcp.png) Затем необходимо выбрать в списке подключений "Clever" и нажать "Connect". После этого можно будет настраивать, калибровать и просматривать состояние квадкоптера без проводов: -![](/assets/qground.png) +![](assets/qground.png) + +UDP broadcast-бридж +--- + +Для использования UDP broadcast-бриджа необходимо установить параметр `gcs_bridge` в значение `udp-b`: + +```xml + +``` + +При изменени launch-файла необходимо перезагрузить сервис `clever`: + +```bash +sudo systemctl restart clever +``` + +При использовании UDB broadcast-бриджа достаточно подключиться к Wi-Fi сети Клевера. QGroundControl должен подключиться к коптеру автоматически. + +> **Note** UDP broadcast-бридж работает быстрее, чем TCP-бридж, но связь в нем менее стабильная: иногда могут возникать проблемы при загрузке миссии на коптер, а также при калибровке сенсоров. UDP-бридж --- diff --git a/docs/gps.md b/docs/gps.md index 96ad7dfa..a21cb986 100644 --- a/docs/gps.md +++ b/docs/gps.md @@ -4,6 +4,6 @@ При подключении GPS появляются следующие возможности: * Удерживание коптером позиции при полете на улице * Программирование автономных миссий в программе QGroundControl -* Полеты на глобальные точки в автономном режиме при помощи модуля [simple offboard](/docs/simple_offboard.md). +* Полеты на глобальные точки в автономном режиме при помощи модуля [simple offboard](simple_offboard.md). TODO diff --git a/docs/les1.md b/docs/les1.md index 45e8fb18..927dc7d9 100644 --- a/docs/les1.md +++ b/docs/les1.md @@ -8,19 +8,19 @@ В 1899 году на выставке в Мэдисон-Сквер-Гарден инженер и изобретатель Никола Тесла продемонстрировал миниатюрное радиоуправляемое судно. Несмотря на то, что общественность в первую очередь заинтересовало военное применение его изобретения, сам Тесла указывал на потенциально гораздо более широкое применение дистанционного управления (названного изобретателем «телеавтоматикой»), например, в человекоподобных автоматонах. -![Tesla](../assets/1_1.png) +![Tesla](assets/1_1.png) ### «Жук» Кеттеринга Экспериментальная беспилотная «воздушная торпеда», один из первых проектов предшественников современных крылатых ракет. Разработана изобретателем Чарльзом Кеттерингом по заказу Армии США в 1917 году. Предназначалась для обстрела с дистанции до 120 км городов, крупных промышленных центров и мест сосредоточения войск противника. Отличался простотой конструкции и очень низкой ценой. Хотя аппарат сравнительно успешно прошёл испытания, Первая мировая война закончилась и снаряд так и остался опытным. -![Bug](../assets/1_2.png) +![Bug](assets/1_2.png) ### Вертолёт Ботезата Многовинтовые вертолёты разрабатывались ещё в первые годы вертолётостроения. Один из первых квадрокоптеров (англ. quadcopter, четырёхроторный вертолет), который реально оторвался от земли и мог держаться в воздухе, был создан Георгием Ботезатом и испытан в 1922 году. Недостатком этих аппаратов была сложная трансмиссия, передававшая вращение одного мотора на несколько винтов. Изобретение хвостового винта и автомата перекоса положило конец этим попыткам. Новые разработки начались в 1950-е годы, но дальше прототипов дело не продвинулось. -![Helicopter](../assets/1_3.png) +![Helicopter](assets/1_3.png) Применение коптеров ------------------- @@ -56,14 +56,14 @@ один из лучей направлен вперед, у «х»-платформ основное направление находится между двумя соседними лучами. -![Types](../assets/1_4.png) +![Types](assets/1_4.png) Управление ---------- Управление коптером осуществляется при помощи пульта управления, который передает команды радиоприемнику. Пульт питается от батареек, а радиоприемник получает питание от Полетного контроллера. Связь зачастую односторонняя, только от пульта к приемнику. Приемник подключается к полетному контроллеру минимум пятью проводами, по которым передаются сигналы поворота вокруг трех осей, команда «газа» и полетный режим. -![Control](../assets/1_5.png) +![Control](assets/1_5.png) **Throttle** — переводится как «дроссель», «тяга» или «газ» в обиходе. Газ мультикоптера — среднее арифметическое между скоростями вращения всех моторов. Чем больше газ, тем больше суммарная тяга моторов, и тем сильнее они тащат коптер вверх (проще говоря «Тапок в пол» здесь означает наискорейший подъем). Обычно измеряется в процентах: 0% — моторы остановлены, 100% — вращаются с максимальной скоростью. Газ висения — минимальный уровень газа, который необходим, чтобы коптер не терял высоту. @@ -71,15 +71,15 @@ **Yaw** – «рыскание». Поворот носа мультикоптера. условно - вращение вправо влево. -![Yaw](../assets/1_6.png) +![Yaw](assets/1_6.png) **Pitch** - «тангаж». В коптерах манипуляции с этим моментом силы позволяет коптеру двигаться вперед или назад за счет наклона носа в соответствующем направлении. -![Pitch](../assets/1_7.png) +![Pitch](assets/1_7.png) **Roll** - «крен». Наклон мультикоптера влево вправо. Коптер за счет крена может двигаться боком в соответствующую сторону. -![Roll](../assets/1_8.png) +![Roll](assets/1_8.png) Газ, тангаж, крен, рыскание — если вы можете управлять этими четырьмя параметрами, значит вы можете управлять квадрокоптером. Их еще иногда называют каналами управления. Режимов полета существует много. Используется и GPS, и барометр, и дальномер, так же режим стабилизации (stab, stabilize, летать в «стабе»), в котором квадрокоптер держит те углы, которые ему задаются с пульта не зависимо от внешних факторов. В этом режиме при отсутствии ветра квадрокоптер может висеть почти на месте. Ветер же придется компенсировать пилоту. Направление вращения винтов выбирается не случайно. Если бы все моторы вращались в одну сторону, квадрокоптер вращался бы в противоположную из-за создаваемых моментов. Поэтому одна пара противостоящих моторов всегда вращается в одну сторону, а другая пара — в другую. Эффект возникновения моментов вращения используется, чтобы изменять угол рыскания: одна пара моторов начинает вращаться чуть быстрее другой, и вот уже квадрокоптер медленно поворачивается к нам лицом: @@ -92,7 +92,7 @@ RBW — right back clockwise rotation (правый задний, вращение по часовой стрелке) - ![Parts](../assets/1_9.png) + ![Parts](assets/1_9.png) Элементы коптера ---------------- @@ -101,22 +101,22 @@ Именно здесь в игру вступают Полетные контроллеры. -![Flightctr](../assets/1_10.png) +![Flightctr](assets/1_10.png) **Полетный контроллер** - самая важная часть. Стабильность полета и управляемость на девяносто процентов зависит от способностей полетного контроллера. Задача полетного контроллера — переводить команды от пульта управления в сигналы задающие обороты двигателя. Также в нем установлены инерциальные измерительные датчики, позволяющие следить за текущим положением платформы и выполнять автоматические регулировки. -![Flightctr](../assets/1_11.png) +![Flightctr](assets/1_11.png) **ESC** — это регуляторы оборотов электродвигателей. Дело в том, что в мультикоптерах используют специальные бесколлекторные электродвигатели, которые способны работать на очень больших оборотах. Для управления этими двигателями необходимо формировать трехфазное напряжение и относительно большие токи, чем и занимаются регуляторы оборотов. Для каждого двигателя необходим свой регулятор оборотов. Все регулятора оборотов подключаются к полетному контроллеру. Питаются регуляторы непосредственно от аккумулятора. Каждый двигатель подключен к своему регулятору оборотов тремя проводами. Последовательность подключения проводов определяет направление вращения двигателя. -![Esc](../assets/1_12.png) +![Esc](assets/1_12.png) **Электродвигатель** В конструкциях коптеров используются бесколлекторные электродвигатели. Они обладают выдающимися характеристиками и живучестью в связи с отсутствием трущихся узлов (щеток) посредством которых передается ток. В отличие от обычного электродвигателя, у которого имеется подвижная часть - ротор и неподвижная - статор, у бесколлекторного двигателя подвижной частью является как раз статор с постоянными магнитами, а неподвижной частью - ротор с обмотками трех фаз. Для того, чтобы заставить вращаться такую систему, необходимо осуществлять в определенном порядке смену направления магнитного поля в обмотках ротора - тогда постоянные магниты статора будут взаимодействовать с магнитными полями ротора и подвижный статор прийдет в движение. Это движение основано на свойстве магнитов с одноименными полюсами полюсами отталкиваться, а с противоположными - притягиваться. -![Engine](../assets/1_13.png) +![Engine](assets/1_13.png) **Аппаратура радиоуправления** diff --git a/docs/les11.md b/docs/les11.md index dba134a1..81c6cad1 100644 --- a/docs/les11.md +++ b/docs/les11.md @@ -10,7 +10,7 @@ Во время работы постоянно происходят химические реакции между компонентами электродных пластин с заполняющим их веществом — электролитом. Принципиальную схему устройства аккумулятора можно представить рисунком упрощенного вида, когда в корпус сосуда вставлены две пластины из разнородных металлов с выводами для обеспечения электрических контактов. Между пластинами залит электролит. -![bat](../assets/11_1.png) +![bat](assets/11_1.png) Работа аккумулятора при разряде ------------------------------- @@ -19,7 +19,7 @@ Этот процесс условно показан на схеме с никель-кадмиевой конструкцией электродов. -![bat](../assets/11_2.png) +![bat](assets/11_2.png) Здесь в качестве материала положительного электрода используют окислы никеля с добавками графита, которые повышают электрическую проводимость. Металлом отрицательного электрода работает губчатый кадмий. Во время разряда частицы активного кислорода из окислов никеля выделяются в электролит и направляются на отрицательные пластины, где окисляют кадмий. @@ -45,7 +45,7 @@ Двигатели квадрокоптера в зависимости от размера могут потреблять значительные токи. Основным требованием к аккумуляторам является высокая токоотдача. И наилучшими характеристиками с этой точки зрения обладают литий-полимерные аккумуляторы. -![bat](../assets/11_3.png) +![bat](assets/11_3.png) ### Характеристики LiPo аккумуляторов @@ -61,7 +61,7 @@ Для зарядки используется специальное зарядное устройство. Практически все модели питаются не от сети, а от постоянного напряжения 12В. -![bat](../assets/11_4.png) +![bat](assets/11_4.png) Особенность этого зарядного устройства в том, что он умеет делать балансировку ячеек аккумулятора. То есть аккумулятор подключается к нему не только силовым разъемом, но и дополнительным балансировочным разъемом на который выведены все ячейки по отдельности. Это дает возможность заряжать все ячейки равномерно, что дает одинаковое распределение нагрузки на банки аккумулятора в процессе эксплуатации. @@ -70,7 +70,7 @@ Для подключения аккумуляторов используют специальные коннекторы. Диаметр пистонов в них 4мм и они дополнительно подпружинены для обеспечения большой площади контакта. Еще для подключения используют специальные провода в силиконовой изоляции, которая способна выдерживать высокие температуры. -![bat](../assets/11_5.png) +![bat](assets/11_5.png) Меры предосторожности --------------------- diff --git a/docs/les13.md b/docs/les13.md index 8bb16db1..16108183 100644 --- a/docs/les13.md +++ b/docs/les13.md @@ -6,7 +6,7 @@ Отличие мультикоптера от других подобных роботов (ездящих, плавающих), заключается в том, что пилот не управляет напрямую мощностью мотора. С помощью джойстика, он передает сигнал полётному контроллеру, который делает расчеты и передает необходимую мощность на моторы. -![Speed](../assets/13_1.png) +![Speed](assets/13_1.png) Рис. Скорость вращения моторов, в зависимости от команды пилота. @@ -17,7 +17,7 @@ Полётный контроллер - устройство, обеспечивающее полёт квадрокоптера, за счет управления газом, углами крена, тангажа и рысканья (throttle, pitch, roll, yaw). Это своеобразные "мозги" мультикоптера. Обычно он содержит несколько датчиков (гироскопы, акселерометр, магнитометр, GPS датчик) и микроконтроллер, который производит расчеты. Именно полётный контроллер отвечает за то, чтобы при среднем положении всех стиков джойстика квадрокоптер стабилизировался, висел в воздухе не отклоняясь ни в одну из сторон. -![FC](../assets/13_2.png) +![FC](assets/13_2.png) Полётный контроллер несколько десятков раз в секунду выполняет цикл управления в который входит: считывание показаний датчиков, считывание каналов управления, обработка информации и выдача управляющих сигналов моторам, чтобы выполнять команды пилота. @@ -35,7 +35,7 @@ Полётный контроллер выдает ШИМ-импульсы (PWM) на регуляторы оборотов (ESC), в зависимости от команды стика джойстика, либо программы. Например, чтобы дать команду мотору вращаться с максимальной скоростью контроллер должен отправлять импульсы длительностью 2 миллисекунды, перемежающиеся логическим нулем длительностью 10 — 20 миллисекунд. Длительности импульса в 1 миллисекунду соответствует остановка мотора, 1.1 мс — 10% от максимальной скорости, 1.2 мс — 20% и т.п. Длительность нуля не играет никакой роли, важна только длительность самого импульса. -![shim](../assets/13_3.jpg) +![shim](assets/13_3.jpg) Но все не так просто, полетные контроллеры бывают разные с разными настройками, регуляторы бывают разные, минимум (1 мс) и максимум (2 мс) — не универсальны. В зависимости от множества факторов диапазон 1-2 мс может на деле оказаться 1.1 — 1.9 мс, либо другим. Чтобы регулятор и контроллер говорили абсолютно на одном языке существует процедура калибровки регуляторов. @@ -48,7 +48,7 @@ Для многих устройств, использующих ПИД-регуляторы, существуют инструкции по настройке. Но чтобы легче ориентироваться в этом многообразии полезно понимать, как же внутри устроены эти регуляторы. Предлагаю вместе со мной самим заново «изобрести» и «на пальцах» понять формулу ПИД-регулятора. Будем рассматривать квадрокоптер в двумерном пространстве, где у него есть только один угол — угол крена, и два мотора: левый и правый. -![FC](../assets/13_4.png) +![FC](assets/13_4.png) В полетный контроллер непрерывно поступают команды с земли: «крен 30 градусов», «крен -10 градусов», «крен 0 градусов (держать горизонт)»; его задача — как можно быстрее и точнее их выполнять с помощью моторов с учетом: ветра, неравномерного распределения веса квадрокоптера, неравномерного износа моторов, инерции квадрокоптера и т.п. Таким образом, полетный контроллер должен непрерывно решать задачу, какую скорость вращения подавать на каждый мотор с учетом текущего значения угла крена и требуемого @@ -61,7 +61,7 @@ right = throttle - force,*** Представим ситуацию: поступает команда «держать горизонт» (***tar get_roll*** = 0), а квадрокоптер имеет крен влево: -![FC](../assets/13_5.png) +![FC](assets/13_5.png) Рис. Двухмерный квадрокоптер с креном влево. ***error*** — разность (ошибка) между ***tar get_roll*** и ***roll***, которую контроллер стремится минимизировать. @@ -82,15 +82,15 @@ D — настраиваемый коэффициент: чем он больш Скорость изменения любой величины — производная этой величины по времени: -![math](../assets/13_6.png) +![math](assets/13_6.png) И вот пропорциональный регулятор превращается в пропорционально-дифференциальный (пропорциональное слагаемое и дифференциальное): -![math](../assets/13_7.png) +![math](assets/13_7.png) Ошибку ***error*** вычислить легко, ведь на каждой итерации мы знаем ***roll*** и ***tar get_roll***; P и D — настраиваемые перед запуском параметры. Для вычисления производной (скорости изменения ***error***) необходимо хранить предыдущее значение ***error***, знать текущее значение ***error*** и знать время, которое прошло между измерениями (период регулирования). И вот она — физика шестого класса школы (скорость = расстояние / время): -![math](../assets/13_8.png) +![math](assets/13_8.png) ***dt*** — период регулирования; ***error previous*** — значение ошибки с предыдущей итерации цикла регуляции. Кстати, эта формула — простейший способ численного дифференцирования, и он нам здесь вполне подойдет. @@ -100,17 +100,17 @@ D — настраиваемый коэффициент: чем он больш Тут есть нюанс. Предположим ***error*** равна 1 градусу, цикл регулирования — 0.1с. Тогда за одну секунду сумма ошибок примет значение 10 градусов. А если цикл обработки — 0.01с, то сумма наберет аж 100 градусов. Чтобы за одно и тоже время интегральное слагаемое набирало одно и тоже значение при разных периодах регулирования, полученную сумму будем умножать на сам период регулирования. Легко посчитать, что в обоих случаях из примера получается сумма в 1 градус. Вот оно — интегральное слагаемое (пока без настраиваемого коэффициента): -![math](../assets/13_9.png) +![math](assets/13_9.png) Эта формула — не что иное, как численный интеграл по времени функции ***error*** в интервале от нуля до текущего момента. Именно поэтому слагаемое называется интегральным: -![math](../assets/13_10.png) +![math](assets/13_10.png) где T — текущий момент времени. Пришло время записать окончательную формулу пропорционально-интергрально-дифференциального регулятора: -![math](../assets/13_11.png) +![math](assets/13_11.png) где ***I*** — один из настраиваемых параметров, которых теперь трое: ***P,I,D***. ПИД регуляторы - важная часть полётного контроллера, без их использования квадрокоптер летал бы непредсказуемо. Они настраиваются индивидуально для каждого квадрокоптера. diff --git a/docs/les15.md b/docs/les15.md index e5931cf4..4ad9f972 100644 --- a/docs/les15.md +++ b/docs/les15.md @@ -6,26 +6,26 @@ Радиосвязь - наиболее распространенный способ передачи информации на расстояние. Сотовые телефоны, спутниковая связь, телевиденье - все это работает на основе передачи сигналов через электромагнитные колебания определенной частоты. -![Radio](../assets/15_1.png) +![Radio](assets/15_1.png) В передатчике формируются высокочастотные колебания определенной частоты (несущий сигнал). На него накладывается сигнал, который нужно передать, это называется модуляция полезным сигналом. Сформированный таким образом высокочастотный сигнал излучается антенной в виде радиоволн. Этот сигнал воспринимается антенной приёмника, проходит через систему фильтров, которая выделяет из множества наведенных в антенне токов от различных передатчиков сигнал с нужной несущей частотой, а детектор выделяет из него модулирующий полезный сигнал. В зависимости от несущей частоты передатчика, излучаемый сигнал обладает разными характеристиками относительно дальности распространения, рассеивания, способности отражаться и огибать препятствия. Радиоволны распространяются в пустоте и в атмосфере; земная твердь и вода для них непрозрачны. Однако, благодаря эффектам дифракции и отражения, возможна связь между точками земной поверхности, не имеющими прямой видимости (в частности, находящимися на большом расстоянии). Примером модуляции сигнала может служить AM и FM. Это частные виды аналоговой модуляции в которых полезный сигнал передаётся либо за счет амплитуды волны, либо частоты. -![Radio](../assets/15_2.png) +![Radio](assets/15_2.png) ### Принцип работы радиоаппаратуры управления. Управление подвижными моделями основано на взаимодействии человека и модели, в нашем случае квадрокоптера. Аппаратура радиоуправления состоит из передатчика, который находится у пилота, и размещенных на модели приемника и полётного контроллера, который и управляет квадрокоптером через регуляторы мощности. О полётном контроллере и регуляторах мощности мы уже рассказывали, теперь рассмотрим Приёмник и передатчик. -![Radio](../assets/15_3.png) +![Radio](assets/15_3.png) ### Передатчик Различают 2 основных вида пультов - джойстиковые и пистолетные. Для квадрокоптеров используют джойстиковый пульт. -![Radio](../assets/15_4.png) +![Radio](assets/15_4.png) Для управления движущимися моделями требуется воздействие одновременно на несколько функций, поэтому передатчики радиоуправления делают многоканальными. Для квадрокоптеров минимальное количество каналов - 4: управление газом, угол крена, угол тангажа, угол рысканья. Положение каждого из стиков пульта кодируется при помощи ШИМ импульса. @@ -35,7 +35,7 @@ На выходе с пульта сигнал модулируется, чтобы передать данные на квадрокоптер. Модуляция сигнала позволяет наложить полезный сигнал на излучаемые волны, для этого все каналы уплотняются в один посредством кодирования. В основном для этого используется фазово-импульсная модуляция, обозначаемая буквами РРМ (Pulse Position Modulation), она распространена из-за единого стандарта на всем оборудовании. Пульт и приемник разных производителей могут работать вместе, привязка их друг к другу осуществляется за счет пары кварцевых резонаторов. -![Radio](../assets/15_5.png) +![Radio](assets/15_5.png) РРМ сигнал имеет фиксированную длину периода Т=20мс. Это означает, что информация о положениях ручек управления на передатчике попадает на модель 50 раз в секунду, что определяет быстродействие аппаратуры управления. Как правило, этого хватает, поскольку скорость реакции пилота на поведение модели намного меньше. Все каналы пронумерованы и передаются по порядку номеров. Значение сигнала в канале определяется величиною временного промежутка между первым и вторым импульсом - для первого канала, между вторым и третьим - для второго канала и т.д. @@ -45,13 +45,13 @@ Приёмник - устройство, служащее для осуществления радиоприёма, т.е . для выделения сигналов из радиоизлучения. Приёмник устанавливается на квадрокоптере, принимает сигнал с пульта и передаёт его в полётный контроллер. -![Radio](../assets/15_6.png) +![Radio](assets/15_6.png) ### Принципиальная схема работы приемника Сигналы, принятые антенной, подаются на колебательный контур, в котором работает приёмник. Этот контур является преселектором. После преселектора сигнал попадает в усилитель высокой частоты, а затем, уже усиленный сигнал подается на смеситель. На смеситель так же подается сигнал с гетеродина ( высокочастотного генератора). Антенна воспринимает сигналы со всех передатчиков, находящихся рядом, в смесителе происходит процесс первичной фильтрации сигнала. Из смесителя отфильтрованные сигналы поступают на селектор промежуточной частоты, который должен выбрать из всех полученных, сигнал "своего" приёмника и подавить остальные. После этого сигнал проходит через усилитель промежуточной частоты и попадает на демодулятор-дискримнатор, где сигнал проходит обратную модуляции процедуру, когда принятого сигнала выделяется полезный сигнал. Затем он попадает на триггер Шмидта, который формирует необходимую амплитуду и крутизну PPM сигнала, а затем подается на декодер полётного контроллера. -![Radio](../assets/15_7.png) +![Radio](assets/15_7.png) Чтобы было понятно, рассмотрим на примере. Наш передатчик и приемник осуществляют связь по 50 каналу, 40,665 МГц. Частота гетеродина, чтобы определить "свой" сигнал обычно отличается на 455 кГц (0,455 МГц), соответственно она равна 40,665 МГц - 0,455 МГц = 40,210 МГц. Например, антенна приняла сигналы 40,665 МГц и 40,805 МГц, что соответствует 50 и 80 каналам. Они усилились при помощи УВЧ и попали в смеситель. Чтобы найти "свой" сигнал в смесителе происходит сложение и вычитание частот полученных сигналов и гетеродина. Получим: diff --git a/docs/les16.md b/docs/les16.md index 74a12a9a..96c7a37a 100644 --- a/docs/les16.md +++ b/docs/les16.md @@ -8,14 +8,14 @@ ### Принцип работы аналоговых видеокамер -![Analog](../assets/16_1.png) +![Analog](assets/16_1.png) Он заключается в том, что световой поток, проходя сквозь линзы объектива, попадает на матрицу ПЗС, где он преобразуется в видеосигнал. Рынок аналоговых видеокамер обширный, и каждый из нас сможет сделать оптимальный для себя выбор, в соответствии с необходимыми характеристиками и вкусом. Большим преимуществом камер аналогового типа является их взаимосовместимость, даже от разных производителей, а также простота монтажа и настройки через соответствующие меню. ### Работа цифровых камер -![analogCam](../assets/16_2.png) +![analogCam](assets/16_2.png) Цифровые видеокамеры (IP камеры), вошли в нашу жизнь совсем недавно, но с позиций их использования – на практике зарекомендовали себя достаточно хорошо с позиций существенного улучшения качества. Конечно же, они пока что, немного дороговаты по сравнению с камерами аналогового типа, но в перспективе развития цифровых технологий – альтернативы им нет. @@ -61,11 +61,11 @@ Летать можно 2-мя способами. С помощью монитора или в очках. -![resolution](../assets/16_3.png) +![resolution](assets/16_3.png) Современный рабочий вариант очков имеет разрешение 800x600, чего более чем достаточно. -![camera](../assets/16_4.png) +![camera](assets/16_4.png) Даже на отличной камере детализация низковата. Атмосферу не чувствуешь, и какие-то шумы присутствуют. Насладиться красотой пейзажей можно потом, в записи со второй цифровой HD-камеры, а не в процессе полета. diff --git a/docs/les2.md b/docs/les2.md index 947160d5..711d018f 100644 --- a/docs/les2.md +++ b/docs/les2.md @@ -12,7 +12,7 @@ Так вот, эта разница потенциалов (+) и (-), есть электродвижущая сила (далее ЭДС), то есть электрическое напряжение. -![current](../assets/2_1.png) +![current](assets/2_1.png) Итак, источник электроэнергии обладает разностью потенциалов, заряженные частицы которых, стремятся друг к другу. А так - же есть такие, которые ограничивают их движение. @@ -28,12 +28,12 @@ Электрический ток будет равен тому, что мы получим, когда поделим разность потенциалов участка (величина напряжения) на сопротивляемость этого участка (сопротивление). Обозначаем: I - электрический ток; U - напряжение; R - сопротивление; -![current](../assets/2_2.png) +![current](assets/2_2.png) С помощью треугольника, работая с формулой закона Ома, легко написать формулу для любой входящей величины. -![current](../assets/2_3.png) +![current](assets/2_3.png) Нужно закрыть ту величину, которую необходимо определить. Если две оставшиеся величины находятся на одном уровне – значит надо их перемножить. @@ -73,12 +73,12 @@ I=2 A **I = I1+I2+I3+I4;** -![current](../assets/2_4.png) +![current](assets/2_4.png) Cумма токов, подходящих к узловой точке электрической цепи, равна сумме токов, уходящих от этого узла. -![current](../assets/2_5.png) +![current](assets/2_5.png) При параллельном соединении резисторов ток проходит по четырем направлениям, что уменьшает общее сопротивление или увеличивает общую проводимость цепи, которая равна сумме проводимостей ветвей. @@ -107,7 +107,7 @@ Cумма токов, подходящих к узловой точке элек Из этого равенства найдем сопротивление R, которым можно заменить два параллельно соединенных резистора: -![current](../assets/2_6.png) +![current](assets/2_6.png) Полученное выражение имеет большое практическое применение. Благодаря этому закону производятся расчёты электрических цепей. @@ -131,7 +131,7 @@ Cумма токов, подходящих к узловой точке элек **Е = Е1—Е2.** -![current](../assets/2_7.png) +![current](assets/2_7.png) Закон Джоуля-Ленца ------------------ @@ -151,11 +151,11 @@ Cумма токов, подходящих к узловой точке элек Если обозначить количество теплоты, создаваемое током, буквой Q (Дж), ток, протекающий по проводнику - I, сопротивление проводника - R и время, в течение которого ток протекал по проводнику - t, то закону Ленца-Джоуля можно придать следующее выражение: -![current](../assets/2_8.png) +![current](assets/2_8.png) Решим пример задачи: -![current](../assets/2_9.png) +![current](assets/2_9.png) ### Контрольные вопросы: 1) Что такое электродвижущая сила? diff --git a/docs/les4.md b/docs/les4.md index 5163a94d..9f2f4864 100644 --- a/docs/les4.md +++ b/docs/les4.md @@ -23,7 +23,7 @@ Для следующих операций понадобится уже специальный электронагревательный инструмент: паяльник, футорка или паяльная горелка. Паять в домашних условиях чаще всего приходится электропаяльником с медным луженым жалом. -![scheme](../assets/4_1.png) +![scheme](assets/4_1.png) Лудить необходимо следующим образом: @@ -54,7 +54,7 @@ * Простая последовательная скрутка, т. наз. прямая британская, или просто британка, применима для соединения токоведущих проводов гибких кабелей сечением до 1,4 кв. мм, не испытывающих регулярных больших механических нагрузок, напр. электрических удлинителей или времянок. -![scheme](../assets/4_2.png) +![scheme](assets/4_2.png) Электрические провода, испытывающие регулярные и/или постоянные механические нагрузки, должны быть обязательно многожильными. Скручивают их, как показано внизу на рис: концы разметливают, «метлы» вдвигают друг в друга и скручивают по-британски. Паяют легкоплавким припоем повышенной прочности, напр. ПОСК-50 (см. ниже) с активированным флюсом, не требующим удаления остатков, также см. ниже. Параллельные (тупиковые) скрутки проводов сечением свыше 0,7 кв. мм желательно паять погружением в расплавленный припой, см. далее. В противном случае придется греть или долго, или слишком мощным паяльником, отчего изоляция ползет, а флюс преждевременно выкипает. @@ -77,7 +77,7 @@ Второе – хлористый цинк в активированных флюс-пастах часто заменяют тераборнокислым натрием – бурой. Соляная кислота – высокотоксичное химически агрессивное летучее вещество; хлорид цинка также токсичен, а при нагреве сублимирует, т.е. улетучивается не плавясь. Бура безопасна, но при нагреве выделяет большое количество кристаллизационной воды, что немного ухудшает качество пайки. -![flux](../assets/4_3.png) +![flux](assets/4_3.png) Пайки от СКФ нужно обязательно промывать: в состав канифоли входит янтарная кислота, при длительном контакте разрушающая металл. Кроме того, случайно пролитый СКФ мгновенно растекается по большой площади и превращается в очень долго сохнущую чрезвычайно липкую гадость, пятна от которой ничем не сводятся ни с одежды, ни с мебели, ни с пола со стенами. В общем СКФ для пайки хороший флюс, но не для ротозеев с растяпами. Полноценный заменитель СКФ, но не такой противный при небрежном обращении – флюс ТАГС. Стальные детали более массивные, чем допустимо для пайки паяльной кислотой, и более прочно, паяют флюсом Ф38. Универсальным флюсом можно паять практически любые металлы в любых сочетаниях, в т.ч. алюминий, но прочность спая с ним не нормируется. К пайке алюминия мы еще вернемся. @@ -85,7 +85,7 @@ Любители мастерить также часто паяют сухим паяльником с бронзовым нелуженым жалом, т. наз. паяльным карандашом, поз. 1 на рис. Он хорош там, где недопустимо растекание припоя вне зоны пайки: в ювелирных изделиях, витражах, паяных предметах прикладного искусства. Иногда всухую паяют и микрочипы, монтируемые на поверхность, с шагом расположения выводов 1,25 или 0,625 мм, но это дело рискованное и для опытных специалистов: плохой тепловой контакт требует избыточной мощности паяльника и длительного нагрева, а обеспечить стабильность прогрева при ручной пайке невозможно. Для сухой пайки применяют гарпиус из ПОСК-40, 45 или 50 и флюс-пасты, не требующие удаления остатков. -![scheme](../assets/4_4.png) +![scheme](assets/4_4.png) ### Мелкая пайка @@ -102,7 +102,7 @@ эффект: спихнул нечаянно плату-«каракатицу» на пол – 1-2 или более дорожек отслоились. Не дожидаясь и первой перепайки. -![soldering](../assets/4_5.png) +![soldering](assets/4_5.png) Паечные наплывы на печатных платах должны быть округлыми гладкими высотой не более 0,7 диаметра монтажной площадки, см. справа на рис. Кончики выводов должны немного выступать из наплывов. Кстати, плата полностью самодельная. Есть способ в домашних условиях сделать печатный монтаж таким же точным и четким, как фабричный, да еще и вывести там надписи, какие хочется. Белые пятнышки – блики от лака при фотосъемке. Наплывы вогнутые и тем более сморщенные – тоже брак. Просто вогнутый наплыв значит, что припоя недостаточно, а морщинистый, кроме того, что в пайку проник воздух. Если собранное устройство не работает и есть подозрение на непропай, смотрите в первую очередь такие места. @@ -114,7 +114,7 @@ Ах да, подставки для паяльников. Классическая, слева на рис., пригодна для любых стержневых. Где на ней быть ванночкам для припоя и канифоли – дело ваше, какой-либо регламентации нет. Для маломощных паяльников с фартуком пригодны упрощенные подставки-скобы, в центре. -![soldering](../assets/4_6.png) +![soldering](assets/4_6.png) Паяльные станции комплектуются преимущественно пружинными или трубчатыми ложементами-гнездами для паяльников. В них вся горячая часть инструмента недоступна для прикосновения, но и промазать паяльником мимо них, сосредоточившись на пайке мелкой «россыпи», вероятнее. Но чего уж точно не надо делать, и что прямо запрещено ТБ – это подставку из подручных материалов, в которой паяльник лежит на ванночках для расходных материалов, справа на рис. diff --git a/docs/les7.md b/docs/les7.md index 4d81a373..5464a3bc 100644 --- a/docs/les7.md +++ b/docs/les7.md @@ -8,12 +8,12 @@ Винт вращается на месте. При этом масса воздуха перемещается вертикально сверху вниз. Это один из режимов так называемого осевого обдува винта. На одной из лопастей выделены два небольших участка: один – «А» – ближе к оси вращения, другой – «Б» – у конца лопасти. В процессе вращения винта оба участка будут описывать концентрические окружности. Понятно, что длина окружности, описываемой элементом «Б», а значит, и его скорость относительно воздуха, будет больше, чем элемента «А». Иными словами, скорость элемента лопасти относительно воздуха зависит от того, на каком расстоянии он расположен от оси вращения. Чем это расстояние больше, тем большую скорость имеет элемент. Понятно, что на оси вращения скорость будет равна нулю, а на конце лопасти она будет наибольшей. -![rotation](../assets/7_1.png) +![rotation](assets/7_1.png) Поперечное сечение лопасти на этом участке имеет вид обтекаемого профиля. При обтекании этого профиля потоком воздуха под углом атаки возникают подъемная сила Y и сила сопротивления X, которые вычисляются по специальным формулам. Разбивая лопасть на множество мелких участков можно определить их подъемные силы и силы сопротивления, и, сложив вместе соответствующие силы по всем участкам, определить подъемную силу и силу лобового сопротивления одной лопасти. (С математической точки зрения такая операция именуется интегрированием по размаху лопасти). Подъемная сила (или сила тяги) всего винта получается умножением подъемной силы одной лопасти на число лопастей. Концевой эффект. Величина силы тяги винта определяется описанным выше методом с некоторой ошибкой, обусловленной несколькими причинами. Одна их них состоит в не учете явления так называемого концевого эффекта. Концевой эффект проявляется в стремлении воздуха к выравниванию давлений над лопастью и под лопастью путем перетекания через края лопасти. -![rotation](../assets/7_2.png) +![rotation](assets/7_2.png) В данном случае перетекание происходит как на внешнем, так и на внутреннем краях лопасти. А так как подъемная сила появляется вследствие разности давлений на верхней и нижней поверхностях лопасти, то любое выравнивание этих давлений вызывает потери подъемной силы. @@ -32,7 +32,7 @@ Для постройки квадрокоптера нужно две пары разнонаправленных винтов, для гексакоптера – три пары и т.д. -![rotation](../assets/7_3.png) +![rotation](assets/7_3.png) 5. **Направление вращения винтов** - классическое - против часовой стрелки 2 винта, по часовой стрелке другие 2 винта на квадрокоптерах. 6. **Качество изготовления пропеллеров** тоже важно. На практике это означает, что обязательно нужно балансировать пропеллеры, чтобы минимизировать вибрацию, которая разрушает механические части (постепенно), а также сводит с ума гироскопы, ухудшая полетные свойства мультикоптера. @@ -58,7 +58,7 @@ Для примера возьмем мотор X2204S 2300kv компании SunnySky. Заходим на сайт производителя и находим наш мотор. В описании имеется табличка, с помощью которой можно подобрать пропеллер (prop). -![rotation](../assets/7_4.png) +![rotation](assets/7_4.png) ### Контрольные вопросы diff --git a/docs/les8.md b/docs/les8.md index cb374628..7d3e3c30 100644 --- a/docs/les8.md +++ b/docs/les8.md @@ -8,7 +8,7 @@ **Зако́н Ампе́ра** — закон взаимодействия электрических токов. Впервые был установлен Андре Мари Ампером в 1820 для постоянного тока. Из закона Ампера следует, что параллельные проводники с электрическими токами, текущими в одном направлении, притягиваются, а в противоположных — отталкиваются. -![low](../assets/8_1.png) +![low](assets/8_1.png) Закон Ома --------- @@ -26,13 +26,13 @@ Каждый электродвигатель обладает некоторыми отличительными свойствами, которые обуславливают его область применения, в которой он наиболее выгоден. Синхронные, асинхронные, постоянного тока, коллекторные, бесколлекторные, вентильно-индукторные, шаговые… -![engine](../assets/8_2.png) +![engine](assets/8_2.png) ### Двигатель постоянного тока (ДПТ) Именно этот тип двигателя стоит в большинстве старых игрушек. Батарейка, два проводка на контакты. Внутри такого двигателя на валу установлен контактный узел – коллектор, переключающий обмотки на роторе в зависимости от положения ротора. Постоянный ток, подводимый к двигателю, протекает то по одним, то по другим частям обмотки, создавая вращающий момент. -![engine](../assets/8_3.png) +![engine](assets/8_3.png) Двигатели постоянного тока бывают как очень маленького размера («вибра» в телефоне), так и довольно большого – обычно до мегаватта. Например, на фото ниже показан тяговый электродвигатель электровоза мощностью 810кВт и напряжением 1500В. @@ -40,7 +40,7 @@ Как ни странно, это самый распространенный в быту электродвигатель, название которого наименее известно. Почему так получилось? Его конструкция и характеристики такие же, как у двигателя постоянного тока, поэтому упоминание о нем в учебниках по приводу обычно помещается в самый конец главы. -![engine](../assets/8_4.png) +![engine](assets/8_4.png) Этот тип двигателей наиболее широко распространен в бытовой технике, где требуется регулировать частоту вращения: дрели, стиральные машины (не с «прямым приводом»), пылесосы и т.п. Почему именно он так популярен? Из-за простоты регулирования. Как и в ДПТ, его можно регулировать уровнем напряжения, что для сети переменного тока делается симистором (двунаправленным тиристором). Схема регулирования может быть так проста, что помещается, например, прямо в «курке» электроинструмента и не требует ни микроконтроллера, ни ШИМ, ни датчика положения ротора. @@ -52,14 +52,14 @@ Синхронных приводов бывает несколько подвидов – с магнитами (PMSM) и без (с обмоткой возбуждения и контактными кольцами), с синусоидальной ЭДС или с трапецеидальной (бесколлекторные двигатели постоянного тока, BLDC). Сюда же можно отнести некоторые шаговые двигатели. До эры силовой полупроводниковой электроники уделом синхронных машин было применение в качестве генераторов (почти все генераторы всех электростанций – синхронные машины), а также в качестве мощных приводов для какой-либо серьезной нагрузки в промышленности. -![engine](../assets/8_5.png) +![engine](assets/8_5.png) ### Сравнение коллекторного и бесколлекторного двигателя У радиоуправляемых моделей с электродвигателями бывают коллекторные и бесколлекторные двигатели. Краткое сравнение типов двигателей: коллекторные развивают меньшую скорость. Бесколлекторные двигатели способны развить большую скорость, а также более износостойкие. -![engine](../assets/8_6.png) +![engine](assets/8_6.png) ### Коллекторный двигатель diff --git a/docs/les9.md b/docs/les9.md index cfddf1d1..2e9788a9 100644 --- a/docs/les9.md +++ b/docs/les9.md @@ -25,13 +25,13 @@ Трехфазные бесколлекторные двигатели приобрели наибольшее распространение. Но они могут быть и одно, двух, трех и более фазными. Чем больше фаз, тем более плавное вращение магнитного поля, но и сложнее система управления двигателем. 3-х фазная система наиболее оптимальна по соотношению эффективность/сложность, поэтому и получила столь широкое распространение. Далее будет рассматриваться только трехфазная схема, как наиболее распространенная. Фактически фазы – это обмотки двигателя. Поэтому если сказать “трехобмоточный”, думаю, это тоже будет правильно. Три обмотки соединяются по схеме “звезда” или “треугольник”. Трехфазный бесколлекторный двигатель имеет три провода – выводы обмоток. -![winding](../assets/9_1.png) +![winding](assets/9_1.png) Двигатели с датчиками имеют дополнительных 5 проводов (2-питание датчиков положения, и 3 сигналы от датчиков). В трехфазной системе в каждый момент времени напряжение подается на две из трех обмоток. Таким образом, есть 6 вариантов подачи постоянного напряжения на обмотки двигателя, как показано на рисунке ниже. -![engine](../assets/9_2.png) +![engine](assets/9_2.png) Это позволяет создать вращающееся магнитное поле, которое будет проворачиваться “шагами” на 60 градусов при каждом переключении. diff --git a/docs/mavros.md b/docs/mavros.md index c7c28f68..d790f483 100644 --- a/docs/mavros.md +++ b/docs/mavros.md @@ -6,7 +6,7 @@ MAVROS \(MAVLink + ROS\) — это пакет для ROS, предоставл MAVROS подписывается определенные ROS-топики в ожидании команд, публикует в другие топики телеметрию, и предоставляет сервисы. -Узел mavros автоматически запускается в launch-файле Клевера. Для [настройки типа подключения](/docs/connection.md) см. аргумент `fcu_conn`. +Узел mavros автоматически запускается в launch-файле Клевера. Для [настройки типа подключения](connection.md) см. аргумент `fcu_conn`. ## Основные сервисы @@ -46,5 +46,5 @@ MAVROS подписывается определенные ROS-топики в `/mavros/setpoint_raw/global` — отправка пакета [SET\_POSITION\_TARGET\_GLOBAL\_INT](https://pixhawk.ethz.ch/mavlink/#SET_POSITION_TARGET_GLOBAL_INT). Позволяет установить целевую позицию в глобальных координатах \(ширина, долгота, высота\), а также скорости полета. **Не поддерживается в PX4** \([issue](https://github.com/PX4/Firmware/issues/7552)\). -[Упрощенное управление коптером с помощью Simple Offboard](/docs/simple_offboard.md). +[Упрощенное управление коптером с помощью Simple Offboard](simple_offboard.md). diff --git a/docs/powerConnection.md b/docs/powerConnection.md index 2e41c467..fd0c9a7a 100644 --- a/docs/powerConnection.md +++ b/docs/powerConnection.md @@ -11,7 +11,7 @@ Говоря простым языком, силовые цепи - это электрические цепи, которые предназначены для передачи большого количества энергии (тока), для обеспечения работоспособности всех систем. В нашем случае в качестве силовой цепи будут выступать провода, соединяющие аккумулятор с платой распределения питания, а также красные и черные провода идущие на регуляторы оборотов. -![Схема силовой цепи](../assets/powerConnect.jpg) +![Схема силовой цепи](assets/powerConnect.jpg) Вся энергия аккумулятора (АКБ) будет распределяться между регуляторами оборотов моторов. Чтобы моторы смогли поднять в воздух коптер, им необходимо много энергии. В качестве энергии выступает ток, который приходит с АКБ. Т.к. энергии нужно много, значит по проводам будет идти большой ток. Чтобы провода смогли выдержать такую нагрузку, необходимы провода большего диаметра. Для наших задач подойдут провода 18AWG, 16AWG, 14AWG. diff --git a/docs/rabota-so-svetodiodnoi-lentoi.md b/docs/rabota-so-svetodiodnoi-lentoi.md index 0ced483f..014a8803 100644 --- a/docs/rabota-so-svetodiodnoi-lentoi.md +++ b/docs/rabota-so-svetodiodnoi-lentoi.md @@ -4,7 +4,7 @@ Есть два основных типа адресуемых светодиодов: WS2812 и WS2812B. Принцип управления один и тот же, однако тайминги разные. Найдите на ленте чип светодиода и определите сколько у него ножек: 6 или 4. Если ножек 6, то это WS2812, если 4 - то WS2812B или его аналог SK6812. -leds +leds Т.к. принцип управления одинаковый, то и ленты подключаются одинаково: @@ -96,6 +96,17 @@ sudo python strandtest.py Права администратора необходимы для выполнения скрипта, т.к. без них нет доступа к функциям прерывания, которые использует библиотека для работы с лентой. +#### Совместимость с ROS и python + +При запуске программы с помощью sudo пользовательское окружение изменяется и появляются ошибки импорта библиотек, т.к. в окружении отсутствуют необходимые пути. Чтобы добавить в окружение пути к библиотекам python и пакетам ROS, необходимо добавить в файл /etc/sudoers следующие строки: + +```(bash) +Defaults env_keep += "PYTHONPATH" +Defaults env_keep += "PATH" +Defaults env_keep += "ROS_ROOT" +Defaults env_keep += "ROS_MASTER_URI" +``` + #### Функции для работы со светодиодной лентой Для подключения библиотеки и её корректной работы требуется подключить следующие модули: neopixels - для работы ленты, time - для управления задержками, sys и signal для прерываний и формирования управляющего сигнала. @@ -196,7 +207,7 @@ pydoc neopixel and 255 is the highest intensity. ``` -#### Почему именно так и можно ли по-другому +#### Почему именно так и можно ли по-другому? Основные типы лент, которые используются для Clever3, это WS2812, WS2812B и SK6812 \(аналог WS2812B\). Они управляются по одному и тому же принципу: для массива светодиодов в ленте отправляется пакет данных по 24 бита на светодиод; каждый светодиод считывает первые 24 бита из пришедших к нему данных и устанавливает соответствующий цвет, остальные данные он отправляет следующему светодиоду в ленте. Нули и единицы задаются разными сочетаниями длительностей высокого и низкого уровня в импульсе. diff --git a/docs/radioerrors.md b/docs/radioerrors.md index 9f9bbc74..ad2c4a53 100644 --- a/docs/radioerrors.md +++ b/docs/radioerrors.md @@ -12,7 +12,7 @@ 2. Переключатели A, B, C, D (2) в положение “От Себя”. 3. Правый стик (3) в центре. -![Заблокированный пульт](../assets/lockradio.jpg) +![Заблокированный пульт](assets/lockradio.jpg) Нет связи с приемником @@ -21,11 +21,11 @@ 1. Соединение с приемником отсутствует -![Нет соединения с приемником](../assets/connectionLost.jpg) +![Нет соединения с приемником](assets/connectionLost.jpg) 2. Соединение с приемником установлено -![Есть соединения с приемником](../assets/connectionOK.jpg) +![Есть соединения с приемником](assets/connectionOK.jpg) Если соединение отсутствует, то 1. Проверьте, что приемник включен (моргает красный светодиод) @@ -37,7 +37,7 @@ -------------- Если нет связи с полетным контроллером, то на экране монитора компьютера в окне Channel Monitor не будут отображаться изменения положения слайдеров при перемещении стиками пульта. -![Нет связи с полетным контроллером](../assets/notmoveslider.jpg) +![Нет связи с полетным контроллером](assets/notmoveslider.jpg) 1. Зайдите в МЕНЮ (удерживаем нажатой кнопку “ОК”) 2. Выберите меню “System setup” (Кнопки Up/Down - для навигации, кнопка “ОК” - подтверждение выбора diff --git a/docs/radioerrors1.md b/docs/radioerrors1.md index 9f9bbc74..ad2c4a53 100644 --- a/docs/radioerrors1.md +++ b/docs/radioerrors1.md @@ -12,7 +12,7 @@ 2. Переключатели A, B, C, D (2) в положение “От Себя”. 3. Правый стик (3) в центре. -![Заблокированный пульт](../assets/lockradio.jpg) +![Заблокированный пульт](assets/lockradio.jpg) Нет связи с приемником @@ -21,11 +21,11 @@ 1. Соединение с приемником отсутствует -![Нет соединения с приемником](../assets/connectionLost.jpg) +![Нет соединения с приемником](assets/connectionLost.jpg) 2. Соединение с приемником установлено -![Есть соединения с приемником](../assets/connectionOK.jpg) +![Есть соединения с приемником](assets/connectionOK.jpg) Если соединение отсутствует, то 1. Проверьте, что приемник включен (моргает красный светодиод) @@ -37,7 +37,7 @@ -------------- Если нет связи с полетным контроллером, то на экране монитора компьютера в окне Channel Monitor не будут отображаться изменения положения слайдеров при перемещении стиками пульта. -![Нет связи с полетным контроллером](../assets/notmoveslider.jpg) +![Нет связи с полетным контроллером](assets/notmoveslider.jpg) 1. Зайдите в МЕНЮ (удерживаем нажатой кнопку “ОК”) 2. Выберите меню “System setup” (Кнопки Up/Down - для навигации, кнопка “ОК” - подтверждение выбора diff --git a/docs/rc.md b/docs/rc.md index 206d335e..15a3bbb6 100644 --- a/docs/rc.md +++ b/docs/rc.md @@ -3,11 +3,11 @@ Возможно управлять квадрокоптером в мобильного пульта через Wi-Fi. Он разработан в виде приложения для iOS и Android (TODO). Также существует упрощенная версия в виде [веб-страницы](#веб-версия). -![](/assets/IMG_4397.PNG) +![](assets/IMG_4397.PNG) > **Warning** Мобильный пульт предназначен в первую очередь для полетов в помещении на дальность не более 10-15 м. Большое количество Wi-Fi сетей также может ухудшить отзывчивость и дальность пульта. -Для включения бэкенда пульта, установите [образ Clever на RPi](/docs/microsd_images.md), а также убедитесь, что он включен в launch-файле Клевера (`~/catkin_ws/src/clever/clever/launch/clever.launch`): +Для включения бэкенда пульта, установите [образ Clever на RPi](microsd_images.md), а также убедитесь, что он включен в launch-файле Клевера (`~/catkin_ws/src/clever/clever/launch/clever.launch`): ```xml @@ -27,11 +27,11 @@ sudo systemctl restart clever Стики на экране приложения работают также, как и реальные стики. Для арминга коптера подержите левый стик в правом нижнем углу на протяжении нескольких секунд. Для дизарминга – в левом нижнем углу. -Пульт отображает текущий [режим PX4](/docs/modes.md) а также уровень заряда батареи. При низком значении заряда батареи телефон будет вибрировать. +Пульт отображает текущий [режим PX4](modes.md) а также уровень заряда батареи. При низком значении заряда батареи телефон будет вибрировать. > **Note** Если интерфейс пульта отображает явно неправильное напряжение (напр. > 5 V), проверьте, что значение PX4-параметра `BAT_N_CELLS` соответствует реальному количество элементов батареи. Если отображаемое напряжение все равно неверно, откалибруйте батарею (TODO: ссылка). -> **Note** Если вместо режима PX4 отображается текст "DISCONNECTED FROM FCU", проверьте [подключение Raspberry Pi к PixHawk](/docs/connection.md). +> **Note** Если вместо режима PX4 отображается текст "DISCONNECTED FROM FCU", проверьте [подключение Raspberry Pi к PixHawk](connection.md). Веб-версия --- diff --git a/docs/rviz.md b/docs/rviz.md index d9b7c6d4..cf7bfa11 100644 --- a/docs/rviz.md +++ b/docs/rviz.md @@ -1,7 +1,7 @@ Использование rviz === -![](/assets/Снимок экрана 2017-11-28 в 23.50.36.png) +![](assets/Снимок экрана 2017-11-28 в 23.50.36.png) Инструмент [rviz](http://wiki.ros.org/rviz) позволяет в реальном времени визуализировать на 3D-сцене все компоненты роботехнической системы — системы координат, движущиеся части, показания датчиков, изображения с камер. @@ -29,4 +29,4 @@ export ROS_IP=192.168.11.1 В качестве reference frame рекомендуется установить фрейм `local_origin`. Для визуализации коптера можно добавить визуализационные маркеры из топика `/vehicle_markers`. Можно просмотреть картинку с дополненной реальностью из топика основной камеры `/main_camera/image_raw`. -Axis или Grid настроенный на фрейм `aruco_map` будут визуализировать расположение [карты ArUco-меток](/docs/aruco.md). +Axis или Grid настроенный на фрейм `aruco_map` будут визуализировать расположение [карты ArUco-меток](aruco.md). diff --git a/docs/safety.md b/docs/safety.md index 9d6b5e2b..fc3b0704 100644 --- a/docs/safety.md +++ b/docs/safety.md @@ -15,14 +15,14 @@ ### Подставка -При работе с горячим паяльником важно использовать подставку. В отсутствии заводской подставки, можно использовать изготовленную -из деревянного бруска и металлических держателей. Подставка позволяет расположить инструмент, без риска, +При работе с горячим паяльником важно использовать подставку. В отсутствии заводской подставки, можно использовать изготовленную +из деревянного бруска и металлических держателей. Подставка позволяет расположить инструмент, без риска, что он упадет на горючие материалы. ### Проветривание помещения -Канифоль и припой при плавлении выделяют значительное количество вредных веществ. -Настойчиво советуется проветривать помещение после каждой пайки. +Канифоль и припой при плавлении выделяют значительное количество вредных веществ. +Настойчиво советуется проветривать помещение после каждой пайки. Через каждые 30 минут нужно делать небольшие перерывы со сквозным проветриванием помещения и не забывать при этом отключать паяльник. ### Как держать паяльник? @@ -30,9 +30,9 @@ Паяльник можно держать только за ручку. Если кто-то утверждает обратное — не верьте, вас вводят в заблуждение :) -![Паяльник состав](../assets/solderConsist.jpg) +![Паяльник состав](assets/solderConsist.jpg) -![Подробнее...->](../docs/tb.md) +![Подробнее...->](tb.md) @@ -56,8 +56,8 @@ * Располагать зрителей за спиной пилота или за линией, проходящей через оба плеча пилота за спиной пилота. * Не допускать выхода зрителей в полусферу перед лицом пилота. -* Знать и помнить время полёта, на которое рассчитан данный коптер и его аккумулятор. -* ДО подключения Li-ion аккумулятора включить аппаратуру управления (пульт), перевести левый стик (газ) в нулевое положение. +* Знать и помнить время полёта, на которое рассчитан данный коптер и его аккумулятор. +* ДО подключения Li-ion аккумулятора включить аппаратуру управления (пульт), перевести левый стик (газ) в нулевое положение. * Подключать Li-ion аккумулятор только перед взлётом, отключать сразу после взлёта. * Стоять на расстоянии не менее 3 м от коптера. * Взлетать с земли с ровной площадки, на расстоянии не менее 3 метров от препятствий. @@ -67,13 +67,13 @@ * Выполнять все указания преподавателя или лётного инструктора. * Заранее обозначить зону пилотажа. Летать только в обозначенной зоне и не допускать вылета за её пределы. Не залетать за собственную спину. * При обучении полётам летать на уровне ниже собственного роста. -* Летать рядом с собой на расстоянии, на котором вам видна ориентация коптера в пространстве. Не улетать далеко от себя. В случае сомнений в ориентации коптера немедленно выполнить посадку на месте. Не пытаться взлететь. Подойти ближе к коптеру и выполнить взлёт. -* При управлении все движения стиками выполнять аккуратно и плавно. Не допускать резких движений. При необходимости изменить направление полёта двигать стиками следует энергично, но не резко. +* Летать рядом с собой на расстоянии, на котором вам видна ориентация коптера в пространстве. Не улетать далеко от себя. В случае сомнений в ориентации коптера немедленно выполнить посадку на месте. Не пытаться взлететь. Подойти ближе к коптеру и выполнить взлёт. +* При управлении все движения стиками выполнять аккуратно и плавно. Не допускать резких движений. При необходимости изменить направление полёта двигать стиками следует энергично, но не резко. > **Caution** Резкие движения стиками запрещаются. Движения стиками в края запрещаются. -* Летать следует осторожно и выполнять только те элементы, в которых нет сомнений. Запрещается выполнять фигуры пилотажа, в успехе которых возникают сомнения и фигуры, связанные с риском. -* Соблюдать скоростной режим. Скорость полёта коптера держать в пределах скорости идущего человека. +* Летать следует осторожно и выполнять только те элементы, в которых нет сомнений. Запрещается выполнять фигуры пилотажа, в успехе которых возникают сомнения и фигуры, связанные с риском. +* Соблюдать скоростной режим. Скорость полёта коптера держать в пределах скорости идущего человека. * Вернуть коптер к месту посадки к рассчитанному времени, не допускать полной разрядки аккумулятора в полёте. * Посадку выполнять только на ровную открытую площадку вдали от препятствий diff --git a/docs/setup.md b/docs/setup.md index 911f22c5..69fc7e7c 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -3,7 +3,7 @@ ### 1. Состав пульта FLYSKY i6 --------------------- -![Состав пульта](../assets/consistofTransmitter.jpg) +![Состав пульта](assets/consistofTransmitter.jpg) ### 2. Установка QGroundCongtrol @@ -20,7 +20,7 @@ ### 4. Обновление прошивки Pixhawk -![Обновление прошивки](../assets/firmwarePX4.jpg) +![Обновление прошивки](assets/firmwarePX4.jpg) 1. Заходим в Vehicle Setup. 2. Выбираем Firmware. @@ -33,7 +33,7 @@ ### 5. Настройка Pixhawk -![Главное окно](../assets/mainWindow.jpg) +![Главное окно](assets/mainWindow.jpg) 1. Системы, нуждающиеся в настройке: Airframe, Radio, Sensors, Flight Mode 2. Текущая прошивка контроллера. @@ -42,14 +42,14 @@ ### 6. Выбор рамы -![ Выбор рамы](../assets/airframeSetup.jpg) +![ Выбор рамы](assets/airframeSetup.jpg) 1. Заходим в меню Airframe. 2. Выбираем тип рамы Quadrotor X. 3. Выбираем тип навесных элементов Generic Quadrotor X config 4. Перемещаемся в начало списка и сохраняем настройки Apply and Restart -![Внимание!](../assets/attentionSave.jpg) +![Внимание!](assets/attentionSave.jpg) 5. Повторно подтверждаем Apply 6. Ждем, пока Pixhawk выполнит сохранение и перезагрузится @@ -59,17 +59,17 @@ #### Убедитесь, что перед калибровкой: * К коптеру не подключено внешнее питание АКБ * Пропеллеры не установлены на моторах - + 1. Заходим в меню Radio 2. Включаем пульт, переводя переключатель Power в верхнее положение 3. Далее необходимо убедиться, что связь с приемником установлена: * На ЖК Экране пульта высвечивается индикация - - ![ Индикация пульта](../assets/unblockView.jpg) - + + ![ Индикация пульта](assets/unblockView.jpg) + * Светодиод на приемнике горит непрерывно красным - - При наличиии проблем с подключением щелкните ![здесь](../docs/radioerrors1.md) + + При наличиии проблем с подключением щелкните ![здесь](radioerrors1.md) ### 8. Настройка режимных каналов @@ -78,45 +78,45 @@ На канал CH5 назначаем 3-х позиционный переключатель SwC - будем изменять полетные режимы На канал CH6 назначаем 2-х позиционный переключатель SwA - аварийная остановка моторов -![Используемые переключатели](../assets/chooseSwitch.jpg) +![Используемые переключатели](assets/chooseSwitch.jpg) #### Чтобы переназначить переключатели, выполните следующие действия: 1. Зайдите в МЕНЮ (удерживаем нажатой кнопку “ОК”) 2. Выберите меню “Functions setup” (Кнопки Up/Down - для навигации, кнопка “ОК” - подтверждение выбора 3. Выберите “Aux. channels” -4. Выберите +4. Выберите * Channel 5 - SwC * Channel 6 - SwA 5. Сохраните изменения (удерживаем нажатой кнопку “CANCEL”) -![Выбор каналов](../assets/setupSwitch.jpg) +![Выбор каналов](assets/setupSwitch.jpg) ### 9. Калибровка пульта Начинаем процедуру калибровки 1. Нажимаем кнопку Calibrate -2. Устанавливаем триммеры Throttle, Yaw, Pitch, Roll в 0. - * Триммеры позволяют задавать смещение коптеру. +2. Устанавливаем триммеры Throttle, Yaw, Pitch, Roll в 0. + * Триммеры позволяют задавать смещение коптеру. * Чтобы установить один из триммеров в 0, необходимо на пульте переместить указатель в центр до длительного звукового сигнала (писка) 3. Жмем ОК -![Калибровка пульта Начало](../assets/calibrateViewStart.jpg) +![Калибровка пульта Начало](assets/calibrateViewStart.jpg) 4. Переводим Левый стик (газ) (throttle) в минимум и кликаем Next -5. Калибровка каналов управления (throttle, yaw, pitch, roll). +5. Калибровка каналов управления (throttle, yaw, pitch, roll). Повторяем движения стиками вслед за анимацией и читаем подсказки. -6. Калибровка переключателей. - При появлении надписи Move all transmitter switches and/or dials back and forth to their extreme positions переключаем SwA..SwD, VrA, VrB в их конечные положения. +6. Калибровка переключателей. + При появлении надписи Move all transmitter switches and/or dials back and forth to their extreme positions переключаем SwA..SwD, VrA, VrB в их конечные положения. Кликаем Next 7. Сохранение параметров. При появлении надписи "All settings have been captured. Click Next to write the new parameters to your board" Кликаем Next - + 8. Калибровка пульта завершена! -![Калибровка пульта](../assets/calibrateView.jpg) +![Калибровка пульта](assets/calibrateView.jpg) ### 10. Калибровка акселерометра @@ -124,13 +124,13 @@ 1. Заходим в меню Sensors > Accelerometer 2. Поскольку направление Pixhawk совпадает с носом БПЛА, то выбираем Autopilot Orientation: ROTATION_NONE Кликаем OK - - ![Калибровка акселерометра](../assets/calibrateaxcelstart.jpg) - + + ![Калибровка акселерометра](assets/calibrateaxcelstart.jpg) + 3. Начинаем калибровку: Последовательно располагаем БПЛА как на картинках, когда Pixhawk захватит положение, вокруг картинки появится желтая рамка - удерживаем в этом положении БПЛА до переключения в зеленую рамку - ![Калибровка акселерометра процесс](../assets/calibrateaxcel.jpg) + ![Калибровка акселерометра процесс](assets/calibrateaxcel.jpg) ### 11. Калибровка компаса @@ -142,24 +142,24 @@ * Выбираем ориентацию БПЛА как на картинке и ждем, когда Pixhawk определит положение БПЛА, появится желтая рамка и надпись "Rotate" * Вращаем БПЛА как на картинке до появления зеленой рамки - Pixhawk откалибровал компас по данной оси. -![Калибровка компаса](../assets/calibratecompass.jpg) +![Калибровка компаса](assets/calibratecompass.jpg) + - ### 12. Калибровка гироскопа 1. Заходим в меню Sensors > Gyroscope 2. Устанавливаем БПЛА на ровную поверхность и кликаем OK -Ждем окончания калибровки. +Ждем окончания калибровки. -![Калибровка компаса](../assets/calibrategyro.jpg) +![Калибровка компаса](assets/calibrategyro.jpg) ##### Во время калибровки БПЛА не должен менять своего положения, шататься и т.д. - + ### 13. Полетные режимы 1. Заходим в меню Flight Modes -2. Устанавливаем переключатель каналов на переключатель SwC (Channel 5) +2. Устанавливаем переключатель каналов на переключатель SwC (Channel 5) Mode channel - Channel 5 3. Переключая SwC, текущий режим подсвечивается желтым цветом. 4. Назначаем полетные режимы: @@ -167,12 +167,12 @@ * Flight Mode 4: Altitude * Flight Mode 6: Hold 5. Отображение текущего полетного режима -6. Аварийное отключение моторов ставим на переключатель SwA (Channel 6). +6. Аварийное отключение моторов ставим на переключатель SwA (Channel 6). Kill switch - Channel 6 -![Полетные режимы](../assets/flightModes.jpg) - - +![Полетные режимы](assets/flightModes.jpg) + + ### 14. Отключение Safety Switch В полетном контроллере PIXHAWK стоит защита моторов от случайного использования. @@ -183,11 +183,11 @@ 3. Сохраняем значения, кликая по кнопке Save 4. Повторяем установку максимальных значений для всех параметров, кроме CBRK_RATE_CTRL и CBRK_VELPOSERR -![Отключение кнопки безопасности](../assets/turnoffSafetyswitch.jpg) - - +![Отключение кнопки безопасности](assets/turnoffSafetyswitch.jpg) + + ### 15. Калибровка регуляторов - + 1. Заходим в меню Power 2. Устанавливаем количество банок Number of cells - 4S 3. Устанавливаем параметр Full Voltage (per cell) - 4.20V @@ -199,17 +199,17 @@ 4. Проверяем, что АКБ не подключена и пропеллеры сняты Нажимаем Calibrate -![Калибровка регуляторов](../assets/calibrateESC.jpg) +![Калибровка регуляторов](assets/calibrateESC.jpg) + - ### 16. Настройка PID - регулятора - - Если во время полета, квадрокоптер имеет осцилляции (колебания) и в связи с этим не может корректно летать, то необходимо провести ![подстройку коэффициентов ПИД - регулятора](../notes/calibratePID.md) - + + Если во время полета, квадрокоптер имеет осцилляции (колебания) и в связи с этим не может корректно летать, то необходимо провести ![подстройку коэффициентов ПИД - регулятора](../notes/calibratePID.md) + По умолчанию для квадрокоптера Клевер 2 используются следующие коэффициенты: 1. Заходим в меню Parameters > Multicopter Attitude Control 2. Устанавливаем выделенные значения параметров ПИД регулятора для углов Roll и Pitch: - + * MC_PITCHRATE_P: 0.145 * MC_PITCHRATE_I: 0.050 * MC_PITCHRATE_D: 0.0025 @@ -218,11 +218,11 @@ * MC_ROLLRATE_I: 0.050 * MC_ROLLRATE_D: 0.0025 -![Коэффициенты ПИД-регулятора](../assets/calibratePIDparams.jpg) +![Коэффициенты ПИД-регулятора](assets/calibratePIDparams.jpg) ## ИНСТРУКЦИЯ ПО БЕЗОПАСНОСТИ - + #### Безопасность при подготовке к вылету * Убедиться, что Li-ion аккумуляторы заряжены. @@ -237,9 +237,9 @@ * Располагать зрителей за спиной пилота или за линией, проходящей через оба плеча пилота за спиной пилота. * Не допускать выхода зрителей в полусферу перед лицом пилота. -* Знать и помнить время полёта, на которое рассчитан данный коптер и его аккумулятор. +* Знать и помнить время полёта, на которое рассчитан данный коптер и его аккумулятор. -* ДО подключения Li-ion аккумулятора включить аппаратуру управления (пульт), перевести левый стик (газ) в нулевое положение. +* ДО подключения Li-ion аккумулятора включить аппаратуру управления (пульт), перевести левый стик (газ) в нулевое положение. * Подключать Li-ion аккумулятор только перед взлётом, отключать сразу после взлёта. * Стоять на расстоянии не менее 3 м от коптера. * Взлетать с земли с ровной площадки, на расстоянии не менее 3 метров от препятствий. @@ -249,13 +249,13 @@ * Выполнять все указания преподавателя или лётного инструктора. * Заранее обозначить зону пилотажа. Летать только в обозначенной зоне и не допускать вылета за её пределы. Не залетать за собственную спину. * При обучении полётам летать на уровне ниже собственного роста. -* Летать рядом с собой на расстоянии, на котором вам видна ориентация коптера в пространстве. Не улетать далеко от себя. В случае сомнений в ориентации коптера немедленно выполнить посадку на месте. Не пытаться взлететь. Подойти ближе к коптеру и выполнить взлёт. -* При управлении все движения стиками выполнять аккуратно и плавно. Не допускать резких движений. При необходимости изменить направление полёта двигать стиками следует энергично, но не резко. +* Летать рядом с собой на расстоянии, на котором вам видна ориентация коптера в пространстве. Не улетать далеко от себя. В случае сомнений в ориентации коптера немедленно выполнить посадку на месте. Не пытаться взлететь. Подойти ближе к коптеру и выполнить взлёт. +* При управлении все движения стиками выполнять аккуратно и плавно. Не допускать резких движений. При необходимости изменить направление полёта двигать стиками следует энергично, но не резко. “РЕЗКИЕ движения стиками ЗАПРЕЩАЮТСЯ. Движения стиками В КРАЯ ЗАПРЕЩАЮТСЯ.” -* Летать следует осторожно и выполнять только те элементы, в которых нет сомнений. Запрещается выполнять фигуры пилотажа, в успехе которых возникают сомнения и фигуры, связанные с риском. -* Соблюдать скоростной режим. Скорость полёта коптера держать в пределах скорости идущего человека. +* Летать следует осторожно и выполнять только те элементы, в которых нет сомнений. Запрещается выполнять фигуры пилотажа, в успехе которых возникают сомнения и фигуры, связанные с риском. +* Соблюдать скоростной режим. Скорость полёта коптера держать в пределах скорости идущего человека. * Вернуть коптер к месту посадки к рассчитанному времени, не допускать полной разрядки аккумулятора в полёте. * Посадку выполнять только на ровную открытую площадку вдали от препятствий @@ -280,9 +280,9 @@ 2. Отключить Li-ion аккумулятор на коптере. 3. Выключить пульт. -"" +"" ===================== - + 3. Залить прошивку PX4 последней версии. Для полетов в помещении на клевере – вариант с эстимейтором LPE. TODO @@ -298,4 +298,4 @@ TODO 7. Включить land detector (если необходим режим AUTO.LAND), изменив значения параметра COM_DISARM_LAND. Подробнее: https://dev.px4.io/en/tutorials/land_detector.html -Далее: [Подключение Raspberry Pi к PixHawk](/docs/connection.md). +Далее: [Подключение Raspberry Pi к PixHawk](connection.md). diff --git a/docs/simple_offboard.md b/docs/simple_offboard.md index 3033cf61..56c0df8c 100644 --- a/docs/simple_offboard.md +++ b/docs/simple_offboard.md @@ -1,16 +1,16 @@ Simple offboard === -Модуль `simple_offboard` пакета `clever` предназначен для упрощенного программирования автономного дрона (режим `OFFBOARD`). Он позволяет устанавливать желаемые полетные задачи и автоматически трансформирует [систему координат](/docs/frames.md). +Модуль `simple_offboard` пакета `clever` предназначен для упрощенного программирования автономного дрона (режим `OFFBOARD`). Он позволяет устанавливать желаемые полетные задачи и автоматически трансформирует [систему координат](frames.md). -`simple_offboard` является высокоуровневым способом взаимодействия с полетным контроллером. Для более низкоуровневой работы см. [mavros](/docs/mavros.md). +`simple_offboard` является высокоуровневым способом взаимодействия с полетным контроллером. Для более низкоуровневой работы см. [mavros](mavros.md). -Основные сервисы – `get_telemetry` (получение всей телеметрии разом), `navigate` (полет в заданную точку по прямой), `land` (переход в режим посадки). +Основные сервисы – `get_telemetry` (получение всей телеметрии), `navigate` (полет в заданную точку по прямой), `navigate_global` (полет в глобальную точку по прямой), `land` (переход в режим посадки). Общие для сервисов параметры: -* `auto_arm` = `true`/`false` – перевести коптер в OFFBOARD и заармить автоматически (**коптер взлетит, если находится на полу!**) -* `frame_id` — система координат в TF2, в которой заданы координаты и рысканье (yaw), [описание систем координат](/docs/frames.md); +* `auto_arm` = `true`/`false` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**) +* `frame_id` — система координат в TF2, в которой заданы координаты и рысканье (yaw), [описание систем координат](frames.md); * `update_frame` — считать ли систему координат изменяющейся (например, `false` для `local_origin`, `fcu`, `fcu_horiz`, `true` для `marker_map`); * `x`, `y` – горизонтальные координаты в системе координат `frame_id`; * `z` — высота в системе координат `frame_id`; @@ -24,14 +24,14 @@ Simple offboard Использование из языка Python --- -Пример программы, объявляющей прокси ко всем сервисам: +Для использования сервисов, необходимо создать объекты-прокси к ним. Пример программы, объявляющей прокси ко всем сервисам `simple_offboard`: ```python import rospy from clever import srv from std_srvs.srv import Trigger -rospy.init_node('foo') +rospy.init_node('foo') # название вашей ROS-ноды # Создаем прокси ко всем сервисам: @@ -39,7 +39,6 @@ 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_position_global = rospy.ServiceProxy('set_position_global', srv.SetPositionGlobal) set_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity) set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude) set_rates = rospy.ServiceProxy('set_rates', srv.SetRates) @@ -49,39 +48,50 @@ release = rospy.ServiceProxy('release', Trigger) Неиспользуемые фукнции-прокси можно удалить из кода. -Список сервисов +Описание API --- ### get_telemetry -Получить полную телеметрию коптера. Параметр: `frame_id` – фрейм для значений `x`, `y`, `z`, `vx`, `vy`, `vz`. Пример: `local_origin`, `fcu_horiz`, `aruco_map`. +Получить полную телеметрию коптера. -Ответ: +Параметры: -* `frame_id` – фрейм -* `connected` – есть ли подключение к FCU -* `armed` – состояние `armed` винтов (винты включены, если true) -* `mode` - текущий [полетный режим](/docs/modes.md) -* `x, y, z` – позиция коптера в системе координат `frame_id` -* `lat, lon` – текущая широта и долгота (при наличии [gps](/docs/gps.md)) -* `vx, vy, vz` – скорость коптера -* `pitch` – угол по тангажу (радианы) -* `roll` – угол по крену (радианы) -* `yaw` – угол по рысканью в фрейме `frame_id` -* `pitch_rate` – угловая скорость по тангажу -* `roll_rate` – угловая скорость по крену -* `yaw_rate` – угловая скорость по рысканью -* `voltage` – общее напряжение аккумулятор -* `cell_voltage` – напряжение аккумулятора на ячейку +* `frame_id` – [фрейм](frames.md) для значений `x`, `y`, `z`, `vx`, `vy`, `vz`. Пример: `local_origin`, `fcu_horiz`, `aruco_map`. -Пример. Вывести координаты x, y и z коптера в локальной системе координат: +Формат ответа: + +* `frame_id` – фрейм; +* `connected` – есть ли подключение к FCU; +* `armed` – состояние `armed` винтов (винты включены, если true); +* `mode` - текущий [полетный режим](modes.md); +* `x, y, z` – локальная позиция коптера; +* `lat, lon` – широта, долгота (при наличии [gps](gps.md)); +* `vx, vy, vz` – скорость коптера; +* `pitch` – угол по тангажу (радианы); +* `roll` – угол по крену (радианы); +* `yaw` – угол по рысканью в фрейме `frame_id`; +* `pitch_rate` – угловая скорость по тангажу (*work in progress*); +* `roll_rate` – угловая скорость по крену (*work in progress*); +* `yaw_rate` – угловая скорость по рысканью (*work in progress*); +* `voltage` – общее напряжение аккумулятора; +* `cell_voltage` – напряжение аккумулятора на ячейку; + +Вывод координат `x`, `y` и `z` коптера в локальной системе координат: ```python telemetry = get_telemetry() print telemetry.x, telemetry.y, telemetry.z ``` -Вывод текущей телеметрии из командной строки: +Вывод высоты коптера относительно [карты ArUco-меток](aruco.md): + +```python +telemetry = get_telemetry(frame_id='aruco_map') +print telemetry.z +``` + +Вывод текущей телеметрии (командная строка): ```bash rosservice call /get_telemetry "{frame_id: ''}" @@ -93,41 +103,53 @@ rosservice call /get_telemetry "{frame_id: ''}" Параметры: -* `x`, `y`, `z` – координаты в системе `frame_id` -* `yaw` – угол по рысканью -* `yaw_rate` – угловая скорость по рысканью (при установке yaw в NaN) -* `speed` – скорость полета (скорость движения setpoint) -* `frame_id`, `update_frame`, `auto_arm`. +* `x`, `y`, `z` – координаты в системе `frame_id`; +* `yaw` – угол по рысканью; +* `yaw_rate` – угловая скорость по рысканью (при установке yaw в `NaN`); +* `speed` – скорость полета (скорость движения setpoint); +* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**); +* `frame_id`, `update_frame`. -Примеры: +Взлететь на высоту 1.5 м со скоростью взлета 0.5 м/с: ```python -# плавно взлететь на высоту 1.5 м со скоростью взлета 0.5 м/с navigate(x=0, y=0, z=1.5, speed=0.5, frame_id='fcu_horiz', auto_arm=True) ``` +Прилететь по прямой в точку 5:0 (высота 2) в локальной системе координат со скоростью 0.8 м/с: + ```python -# прилететь по прямой в точку 5:0 (высота 2) -# в локальной системе координат со скоростью 0.8 м/с navigate(x=5, y=0, z=3, speed=0.8) ``` +Пролететь вправо относительно коптера на 3 м: ```python -# пролететь вправо относительно коптера на 3 м navigate(x=0, y=-1, z=0, speed=1, frame_id='fcu_horiz') ``` +Прилететь в точку 3:2 (высота 2) в системе координат [маркерного поля](aruco.md) со скоростью 1 м/с: + ```python -# прилететь в точку 3:2 (высота 2) в системе координат маркерного поля -# со скоростью 1 м/с navigate(x=3, y=2, z=2, speed=1, frame_id='aruco_map', update_frame=True) ``` -Пример взлета на коптере на 2 метра из командной строки: +Вращение на месте со скоростью 0.5 рад/c: + +```python +navigate(x=0, y=0, z=0, yaw=float('nan'), yaw_rate=0.5, frame_id='fcu_horiz') +``` + +Пролететь вперед 3 метра со скоростью 0.5 м/с, вращаясь по рысканью со скоростью 0.2 рад/с: + +```python +navigate(x=3, y=0, z=0, speed=0.5, yaw=float('nan'), yaw_rate=0.2, frame_id='fcu_horiz') +``` + +Взлететь на высоту 2 м (командная строка): ```bash -rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, speed: 0.5, frame_id: 'fcu_horiz', update_frame: false, auto_arm: true}" +rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, yaw_rate: 0.0, speed: 0.5, frame_id: 'fcu_horiz', update_frame: false, auto_arm: true}" ``` ### navigate_global @@ -141,15 +163,10 @@ rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, speed: 0.5, frame_id * `lat`, `lon` – широта и долгота; * `z` – высота в системе координат `frame_id`; * `yaw` – угол по рысканью; -* `yaw_rate` – угловая скорость по рысканью (при установке yaw в NaN); +* `yaw_rate` – угловая скорость по рысканью (при установке yaw в `NaN`); * `speed` – скорость полета (скорость движения setpoint); -* `frame_id`, `update_frame`, `auto_arm`. - -Объявление прокси к сервису: - -```python -navigate_global = rospy.ServiceProxy('/navigate_global', srv.NavigateGlobal) -``` +* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**); +* `frame_id`, `update_frame`. Полет в глобальную точку по прямой (оставаясь на текущей высоте): @@ -157,15 +174,17 @@ navigate_global = rospy.ServiceProxy('/navigate_global', srv.NavigateGlobal) navigate_global(lat=55.707033, lon=37.725010, z=0, frame_id='fcu_horiz') ``` -Пример полета в глобальную точку из командной строки: +Полет в глобальную точку (командная строка): ```bash -rosservice call /navigate_global "{lat: 55.707033, lon: 37.725010, z: 0.0, yaw: 0.0, speed: 3.0, frame_id: 'fcu_horiz', update_frame: false, auto_arm: false}" +rosservice call /navigate_global "{lat: 55.707033, lon: 37.725010, z: 0.0, yaw: 0.0, yaw_rate: 0.0, speed: 3.0, frame_id: 'fcu_horiz', update_frame: false, auto_arm: false}" ``` ### set_position -Установить цель по позиции и рысканью. +Установить цель по позиции и рысканью. Данный сервис следует использовать при необходимости задания продолжающегося потока целевых точек, например, для полета по сложным траекториям (круговой, дугообразной и т. д.). + +> **Hint** Для полета на точку по прямой или взлета используйте более высокоуровневый сервис `navigate`. Параметры: @@ -173,29 +192,19 @@ rosservice call /navigate_global "{lat: 55.707033, lon: 37.725010, z: 0.0, yaw: * `yaw` – угол по рысканью; * `yaw_rate` – угловая скорость по рысканью (при установке yaw в NaN); * `speed` – скорость полета (скорость движения setpoint); -* `frame_id`, `update_frame`, `auto_arm`. +* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**); +* `frame_id`, `update_frame`. -> **Hint** Для полета на точку по прямой или взлета используйте более высокоуровневый сервис `navigate`. - -Задание позиции относительно текущей позиции коптера: +Назначить целевую точку на 3 м выше текущей позиции: ```python -set_position(x=0, y=0, z=3, frame_id='fcu_horiz', auto_arm=true) # взлет на 3 метра +set_position(x=0, y=0, z=3, frame_id='fcu_horiz') ``` -```python -set_position(x=1, y=0, z=0, frame_id='fcu_horiz') # пролететь вперед на 1 метр -``` +Назначить целевую точку на 1 м впереди текущей позиции: ```python -set_position(x=0, y=-1, z=0, frame_id='fcu_horiz') # пролететь вправо на 1 метр -``` - -Задание позиции относительно системы маркеров -(фрейм `aruco_map` не будет опубликован, пока коптер хоть раз не увидит один из маркеров): - -```python -set_position(x=2, y=2, z=3, frame_id='aruco_map', update_frame=True) # полет в координату 2:2, высота 3 метра +set_position(x=1, y=0, z=0, frame_id='fcu_horiz') ``` Вращение на месте со скоростью 0.5 рад/c: @@ -211,11 +220,10 @@ set_position(x=0, y=0, z=0, frame_id='fcu_horiz', yaw=float('nan'), yaw_rate=0.5 * `vx`, `vy`, `vz` – требуемая скорость полета; * `yaw` – угол по рысканью; * `yaw_rate` – угловая скорость по рысканью (при установке yaw в NaN); -* `frame_id`, `update_frame`, `auto_arm`. +* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**); +* `frame_id`, `update_frame`. -> **Note** Параметр `frame_id` влияет только на ориентацию результирующего вектора скорости, но не на его длину. - -Параметры: vx, vy, vz, yaw, frame_id, update_frame +> **Note** Параметр `frame_id` определяет только ориентацию результирующего вектора скорости, но не его длину. Полет вперед (относительно коптера) со скоростью 1 м/с: @@ -223,7 +231,7 @@ set_position(x=0, y=0, z=0, frame_id='fcu_horiz', yaw=float('nan'), yaw_rate=0.5 set_velocity(vx=1, vy=0.0, vz=0, frame_id: 'fcu_horiz') ``` -Полет по кругу: +Один из вариантов полета по кругу: ```python set_velocity(vx=0.2, vy=0.0, vz=0, yaw=float('nan'), yaw_rate=0.5, frame_id: 'fcu_horiz', update_frame: True) @@ -231,42 +239,32 @@ set_velocity(vx=0.2, vy=0.0, vz=0, yaw=float('nan'), yaw_rate=0.5, frame_id: 'fc ### set_attitude -Установить тангаж, крен, рысканье и уровень газа. +Установить тангаж, крен, рысканье и уровень газа (примерный аналог управления в [режиме `STABILIZED`](modes.md)). Данный сервис может быть использован для более низкоуровнего контроля поведения коптера либо для управления коптером при отсутствии источника достоверных данных о его позиции. -> **Note** Параметр `frame_id` определяет систему координат, в которой задается `yaw`. +> **Note** Параметр `frame_id` определяет только систему координат, в которой задается рысканье (`yaw`). Параметры: * `pitch`, `roll`, `yaw` – необходимый угол по тангажу, крену и рысканью (рад.); * `thrust` – уровень газа от 0 (нет газа) до 1 (полный газ); +* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**); * `frame_id`, `update_frame`. ### set_rates -Установить угловые скорости по тагажу, крену и рысканью и уровень газа. +Установить угловые скорости по тагажу, крену и рысканью и уровень газа (примерный аналог управления в [режиме `ACRO`](modes.md). Это самый низкий уровень управления коптером (исключая непосредственный контроль оборотов моторов). Данный сервис может быть использован для автоматического выполнения акробатических трюков (например, флипа). Параметры: -* pitch_rate, roll_rate, yaw_rate – угловая скорость по танажу, крену и рыканью (рад/с); -* thrust – уровень газа от 0 (нет газа) до 1 (полный газ). +* `pitch_rate`, `roll_rate`, `yaw_rate` – угловая скорость по танажу, крену и рыканью (рад/с); +* `thrust` – уровень газа от 0 (нет газа) до 1 (полный газ). +* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**); -### release +### land -Перестать публиковать sepoint'ы коптеру (отпустить управление). -Возможно продолжение управления средствами [MAVROS](/docs/mavros.md), [Веб-пультом управления](/docs/web_rc.md). +Перевести коптер в [режим](modes.md) посадки (`AUTO.LAND` или аналогичный). -Посадка -------- - -> **Info** Образ версии >0.5. - -Для посадки можно использовать сервис `/land`. При вызове сервиса коптер автоматически переведется в [режим](/docs/modes.md) `AUTO.LAND` (или аналогичный). - -Объявление прокси к сервису: - -```python -land = rospy.ServiceProxy('/land', Trigger) -``` +> **Note** Для автоматического отключения винтов после посадки PX4-параметр `COM_DISARM_LAND` должен быть установлен в значение > 0. Посадка коптера: @@ -278,26 +276,18 @@ if res.success: # ... ``` -Пример использования сервиса из командной строки: +Посадка коптера (командная строка): ```bash rosservice call /land "{}" ``` -> **Note** Для автоматического отключения винтов после посадки PX4-параметр `COM_DISARM_LAND` должен быть установлен в значение > 0. +### release -В предущих версиях для посадки необходимо перевести коптер в режим ``AUTO.LAND``, используя mavros. +Перестать публиковать setpoint'ы коптеру (отпустить управление). Необходим для продолжения контроля средствами [MAVROS](mavros.md). -```python -from mavros_msgs.srv import SetMode +Дополнительные материалы +------------------------ -# ... - -set_mode = rospy.ServiceProxy('/mavros/set_mode', SetMode) # объявляем прокси к сервису переключения режимов - -# ... - -set_mode(base_mode=0, custom_mode='AUTO.LAND') # включаем режим посадки -``` - -Для полетов в поле ArUco-макеров см. [навигация по ArUco](/docs/aruco.md). +* [Полеты в поле ArUco-макеров](aruco.md). +* [Примеры программ и сниппеты](snippets.md). diff --git a/docs/snippets.md b/docs/snippets.md index 1eb7a09f..d5c25fb2 100644 --- a/docs/snippets.md +++ b/docs/snippets.md @@ -4,7 +4,7 @@ Python --- -Функция определения расстяния между двумя точками (**важно**: точки должны быть в одной [системе координат](/docs/frames.md)): +Функция определения расстяния между двумя точками (**важно**: точки должны быть в одной [системе координат](frames.md)): ```python def get_distance(x1, y1, z1, x2, y2, z2): diff --git a/docs/ssh.md b/docs/ssh.md index 9e2c8c99..4082057e 100644 --- a/docs/ssh.md +++ b/docs/ssh.md @@ -1,7 +1,7 @@ Доступ по SSH к Raspberry Pi === -На [образе для RPi](/docs/microsd_images.md) преднастроен доступ по SSH для редактирования файлов, загрузки данных и запуска программ. +На [образе для RPi](microsd_images.md) преднастроен доступ по SSH для редактирования файлов, загрузки данных и запуска программ. Для доступа к Raspberry Pi на Клевере по SSH из Linux или macOS необходимо запустить Терминал и выполнить команду: diff --git a/docs/tb.md b/docs/tb.md index ea83326e..14765728 100644 --- a/docs/tb.md +++ b/docs/tb.md @@ -7,16 +7,16 @@ 1. Привести в порядок рабочее место, ничего не должно мешать процессу. Рабочее место должно быть хорошо освещено. 2. Паяльник, находящийся в рабочем состоянии, установить в зоне действия местной вытяжной вентиляции, в специальную подставку. -![stand](/assets/stand.jpg) +![stand](assets/stand.jpg) Во время пайки: 1. Паяльник следует держать только за ручку, так как жало имеет высокую температуру. -![keep](/assets/keep.png) +![keep](assets/keep.png) 2. Для перемещения изделий применять специальные инструменты (пинцеты, клещи или другие инструменты), обеспечивающие безопасность при пайке. 3. Во избежание ожогов расплавленным припоем при распайке не выдергивать резко с большим усилием паяемые провода. 4. При пайке мелких и подвижных изделий пользоваться специальным держателем. -![helphand](/assets/helphand.jpg) +![helphand](assets/helphand.jpg) 5. Паяльник переносить за корпус, а не за провод или рабочую часть. При перерывах в работе паяльник отключать от электросети. **При обнаружении неисправной работы паяльника или возникновении возгорания отключить его от питающей электросети.** diff --git a/docs/testConnection.md b/docs/testConnection.md index 5e131548..b2957634 100644 --- a/docs/testConnection.md +++ b/docs/testConnection.md @@ -12,7 +12,7 @@ * Проверить работу мультиметра путем замыкания щупов между собой. При корректной работе прибор издаст характерный звук. * Попарно красный щуп прикладывается к “+ ”контакту, черный к “-” / ”GND”. Если в цепи есть короткое замыкание, издается звук. -1[Режим прозвонки](../assets/startPDBtest.jpg) +1[Режим прозвонки](assets/startPDBtest.jpg) 1. Прозвонить следующие цепи на НЕЗАМКНУТОСТЬ (отсутствие звукового сигнала мультиметра): diff --git a/docs/web_rc.md b/docs/web_rc.md index 01ddcef2..dcf9d362 100644 --- a/docs/web_rc.md +++ b/docs/web_rc.md @@ -24,11 +24,11 @@ sudo systemctl restart clever При отстутствии соединения, интерфейс будет заблокирован для управления. -![](/assets/webrc_no_connection.png) +![](assets/webrc_no_connection.png) После установления соединения интерфейс разблокируется. -![](/assets/webrc.png) +![](assets/webrc.png) В интефейсе доступны: @@ -64,7 +64,7 @@ sudo systemctl restart clever * объединяет одинаковые сообщения в один, с указанием количества повторений * открывается нажатием на всплывающее уведомление или кнопку уведомлений на верхней панели -![](/assets/webrc_notifications.png) +![](assets/webrc_notifications.png) ## Контролы 🎮 @@ -87,7 +87,7 @@ sudo systemctl restart clever ⚠️ _Не запрашивается когда дрон уже в режиме OFFBOARD или когда активен хотя бы один жест._ -![](/assets/webrc_offboarding.gif) +![](assets/webrc_offboarding.gif) Все этапы переключения дрона в режим OFFBOARD отражаются соответствующим цветом контрола @@ -109,7 +109,7 @@ sudo systemctl restart clever * ARM – в правом нижнем углу * DISARM – в левом нижнем углу -![](/assets/webrc_arm_disarm.gif) +![](assets/webrc_arm_disarm.gif) Бандл так же следит за тем, что бы данные в топик публиковались непрерывно. Если пользователь остановил пальцы или отпустил контролы, то бандл продолжит публиковать данные с некой минимальной периодичностью, во избежание выпадания дрона из OFFBOARD. diff --git a/docs/web_video_server.md b/docs/web_video_server.md index 2a9e6f5b..5c9741eb 100644 --- a/docs/web_video_server.md +++ b/docs/web_video_server.md @@ -1,6 +1,6 @@ # Просмотр изображений с камер -Для просмотра изображений с камер можно воспользовться [rviz](/docs/rviz.md), rqt, или смотреть их через браузер, используя web\_video\_server. +Для просмотра изображений с камер можно воспользовться [rviz](rviz.md), rqt, или смотреть их через браузер, используя web\_video\_server. ## Настройка diff --git a/docs/wifi.md b/docs/wifi.md index 2cd8f987..18ed87e1 100644 --- a/docs/wifi.md +++ b/docs/wifi.md @@ -1,7 +1,7 @@ Подключение к Клеверу по Wi-Fi === -На [образе для RPi](/docs/microsd_images.md) преднастроена раздача Wi-Fi с SSID `CLEVER-xxxx`, где xxxx – 4 случайных цифры, назначаемых при первом включении Raspberry Pi. +На [образе для RPi](microsd_images.md) преднастроена раздача Wi-Fi с SSID `CLEVER-xxxx`, где xxxx – 4 случайных цифры, назначаемых при первом включении Raspberry Pi. Пароль: `cleverwifi`. diff --git a/docs/zap.md b/docs/zap.md index 61df30a9..0ca99f12 100644 --- a/docs/zap.md +++ b/docs/zap.md @@ -10,7 +10,7 @@ 1. Нанести флюс на контактную площадку 2. Покрыть припоем контактную площадку -![Лужение площадок](../assets/zapPDBtest.jpg) +![Лужение площадок](assets/zapPDBtest.jpg) ## Лужение проводов @@ -22,4 +22,4 @@ 3. Нанести флюс на скрученные оголенные провода 4. Покрыть слоем припоя. -![Лужение проводов](../assets/zap.jpg) +![Лужение проводов](assets/zap.jpg) diff --git a/image/Jenkinsfile b/image/Jenkinsfile index 5ad1f845..6785b86c 100644 --- a/image/Jenkinsfile +++ b/image/Jenkinsfile @@ -2,14 +2,13 @@ pipeline { agent any stages { stage('Get image') { - agent any environment { RPI_DONWLOAD_URL = 'https://downloads.raspberrypi.org/raspbian_lite_latest' RPI_ZIP_NAME = 'raspbian_lite_latest.zip' RPI_IMAGE_NAME = '2017-11-29-raspbian-stretch-lite.img' } steps { - sh '$WORKSPACE/image/image-config.sh get_image $BUID_DIRECTORY $RPI_ZIP_NAME $RPI_DONWLOAD_URL $RPI_IMAGE_NAME $IMAGE_NAME' + sh "$WORKSPACE/image/image-config.sh get_image $BUILD_DIRECTORY $RPI_ZIP_NAME $RPI_DONWLOAD_URL $RPI_IMAGE_NAME $IMAGE_NAME" } } stage('Resize FS') { @@ -17,7 +16,7 @@ pipeline { SIZE = '7G' } steps { - sh '$WORKSPACE/image/image-config.sh resize_fs $SIZE $BUID_DIRECTORY $IMAGE_NAME $DEV_ROOTFS' + sh '$WORKSPACE/image/image-config.sh resize_fs $SIZE $BUILD_DIRECTORY $IMAGE_NAME $DEV_ROOTFS' } } stage('Configure interfaces') { @@ -25,7 +24,7 @@ pipeline { EXECUTE_FILE = 'iface.sh' } steps { - sh '$WORKSPACE/image/image-config.sh execute $BUID_DIRECTORY/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' + sh '$WORKSPACE/image/image-config.sh execute $BUILD_DIRECTORY/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' } } stage('Install Apps') { @@ -33,7 +32,7 @@ pipeline { EXECUTE_FILE = 'apps.sh' } steps { - sh '$WORKSPACE/image/image-config.sh execute $BUID_DIRECTORY/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' + sh '$WORKSPACE/image/image-config.sh execute $BUILD_DIRECTORY/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' } } stage('Install ROS') { @@ -41,7 +40,7 @@ pipeline { EXECUTE_FILE = 'ros.sh' } steps { - sh '$WORKSPACE/image/image-config.sh execute $BUID_DIRECTORY/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' + sh '$WORKSPACE/image/image-config.sh execute $BUILD_DIRECTORY/$IMAGE_NAME $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE' } } stage('Publish image') { @@ -49,12 +48,12 @@ pipeline { CONFIG_FILE = 'coex-ci.conf' } steps { - sh '$WORKSPACE/image/image-config.sh publish_image $BUID_DIRECTORY $IMAGE_NAME $WORKSPACE $CONFIG_FILE $RELEASE_ID $RELEASE_BODY' + sh '$WORKSPACE/image/image-config.sh publish_image $BUILD_DIRECTORY $IMAGE_NAME $WORKSPACE $CONFIG_FILE $RELEASE_ID $RELEASE_BODY' } } } environment { - BUID_DIRECTORY = '/home/pi/clever_builder/temp' + BUILD_DIRECTORY = '/home/pi/clever_builder/temp' PREFIX_PATH = '/mnt' DEV_BOOT = '/dev/disk/by-uuid/CDD4-B453' DEV_ROOTFS = '/dev/disk/by-uuid/72bfc10d-73ec-4d9e-a54a-1cc507ee7ed2' diff --git a/image/Jenkinsfile-build b/image/Jenkinsfile-build new file mode 100644 index 00000000..daa2180d --- /dev/null +++ b/image/Jenkinsfile-build @@ -0,0 +1,61 @@ +pipeline { + agent any + parameters { + string(name: 'IMAGE_NAME', defaultValue: 'CLEVER-JENKINS-FILE.img', description: 'IMAGE_NAME') + //string(name: 'WORKSPACE', defaultValue: '', description: 'WORKSPACE') + } + environment { + BUILD_DIRECTORY = '/home/pi/temp' + PREFIX_PATH = '/mnt' + DEV_BOOT = '/dev/disk/by-uuid/CDD4-B453' + DEV_ROOTFS = '/dev/disk/by-uuid/72bfc10d-73ec-4d9e-a54a-1cc507ee7ed2' + + DEBIAN_FRONTEND = 'noninteractive' + LANG = 'C.UTF-8' + LC_ALL = 'C.UTF-8' + } + stages { + stage('Get image') { + environment { + RPI_DONWLOAD_URL = 'https://downloads.raspberrypi.org/raspbian_lite_latest' + RPI_ZIP_NAME = 'raspbian_lite_latest.zip' + RPI_IMAGE_NAME = '2017-11-29-raspbian-stretch-lite.img' + } + steps { + sh "$WORKSPACE/image/image-config.sh get_image $BUILD_DIRECTORY $RPI_ZIP_NAME $RPI_DONWLOAD_URL $RPI_IMAGE_NAME ${params.IMAGE_NAME}" + } + } + stage('Resize FS') { + environment { + SIZE = '7G' + } + steps { + sh "$WORKSPACE/image/image-config.sh resize_fs $SIZE $BUILD_DIRECTORY ${params.IMAGE_NAME} $DEV_ROOTFS" + } + } + stage('Configure interfaces') { + environment { + EXECUTE_FILE = 'iface.sh' + } + steps { + sh "$WORKSPACE/image/image-config.sh execute $BUILD_DIRECTORY/${params.IMAGE_NAME} $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE" + } + } + stage('Install Apps') { + environment { + EXECUTE_FILE = 'apps.sh' + } + steps { + sh "$WORKSPACE/image/image-config.sh execute $BUILD_DIRECTORY/${params.IMAGE_NAME} $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE" + } + } + stage('Install ROS') { + environment { + EXECUTE_FILE = 'ros.sh' + } + steps { + sh "$WORKSPACE/image/image-config.sh execute $BUILD_DIRECTORY/${params.IMAGE_NAME} $PREFIX_PATH $DEV_ROOTFS $DEV_BOOT $WORKSPACE/image/$EXECUTE_FILE" + } + } + } +} diff --git a/image/Jenkinsfile-release b/image/Jenkinsfile-release new file mode 100644 index 00000000..7305b75c --- /dev/null +++ b/image/Jenkinsfile-release @@ -0,0 +1,35 @@ +pipeline { + agent any + parameters { + //string(name: 'GWBT_REPO_NAME', defaultValue: 'master', description: 'GWBT_REPO_NAME') + //string(name: 'GWBT_RELEASE_TAG_NAME', defaultValue: 'master', description: 'REPO') + //string(name: 'GWBT_RELEASE_PUBLISHED_AT', defaultValue: 'master', description: 'GWBT_RELEASE_PUBLISHED_AT') + //string(name: 'GWBT_RELEASE_ID', defaultValue: '', description: 'GWBT_RELEASE_ID') + //string(name: 'GWBT_RELEASE_BODY', defaultValue: '', description: 'GWBT_RELEASE_BODY') + string(name: 'IMAGE_NAME', defaultValue: "${params.GWBT_REPO_NAME}_${params.GWBT_RELEASE_TAG_NAME}_${params.GWBT_RELEASE_PUBLISHED_AT}.img", description: 'IMAGE_NAME') + //string(name: 'GWBT_TRIGGER', defaultValue: '', description: 'GWBT_TRIGGER') + booleanParam(name: 'ONLY_PUBLISH', defaultValue: false, description: 'ONLY PUBLISH') + //string(name: 'WORKSPACE', defaultValue: '', description: 'WORKSPACE') + } + environment { + BUILD_DIRECTORY = '/home/pi/temp' + } + stages { + stage('Build image') { + when { not { expression { return params.ONLY_PUBLISH } } } + steps { + build job: 'CopterExpress-clever-build', parameters: [[$class: 'StringParameterValue', name: 'IMAGE_NAME', value: "${params.IMAGE_NAME}"], [$class: 'StringParameterValue', name: 'GWBT_RELEASE_TAG_NAME', value: "${params.GWBT_RELEASE_TAG_NAME}"]] + sh "echo ${params.IMAGE_NAME}" + } + } + stage('Publish image') { + when { environment name: 'GWBT_TRIGGER', value: 'release' } + environment { + CONFIG_FILE = 'coex-ci.conf' + } + steps { + sh "$WORKSPACE/image/image-config.sh publish_image $BUILD_DIRECTORY ${params.IMAGE_NAME} $WORKSPACE $CONFIG_FILE ${params.GWBT_RELEASE_ID} ${params.GWBT_RELEASE_BODY}" + } + } + } +} diff --git a/image/Jenkinsfile-release-new b/image/Jenkinsfile-release-new new file mode 100644 index 00000000..cfb8c733 --- /dev/null +++ b/image/Jenkinsfile-release-new @@ -0,0 +1,56 @@ +pipeline { + agent any + parameters { + string(name: 'IMAGE_NAME', defaultValue: '', description: 'IMAGE_NAME') + string(name: 'GWBT_RELEASE_ID', defaultValue: '', description: 'GWBT_RELEASE_ID') + string(name: 'GWBT_RELEASE_BODY', defaultValue: '', description: 'GWBT_RELEASE_BODY') + } + stages { + stage('Zip image') { + steps { + echo 'Zip image' + sh "zip $BUILD_DIRECTORY/$IMAGE_NAME.zip $BUILD_DIRECTORY/$IMAGE_NAME" + echo 'End of Zipping' + } + } + stage('Upload image') { + environment { + CONFIG_FILE = 'coex-ci.conf' + } + steps { + echo 'Upload image' + parameters { + string(name: 'IMAGE_LINK', defaultValue: '$($WORKSPACE/image/yadisk.py $BUILD_DIRECTORY/$CONFIG_FILE $BUILD_DIRECTORY/$IMAGE_NAME.zip)', description: 'IMAGE_NAME') + } + echo 'End of Upload' + } + } + stage('Send image to TESTER') { + steps { + echo 'Send image' + sh "# TODO" + echo 'End of Send image' + } + } + stage('Burn to MicroSD') { + steps { + echo 'Start Burn' + sh "# dd of=/dev/sda if=$BUILD_DIRECTORY/$IMAGE_NAME" + echo 'End of Burn' + } + } + stage('Publish image') { + environment { + CONFIG_FILE = 'coex-ci.conf' + } + steps { + echo 'Start Publish' + sh "$WORKSPACE/image/git_release.py $BUILD_DIRECTORY/$CONFIG_FILE ${params.GWBT_RELEASE_ID} ${params.GWBT_RELEASE_BODY} $IMAGE_NAME $IMAGE_LINK $(du -sh $BUILD_DIRECTORY/$IMAGE_NAME.zip | awk '{ print $1 }')" + echo 'End of Publish' + } + } + } + environment { + BUILD_DIRECTORY = '/home/pi/temp' + } +} diff --git a/image/apps.sh b/image/apps.sh index 6a6139e6..961745dc 100755 --- a/image/apps.sh +++ b/image/apps.sh @@ -1,11 +1,13 @@ -#!/bin/bash +#!/bin/sh + +set -e ################################################################################################################################## # Установка необходимых программ ################################################################################################################################## -echo -e "\033[0;31m\033[1m$(date) | #1 apt update && apt upgrade\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #1 apt update && apt upgrade\033[0m\033[0m" # install bootstrap tools apt-get update @@ -13,9 +15,11 @@ apt-get update -echo -e "\033[0;31m\033[1m$(date) | #2 Install programs\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #2 Install programs\033[0m\033[0m" apt-get install --no-install-recommends -y \ + unzip \ + zip \ ipython \ screen \ byobu \ @@ -31,7 +35,7 @@ apt-get install --no-install-recommends -y \ -echo -e "\033[0;31m\033[1m$(date) | #3 Write to /etc/wpa_supplicant/wpa_supplicant.conf\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #3 Write to /etc/wpa_supplicant/wpa_supplicant.conf\033[0m\033[0m" echo " network={ @@ -46,7 +50,7 @@ network={ -echo -e "\033[0;31m\033[1m$(date) | #4 Write STATIC to /etc/dhcpcd.conf\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #4 Write STATIC to /etc/dhcpcd.conf\033[0m\033[0m" echo " interface wlan0 @@ -55,13 +59,13 @@ static ip_address=192.168.11.1/24" >> /etc/dhcpcd.conf -echo -e "\033[0;31m\033[1m$(date) | #5 Write iface to /etc/default/isc-dhcp-server\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #5 Write iface to /etc/default/isc-dhcp-server\033[0m\033[0m" # https://www.shellhacks.com/ru/sed-find-replace-string-in-file/ sed -i 's/INTERFACESv4=\"\"/INTERFACESv4=\"wlan0\"/' /etc/default/isc-dhcp-server -echo -e "\033[0;31m\033[1m$(date) | #6 Write dhcp declaration subnet to /etc/dhcp/dhcpd.conf\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #6 Write dhcp declaration subnet to /etc/dhcp/dhcpd.conf\033[0m\033[0m" echo "subnet 192.168.11.0 netmask 255.255.255.0 { @@ -76,7 +80,7 @@ echo "subnet 192.168.11.0 netmask 255.255.255.0 { -echo -e "\033[0;31m\033[1m$(date) | #7 Write start script for dhcpd to /etc/network/if-up.d/isc-dhcp-server\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #7 Write start script for dhcpd to /etc/network/if-up.d/isc-dhcp-server\033[0m\033[0m" echo "#!/bin/sh if [ \"\$IFACE\" = \"--all\" ]; @@ -87,7 +91,7 @@ fi -echo -e "\033[0;31m\033[1m$(date) | #8 Write magic script for rename SSID to /etc/rc.local\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #8 Write magic script for rename SSID to /etc/rc.local\033[0m\033[0m" RENAME_SSID="sudo sed -i.OLD \"s/CLEVER/CLEVER-\$(head -c 100 /dev/urandom | xxd -ps -c 100 | sed -e 's/[^0-9]//g' | cut -c 1-4)/g\" /etc/wpa_supplicant/wpa_supplicant.conf && sudo sed -i '/sudo sed/d' /etc/rc.local && sudo reboot" @@ -96,5 +100,5 @@ sed -i "19a$RENAME_SSID" /etc/rc.local -echo -e "\033[0;31m\033[1m$(date) | #9 End of install programs\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #9 End of install programs\033[0m\033[0m" diff --git a/image/iface.sh b/image/iface.sh index f4b1fb3b..deccb0fb 100755 --- a/image/iface.sh +++ b/image/iface.sh @@ -1,4 +1,6 @@ -#!/bin/bash +#!/bin/sh + +set -e ################################################################################################################################## # Настройка интерфейсов @@ -41,14 +43,14 @@ CONFIG=/boot/config.txt # 2. Изменить необходимые настройки # 2.1. Включить sshd -echo -e "\033[0;31m\033[1m$(date) | #11 Turn on sshd\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #11 Turn on sshd\033[0m\033[0m" touch /boot/ssh # 2.2. Включить GPIO # Включено по умолчанию # 2.3. Включить I2C -echo -e "\033[0;31m\033[1m$(date) | #12 Turn on I2C\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #12 Turn on I2C\033[0m\033[0m" set_config_var dtparam=i2c_arm on $CONFIG && if ! [ -e $BLACKLIST ]; then @@ -61,7 +63,7 @@ set_config_var dtparam=i2c_arm on $CONFIG && fi # 2.4. Включить SPI -echo -e "\033[0;31m\033[1m$(date) | #13 Turn on SPI\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #13 Turn on SPI\033[0m\033[0m" set_config_var dtparam=spi on $CONFIG && if ! [ -e $BLACKLIST ]; then @@ -70,7 +72,7 @@ set_config_var dtparam=spi on $CONFIG && sed $BLACKLIST -i -e "s/^\(blacklist[[:space:]]*spi[-_]bcm2708\)/#\1/" # 2.5. Включить raspicam -echo -e "\033[0;31m\033[1m$(date) | #14 Turn on raspicam\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #14 Turn on raspicam\033[0m\033[0m" get_config_var() { lua - "$1" "$2" < /etc/apt/sources.li -echo -e "\033[0;31m\033[1m$(date) | #2 apt update && apt upgrade\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #2 apt update && apt upgrade\033[0m\033[0m" # install bootstrap tools apt-get update @@ -35,7 +37,7 @@ apt-get update -echo -e "\033[0;31m\033[1m$(date) | #3 Install wget, unzip, python-rosdep, python-rosinstall-generator, python-wstool, python-rosinstall, build-essential, cmake\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #3 Install wget, unzip, python-rosdep, python-rosinstall-generator, python-wstool, python-rosinstall, build-essential, cmake\033[0m\033[0m" apt-get install --no-install-recommends -y \ wget \ @@ -50,7 +52,7 @@ apt-get install --no-install-recommends -y \ -echo -e "\033[0;31m\033[1m$(date) | #4 rosdep init && rosdep update\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #4 rosdep init && rosdep update\033[0m\033[0m" # bootstrap rosdep rosdep init && rosdep update @@ -58,7 +60,7 @@ rosdep init && rosdep update -echo -e "\033[0;31m\033[1m$(date) | #5 Prepare ros_comm packages to kinetic-ros_comm-wet.rosinstall\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #5 Prepare ros_comm packages to kinetic-ros_comm-wet.rosinstall\033[0m\033[0m" # create catkin workspace mkdir -p /home/pi/ros_catkin_ws && cd /home/pi/ros_catkin_ws \ @@ -67,22 +69,22 @@ mkdir -p /home/pi/ros_catkin_ws && cd /home/pi/ros_catkin_ws \ -echo -e "\033[0;31m\033[1m$(date) | #6 Install assimp-3.1.1 to /home/pi/ros_catkin_ws/external_src\033[0m\033[0m" +#echo "\033[0;31m\033[1m$(date) | #6 Install assimp-3.1.1 to /home/pi/ros_catkin_ws/external_src\033[0m\033[0m" # Unavailable Dependencies -mkdir -p /home/pi/ros_catkin_ws/external_src \ - && cd /home/pi/ros_catkin_ws/external_src \ - && wget http://sourceforge.net/projects/assimp/files/assimp-3.1/assimp-3.1.1_no_test_models.zip/download -O assimp-3.1.1_no_test_models.zip \ - && unzip assimp-3.1.1_no_test_models.zip \ - && cd assimp-3.1.1 \ - && cmake . \ - && make \ - && make install +#mkdir -p /home/pi/ros_catkin_ws/external_src \ +# && cd /home/pi/ros_catkin_ws/external_src \ +# && wget http://sourceforge.net/projects/assimp/files/assimp-3.1/assimp-3.1.1_no_test_models.zip/download -O assimp-3.1.1_no_test_models.zip \ +# && unzip assimp-3.1.1_no_test_models.zip \ +# && cd assimp-3.1.1 \ +# && cmake . -Wattributes \ +# && make \ +# && make install -echo -e "\033[0;31m\033[1m$(date) | #7 Prepare other ROS-packages to kinetic-custom_ros.rosinstall\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #7 Prepare other ROS-packages to kinetic-custom_ros.rosinstall\033[0m\033[0m" cd /home/pi/ros_catkin_ws \ && rosinstall_generator \ @@ -94,7 +96,7 @@ cd /home/pi/ros_catkin_ws \ -echo -e "\033[0;31m\033[1m$(date) | #8 Install dependencies apps with rosdep\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #8 Install dependencies apps with rosdep\033[0m\033[0m" # как я понял установка apt-get всяких зависимостей для ros-пакетов # Resolving Dependencies with rosdep @@ -104,7 +106,7 @@ cd /home/pi/ros_catkin_ws \ -echo -e "\033[0;31m\033[1m$(date) | #9 Refactor usb_cam in SRC\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #9 Refactor usb_cam in SRC\033[0m\033[0m" # добавление префикса с помощью двух define # #define PIX_FMT_RGB24 AV_PIX_FMT_RGB24 @@ -114,14 +116,14 @@ sed -i '/#define __STDC_CONSTANT_MACROS/a\#define PIX_FMT_RGB24 AV_PIX_FMT_RGB24 -echo -e "\033[0;31m\033[1m$(date) | #10 Install GeographicLib datasets\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #10 Install GeographicLib datasets\033[0m\033[0m" /home/pi/ros_catkin_ws/src/mavros/mavros/scripts/install_geographiclib_datasets.sh -echo -e "\033[0;31m\033[1m$(date) | #11 Build light packages on 2 threads\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #11 Build light packages on 2 threads\033[0m\033[0m" # Building the catkin Workspace cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2 --pkg actionlib actionlib_msgs angles async_web_server_cpp bond bond_core bondcpp bondpy camera_calibration_parsers camera_info_manager catkin class_loader cmake_modules cpp_common diagnostic_msgs diagnostic_updater dynamic_reconfigure eigen_conversions gencpp geneus genlisp genmsg gennodejs genpy geographic_msgs geometry_msgs geometry2 image_transport libmavconn mavlink mavros_msgs message_filters message_generation message_runtime mk nav_msgs nodelet orocos_kdl pluginlib python_orocos_kdl ros ros_comm rosapi rosauth rosbag rosbag_migration_rule rosbag_storage rosbash rosboost_cfg rosbridge_library rosbridge_server rosbridge_suite rosbuild rosclean rosconsole rosconsole_bridge roscpp roscpp_serialization roscpp_traits roscreate rosgraph rosgraph_msgs roslang roslaunch roslib roslint roslisp roslz4 rosmake rosmaster rosmsg rosnode rosout rospack rosparam rospy rospy_tutorials rosserial rosserial_client rosserial_msgs rosserial_python rosservice rostest rostime rostopic rosunit roswtf sensor_msgs smclib std_msgs std_srvs stereo_msgs tf tf2 tf2_bullet tf2_eigen tf2_geometry_msgs tf2_kdl tf2_msgs tf2_py tf2_ros tf2_sensor_msgs tf2_tools topic_tools trajectory_msgs urdf urdf_parser_plugin usb_cam uuid_msgs visualization_msgs xmlrpcpp @@ -129,39 +131,39 @@ cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -DC -echo -e "\033[0;31m\033[1m$(date) | #12 Build heavy packages\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #12 Build heavy packages\033[0m\033[0m" # Building the catkin Workspace cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j1 --pkg mavros opencv3 cv_bridge cv_camera mavros_extras web_video_server -echo -e "\033[0;31m\033[1m$(date) | #13 Create catkin_ws\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #13 Create catkin_ws\033[0m\033[0m" mkdir -p /home/pi/catkin_ws/src \ && cd /home/pi/catkin_ws \ - && source /opt/ros/kinetic/setup.bash \ + && . /opt/ros/kinetic/setup.sh \ && catkin init \ && wstool init /home/pi/catkin_ws/src -echo -e "\033[0;31m\033[1m$(date) | #14 Install CLEVER-BUNDLE\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #14 Install CLEVER-BUNDLE\033[0m\033[0m" cd /home/pi/catkin_ws/src \ && git clone https://github.com/CopterExpress/clever.git clever \ && pip install wheel \ && pip install -r /home/pi/catkin_ws/src/clever/clever/requirements.txt \ && cd /home/pi/catkin_ws \ - && source /opt/ros/kinetic/setup.bash \ + && . /opt/ros/kinetic/setup.sh \ && catkin_make -j1 \ && systemctl enable /home/pi/catkin_ws/src/clever/deploy/roscore.service \ && systemctl enable /home/pi/catkin_ws/src/clever/deploy/clever.service -echo -e "\033[0;31m\033[1m$(date) | #15 Add mjpg-streamer at /home/pi\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #15 Add mjpg-streamer at /home/pi\033[0m\033[0m" # https://github.com/jacksonliam/mjpg-streamer @@ -173,7 +175,7 @@ cd /home/pi \ -echo -e "\033[0;31m\033[1m$(date) | #16 Add ENV vars\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #16 Add ENV vars\033[0m\033[0m" # setup environment echo "LANG=C.UTF-8" >> /home/pi/.bashrc @@ -188,4 +190,4 @@ chown -Rf pi:pi /home/pi -echo -e "\033[0;31m\033[1m$(date) | #17 END of ROS INSTALLATION\033[0m\033[0m" +echo "\033[0;31m\033[1m$(date) | #17 END of ROS INSTALLATION\033[0m\033[0m"