diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..da7471f2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 + +[*.{py,cpp,h,swift,launch}] +indent_style = space +indent_size = 4 + +[*.{js,html}] +indent_style = tab diff --git a/apps/ios/cleverrc.xcodeproj/project.pbxproj b/apps/ios/cleverrc.xcodeproj/project.pbxproj index a11354c2..896d5a79 100644 --- a/apps/ios/cleverrc.xcodeproj/project.pbxproj +++ b/apps/ios/cleverrc.xcodeproj/project.pbxproj @@ -139,7 +139,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0920; + LastUpgradeCheck = 0930; ORGANIZATIONNAME = "Copter Express"; TargetAttributes = { 7C51653C20139237004D1F4D = { @@ -294,6 +294,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -301,6 +302,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -351,6 +353,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -358,6 +361,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; diff --git a/apps/ios/cleverrc.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/ios/cleverrc.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/apps/ios/cleverrc.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/Contents.json index dbbe908d..ea0141b6 100644 --- a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,95 +1,111 @@ { "images" : [ { - "idiom" : "iphone", "size" : "20x20", + "idiom" : "iphone", + "filename" : "cleverrc40.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "20x20", + "idiom" : "iphone", + "filename" : "clever60.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "clever58.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "clever87.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "clever80.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "clever120.png", "scale" : "3x" }, { "size" : "60x60", "idiom" : "iphone", - "filename" : "cleverios180.png", + "filename" : "clever120-1.png", "scale" : "2x" }, { "size" : "60x60", "idiom" : "iphone", - "filename" : "cleverios180-1.png", + "filename" : "clever180-1.png", "scale" : "3x" }, { - "idiom" : "ipad", "size" : "20x20", + "idiom" : "ipad", + "filename" : "clever20.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "20x20", + "idiom" : "ipad", + "filename" : "clever40.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "clever29.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "clever58-1.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "clever40-1.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "clever80-1.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "clever76.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "clever152.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "clever167.png", "scale" : "2x" }, { - "idiom" : "ios-marketing", "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "clever1024.png", "scale" : "1x" } ], diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever1024.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever1024.png new file mode 100644 index 00000000..18e6ddae Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever1024.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever120-1.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever120-1.png new file mode 100644 index 00000000..df88d16e Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever120-1.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever120.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever120.png new file mode 100644 index 00000000..df88d16e Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever120.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever152.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever152.png new file mode 100644 index 00000000..ac26ada9 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever152.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever167.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever167.png new file mode 100644 index 00000000..092ae2c0 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever167.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever180-1.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever180-1.png new file mode 100644 index 00000000..ede5637d Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever180-1.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever20.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever20.png new file mode 100644 index 00000000..a6efdbf2 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever20.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever29.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever29.png new file mode 100644 index 00000000..76a04760 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever29.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever40-1.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever40-1.png new file mode 100644 index 00000000..43736655 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever40-1.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever40.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever40.png new file mode 100644 index 00000000..43736655 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever40.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever58-1.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever58-1.png new file mode 100644 index 00000000..f5ef15a8 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever58-1.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever58.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever58.png new file mode 100644 index 00000000..f5ef15a8 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever58.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever60.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever60.png new file mode 100644 index 00000000..273f23c5 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever60.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever76.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever76.png new file mode 100644 index 00000000..1267cf82 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever76.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever80-1.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever80-1.png new file mode 100644 index 00000000..9cb96a3f Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever80-1.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever80.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever80.png new file mode 100644 index 00000000..9cb96a3f Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever80.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever87.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever87.png new file mode 100644 index 00000000..6510f9f1 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/clever87.png differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180-1.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180-1.png deleted file mode 100644 index ae590b79..00000000 Binary files a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180-1.png and /dev/null differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180.png deleted file mode 100644 index ae590b79..00000000 Binary files a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180.png and /dev/null differ diff --git a/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverrc40.png b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverrc40.png new file mode 100644 index 00000000..43736655 Binary files /dev/null and b/apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverrc40.png differ diff --git a/apps/ios/cleverrc/Info.plist b/apps/ios/cleverrc/Info.plist index 561d6a61..09e1c8a2 100644 --- a/apps/ios/cleverrc/Info.plist +++ b/apps/ios/cleverrc/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Clever RC + CLEVER RC CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.0 CFBundleVersion - 1 + 3 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/apps/ios/cleverrc/ViewController.swift b/apps/ios/cleverrc/ViewController.swift index 20329783..46c67b76 100644 --- a/apps/ios/cleverrc/ViewController.swift +++ b/apps/ios/cleverrc/ViewController.swift @@ -10,12 +10,13 @@ import UIKit import WebKit import SwiftSocket import NotificationBannerSwift +import AudioToolbox.AudioServices class ViewController: UIViewController, WKScriptMessageHandler { @IBOutlet weak var webView: WKWebView! let impactGenerator = UIImpactFeedbackGenerator(style: .medium) let notificationGenerator = UINotificationFeedbackGenerator() - let udpSocket = UDPClient(address:"255.255.255.255", port: 35602) + let udpSocket = UDPClient(address: "255.255.255.255", port: 35602) override func viewDidLoad() { super.viewDidLoad() @@ -24,6 +25,7 @@ class ViewController: UIViewController, WKScriptMessageHandler { UIApplication.shared.isIdleTimerDisabled = true // Setup webview event handlers + webView.scrollView.bounces = false; webView.configuration.userContentController.add(self, name: "control") webView.configuration.userContentController.add(self, name: "controlStart") webView.configuration.userContentController.add(self, name: "lowBattery") @@ -56,7 +58,7 @@ class ViewController: UIViewController, WKScriptMessageHandler { } else if (message.name == "lowBattery") { // Got low battery notification print("Low battery notification") - notificationGenerator.notificationOccurred(.warning) + tapticNotify() } else if (message.name == "notification") { // Got notification message print(message) @@ -71,4 +73,22 @@ class ViewController: UIViewController, WKScriptMessageHandler { } } } + + func tapticNotify() { + if let feedbackSupportLevel = UIDevice.current.value(forKey: "_feedbackSupportLevel") as? Int { + switch feedbackSupportLevel { + case 2: + // 2nd Generation Taptic Engine w/ Haptic Feedback (iPhone 7/7+) + notificationGenerator.notificationOccurred(.warning) + case 1: + // 1st Generation Taptic Engine (iPhone 6S/6S+) + let peek = SystemSoundID(1519) + AudioServicesPlaySystemSound(peek) + case 0: + // No Taptic Engine + break + default: break + } + } + } } diff --git a/apps/ios/cleverrc/main.css b/apps/ios/cleverrc/main.css index c9a6dc11..3f3f944d 100644 --- a/apps/ios/cleverrc/main.css +++ b/apps/ios/cleverrc/main.css @@ -7,6 +7,10 @@ html, body { color: rgba(255, 255, 255, 0.9); } +* { + user-select: none; +} + .stick { border-radius: 50%; width: 5cm; diff --git a/apps/ios/cleverrc/telemetry.js b/apps/ios/cleverrc/telemetry.js index 4370ac13..6b35c585 100644 --- a/apps/ios/cleverrc/telemetry.js +++ b/apps/ios/cleverrc/telemetry.js @@ -65,8 +65,8 @@ new ROSLIB.Topic({ name: '/rosout_agg', messageType: 'rosgraph_msgs/Log' }).subscribe(function(message) { - var BLACKLIST = ['CMD: ', 'PR: ', 'DROPPED']; - if(message.level >= 4) { + var BLACKLIST = ['CMD: ', 'PR: ', 'DROPPED', 'Clock skew detected', 'MANUAL CONTROL LOST']; + if (message.level >= 4) { if (BLACKLIST.some(function(e) { return message.msg.indexOf(e) != -1; })) { diff --git a/clever/launch/mavros.launch b/clever/launch/mavros.launch index 4a9934ff..ae389a0b 100644 --- a/clever/launch/mavros.launch +++ b/clever/launch/mavros.launch @@ -18,8 +18,10 @@ - + + + diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 8f36015d..48743e34 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -28,6 +28,7 @@ * [Подключение GPS](gps.md) * [Использование 3G-модема](3g.md) * [Устройство сети RPi](network.md) +* [Работа с логами PX4](flight_logs.md) * Учебник * [Уроки](lessons.md) * [Учебно-методическое пособие](metod.md) diff --git a/docs/assets/download-log.png b/docs/assets/download-log.png new file mode 100644 index 00000000..a9fa7cd4 Binary files /dev/null and b/docs/assets/download-log.png differ diff --git a/docs/assets/flightplot.png b/docs/assets/flightplot.png new file mode 100644 index 00000000..7d1b495a Binary files /dev/null and b/docs/assets/flightplot.png differ diff --git a/docs/assets/listener.png b/docs/assets/listener.png new file mode 100644 index 00000000..bbfa0db6 Binary files /dev/null and b/docs/assets/listener.png differ diff --git a/docs/flight_logs.md b/docs/flight_logs.md new file mode 100644 index 00000000..aaea03dd --- /dev/null +++ b/docs/flight_logs.md @@ -0,0 +1,55 @@ +Логи и топики PX4 +=== + +Для детального анализа поведения прошивки PX4 можно просмотреть полетные логи. Полетные логи представляют собой сообщения в [uORB-топиках](https://dev.px4.io/en/middleware/uorb.html), записанные в файл с раширением `.ulg`. Лог-файл можно скачать с помощью QGroundControl по Wi-Fi или USB во вкладке *Log Download*: + +![](assets/download-log.png) + +Также необходимые `.ulg`-файлы можно скопировать непосредственно с MicroSD-карты, находившейся в полетном контроллере. + +Анализ +--- + +Лог-файл можно анализировать с помомщью программы FlightPlot. Актуальную версию программы можно [скачать](https://github.com/PX4/FlightPlot/releases) на GitHub. + +В программе можно просмотреть полный список записанных топиков (*Fields List*). В нем нужно выбрать необходимые топики, после чего они появятся на графике: + +![](assets/flightplot.png) + +Основные топики в PX4 +--- + +[uORB](https://dev.px4.io/en/middleware/uorb.html) представляет собой pubsub механизм, аналогичный ROS-топикам, однако сильно упрощенный и подходящий для embedded-среды. + +Полный список топиков можно узнать в исходном коде проекта [в каталоге `msg`](https://github.com/PX4/Firmware/tree/master/msg). + +Список некоторых топиков: + +* **vehicle_status** – состояние коптера (режим и т. д.); +* **vehicle_local_position** – локальная позиция коптера; +* **vehicle_attitude** – ориентация коптера; +* **vehicle_local_position_setpoint** – целевая точка (setpoint) коптера по позиции; +* **vehicle_global_position** – глобальная позиция коптера; +* **vehicle_vision_position** – полученная визуальная позиция коптера, аналог MAVLink пакета `VISION_POSITION_ESTIMATE` или MAVROS-топика `/mavros/vision_position_estimate/pose`; +* **att_pos_mocap** – полученная MOCAP-позиция коптера, аналог MAVLink пакета `ATT_POS_MOCAP` или MAVROS-топика `/mavros/mocap/pose`; +* **actuator_controls** – сигналы на моторы; +* **vehicle_land_detected** – статус Land-detector'а; + +Мониторинг топиков в режиме реального времени +--- + +Для более новых версий платы PixHawk (`px4fmu-v3`), а также для плат PixRacer, в прошивку включен модуль `topic_listener`, который позволяет просматривать значения топиков в режиме реального времени (в том числе в полете). + +Для ее использования нужно выбрать вкладку Mavlink Console в QGroundControl: + +![](assets/listener.png) + +Команда `list_topics` выводит список топиков, доступных для просмотра (включена только в [SITL](sitl.md)). + +Команда `listener <название топика>` выводит текущее значение в топике. Существует третий опциональный параметр, который определяет количество сообщений, которые необходимо вывести. + +Примеры команд: + +`listener vehicle_local_position` + +`listener vehicle_attitude 5` diff --git a/docs/gcs_bridge.md b/docs/gcs_bridge.md index fe773f17..43fbeb0d 100644 --- a/docs/gcs_bridge.md +++ b/docs/gcs_bridge.md @@ -4,7 +4,7 @@ Возможен контроль, управление и настройка полетного контроллера квадрокоптера с помощью программы QGroundControl по Wi-Fi. Для этого необходимо подключиться к Wi-Fi сети `CLEVER-xxxx`. -После чего в launch-файле Клевера `/home/pi/catkin_ws/src/clever/clever/launch/clever.launch` выбрать один из преднастроенных режимов: TCP, UDP, UDP-B. +После чего в launch-файле Клевера `/home/pi/catkin_ws/src/clever/clever/launch/clever.launch` выбрать один из преднастроенных режимов: TCP, UDP, UDP broadcast. После изменения launch-файла необходимо перезагрузить сервис clever: @@ -51,9 +51,9 @@ UDP broadcast-бридж ``` -При использовании UDB broadcast-бриджа достаточно подключиться к Wi-Fi сети Клевера. QGroundControl должен подключиться к коптеру автоматически. +При использовании UDB broadcast-бриджа достаточно подключиться к Wi-Fi сети Клевера. QGroundControl должен подключиться к коптеру автоматически. Также при использовании UDP broadcast возможна работа с коптером одновременно с нескольких устройств (например, одновременно QGroundControl на ноутбуке и смартфоне). -> **Note** UDP broadcast-бридж работает быстрее, чем TCP-бридж, но связь в нем менее стабильная: иногда могут возникать проблемы при загрузке миссии на коптер, а также при калибровке сенсоров. +> **Note** UDP broadcast-бридж является наиболее быстрым соединением, но связь в нем менее стабильная: иногда могут возникать проблемы при загрузке миссии на коптер, а также при калибровке сенсоров. ___ После успешного подключения можно настраивать, калибровать и просматривать состояние квадкоптера без проводов. diff --git a/docs/rc.md b/docs/rc.md index 15a3bbb6..a248d564 100644 --- a/docs/rc.md +++ b/docs/rc.md @@ -1,16 +1,27 @@ -Мобильный пульт +Управление Клевером со смартфона === -Возможно управлять квадрокоптером в мобильного пульта через Wi-Fi. Он разработан в виде приложения для iOS и Android (TODO). Также существует упрощенная версия в виде [веб-страницы](#веб-версия). +Для управления Клевером со смартфона через Wi-Fi необходимо установить приложение – [iOS](), Android (в разработке). ![](assets/IMG_4397.PNG) > **Warning** Мобильный пульт предназначен в первую очередь для полетов в помещении на дальность не более 10-15 м. Большое количество Wi-Fi сетей также может ухудшить отзывчивость и дальность пульта. -Для включения бэкенда пульта, установите [образ Clever на RPi](microsd_images.md), а также убедитесь, что он включен в launch-файле Клевера (`~/catkin_ws/src/clever/clever/launch/clever.launch`): +> **Info** Также управление со смартфона [доступно в мобильной версия приложения](https://docs.qgroundcontrol.com/en/SettingsView/VirtualJoystick.html) QGroundControl. + +Настройка +--- + +> **Note** Мобильный пульт конфликтует с реальной аппаратурой радиоуправления. Во время использования мобильного пульта она должна быть выключена. + +Установите [образ Clever на RPi](microsd_images.md), а также включите `rosbridge` и `rc` в launch-файле (`~/catkin_ws/src/clever/clever/launch/clever.launch`): ```xml - + +``` + +```xml + ``` При изменении launch-файла необходимо перезапустить пакет `clever`: @@ -21,19 +32,23 @@ sudo systemctl restart clever Также необходимо убедиться, что PX4-параметр `COM_RC_IN_MODE` установлен в значение `0` (RC Transmitter). -> **Note** Мобильный пульт конфликтует с реальной аппаратурой радиоуправления. Во время использования мобильного пульта она должны быть выключена. +Дополнительные параметры: -Для управления коптером установите приложение на смартфон, подключитесь с Wi-Fi сети Клевера (`CLEVER-xxxx`), затем запустите приложение. +* `COM_RC_LOSS_T` – таймаут для определения потери сигнала пульта (мобильного или физического). Рекомендуется увеличение таймаута до нескольких секунд. +* `NAV_RCL_ACT` – действие при потере сигнала пульта. -Стики на экране приложения работают также, как и реальные стики. Для арминга коптера подержите левый стик в правом нижнем углу на протяжении нескольких секунд. Для дизарминга – в левом нижнем углу. +> **Note** Мобильный пульт конфликтует с реальной аппаратурой радиоуправления. Во время использования мобильного пульта она должна быть выключена. -Пульт отображает текущий [режим PX4](modes.md) а также уровень заряда батареи. При низком значении заряда батареи телефон будет вибрировать. - -> **Note** Если интерфейс пульта отображает явно неправильное напряжение (напр. > 5 V), проверьте, что значение PX4-параметра `BAT_N_CELLS` соответствует реальному количество элементов батареи. Если отображаемое напряжение все равно неверно, откалибруйте батарею (TODO: ссылка). - -> **Note** Если вместо режима PX4 отображается текст "DISCONNECTED FROM FCU", проверьте [подключение Raspberry Pi к PixHawk](connection.md). - -Веб-версия +Подключение --- -TODO \ No newline at end of file +Подключите смартфон к [Wi-Fi](wifi.md) сети Клевера (`CLEVER-xxxx`). Приложение должно подключиться с коптеру автоматически. При успешном подключении должны отобразиться текущий [режим](modes.ms) и заряд батареи. + +Стики на экране приложения работают так же, как и реальные стики. Для арма коптера подержите левый стик в правом нижнем углу на протяжении нескольких секунд. Для дизарма – в левом нижнем углу. + +Неисправности +--- + +* Если интерфейс пульта отображает явно неправильное напряжение (напр. > 5 V), проверьте, что значение PX4-параметра `BAT_N_CELLS` соответствует реальному количество элементов батареи. Если отображаемое напряжение все равно неверно, откалибруйте батарею (TODO: ссылка). + +* Если вместо режима PX4 отображается текст "DISCONNECTED FROM FCU", проверьте [подключение Raspberry Pi к PixHawk](connection.md). diff --git a/image_builder/scripts/software_install.sh b/image_builder/scripts/software_install.sh index aed07918..ec2ec5cc 100755 --- a/image_builder/scripts/software_install.sh +++ b/image_builder/scripts/software_install.sh @@ -36,4 +36,11 @@ git clone https://github.com/jacksonliam/mjpg-streamer.git /home/pi/mjpg-streame && make install \ && chown -Rf pi:pi /home/pi/mjpg-streamer -echo -e "\033[0;31m\033[1m$(date) | End of software installation\033[0m\033[0m" +echo -e "\033[0;31m\033[1m$(date) | Add .vimrc\033[0m\033[0m" + +# vim settings +echo "set mouse-=a +syntax on +" > /home/pi/.vimrc + +echo -e "\033[0;31m\033[1m$(date) | End of network installation\033[0m\033[0m"