Compare commits
187 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b0dd46ca6 | ||
|
|
16b2e1903a | ||
|
|
36d7a95d34 | ||
|
|
1d82e195ec | ||
|
|
78cae0c69a | ||
|
|
2b46ee27f2 | ||
|
|
de44400749 | ||
|
|
55e40bd6c3 | ||
|
|
124950d7e4 | ||
|
|
199104ca83 | ||
|
|
e5552e0a4b | ||
|
|
bfb0aa7961 | ||
|
|
44d83bdcf8 | ||
|
|
d960e57cf9 | ||
|
|
30ec03ef4d | ||
|
|
c2c27b1577 | ||
|
|
c0449ccf59 | ||
|
|
ea933ce3d1 | ||
|
|
327666385b | ||
|
|
8ea511b293 | ||
|
|
c510fe5cf0 | ||
|
|
dab70937f5 | ||
|
|
fec4859cfe | ||
|
|
63ecc3b713 | ||
|
|
d3a08c60d7 | ||
|
|
322eb1e255 | ||
|
|
22d4f3c3e7 | ||
|
|
008750b1d9 | ||
|
|
506767f32f | ||
|
|
aaa673de92 | ||
|
|
43237d8ff4 | ||
|
|
9681fc9a87 | ||
|
|
76c3e96f76 | ||
|
|
1e66afa6a4 | ||
|
|
41c59e8e49 | ||
|
|
225e3d7936 | ||
|
|
204dd97b00 | ||
|
|
27bfecc737 | ||
|
|
8cdb131a19 | ||
|
|
c9042588f0 | ||
|
|
342eaec49a | ||
|
|
77b3d28e3b | ||
|
|
357b38b5e7 | ||
|
|
a99a1c7540 | ||
|
|
6742ba332a | ||
|
|
c5916fea7c | ||
|
|
7a4958f8e9 | ||
|
|
b71a96faee | ||
|
|
24e79f0169 | ||
|
|
76e887407a | ||
|
|
0d0c8e54f4 | ||
|
|
06a01f7e32 | ||
|
|
f564d20c5b | ||
|
|
85afded6b4 | ||
|
|
7e84853c37 | ||
|
|
c3c324158f | ||
|
|
1e2fd40c05 | ||
|
|
6a7f78a218 | ||
|
|
0b637e56d7 | ||
|
|
63f44a5a3f | ||
|
|
83ce14e31b | ||
|
|
8162357ce6 | ||
|
|
ba0e9cf9c5 | ||
|
|
8d1072d97d | ||
|
|
ffd4fdf2dc | ||
|
|
d279f04a1f | ||
|
|
77e8c858a0 | ||
|
|
f6edf15011 | ||
|
|
b50c34b19c | ||
|
|
874f206e2a | ||
|
|
fd262fdb6a | ||
|
|
2cb17985d4 | ||
|
|
2daa6f108a | ||
|
|
2e0d92c0d5 | ||
|
|
1a0d61af7c | ||
|
|
eb9fc6140b | ||
|
|
b0d72030fa | ||
|
|
db27d422ae | ||
|
|
d6ec597fe2 | ||
|
|
0fe319f430 | ||
|
|
2616b49e82 | ||
|
|
c2fd26db56 | ||
|
|
71bd59fe3d | ||
|
|
5b84fe63dd | ||
|
|
40782063c4 | ||
|
|
580eb2400c | ||
|
|
4666e443cb | ||
|
|
d52c1701e4 | ||
|
|
4a543c75f7 | ||
|
|
0b15f4ffd5 | ||
|
|
0f6e24d07f | ||
|
|
7110ef1420 | ||
|
|
a56cef65d5 | ||
|
|
f58be1ff6f | ||
|
|
b1a788864c | ||
|
|
fe468d911b | ||
|
|
ef8e1c0478 | ||
|
|
710c4fb33e | ||
|
|
3ef8656bcd | ||
|
|
251e15f503 | ||
|
|
eb2f9d9c2b | ||
|
|
dfcd3ea693 | ||
|
|
7260128dfd | ||
|
|
d4e783c96f | ||
|
|
c57a342053 | ||
|
|
9ed9af2d04 | ||
|
|
295b9c98d1 | ||
|
|
8f4de0e08f | ||
|
|
8f53301b79 | ||
|
|
6372ef8c22 | ||
|
|
a91f9e5a6b | ||
|
|
6b74f75616 | ||
|
|
9cd9babb83 | ||
|
|
380c14da56 | ||
|
|
32c1c18af2 | ||
|
|
b7077339a1 | ||
|
|
52fd505ffc | ||
|
|
b911b7a3dd | ||
|
|
9b38d5135e | ||
|
|
0346c48546 | ||
|
|
212c6ca5ac | ||
|
|
361c89d016 | ||
|
|
b0cbc67799 | ||
|
|
18cfb08054 | ||
|
|
66121e6d5d | ||
|
|
a4841de17e | ||
|
|
84aef97e37 | ||
|
|
f14e1976e7 | ||
|
|
8c9acc98fb | ||
|
|
bd36428bd4 | ||
|
|
7f7276e34a | ||
|
|
460761ef68 | ||
|
|
9fefc6428e | ||
|
|
ffe4423c10 | ||
|
|
3f02919cd9 | ||
|
|
3075badf33 | ||
|
|
29d66ee264 | ||
|
|
846ec3a430 | ||
|
|
a65a50ffd3 | ||
|
|
c945bb9d03 | ||
|
|
3dc9575c9e | ||
|
|
f901167009 | ||
|
|
8519a6c6a4 | ||
|
|
d8fc2c088f | ||
|
|
679cd37ec6 | ||
|
|
40be77f9c3 | ||
|
|
1a0d762c4e | ||
|
|
a7e0032225 | ||
|
|
0b9df02faa | ||
|
|
0dcf7d1520 | ||
|
|
b146057ca7 | ||
|
|
68a32e036e | ||
|
|
dba5b63230 | ||
|
|
26efccb110 | ||
|
|
e0516663aa | ||
|
|
d737d91bc2 | ||
|
|
1b10d59188 | ||
|
|
a9ca13c55d | ||
|
|
57fbe9cc09 | ||
|
|
061b225690 | ||
|
|
27189d559a | ||
|
|
60b22d0df8 | ||
|
|
0072bf8330 | ||
|
|
f36b4546a9 | ||
|
|
c0a97fd263 | ||
|
|
46932e4adf | ||
|
|
0c2675ec28 | ||
|
|
f4e5d7978a | ||
|
|
cc7ba566c5 | ||
|
|
d47e3f6bbf | ||
|
|
2335c74b55 | ||
|
|
ca4bab7bf8 | ||
|
|
d4d84ea422 | ||
|
|
f985e07be4 | ||
|
|
bab62cf374 | ||
|
|
4eb988c34d | ||
|
|
3006d7e32e | ||
|
|
3e9b7426bf | ||
|
|
e8f93782e0 | ||
|
|
910b24c460 | ||
|
|
5dc580c76b | ||
|
|
c0705222f5 | ||
|
|
b51e8add55 | ||
|
|
86211df4b3 | ||
|
|
5ef5c6b641 | ||
|
|
5b96253146 | ||
|
|
54111504ac |
13
.editorconfig
Normal file
@@ -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
|
||||
11
README.md
@@ -4,16 +4,17 @@
|
||||
|
||||
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.
|
||||
|
||||
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 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 [Robocross-2016](https://www.youtube.com/watch?v=dGbDaz_VmYU) and [Robocross-2017](https://youtu.be/AQnd2CRczbQ) competitions and many others.
|
||||
|
||||
**The main documentation in Russian is available on our Gitbook:**
|
||||
**https://copterexpress.gitbooks.io/clever/content/**
|
||||
**The main documentation in Russian is available [on our Gitbook](https://clever.copterexpress.com/).**
|
||||
|
||||
Use it to learn how to assemble, configure, pilot and program autonomous CLEVER drone.
|
||||
|
||||
## Preconfigured RPi 3 image
|
||||
|
||||
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).
|
||||
**Preconfigured image for Raspberry Pi 3 with installed and configured software, ready to fly, is available [in the Releases section](https://github.com/CopterExpress/clever/releases).**
|
||||
|
||||
[](http://builder.coex.space/job/CopterExpress---clever/)
|
||||
|
||||
Image includes:
|
||||
|
||||
@@ -24,7 +25,7 @@ Image includes:
|
||||
* mavros
|
||||
* CLEVER software bundle for autonomous drone control
|
||||
|
||||
API description in Russian for autonomous flights is available [here](https://copterexpress.gitbooks.io/clever/simple_offboard.html).
|
||||
API description (in Russian) for autonomous flights is available [on GitBook](https://copterexpress.gitbooks.io/clever/simple_offboard.html).
|
||||
|
||||
## Manual installation
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -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"
|
||||
}
|
||||
],
|
||||
|
||||
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 508 B |
|
After Width: | Height: | Size: 659 B |
|
After Width: | Height: | Size: 867 B |
|
After Width: | Height: | Size: 867 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 867 B |
@@ -5,7 +5,7 @@
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Clever RC</string>
|
||||
<string>CLEVER RC</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
@@ -19,7 +19,7 @@
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<string>3</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,10 @@ html, body {
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
|
||||
* {
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.stick {
|
||||
border-radius: 50%;
|
||||
width: 5cm;
|
||||
|
||||
@@ -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;
|
||||
})) {
|
||||
|
||||
@@ -4,13 +4,16 @@
|
||||
"author": "Copter Express",
|
||||
"language": "ru",
|
||||
"root": "docs/",
|
||||
"plugins": ["youtube", "richquotes", "disqus", "versions"],
|
||||
"plugins": ["youtube", "richquotes", "versions", "yametrika"],
|
||||
"pluginsConfig": {
|
||||
"disqus": {
|
||||
"shortName": "coex-clever"
|
||||
},
|
||||
"versions": {
|
||||
"type": "tags"
|
||||
},
|
||||
"yametrika": {
|
||||
"id": 49359238
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
<arg name="fcu_ip" default="127.0.0.1"/>
|
||||
<arg name="gcs_bridge" default="tcp"/>
|
||||
<arg name="viz" default="true"/>
|
||||
<arg name="respawn" default="false"/>
|
||||
<arg name="respawn" default="true"/>
|
||||
|
||||
<node pkg="mavros" type="mavros_node" name="mavros" required="false" clear_params="true" respawn="$(arg respawn)" respawn_delay="3" output="screen">
|
||||
<node pkg="mavros" type="mavros_node" name="mavros" required="false" clear_params="true" respawn="$(arg respawn)" respawn_delay="5" output="screen">
|
||||
<!-- UART connection -->
|
||||
<param name="fcu_url" value="/dev/ttyAMA0:921600" if="$(eval fcu_conn is None or fcu_conn == 'uart')"/>
|
||||
|
||||
@@ -17,9 +17,12 @@
|
||||
|
||||
<!-- gcs bridge -->
|
||||
<param name="gcs_url" value="tcp-l://0.0.0.0:5760" if="$(eval gcs_bridge == 'tcp')"/>
|
||||
<param name="gcs_url" value="udp://@192.168.11.14:14550" if="$(eval gcs_bridge == 'udp')"/> <!-- TODO: fix -->
|
||||
<param name="gcs_url" value="udp-b://192.168.11.1:14550@" if="$(eval gcs_bridge == 'udp-b')"/>
|
||||
<param name="gcs_url" value="udp://0.0.0.0:14550@14550" if="$(eval gcs_bridge == 'udp')"/>
|
||||
<param name="gcs_url" value="udp-b://$(env ROS_IP):14550@14550" if="$(eval gcs_bridge == 'udp-b')"/>
|
||||
<param name="gcs_url" value="udp-pb://$(env ROS_IP):14550@14550" if="$(eval gcs_bridge == 'udp-pb')"/>
|
||||
<param name="gcs_url" value="" if="$(eval not gcs_bridge)"/>
|
||||
<param name="gcs_quiet_mode" value="true"/>
|
||||
<param name="conn/timeout" value="8"/>
|
||||
|
||||
<!-- default px4 params -->
|
||||
<rosparam command="load" file="$(find mavros)/launch/px4_config.yaml"/>
|
||||
|
||||
@@ -188,7 +188,7 @@ def get_publisher_and_message(req, stamp, continued=True, update_frame=True):
|
||||
PT.IGNORE_AFX + PT.IGNORE_AFY + PT.IGNORE_AFZ +
|
||||
(PT.IGNORE_YAW if yaw_rate_flag else PT.IGNORE_YAW_RATE),
|
||||
position=setpoint,
|
||||
yaw=euler_from_orientation(current_nav_finish.pose.orientation)[2] - math.pi / 2,
|
||||
yaw=euler_from_orientation(current_nav_finish.pose.orientation, 'szyx')[2] - math.pi / 2,
|
||||
yaw_rate=req.yaw_rate)
|
||||
return position_pub, msg
|
||||
|
||||
@@ -207,7 +207,7 @@ def get_publisher_and_message(req, stamp, continued=True, update_frame=True):
|
||||
PT.IGNORE_AFX + PT.IGNORE_AFY + PT.IGNORE_AFZ +
|
||||
(PT.IGNORE_YAW if yaw_rate_flag else PT.IGNORE_YAW_RATE),
|
||||
position=pose_local.pose.position,
|
||||
yaw=euler_from_orientation(pose_local.pose.orientation)[2] - math.pi / 2,
|
||||
yaw=euler_from_orientation(pose_local.pose.orientation, 'szyx')[2] - math.pi / 2,
|
||||
yaw_rate=req.yaw_rate)
|
||||
return position_pub, msg
|
||||
|
||||
@@ -225,7 +225,7 @@ def get_publisher_and_message(req, stamp, continued=True, update_frame=True):
|
||||
PT.IGNORE_AFX + PT.IGNORE_AFY + PT.IGNORE_AFZ +
|
||||
(PT.IGNORE_YAW if yaw_rate_flag else PT.IGNORE_YAW_RATE),
|
||||
velocity=vector_local.vector,
|
||||
yaw=euler_from_orientation(pose_local.pose.orientation)[2] - math.pi / 2,
|
||||
yaw=euler_from_orientation(pose_local.pose.orientation, 'szyx')[2] - math.pi / 2,
|
||||
yaw_rate=req.yaw_rate)
|
||||
return position_pub, msg
|
||||
|
||||
@@ -348,6 +348,7 @@ def get_telemetry(req):
|
||||
'z': float('nan'),
|
||||
'lat': float('nan'),
|
||||
'lon': float('nan'),
|
||||
'alt': float('nan'),
|
||||
'vx': float('nan'),
|
||||
'vy': float('nan'),
|
||||
'vz': float('nan'),
|
||||
@@ -368,11 +369,9 @@ def get_telemetry(req):
|
||||
res['x'] = p.pose.position.x
|
||||
res['y'] = p.pose.position.y
|
||||
res['z'] = p.pose.position.z
|
||||
# Get yaw in the request's frame_in
|
||||
_, _, res['yaw'] = euler_from_orientation(p.pose.orientation)
|
||||
# Calculate pitch and roll as angles between the pose and fcu_horiz
|
||||
attitude_pose = tf_buffer.transform(pose, 'fcu_horiz', TRANSFORM_TIMEOUT)
|
||||
res['roll'], res['pitch'], _ = euler_from_orientation(attitude_pose.pose.orientation)
|
||||
|
||||
# Calculate roll pitch and yaw as Tait-Bryan angles, order z-y-x
|
||||
res['yaw'], res['pitch'], res['roll'] = euler_from_orientation(p.pose.orientation, axes='rzyx')
|
||||
|
||||
if velocity:
|
||||
v = Vector3Stamped()
|
||||
@@ -383,11 +382,15 @@ def get_telemetry(req):
|
||||
res['vx'] = linear.vector.x
|
||||
res['vy'] = linear.vector.y
|
||||
res['vz'] = linear.vector.z
|
||||
# TODO pitch_rate, roll_rate, yaw_rate
|
||||
|
||||
res['yaw_rate'] = velocity.twist.angular.z
|
||||
res['pitch_rate'] = velocity.twist.angular.y
|
||||
res['roll_rate'] = velocity.twist.angular.x
|
||||
|
||||
if global_position and stamp - global_position.header.stamp < rospy.Duration(5):
|
||||
res['lat'] = global_position.latitude
|
||||
res['lon'] = global_position.longitude
|
||||
res['alt'] = global_position.altitude
|
||||
|
||||
if state:
|
||||
res['connected'] = state.connected
|
||||
|
||||
@@ -6,8 +6,8 @@ def orientation_from_quaternion(q):
|
||||
return Quaternion(*q)
|
||||
|
||||
|
||||
def orientation_from_euler(roll, pitch, yaw):
|
||||
q = t.quaternion_from_euler(roll, pitch, yaw)
|
||||
def orientation_from_euler(roll, pitch, yaw, axes='rzyx'):
|
||||
q = t.quaternion_from_euler(roll, pitch, yaw, axes)
|
||||
return orientation_from_quaternion(q)
|
||||
|
||||
|
||||
@@ -15,9 +15,9 @@ def quaternion_from_orientation(o):
|
||||
return o.x, o.y, o.z, o.w
|
||||
|
||||
|
||||
def euler_from_orientation(o):
|
||||
def euler_from_orientation(o, axes='rzyx'):
|
||||
q = quaternion_from_orientation(o)
|
||||
return t.euler_from_quaternion(q)
|
||||
return t.euler_from_quaternion(q, axes)
|
||||
|
||||
|
||||
def vector3_from_point(p):
|
||||
|
||||
@@ -7,8 +7,9 @@ string mode
|
||||
float32 x
|
||||
float32 y
|
||||
float32 z
|
||||
float32 lat
|
||||
float32 lon
|
||||
float64 lat
|
||||
float64 lon
|
||||
float32 alt
|
||||
float32 vx
|
||||
float32 vy
|
||||
float32 vz
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
|
||||
Для того, чтобы научиться собирать, настраивать, пилотировать и программировать автономный дрон «Клевер», воспользуйтесь этим учебником.
|
||||
|
||||
Если вы детально изучили наш gitbook, но так и не нашли ответа на свой вопрос, напишите в чат техподдержки и наши специалисты вам с радостью ответят https://t.me/COEXHelpdesk .
|
||||
|
||||
Также, у нас есть чат для программистов, которые разрабатывают под PX4, автономную навигацию в помещениях и рои дронов https://t.me/DroneCode .
|
||||
|
||||
Образ для Raspberry Pi
|
||||
----------------------
|
||||
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
* [Подключение Raspberry Pi к PixHawk](connection.md)
|
||||
* [Подключение по Wi-Fi](wifi.md)
|
||||
* [Работа с QGroundControl через Wi-Fi](gcs_bridge.md)
|
||||
* [Прошивка PixHawk/PixRacer](firmware.md)
|
||||
* [Пилотирование со смартфона](rc.md)
|
||||
* [SSH-доступ](ssh.md)
|
||||
* [Неисправности радиоаппаратуры](radioerrors.md)
|
||||
* [Безопасность](safety.md)
|
||||
@@ -26,20 +28,17 @@
|
||||
* [Визуализация с помощью rviz](rviz.md)
|
||||
* [Работа с SITL](sitl.md)
|
||||
* [Подключение GPS](gps.md)
|
||||
* [Автозапуск ПО](autolaunch.md)
|
||||
* [Использование 3G-модема](3g.md)
|
||||
* [Устройство сети RPi](network.md)
|
||||
* [Работа с логами PX4](flight_logs.md)
|
||||
* Учебник
|
||||
* [Урок 1](lesson1.md)
|
||||
* [Урок 2](lesson2.md)
|
||||
* [Урок 3](lesson3.md)
|
||||
* [Урок 4](lesson4.md)
|
||||
* [Урок 5](lesson5.md)
|
||||
* [Урок 6](lesson6.md)
|
||||
* [Урок 7](lesson7.md)
|
||||
* [Урок 8](lesson8.md)
|
||||
* [Урок 9](lesson9.md)
|
||||
* [Урок 10](lesson10.md)
|
||||
* [Теория и видеоуроки](lessons.md)
|
||||
* [Учебно-методическое пособие](metod.md)
|
||||
* [Контрольные и проверочные материалы](tests.md)
|
||||
* [Другое](drugoe.md)
|
||||
* [CopterHack-2017](copterhack2017.md)
|
||||
* [Прошивка ESC контроллеров с помощью Arduino](esc_firmware.md)
|
||||
* [Работа со светодиодной лентой](leds.md)
|
||||
* [Проекты на базе коптера "Клевер"](projects.md)
|
||||
* [Полезные ссылки](links.md)
|
||||
|
||||
@@ -110,7 +110,7 @@ _Примечание_: указанное выше определение пр
|
||||
|
||||
Для правильной работы Vision Position Estimation необходимо \(через [QGroundControl](gcs_bridge.md)\) убедиться, что:
|
||||
|
||||
* Для PixHawk: Установлена прошивка с LPE \(local position estimator\). Для PixRacer: параметр `SYS_MC_EST_GROUP` установлен в `local_position_estimator, attitude_estimator_q`.
|
||||
* Для PixHawk: Установлена прошивка с LPE \(local position estimator\). Для PixHawk необходимо [скачать прошивку `px4fmu-v2_lpe.px4`](https://github.com/PX4/Firmware/releases). Для PixRacer параметр `SYS_MC_EST_GROUP` должен быть установлен в `local_position_estimator, attitude_estimator_q`.
|
||||
* В параметре `LPE_FUSION` включены **только** флажки `vision position`, `vision yaw`, `land detector`. Итоговое значение _28_.
|
||||
* Выключен компас: `ATT_W_MAG` = 0
|
||||
* Вес угла по рысканью по зрению: `ATT_W_EXT_HDG` = 0.5
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||

|
||||
|
||||
|
||||

|
||||
[Техника безопасности при пайке](tb.md)
|
||||
|
||||
Порядок сборки
|
||||
--------------
|
||||
@@ -127,7 +127,7 @@
|
||||
* Лучи с моторами необходимо расположить согласно схеме. Стрелками указано направление вращения моторов.
|
||||
|
||||

|
||||
//указать стрелками направление вращения на моторах
|
||||
|
||||
|
||||
#### Залудить три контактные площадки регулятора
|
||||
* Нанести флюс
|
||||
@@ -146,7 +146,7 @@
|
||||
* Повторить данную операцию для оставшихся трех регуляторов
|
||||
|
||||
### Монтаж разъемов питания
|
||||

|
||||
[Статья про силовые и управляющие цепи](powerConnection.md)
|
||||
|
||||
#### Подготовка проводов для силовых разъемов XT60
|
||||
|
||||
@@ -159,7 +159,7 @@
|
||||
|
||||
#### Подготовка силовых разъемов питания XT60 pin и XT60 socket
|
||||
|
||||

|
||||
[Статья про силовые разъемы и их обозначения](connectortypes.md)
|
||||
|
||||

|
||||
|
||||
@@ -176,7 +176,6 @@
|
||||
8. Повторить процедуру для разъема XT60 socket.
|
||||
|
||||
#### Подготовка разъема питания управляющей цепи 5В
|
||||
 // *почему используется именно 3х контактный разъем, почему шина питания посередине
|
||||
|
||||
1. Обрезать/вытащить все пины из одного из разъемов. Отсоединить его.
|
||||
2. Поддеть канцелярским ножом фиксатор на оставшемся разъеме, чтобы освободить 3-й провод.
|
||||
@@ -187,11 +186,9 @@
|
||||
|
||||
### Монтаж платы распределения питания
|
||||
|
||||

|
||||
|
||||
#### Предпаячная проверка
|
||||
|
||||

|
||||
[Статья про прозвонку](testConnection.md)
|
||||
|
||||

|
||||
|
||||
@@ -205,7 +202,7 @@
|
||||
* “BAT+”, с каждым контактом, обозначенным “+”
|
||||
|
||||
#### Залудить контактные площадки платы питания
|
||||
1.  контактные площадки платы питания.
|
||||
1. [Залудить*](zap.md) контактные площадки платы питания.
|
||||
2. С помощью мультиметра проверить отсутствие контактного замыкания на плате (прозвонить)
|
||||
|
||||

|
||||
@@ -294,15 +291,17 @@
|
||||

|
||||
|
||||
#### Включение радиопульта
|
||||
1. На пульте зажать кнопку BIND KEY.
|
||||
2. Включить пульт (перещелкнуть POWER, BIND KEY не отпускаем).
|
||||
3. Ждем синхронизацию.
|
||||
4. Отсоединить джампер.
|
||||
5. Светодиод горит непрерывно.
|
||||
1. Вставить джампер в B/VCC радиоприемника (замкнуть "землю" и "сигнал")
|
||||
2. На пульте зажать кнопку BIND KEY.
|
||||
3. Включить пульт (перещелкнуть POWER, BIND KEY не отпускаем).
|
||||
4. Подключить аккумулятор к коптеру.
|
||||
5. Ждем синхронизацию.
|
||||
6. Отсоединить джампер.
|
||||
7. Светодиод горит непрерывно.
|
||||
|
||||

|
||||
|
||||

|
||||
[Мануал по неисправностям радиоаппаратуры](radioerrors1.md)
|
||||
### Проверка направления вращения моторов
|
||||
1. Наклеить наклейки на АКБ 18650.
|
||||
2. Установить 18650 в отсек АКБ, соблюдая полярность.
|
||||
@@ -329,7 +328,7 @@
|
||||
2. Разъем питания 5В продеть в прорезь.
|
||||

|
||||
|
||||
3. Приемник прикрепить к , используя двухсторонний скотч и ориентируясь на гравировку. Антенны направлены вперед.
|
||||
3. Приемник прикрепить к нижней дополнительной раме, используя двухсторонний скотч и ориентируясь на гравировку. Антенны направлены вперед.
|
||||
|
||||

|
||||
|
||||
@@ -341,8 +340,7 @@
|
||||

|
||||
|
||||
##### ВАЖНО
|
||||
Направление стрелок на плате питания и на раме дополнительной совпадают
|
||||
|
||||
Направление стрелок на плате питания и на дополнительной раме совпадают
|
||||
|
||||
### Монтаж полетного контроллера
|
||||
#### Переворачиваем сборку
|
||||
@@ -438,7 +436,4 @@
|
||||
2. При подключении (отключении) аккумуляторов держаться только за разъёмы, тянуть или дергать за провода запрещается.
|
||||
3. В случае обрыва разъемов, обнаружения нарушений целостности изоляции или корпуса аккумулятора, не трогая его, немедленно сообщить преподавателю.
|
||||
|
||||
|
||||
|
||||
|
||||
## 
|
||||
## [ТЕХНИКА БЕЗОПАСНОСТИ ПРИ ПАЙКЕ И ЛЁТНОЙ ЭКСПЛУАТАЦИИ КОПТЕРОВ](safety.md)
|
||||
|
||||
BIN
docs/assets/3dmodel.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 4.8 MiB After Width: | Height: | Size: 1.3 MiB |
BIN
docs/assets/balance.jpg
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
docs/assets/ball.png
Normal file
|
After Width: | Height: | Size: 166 KiB |
BIN
docs/assets/banana.jpg
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
docs/assets/bridge_udp.png
Normal file
|
After Width: | Height: | Size: 363 KiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 751 KiB |
|
Before Width: | Height: | Size: 6.5 MiB After Width: | Height: | Size: 3.3 MiB |
|
Before Width: | Height: | Size: 2.4 MiB After Width: | Height: | Size: 901 KiB |
BIN
docs/assets/calculation.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 363 KiB After Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 257 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 467 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 404 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 265 KiB After Width: | Height: | Size: 62 KiB |
BIN
docs/assets/detal.png
Normal file
|
After Width: | Height: | Size: 391 KiB |
BIN
docs/assets/detal1.png
Normal file
|
After Width: | Height: | Size: 632 KiB |
BIN
docs/assets/detal2.png
Normal file
|
After Width: | Height: | Size: 598 KiB |
BIN
docs/assets/download-log.png
Normal file
|
After Width: | Height: | Size: 644 KiB |
BIN
docs/assets/elements.png
Normal file
|
After Width: | Height: | Size: 223 KiB |
BIN
docs/assets/elements1.png
Normal file
|
After Width: | Height: | Size: 248 KiB |
|
Before Width: | Height: | Size: 475 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 3.1 MiB After Width: | Height: | Size: 848 KiB |
BIN
docs/assets/finalball.png
Normal file
|
After Width: | Height: | Size: 593 KiB |
BIN
docs/assets/flightplot.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
|
Before Width: | Height: | Size: 518 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 70 KiB |
BIN
docs/assets/listener.png
Normal file
|
After Width: | Height: | Size: 444 KiB |
|
Before Width: | Height: | Size: 332 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 326 KiB After Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 227 KiB |
|
Before Width: | Height: | Size: 237 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 414 KiB After Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 552 KiB After Width: | Height: | Size: 126 KiB |
BIN
docs/assets/oscillRoll.jpg
Normal file
|
After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 246 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 425 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 279 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 203 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 327 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 251 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 408 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 339 KiB After Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 294 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 31 KiB |
BIN
docs/assets/safetyball.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 329 KiB After Width: | Height: | Size: 71 KiB |
BIN
docs/assets/setupSwitch.jpg
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
docs/assets/solderConsist.gif
Normal file
|
After Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 848 KiB After Width: | Height: | Size: 259 KiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 310 KiB |
|
Before Width: | Height: | Size: 335 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 772 KiB After Width: | Height: | Size: 243 KiB |
BIN
docs/assets/stmrev.jpg
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
docs/assets/t-plug.jpg
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
docs/assets/table.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 334 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 305 KiB After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 321 KiB After Width: | Height: | Size: 103 KiB |
BIN
docs/assets/xt60.jpg
Normal file
|
After Width: | Height: | Size: 12 KiB |
59
docs/autolaunch.md
Normal file
@@ -0,0 +1,59 @@
|
||||
Автозапускаемое ПО
|
||||
===
|
||||
|
||||
systemd
|
||||
---
|
||||
|
||||
Основная документация: [https://wiki.archlinux.org/index.php/Systemd_(Русский)](https://wiki.archlinux.org/index.php/Systemd_(Русский)).
|
||||
|
||||
Все автоматически стартуемое ПО Клевера запускается в виде systemd-сервиса `clever.service`.
|
||||
|
||||
Сервис может быть перезапущен командой `systemctl`:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart clever
|
||||
```
|
||||
|
||||
Текстовый вывод ПО можно просмотреть с помощью команды `journalctl`:
|
||||
|
||||
```bash
|
||||
journalctl -u clever
|
||||
```
|
||||
|
||||
Для того, запустить ПО Клевера непосредственно в текущей консольной сессии, вы можете использовать `roslaunch`:
|
||||
|
||||
```bash
|
||||
sudo systemctl stop clever
|
||||
roslaunch clever clever.launch
|
||||
```
|
||||
|
||||
Вы можете выключить автозапуск ПО Клевера с помощью команды `disable`:
|
||||
|
||||
```bash
|
||||
sudo systemctl disable clever
|
||||
```
|
||||
|
||||
roslaunch
|
||||
---
|
||||
|
||||
Основная документация: http://wiki.ros.org/roslaunch.
|
||||
|
||||
Список объявленных для запуска нод / программ указывается в файле `/home/pi/catkin_ws/src/clever/clever/launch/clever.launch`.
|
||||
|
||||
Вы можете добавить собственную ноду в список автозапускаемых. Для этого разместите ваш запускаемый файл (например, `my_program.py`) в каталог `/home/pi/catkin_ws/src/clever/clever/src`. Затем добавьте запуск вашей ноды в `clever.launch`, например:
|
||||
|
||||
```xml
|
||||
<node name="my_program" pkg="clever" type="my_program.py" output="screen"/>
|
||||
```
|
||||
|
||||
Запускаемый файл должен иметь *permission* на запуск:
|
||||
|
||||
```bash
|
||||
chmod +x my_program.py
|
||||
```
|
||||
|
||||
При использовании скриптовых языков вначале файла должен стоять [shebang](https://ru.wikipedia.org/wiki/Шебанг_(Unix)), например:
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env python
|
||||
```
|
||||
17
docs/calibratePID.md
Normal file
@@ -0,0 +1,17 @@
|
||||
### Как настраивать PID
|
||||
|
||||
|
||||
На практике самая распространенная проблема это быстрые осцилляции, возникающие из-за слишком большого значения параметра P.
|
||||
В данной ситуации следует уменьшить его значение (все параметры выставляются экспериментальным путем, исходя из поведения аппарата).
|
||||
|
||||
Также стоит проверить чтобы осцилляций не было при резком спуске (в противном случае уменьшить P)
|
||||
Медленные раскачивания коптера из стороны в сторону при попытке удержания заданной точки связаны с перебором значения I.
|
||||
В случае если при движении коптер раскачивается следует поднять это значение
|
||||
В случае если коптер плохо держит заданное положение следует увеличить параметр D при переборе или недостатке параметра D возникают осцилляции
|
||||
|
||||
#### ВАЖНО настройку D следует начинать с минимальных значений , в 3-4 раза меньше значений по умолчанию, если таковые присутствуют
|
||||
|
||||
Параметры для Rate Pitch and Rate Roll должны быть одинаковыми
|
||||
По YAW параметры следует менять отдельно, согласно вышеуказанной инструкции (как правило рысканье не требует серьезной настройки, можно оставить по умолчанию)
|
||||
|
||||

|
||||