Compare commits
110 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 |
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()
|
||||
@@ -391,6 +390,7 @@ def get_telemetry(req):
|
||||
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,13 +28,17 @@
|
||||
* [Визуализация с помощью rviz](rviz.md)
|
||||
* [Работа с SITL](sitl.md)
|
||||
* [Подключение GPS](gps.md)
|
||||
* [Автозапуск ПО](autolaunch.md)
|
||||
* [Использование 3G-модема](3g.md)
|
||||
* [Устройство сети RPi](network.md)
|
||||
* [Работа с логами PX4](flight_logs.md)
|
||||
* Учебник
|
||||
* [Уроки](lessons.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
|
||||
|
||||
BIN
docs/assets/3dmodel.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
docs/assets/ball.png
Normal file
|
After Width: | Height: | Size: 166 KiB |
BIN
docs/assets/bridge_udp.png
Normal file
|
After Width: | Height: | Size: 363 KiB |
BIN
docs/assets/calculation.png
Normal file
|
After Width: | Height: | Size: 50 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 |
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 |
BIN
docs/assets/listener.png
Normal file
|
After Width: | Height: | Size: 444 KiB |
BIN
docs/assets/safetyball.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
docs/assets/stmrev.jpg
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
docs/assets/table.png
Normal file
|
After Width: | Height: | Size: 78 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
|
||||
```
|
||||
@@ -0,0 +1,53 @@
|
||||
Прошивка PixHawk / PixRacer
|
||||
===
|
||||
|
||||
PixHawk или PixRacer можно прошить, используя QGroundControl или утилиты командной строки.
|
||||
|
||||
Различные варианты сборок стабильных прошивок PX4 можно скачать в разделе [Releases на GitHub](https://github.com/PX4/Firmware/releases).
|
||||
|
||||
В названии файла прошивки кодируется информации о целевой плате и варианте сборки. Примеры:
|
||||
|
||||
* `px4fmu-v2_default.px4` — прошивка для PixHawk с EKF2.
|
||||
* `px4fmu-v2_lpe.px4` — прошивка для PixHawk с LPE.
|
||||
* `px4fmu-v4_default.px4` — прошивка для PixRacer с EKF2 и LPE (*Клевер 3*).
|
||||
* `px4fmu-v3_default.px4` — прошивка для более новых версий PixHawk (чип ревизии 3, см. илл. + Bootloader v5) с EKF2 и LPE.
|
||||
|
||||

|
||||
|
||||
> **Note** Для загрузки `px4fmu-v3_default.px4` может понадобиться использование команды `force_upload` из командной строки.
|
||||
|
||||
QGroundControl
|
||||
---
|
||||
|
||||
В QGroundControl откройте раздел Firmware. **После** этого подключите PixHawk / PixRacer по USB.
|
||||
|
||||
Выберите PX4 Flight Stack. Для скачивания и загрузки стандартной прошивки (вариант с EKF2 для PixHawk) выберите пункт меню "Standard Version", для загрузки собственного файла прошивки выберите пункт "Custom firmware file...", затем нажмите OK.
|
||||
|
||||
> **Warning** Не отключайте USB-кабель до окончания процесса прошивки.
|
||||
|
||||
TODO: Иллюстрация.
|
||||
|
||||
Командная строка
|
||||
---
|
||||
|
||||
PX4 может быть собран из исходников и загружен в плату автоматически из командной строки.
|
||||
|
||||
Для это склонируйте репозиторий PX4:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/PX4/Firmware.git
|
||||
```
|
||||
|
||||
Выберите необходимую версию (тэг) с помощью `git checkout`. Затем соберите и загрузите прошивку:
|
||||
|
||||
```
|
||||
make px4fmu-v4_default upload
|
||||
```
|
||||
|
||||
Где `px4fmu-v4_default` – требуемый вариант прошивки.
|
||||
|
||||
Для загрузки прошивки `v3` в PixHawk может понадобиться команда `force_upload`:
|
||||
|
||||
```
|
||||
make px4fmu-v3_default force-upload
|
||||
```
|
||||
|
||||
55
docs/flight_logs.md
Normal file
@@ -0,0 +1,55 @@
|
||||
Логи и топики PX4
|
||||
===
|
||||
|
||||
Для детального анализа поведения прошивки PX4 можно просмотреть полетные логи. Полетные логи представляют собой сообщения в [uORB-топиках](https://dev.px4.io/en/middleware/uorb.html), записанные в файл с раширением `.ulg`. Лог-файл можно скачать с помощью QGroundControl по Wi-Fi или USB во вкладке *Log Download*:
|
||||
|
||||

|
||||
|
||||
Также необходимые `.ulg`-файлы можно скопировать непосредственно с MicroSD-карты, находившейся в полетном контроллере.
|
||||
|
||||
Анализ
|
||||
---
|
||||
|
||||
Лог-файл можно анализировать с помомщью программы FlightPlot. Актуальную версию программы можно [скачать](https://github.com/PX4/FlightPlot/releases) на GitHub.
|
||||
|
||||
В программе можно просмотреть полный список записанных топиков (*Fields List*). В нем нужно выбрать необходимые топики, после чего они появятся на графике:
|
||||
|
||||

|
||||
|
||||
Основные топики в 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:
|
||||
|
||||

|
||||
|
||||
Команда `list_topics` выводит список топиков, доступных для просмотра (включена только в [SITL](sitl.md)).
|
||||
|
||||
Команда `listener <название топика>` выводит текущее значение в топике. Существует третий опциональный параметр, который определяет количество сообщений, которые необходимо вывести.
|
||||
|
||||
Примеры команд:
|
||||
|
||||
`listener vehicle_local_position`
|
||||
|
||||
`listener vehicle_attitude 5`
|
||||
@@ -1,51 +1,70 @@
|
||||
Использование QGroundControl через Wi-Fi
|
||||
===
|
||||
|
||||
Возможен контроль, управление и настройка полетного контроллера квадрокоптера с помощью программы QGroundControl по Wi-Fi. Для этого необходимо подключиться к Wi-Fi сети `CLEVER-xxxx`.
|
||||

|
||||
|
||||
Возможны контроль, управление, калибровка и настройка полетного контроллера квадрокоптера с помощью программы QGroundControl по Wi-Fi.
|
||||
Для этого необходимо подключиться к Wi-Fi сети `CLEVER-xxxx`.
|
||||
|
||||
После чего в launch-файле Клевера `/home/pi/catkin_ws/src/clever/clever/launch/clever.launch` выбрать один из преднастроенных режимов бриджа.
|
||||
|
||||
После изменения launch-файла необходимо перезагрузить сервис clever:
|
||||
|
||||
```(bash)
|
||||
sudo systemctl restart clever
|
||||
```
|
||||
|
||||
TCP-бридж
|
||||
---
|
||||
|
||||
Необходимо убедиться с в launch-файле Клевера (`~/catkin_ws/src/clever/clever/launch/clever.launch`) включен TCP GCS Bridge:
|
||||
|
||||
Изменить параметр `gcs_bridge` в launch-файле:
|
||||
```xml
|
||||
<arg name="gcs_bridge" default="tcp"/>
|
||||
```
|
||||
|
||||
При изменени launch-файла необходимо перезагрузить сервис `clever`:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart clever
|
||||
```
|
||||
|
||||
Затем в программе QGroundControl нужно выбрать Application Settings -> Comm Links -> Add. Создать подключение со следующими настройками:
|
||||
Затем в программе QGroundControl нужно выбрать Application Settings > Comm Links > Add. Создать подключение со следующими настройками:
|
||||
|
||||

|
||||
|
||||
Затем необходимо выбрать в списке подключений "Clever" и нажать "Connect". После этого можно будет настраивать, калибровать и просматривать состояние квадкоптера без проводов:
|
||||
Затем необходимо выбрать в списке подключений "Clever" и нажать "Connect".
|
||||
|
||||

|
||||
|
||||
UDP broadcast-бридж
|
||||
UDP бридж (с автоматическим подключением)
|
||||
---
|
||||
|
||||
Для использования UDP broadcast-бриджа необходимо установить параметр `gcs_bridge` в значение `udp-b`:
|
||||
|
||||
Изменить параметр gcs_bridge в launch-файле:
|
||||
```xml
|
||||
<arg name="gcs_bridge" default="udp-b"/>
|
||||
```
|
||||
|
||||
При изменени launch-файла необходимо перезагрузить сервис `clever`:
|
||||
При открытии программы QGroundControl соединение должно установиться автоматически.
|
||||
|
||||
```bash
|
||||
sudo systemctl restart clever
|
||||
```
|
||||
|
||||
При использовании UDB broadcast-бриджа достаточно подключиться к Wi-Fi сети Клевера. QGroundControl должен подключиться к коптеру автоматически.
|
||||
|
||||
> **Note** UDP broadcast-бридж работает быстрее, чем TCP-бридж, но связь в нем менее стабильная: иногда могут возникать проблемы при загрузке миссии на коптер, а также при калибровке сенсоров.
|
||||
|
||||
UDP-бридж
|
||||
UDP-бридж (без автоматического подключения)
|
||||
---
|
||||
|
||||
TODO
|
||||
Изменить параметр `gcs_bridge` в launch-файле:
|
||||
|
||||
```xml
|
||||
<arg name="gcs_bridge" default="udp"/>
|
||||
```
|
||||
|
||||
Затем в программе QGroundControl нужно выбрать Application Settings > Comm Links > Add. Создать подключение со следующими настройками:
|
||||
|
||||

|
||||
|
||||
Затем необходимо выбрать в списке подключений "CLEVER" и нажать "Connect".
|
||||
|
||||
|
||||
|
||||
UDP broadcast-бридж
|
||||
---
|
||||
|
||||
> **Hint** Особенностью UDP broadcast-бриджа является возможность просмотра телеметрии дрона одновременно с нескольких устройств (например с телефона и компьютера). Также он хорошо подходит для организации сети из устройств при помощи роутера.
|
||||
|
||||
Изменить параметр `gcs_bridge` в launch-файле:
|
||||
|
||||
```xml
|
||||
<arg name="gcs_bridge" default="udp-pb"/>
|
||||
```
|
||||
|
||||
При открытии программы QGroundControl соединение должно установиться автоматически.
|
||||
|
||||
15
docs/gps.md
@@ -2,8 +2,21 @@
|
||||
===
|
||||
|
||||
При подключении GPS появляются следующие возможности:
|
||||
|
||||
* Удерживание коптером позиции при полете на улице
|
||||
* Программирование автономных миссий в программе QGroundControl
|
||||
* Полеты на глобальные точки в автономном режиме при помощи модуля [simple offboard](simple_offboard.md).
|
||||
|
||||
TODO
|
||||
Полезные ссылки:
|
||||
* https://docs.px4.io/en/assembly/quick_start_pixhawk.html
|
||||
* http://ardupilot.org/copter/docs/common-pixhawk-wiring-and-quick-start.html
|
||||
* http://ardupilot.org/copter/docs/common-installing-3dr-ublox-gps-compass-module.html
|
||||
|
||||
Подключение
|
||||
---
|
||||
|
||||
GPS-модуль подключается к разъемам "GPS" и "I2C" (компас) полетного контроллера.
|
||||
|
||||
При подключении GPS, необходимо заново откалибровать магнитометры в программе QGroundControl, подключившись по [Wi-Fi](wifi.md) или USB.
|
||||
|
||||
Далее, необходимо включить GPS в параметре `EKF2_AID_MASK` (при использовании EKF2) или `LPE_FUSION` (при использовании LPE).
|
||||
|
||||
@@ -1,26 +1,51 @@
|
||||
Оглавление
|
||||
=======
|
||||
# Теория
|
||||
|
||||
[**Урок №1** «Знакомство. Принципы проектирования и строение мультикоптеров»](lesson1.md)
|
||||
[**Урок №1** «Знакомство. Принципы проектирования и строение мультикоптеров»](https://github.com/CopterExpress/clever/blob/master/docs/lesson1.md)
|
||||
|
||||
[**Урок №2** «Основы электричества»](lesson2.md)
|
||||
[**Урок №2** «Основы электричества»](https://github.com/CopterExpress/clever/blob/master/docs/lesson2.md)
|
||||
|
||||
[**Урок №3** «Теория пайки»](lesson3.md)
|
||||
[**Урок №3** «Теория пайки»](https://github.com/CopterExpress/clever/blob/master/docs/lesson3.md)
|
||||
|
||||
[**Урок №4** «Аэродинамика полета. Пропеллер»](lesson4.md)
|
||||
[**Урок №4** «Аэродинамика полета. Пропеллер»](https://github.com/CopterExpress/clever/blob/master/docs/lesson4.md)
|
||||
|
||||
[**Урок №5** «Бесколлекторные двигатели и регуляторы их хода»](lesson5.md)
|
||||
[**Урок №5** «Бесколлекторные двигатели и регуляторы их хода»](https://github.com/CopterExpress/clever/blob/master/docs/lesson5.md)
|
||||
|
||||
[**Урок №6** «Основы электромагнетизма. Типы двигателей»](lesson6.md)
|
||||
[**Урок №6** «Основы электромагнетизма. Типы двигателей»](https://github.com/CopterExpress/clever/blob/master/docs/lesson6.md)
|
||||
|
||||
[**Урок №7** «Принцип работы, типы и устройство аккумуляторов»](lesson7.md)
|
||||
[**Урок №7** «Принцип работы, типы и устройство аккумуляторов»](https://github.com/CopterExpress/clever/blob/master/docs/lesson7.md)
|
||||
|
||||
[**Урок №8** «Управление полётом мультикоптера. Принцип функционирования полётного контроллера. ПИД регуляторы»](lesson8.md)
|
||||
[**Урок №8** «Управление полётом мультикоптера. Принцип функционирования полётного контроллера. ПИД регуляторы»](https://github.com/CopterExpress/clever/blob/master/docs/lesson8.md)
|
||||
|
||||
[**Урок №9** «Основы радиосвязи. Принцип работы радиоаппаратуры управления»](lesson9.md)
|
||||
[**Урок №9** «Основы радиосвязи. Принцип работы радиоаппаратуры управления»](https://github.com/CopterExpress/clever/blob/master/docs/lesson9.md)
|
||||
|
||||
[**Урок №10** «Аналоговая и цифровая видеотрансляция. Применяемые камеры, радиопередатчики иприёмники»](lesson10.md)
|
||||
[**Урок №10** «Аналоговая и цифровая видеотрансляция. Применяемые камеры, радиопередатчики иприёмники»](https://github.com/CopterExpress/clever/blob/master/docs/lesson10.md)
|
||||
|
||||
Видеоуроки
|
||||
----------
|
||||
## Видеоуроки
|
||||
|
||||
Немного о видах коптеров
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/LFOmZZwg-PE" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
|
||||
|
||||
Часть 1
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/e9Z1pjW0vQU" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
|
||||
|
||||
Часть 2
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/jWMGSgiLD_E" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
|
||||
|
||||
Часть 3
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/WhxxXD4b1MY" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
|
||||
|
||||
Часть 4
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/jkA9F9lSWDM" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
|
||||
|
||||
Часть 5
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/Cz7EbJ1-xMw" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
|
||||
|
||||
Часть 6
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/v00oNVzwICg" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
|
||||
|
||||
@@ -7,93 +7,47 @@
|
||||
Учебно-методическое пособие
|
||||
---------------------------
|
||||
|
||||
[Урок 1. «Знакомство. Принципы проектирования и строение мультикоптеров»](metodmaterials.md)
|
||||
[Урок 1. «Знакомство. Принципы проектирования и строение мультикоптеров»](https://github.com/CopterExpress/clever/blob/master/docs/ https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 2. «Основы электричества»](metodmaterials.md)
|
||||
[Урок 2. «Основы электричества»](https://github.com/CopterExpress/clever/blob/master/docs/ https://github.com/CopterExpress/clever/blob/master/docs/ https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 3. «Теория пайки»](metodmaterials.md)
|
||||
[Урок 3. «Теория пайки»]( https://github.com/CopterExpress/clever/blob/master/docs/ https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 4. «Аэродинамика полета. Пропеллер»](metodmaterials.md)
|
||||
[Урок 4. «Аэродинамика полета. Пропеллер»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 5. «Основы электромагнетизма. Типы двигателей»](metodmaterials.md)
|
||||
[Урок 5. «Основы электромагнетизма. Типы двигателей»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 6. «Бесколлекторные двигатели и регуляторы их хода»](metodmaterials.md)
|
||||
[Урок 6. «Бесколлекторные двигатели и регуляторы их хода»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 7. «Принцип работы, типы и устройство аккумуляторов»](metodmaterials.md)
|
||||
[Урок 7. «Принцип работы, типы и устройство аккумуляторов»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 8. «Управление полётом мультикоптера. Принцип функционирования полетного контроллера. ПИД регуляторы»](metodmaterials.md)
|
||||
[Урок 8. «Управление полётом мультикоптера. Принцип функционирования полетного контроллера. ПИД регуляторы»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 9. «Основы радиосвязи. Принцип работы радиоаппаратуры управления»](metodmaterials.md)
|
||||
[Урок 9. «Основы радиосвязи. Принцип работы радиоаппаратуры управления»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 10. «Аналоговая и цифровая видеотрансляция. Применяемые камеры, радиопередатчики и приёмники»](metodmaterials.md)
|
||||
[Урок 10. «Аналоговая и цифровая видеотрансляция. Применяемые камеры, радиопередатчики и приёмники»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 11. «Техника безопасности при сборке и настройке коптеров, при подготовке к вылету. Техника безопасности при работе с аккумуляторами»](metodmaterials.md)
|
||||
[Урок 11. «Техника безопасности при сборке и настройке коптеров, при подготовке к вылету. Техника безопасности при работе с аккумуляторами»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 12. «Теория ручного визуального пилотирования»](metodmaterials.md)
|
||||
[Урок 12. «Теория ручного визуального пилотирования»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 13. «Техника безопасности при летной эксплуатации коптера»](metodmaterials.md)
|
||||
[Урок 13. «Техника безопасности при летной эксплуатации коптера»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 14. «Обучение лётному мастерству»](metodmaterials.md)
|
||||
[Урок 14. «Обучение лётному мастерству»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 15. «Основы радиоэлектроники, схемотехники и макетирования электрических схем»](metodmaterials.md)
|
||||
[Урок 15. «Основы радиоэлектроники, схемотехники и макетирования электрических схем»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 16. «Основы работы с аналоговым и цифровым сигналом»](metodmaterials.md)
|
||||
[Урок 16. «Основы работы с аналоговым и цифровым сигналом»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 17. «Основы работы с лабораторным оборудованием»](metodmaterials.md)
|
||||
[Урок 17. «Основы работы с лабораторным оборудованием»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 18. «Теория FPV полетов»](metodmaterials.md)
|
||||
[Урок 18. «Теория FPV полетов»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 19. «История автономных полетов. Развитие автопилотов в авиации»](metodmaterials.md)
|
||||
[Урок 19. «История автономных полетов. Развитие автопилотов в авиации»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 20. «Основы программирование на языке Python»](metodmaterials.md)
|
||||
[Урок 20. «Основы программирование на языке Python»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 21. «Знакомство с компьютером Raspberry Pi»](metodmaterials.md)
|
||||
[Урок 21. «Знакомство с компьютером Raspberry Pi»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
[Урок 22. «Управление автономным дроном: теория»](metodmaterials.md)
|
||||
[Урок 22. «Управление автономным дроном: теория»]( https://github.com/CopterExpress/clever/blob/master/docs/metodmaterials.md)
|
||||
|
||||
Контрольные вопросы и тесты к разделам
|
||||
------------------
|
||||
|
||||
[Урок 1. «Знакомство. Принципы проектирования и строение мультикоптеров»](tests.md)
|
||||
|
||||
[Урок 2. «Основы электричества»](tests.md)
|
||||
|
||||
[Урок 3. «Теория пайки»](tests.md)
|
||||
|
||||
[Урок 4. «Аэродинамика полета. Пропеллер»](tests.md)
|
||||
|
||||
[Урок 5. «Основы электромагнетизма. Типы двигателей»](tests.md)
|
||||
|
||||
[Урок 6. «Бесколлекторные двигатели и регуляторы их хода»](tests.md)
|
||||
|
||||
[Урок 7. «Принцип работы, типы и устройство аккумуляторов»](tests.md)
|
||||
|
||||
[Урок 8. «Управление полётом мультикоптера. Принцип функционирования полетного контроллера. ПИД регуляторы»](tests.md)
|
||||
|
||||
[Урок 9. «Основы радиосвязи. Принцип работы радиоаппаратуры управления»](tests.md)
|
||||
|
||||
[Урок 10. «Аналоговая и цифровая видеотрансляция. Применяемые камеры, радиопередатчики и приёмники»](tests.md)
|
||||
|
||||
[Урок 11. «Техника безопасности при сборке и настройке коптеров, при подготовке к вылету. Техника безопасности при работе с аккумуляторами»](tests.md)
|
||||
|
||||
[Урок 12. «Теория ручного визуального пилотирования»](tests.md)
|
||||
|
||||
[Урок 13. «Техника безопасности при летной эксплуатации коптера»](tests.md)
|
||||
|
||||
[Урок 14. «Обучение лётному мастерству»](tests.md)
|
||||
|
||||
[Урок 15. «Основы радиоэлектроники, схемотехники и макетирования электрических схем»](tests.md)
|
||||
|
||||
[Урок 16. «Основы работы с аналоговым и цифровым сигналом»](tests.md)
|
||||
|
||||
[Урок 17. «Основы работы с лабораторным оборудованием»](tests.md)
|
||||
|
||||
[Урок 18. «Теория FPV полетов»](tests.md)
|
||||
|
||||
[Урок 19. «История автономных полетов. Развитие автопилотов в авиации»](tests.md)
|
||||
|
||||
[Урок 20. «Основы программирование на языке Python»](tests.md)
|
||||
|
||||
[Урок 21. «Знакомство с компьютером Raspberry Pi»](tests.md)
|
||||
|
||||
[Урок 22. «Управление автономным дроном: теория»](tests.md)
|
||||
|
||||
@@ -12,8 +12,7 @@
|
||||
* об истории и тенденциях развития беспилотных летательных аппаратов; о том как можно улучшить их характеристики;
|
||||
* правила техники безопасности при эксплуатации БПЛА;
|
||||
* основные компоненты коптеров;
|
||||
* конструктивные особенности различных моделей, сооружений и
|
||||
механизмов;
|
||||
* конструктивные особенности различных моделей, сооружений и механизмов;
|
||||
* компьютерные среды для настройки полетных контроллеров;
|
||||
* основы аэродинамики полета;
|
||||
* основы электричества, радиоэлектроники;
|
||||
@@ -51,7 +50,9 @@
|
||||
|
||||
**Подведение итогов**
|
||||
|
||||
Подведение итогов по курсу проводится в 3 этапа:
|
||||
Ниже предложен один из вариантов подведения итогов курса.
|
||||
|
||||
Финальное мероприятие включает 3 раздела:
|
||||
|
||||
1. Итоговый тест (см. [проверочные задания](tests.md)).
|
||||
2. Финальная гонка.
|
||||
|
||||
@@ -1,21 +1,15 @@
|
||||
# Образ для Raspberry Pi
|
||||
|
||||
## Установка образа операционной системы на MicroSD карту
|
||||
|
||||
Для установки образа воспользуйтесь утилитой [Etcher](https://etcher.io):
|
||||
|
||||
[
|
||||
](https://etcher.io)
|
||||
|
||||
## Образы
|
||||
|
||||
На образе установлены:
|
||||
|
||||
* Raspbian Stretch
|
||||
* ROS Kinetic
|
||||
* [Пакет ПО для Клевера](https://github.com/CopterExpress/clever_bundle)
|
||||
* [Пакет ПО для Клевера](https://github.com/CopterExpress/clever)
|
||||
|
||||
|Версия|Дата|Ссылка|Примечания|
|
||||
|-|-|-|-|
|
||||
|0.2|24.01.18|[Скачать](https://yadi.sk/d/n_Krnor03RkntU)|–|
|
||||
|0.1|15.12.17|[Скачать](https://drive.google.com/open?id=1Gtj_0iB7dFuorfUKAUUV8ImjmkZCkvc7)|–|
|
||||
**Свежую версию образа можно [скачать на GitHub в разделе Releases](https://github.com/CopterExpress/clever/releases).**
|
||||
|
||||
## Установка образа ОС на MicroSD карту
|
||||
|
||||
Для установки образа воспользуйтесь утилитой [Etcher](https://etcher.io).
|
||||
|
||||
[](https://etcher.io)
|
||||
|
||||
@@ -22,9 +22,9 @@ PX4
|
||||
|
||||
### С использованием дополнительных датчиков (ASSISTED)
|
||||
|
||||
* **ALTCTL** — управление скоростью изменения высоты полета, углами по тангажу и крену и угловой скоростью по рысканью. Используется барометр (или иной датчик высоты).
|
||||
* **ALTCTL** (ALTITUDE) — управление скоростью изменения высоты полета, углами по тангажу и крену и угловой скоростью по рысканью. Используется барометр (или иной датчик высоты).
|
||||
|
||||
* **POSCTL** — управление скоростями набора высоты, скоростью движения вперед/назад и вправо/влево, угловой скоростью по рысканью. Наиболее простой для полетов режим. Используется барометр, GPS, компьютерное зрение, другие датчики.
|
||||
* **POSCTL** (POSITION) — управление скоростями набора высоты, скоростью движения вперед/назад и вправо/влево, угловой скоростью по рысканью. Наиболее простой для полетов режим. Используется барометр, GPS, компьютерное зрение, другие датчики.
|
||||
|
||||
|
||||
### Автоматический полет (AUTO)
|
||||
|
||||
282
docs/network.md
Normal file
@@ -0,0 +1,282 @@
|
||||
# Настройка Wi-Fi
|
||||
|
||||
Wi-Fi адаптер на Raspberry Pi имеет два основных режима работы:
|
||||
1. **Режим клиента** – RPi подключается к существующей Wi-Fi сети.
|
||||
2. **Режим точки доступа** – RPi создает Wi-Fi сеть, к которой вы можете подключиться.
|
||||
|
||||
При использовании [образа для RPi](microsd_images.md) по умолчанию Wi-Fi адаптер работает в режиме точки доступа.
|
||||
|
||||
## Инструкция для переключения адаптера в режим клиента
|
||||
|
||||
1\. Выключите службу `dnsmasq`.
|
||||
|
||||
```bash
|
||||
sudo systemctl stop dnsmasq
|
||||
sudo systemctl disable dnsmasq
|
||||
```
|
||||
|
||||
2\. Включите получение IP адреса на беспроводном интерфейсе DHCP клиентом.
|
||||
|
||||
Для этого удалите следующие строки
|
||||
|
||||
```
|
||||
interface wlan0
|
||||
static ip_address=192.168.11.1/24
|
||||
```
|
||||
|
||||
из файла `/etc/dhcpcd.conf` вручную или введите следующие команды.
|
||||
|
||||
```bash
|
||||
sudo sed -i 's/interface wlan0//' /etc/dhcpcd.conf
|
||||
sudo sed -i 's/static ip_address=192.168.11.1\/24//' /etc/dhcpcd.conf
|
||||
```
|
||||
|
||||
3\. Настройте `wpa_supplicant` для подключения к существующей точке доступа.
|
||||
|
||||
```bash
|
||||
cat << EOF | sudo tee /etc/wpa_supplicant/wpa_supplicant.conf
|
||||
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
|
||||
update_config=1
|
||||
country=GB
|
||||
|
||||
network={
|
||||
ssid="CLEVER"
|
||||
psk="cleverwifi"
|
||||
}
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
где `CLEVER` – название сети, а `cleverwifi` – пароль.
|
||||
|
||||
4\. Перезапустите службу `dhcpcd`.
|
||||
|
||||
```bash
|
||||
sudo systemctl restart dhcpcd
|
||||
```
|
||||
|
||||
## Инструкция для переключения адаптера в режим точки доступа
|
||||
|
||||
1\. Включите статический IP адрес на беспроводном интерфейсе.
|
||||
|
||||
Для этого добавьте следующие строки
|
||||
|
||||
```
|
||||
interface wlan0
|
||||
static ip_address=192.168.11.1/24
|
||||
```
|
||||
|
||||
в файл `/etc/dhcpcd.conf` вручную или введите следующую команду
|
||||
|
||||
```bash
|
||||
cat << EOF | sudo tee -a /etc/dhcpcd.conf
|
||||
interface wlan0
|
||||
static ip_address=192.168.11.1/24
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
2\. Настроите wpa_supplicant на работу в режиме точки доступа.
|
||||
|
||||
```bash
|
||||
cat << EOF | sudo tee /etc/wpa_supplicant/wpa_supplicant.conf
|
||||
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
|
||||
update_config=1
|
||||
country=GB
|
||||
|
||||
network={
|
||||
ssid="CLEVER-$(head -c 100 /dev/urandom | xxd -ps -c 100 | sed -e 's/[^0-9]//g' | cut -c 1-4)"
|
||||
psk="cleverwifi"
|
||||
mode=2
|
||||
proto=RSN
|
||||
key_mgmt=WPA-PSK
|
||||
pairwise=CCMP
|
||||
group=CCMP
|
||||
auth_alg=OPEN
|
||||
}
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
3\. Перезагрузите службу `dhcpcd`.
|
||||
|
||||
```bash
|
||||
sudo systemctl restart dhcpcd
|
||||
```
|
||||
|
||||
4\. Включите службу `dnsmasq`.
|
||||
|
||||
```bash
|
||||
sudo systemctl enable dnsmasq
|
||||
sudo systemctl start dnsmasq
|
||||
```
|
||||
|
||||
___
|
||||
|
||||
Ниже вы можете узнать больше о том, как устроена работа с сетью на RPi.
|
||||
|
||||
# Устройство сети RPi
|
||||
Работа сети на образе **2017-11-29-raspbian-stretch-lite** поддерживается двумя предустановленными службами:
|
||||
* **networking** — служба включает все сетевые интерфейсы в момент запуска [5].
|
||||
* **dhcpcd** — служба обеспечивает настройку адресации и маршрутризации на интерфейсах, полученных динамически или указаных в файле настроек статически.
|
||||
|
||||
Для работы в режиме роутера (точки доступа) RPi необходим DHCP сервер. Он служит для автоматической выдачи настроек текущей сети подключившимся клиентам. В роли такого сервера может выступать `isc-dhcp-server` или `dnsmasq`.
|
||||
|
||||
## dhcpcd
|
||||
|
||||
Начиная с Raspbian Jesse настройки сети больше не задаются в файле `/etc/network/interfaces`. Теперь за выдачу адресации и настройку маршрутизации отвечает `dhcpcd` [4].
|
||||
|
||||
По умолчанию на всех интерфейсах включен dhcp-клиент. Настройки интерфейсов меняются в файле `/etc/dhcpcd.conf`. Для того, чтобы поднять точку доступа необходимо прописать статический ip-адрес. Для этого в конец файла необходимо добавить следующие строки:
|
||||
|
||||
```
|
||||
interface wlan0
|
||||
static ip_address=192.168.11.1/24
|
||||
```
|
||||
|
||||
> **Note** Если интерфейс является беспроводным (wlan), то служба `dhcpcd` триггерит `wpa_supplicant` [13], который в свою очередь работает непосредственно с wifi-адаптером и переводит его в заданное состояние.
|
||||
|
||||
## wpa_supplicant
|
||||
|
||||
**wpa_supplicant** – служба конфигурирует Wi-Fi адаптер. Служба `wpa_supplicant` работает не как самостоятельная (хотя как таковая существует), а запускается как дочерний процесс от `dhcpcd`.
|
||||
|
||||
Конфигурационный файл по умолчанию должен иметь путь `/etc/wpa_supplicant/wpa_supplicant.conf`.
|
||||
Пример конфигурационного файла:
|
||||
|
||||
```
|
||||
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
|
||||
update_config=1
|
||||
country=GB
|
||||
|
||||
network={
|
||||
ssid=\"CLEVER-SMIRNOV\"
|
||||
psk=\"cleverwifi\"
|
||||
mode=2
|
||||
proto=RSN
|
||||
key_mgmt=WPA-PSK
|
||||
pairwise=CCMP
|
||||
group=CCMP
|
||||
auth_alg=OPEN
|
||||
}
|
||||
```
|
||||
|
||||
Внутри конфига указываются общие настройки `wpa_supplicant` и параметры для настройки адаптера. Также конфигурационный файл содержит секции `network` – основные настройки Wi-Fi сети такие как SSID сети, пароль, режим работы адаптера. Таких блоков может быть несколько, но используется первый рабочий. Например, если вы указали в первом блоке подключение к некоторой недоступной сети, то адаптер будет настроен следующей удачной секцией, если такая есть. Подробнее о синтаксисе `wpa_supplicant.conf` [TODO WIKI].
|
||||
|
||||
### wpa_passphrase
|
||||
|
||||
`wpa_passphrase` – утилита для создания секции `network`.
|
||||
|
||||
```bash
|
||||
wpa_passphrase SSID PASSWORD
|
||||
```
|
||||
После выполнения команды скопируйте полученную секцию в ваш конфигурационный файл. Можно удалить закоментированное поле `psk` и оставить только поле с хешем пароля, либо наоборот.
|
||||
```bash
|
||||
network={
|
||||
ssid="SSID"
|
||||
#psk="PASSWORD"
|
||||
psk=c2161655c6ba444d8df94cbbf4e9c5c4c61fc37702b9c66ed37aee1545a5a333
|
||||
}
|
||||
```
|
||||
|
||||
### Несколько Wi-Fi адаптеров
|
||||
В системе может быть несколько Wi-Fi адаптеров. Если для них корректно подключены драйвера, то их можно увидеть вызвав `ifconfig` (например wlan0 и wlan1).
|
||||
|
||||
Если у вас несколько адаптеров, для всех будет использоваться одна и таже самая рабочая секция `network`. Это связано с тем, что для каждого интерфейса, `dhcpcd` отдельно создает по дочернему процессу `wpa_supplicant`, в котором выполняется один тот же код (т. к. конфиг один и тот же).
|
||||
|
||||
Для работы нескольких адаптеров с отдельными настройками для каждого, в стандартном вызываемом скрипте `dhcpcd` реализован механизм запуска разных конфигурационных скриптов. Для его использования необходимо переименовать стандартный файл конфига по следующему образцу: `wpa_supplicant-<имя интерфейса>.conf`, например `wpa_supplicant-wlan0.conf`.
|
||||
|
||||
Для применения настроек необходимо перезапустить родительский процесс - службу `dhcpcd`. Сделать это можно следующей командой:
|
||||
```bash
|
||||
sudo systemctl restart dhcpcd
|
||||
```
|
||||
## DHCP сервер
|
||||
|
||||
### dnsmasq-base
|
||||
`dnsmasq-base` – консольная утилита, не являющаяся службой, для использования dnsmasq как службы надо установить пакет `dnsmasq`.
|
||||
|
||||
```bash
|
||||
sudo apt install dnsmasq-base
|
||||
```
|
||||
|
||||
```bash
|
||||
# Вызов dnsmasq-base
|
||||
sudo dnsmasq --interface=wlan0 --address=/clever/coex/192.168.11.1 --no-daemon --dhcp-range=192.168.11.100,192.168.11.200,12h --no-hosts --filterwin2k --bogus-priv --domain-needed --quiet-dhcp6 --log-queries
|
||||
|
||||
# Подробнее о dnsmasq-base
|
||||
dnsmasq --help
|
||||
|
||||
# или
|
||||
man dnsmasq
|
||||
```
|
||||
|
||||
### dnsmasq
|
||||
|
||||
```bash
|
||||
sudo apt install dnsmasq
|
||||
```
|
||||
|
||||
```bash
|
||||
cat << EOF | sudo tee -a /etc/dnsmasq.conf
|
||||
interface=wlan0
|
||||
address=/clever/coex/192.168.11.1
|
||||
dhcp-range=192.168.11.100,192.168.11.200,12h
|
||||
no-hosts
|
||||
filterwin2k
|
||||
bogus-priv
|
||||
domain-needed
|
||||
quiet-dhcp6
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
### isc-dhcp-server
|
||||
|
||||
```bash
|
||||
sudo apt install isc-dhcp-server
|
||||
```
|
||||
|
||||
```bash
|
||||
# https://www.shellhacks.com/ru/sed-find-replace-string-in-file/
|
||||
sed -i 's/INTERFACESv4=\"\"/INTERFACESv4=\"wlan0\"/' /etc/default/isc-dhcp-server
|
||||
```
|
||||
|
||||
```bash
|
||||
cat << EOF | sudo tee /etc/dhcp/dhcpd.conf
|
||||
subnet 192.168.11.0 netmask 255.255.255.0 {
|
||||
range 192.168.11.11 192.168.11.254;
|
||||
#option domain-name-servers 8.8.8.8;
|
||||
#option domain-name "rpi.local";
|
||||
option routers 192.168.11.1;
|
||||
option broadcast-address 192.168.11.255;
|
||||
default-lease-time 600;
|
||||
max-lease-time 7200;
|
||||
}
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
```bash
|
||||
cat << EOF | sudo tee /etc/network/if-up.d/isc-dhcp-server && sudo chmod +x /etc/network/if-up.d/isc-dhcp-server
|
||||
#!/bin/sh
|
||||
if [ "\$IFACE" = "--all" ];
|
||||
then sleep 10 && systemctl start isc-dhcp-server.service &
|
||||
fi
|
||||
|
||||
EOF
|
||||
```
|
||||
|
||||
|
||||
## Ссылки
|
||||
|
||||
1. [habr.com: Linux WiFi из командной строки с wpa_supplicant](https://habr.com/post/315960/)
|
||||
2. [wiki.archlinux.org: WPA supplicant (Русский)](https://wiki.archlinux.org/index.php/WPA_supplicant_(Русский))
|
||||
3. [blog.hoxnox.com: WiFi access point with wpa_supplicant](http://blog.hoxnox.com/gentoo/wifi-hotspot.html)
|
||||
4. [dmitrysnotes.ru: Raspberry Pi 3. Присвоение статического IP-адреса](http://dmitrysnotes.ru/raspberry-pi-3-prisvoenie-staticheskogo-ip-adresa)
|
||||
5. [thegeekdiary.com: Linux OS Service ‘network’](https://www.thegeekdiary.com/linux-os-service-network/)
|
||||
6. [frillip.com: USING YOUR NEW RASPBERRY PI 3 AS A WIFI ACCESS POINT WITH HOSTAPD](https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd/) (также здесь есть инструкция по настройке форвардинга для использования RPi в качестве шлюза для выхода в интернет)
|
||||
7. [habr.com: Настраиваем ddns-сервер на GNU/Linux Debian 6](https://habr.com/sandbox/30433/) (Хорошая статья по настройке ddns-сервера на основе `bind` и `isc-dhcp-server`)
|
||||
8. [pro-gram.ru: Установка и настройка DHCP сервера на Ubuntu 16.04.](https://pro-gram.ru/dhcp-server-ubuntu.html) (Настройка isc-dhcp-server)
|
||||
9. [expert-orda.ru: Настройка DHCP-сервера на Ubuntu](http://expert-orda.ru/posts/liuxnewbie/125--dhcp-ubuntu) (Настройка isc-dhcp-server)
|
||||
10. [academicfox.com: Raspberry Pi беспроводная точка доступа (WiFi access point)](http://academicfox.com/raspberry-pi-besprovodnaya-tochka-dostupa-wifi-access-point/) (Настройка маршрутов, hostapd, isc-dhcp-server)
|
||||
11. [weworkweplay.com: Automatically connect a Raspberry Pi to a Wifi network](http://weworkweplay.com/play/automatically-connect-a-raspberry-pi-to-a-wifi-network/) (Есть настройки для создания открытой точки доступа)
|
||||
12. [wiki.archlinux.org: WPA supplicant](https://wiki.archlinux.org/index.php/WPA%20supplicant)
|
||||
13. [wiki.archlinux.org: dhcpcd](https://wiki.archlinux.org/index.php/Dhcpcd#10-wpa_supplicant) (dhcpcd hook wpa_supplicant)
|
||||
94
docs/projects.md
Normal file
@@ -0,0 +1,94 @@
|
||||
# Шаровая защита коптера
|
||||
|
||||
|
||||
1. Введение
|
||||
|
||||
Наверное, летать в помещениях приходилось каждому, кто брал в руки коптер. Подобные полеты сопряжены с немалым риском повредить коптер о стены и различные предметы. Даже полеты на относительно больших пространствах связаны с рисками удариться о препятствие: на пути коптера может встать ствол дерева или здание — что уж говорить о полетах в замкнутых пространствах. Подобные «краш-тесты» не очень приятный момент, который может оказаться в лучшем случае причиной потери внушительной суммы денег на ремонт, а в худшем — и вовсе утраты коптера. Тем более неприятны такие ситуации для новичка, который не может своевременно увернуться от препятствия и только учится летать.
|
||||
|
||||
Это все подвигло нас к поиску решений. К сожалению, перерыв весь интернет, мы не нашли достаточно легкого и простого в изготовлении решения для простых пользователей, а главное — такого, которое будет всем по карману. Например, защита по контуру пропеллеров неплохо предохраняет сами пропеллеры, но при малейшем касании о препятствие коптер переворачивается и падает. В общем, защита либо не оберегала коптер полностью, либо выглядела несуразно и была слишком узко доступна.
|
||||
|
||||

|
||||
|
||||
Нами было принято сложное решение: придется делать ее полностью самим и почти с нуля, а также поставлена цель сделать ее простой в изготовлении и максимально легкой.
|
||||
|
||||
2. Разработка
|
||||
|
||||
В результате поиска решения, удовлетворяющего всем нашим требованиям, мы остановились на нескольких схожих вариантах. Было решено сделать защиту в форме полуправильного многогранника (примерами могут служить фуллерен, молекула углерода, или фигура пентакисдодекаэдр) — его мы и выбрали как самый приятный глазу. Кроме того, такая защита легко масштабируема под нужный размер.
|
||||
|
||||
При создании такой фигуры используются два вида ребер (далее — лучей): короткие и длинные, их длины рассчитываются исходя из нужного диаметра вписанной в многогранник сферы. Для лучшего понимания я вставлю все необходимые формулы ниже из «Википедии».
|
||||
|
||||

|
||||
|
||||
С угловыми соединениями (фитингами), тоже не все просто: их также два вида — с пятью гранями при вершине (пять лучей исходят из вершины) и с шестью гранями (шесть лучей исходят из вершины).
|
||||
|
||||
3. Первые модели
|
||||
|
||||
Была составлена спецификация для удобства контроля процесса изготовления, и мы приступили к моделированию.
|
||||
|
||||
Сделав несложные расчеты под нужные размеры, мы построили модели в Inventor CAD.
|
||||
|
||||
В ходе проектирования мы столкнулись с проблемами в моделировании угловых соединений, но они были решены упрощением конструкции, а разность углов компенсируется гибкостью материалов. Таким образом, все соединения сидят в небольшом натяге.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
(Элементы крепления защиты к корпусу)
|
||||
|
||||

|
||||
|
||||
4. Материалы
|
||||
|
||||
В ходе проектирования встал вопрос, из чего же все-таки сделать такую защиту, чтобы получилось легко и прочно. Ответ пришел, как всегда, совершенно неожиданно. На глаза попались шпажки из бамбука: они достаточно тонкие, чтобы не повлиять на аэродинамику, имеют достаточную гибкость и при этом достаточно прочные. Далее возник вопрос, из чего и как делать фитинги. Конечно же, 3D-печать! 3D-принтер — это вообще незаменимая вещь, тем более для тех, кто любит что-то делать сам. К тому же они из-за не самой высокой цены получили достаточно широкое распространение. На таком принтере можно делать изделия почти любой сложности. То, что надо!
|
||||
|
||||
Готовые модели переводим в .stl, закидываем в слайсер (в нашем случае — Cura), вводим настройки под конкретный принтер и пластик и ставим на печать.
|
||||
|
||||
Для уменьшения веса был выбран ABC-пластик как один из самых легких и доступных.
|
||||
|
||||

|
||||
|
||||
Шпажки были порезаны на расчетные длины и подготовлены к последующей работе.
|
||||
|
||||
5. Сборка и установка
|
||||
|
||||
После того как все было напечатано и порезано, настало время собирать защиту.
|
||||
|
||||

|
||||
|
||||
Сборка здесь самый ответственный момент, так как требует специального алгоритма.
|
||||
|
||||
Из пятилучевого фитинга выходят только короткие лучи, в то время как из шестилучевого — только каждая вторая длинная.
|
||||
|
||||
Сборка:
|
||||
|
||||
1. Вначале собираем все пятилучевые вершины.
|
||||
2. На каждый луч, исходящий из пятилучевой вершины, надеваем шестилучевую.
|
||||
3. Соединяем между собой шестилучевые фитинги длинными шпажками.
|
||||
4. Присоединяем уже собранные пятилучевые вершины к шестилучевым, учитывая, что в шестилучевом фитинге короткие и длинные лучи чередуются.
|
||||
5. Повторяем процесс для каждой пятилучевой вершины, пока шар не соберется.
|
||||
|
||||
После сборки разделяем шар на две полусферы, устанавливаем крепления на коптер, смотрим, что все подходит.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
(Пример установки креплений)
|
||||
|
||||
Теперь полусферы можно проклеивать. Между собой полусферы не склеиваются — это нужно для установки коптера внутрь. Мы в качестве клея использовали растворитель для пластиков «Дихлорэтан», но с тем же успехом можно использовать и любой быстросохнущий клей для полимеров.
|
||||
|
||||
После высыхания защита готова к установке и первым пробным полетам!
|
||||
|
||||

|
||||
|
||||
(Пока еще без креплений)
|
||||
|
||||

|
||||
|
||||
6. Первые полеты
|
||||
|
||||
Мы делали защиту под коптер «Клевер 2», являющийся обучающим пособием по сборке и настройке квадрокоптеров, и на него она устанавливается без доработок. Защита весит на 70 г больше (139 грамм), чем стандартная, и на управляемость и время полета почти не влияет.
|
||||
|
||||
Отдельно стоит сказать, что излишние вибрации, если таковые имеются, можно убрать путем более жесткого крепления защиты к коптеру.
|
||||
|
||||
В итоге получилась необычная защита для коптера с небольшим весом и интересным дизайном, открывающая новые горизонты для полетов в тех местах, где летать для коптера раньше было опасно.
|
||||
47
docs/rc.md
@@ -1,16 +1,29 @@
|
||||
Мобильный пульт
|
||||
Управление Клевером со смартфона
|
||||
===
|
||||
|
||||
Возможно управлять квадрокоптером в мобильного пульта через Wi-Fi. Он разработан в виде приложения для iOS и Android (TODO). Также существует упрощенная версия в виде [веб-страницы](#веб-версия).
|
||||
**WORK-IN-PROGRESS**
|
||||
|
||||
Для управления Клевером со смартфона через Wi-Fi необходимо установить приложение – iOS (TODO), Android (TODO).
|
||||
|
||||

|
||||
|
||||
> **Warning** Мобильный пульт предназначен в первую очередь для полетов в помещении на дальность не более 10-15 м. Большое количество Wi-Fi сетей также может ухудшить отзывчивость и дальность пульта.
|
||||
|
||||
Для включения бэкенда пульта, установите [образ Clever на RPi](microsd_images.md), а также убедитесь, что он включен в launch-файле Клевера (`~/catkin_ws/src/clever/clever/launch/clever.launch`):
|
||||
Также управление со смартфона [доступно в мобильной версия приложения](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
|
||||
<arg name="rc" value="true"/>
|
||||
<arg name="rosbridge" default="true"/>
|
||||
```
|
||||
|
||||
```xml
|
||||
<arg name="rc" default="true"/>
|
||||
```
|
||||
|
||||
При изменении launch-файла необходимо перезапустить пакет `clever`:
|
||||
@@ -21,19 +34,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
|
||||
Подключите смартфон к [Wi-Fi](wifi.md) сети Клевера (`CLEVER-xxxx`). Приложение должно подключиться с коптеру автоматически. При успешном подключении должны отобразиться текущий [режим](modes.ms) и заряд батареи.
|
||||
|
||||
Стики на экране приложения работают так же, как и реальные стики. Для арма коптера подержите левый стик в правом нижнем углу на протяжении нескольких секунд. Для дизарма – в левом нижнем углу.
|
||||
|
||||
Неисправности
|
||||
---
|
||||
|
||||
* Если интерфейс пульта отображает явно неправильное напряжение (напр. > 5 V), проверьте, что значение PX4-параметра `BAT_N_CELLS` соответствует реальному количество элементов батареи. Если отображаемое напряжение все равно неверно, откалибруйте батарею (TODO: ссылка).
|
||||
|
||||
* Если вместо режима PX4 отображается текст "DISCONNECTED FROM FCU", проверьте [подключение Raspberry Pi к PixHawk](connection.md).
|
||||
|
||||
@@ -11,12 +11,12 @@ Simple offboard
|
||||
|
||||
Общие для сервисов параметры:
|
||||
|
||||
* `auto_arm` = `true`/`false` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**)
|
||||
* `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`;
|
||||
* `lat`, `lon` – широта и долгота (в градусах);
|
||||
* `x`, `y` – горизонтальные координаты в системе координат `frame_id` *(м)*;
|
||||
* `z` — высота в системе координат `frame_id` *(м)*;
|
||||
* `lat`, `lon` – широта и долгота *(градусы)*;
|
||||
* `yaw` — рысканье в радианах в системе координат `frame_id` (0 – коптер смотрит по оси X);
|
||||
* `yaw_rate` — угловая скорость по рысканью в радианах в секунду (против часовой), `yaw` должен быть установлен в NaN;
|
||||
* `thrust` — уровень газа от 0 (нет газа) до 1 (полный газ).
|
||||
@@ -68,18 +68,19 @@ release = rospy.ServiceProxy('release', Trigger)
|
||||
* `frame_id` – фрейм;
|
||||
* `connected` – есть ли подключение к <abbr title="Flight Control Unit, полетный контроллер">FCU</abbr>;
|
||||
* `armed` – состояние `armed` винтов (винты включены, если true);
|
||||
* `mode` - текущий [полетный режим](modes.md);
|
||||
* `x, y, z` – локальная позиция коптера;
|
||||
* `lat, lon` – широта, долгота (при наличии [gps](gps.md));
|
||||
* `vx, vy, vz` – скорость коптера;
|
||||
* `pitch` – угол по тангажу (радианы);
|
||||
* `roll` – угол по крену (радианы);
|
||||
* `mode` – текущий [полетный режим](modes.md);
|
||||
* `x, y, z` – локальная позиция коптера *(м)*;
|
||||
* `lat, lon` – широта, долгота *(градусы)*, необходимо наличие [GPS](gps.md);
|
||||
* `alt` – высота в глобальной системе координат (стандарт [WGS-84](https://ru.wikipedia.org/wiki/WGS_84), не <abbr title="Above Mean Sea Level, выше среднего уровня моря">AMSL</abbr>!), необходимо наличие [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` – напряжение аккумулятора на ячейку.
|
||||
* `pitch_rate` – угловая скорость по тангажу *(рад/с)*;
|
||||
* `roll_rate` – угловая скорость по крену *(рад/с)*;
|
||||
* `yaw_rate` – угловая скорость по рысканью *(рад/с)*;
|
||||
* `voltage` – общее напряжение аккумулятора *(В)*;
|
||||
* `cell_voltage` – напряжение аккумулятора на ячейку *(В)*.
|
||||
|
||||
> **Note** Недоступные по каким-то причинам поля будут содержать в себе значения `NaN`.
|
||||
|
||||
@@ -119,13 +120,15 @@ rosservice call /get_telemetry "{frame_id: ''}"
|
||||
|
||||
Параметры:
|
||||
|
||||
* `x`, `y`, `z` – координаты в системе `frame_id`;
|
||||
* `yaw` – угол по рысканью;
|
||||
* `yaw_rate` – угловая скорость по рысканью (при установке yaw в `NaN`);
|
||||
* `speed` – скорость полета (скорость движения setpoint);
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
|
||||
* `x`, `y`, `z` – координаты в системе `frame_id` *(м)*;
|
||||
* `yaw` – угол по рысканью *(радианы)*;
|
||||
* `yaw_rate` – угловая скорость по рысканью (применяется при установке yaw в `NaN`) *(рад/с)*;
|
||||
* `speed` – скорость полета (скорость движения setpoint) *(м/с)*;
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит**);
|
||||
* `frame_id`, `update_frame`.
|
||||
|
||||
> **Note** Для полета без изменения угла по рыскаью достаточно установить `yaw` в `NaN` (значение угловой скорости по-умолчанию – 0).
|
||||
|
||||
Взлет на высоту 1.5 м со скоростью взлета 0.5 м/с:
|
||||
|
||||
```python
|
||||
@@ -180,14 +183,16 @@ rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, yaw_rate: 0.0, speed
|
||||
|
||||
Параметры:
|
||||
|
||||
* `lat`, `lon` – широта и долгота;
|
||||
* `z` – высота в системе координат `frame_id`;
|
||||
* `yaw` – угол по рысканью;
|
||||
* `yaw_rate` – угловая скорость по рысканью (при установке yaw в `NaN`);
|
||||
* `speed` – скорость полета (скорость движения setpoint);
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
|
||||
* `lat`, `lon` – широта и долгота *(градусы)*;
|
||||
* `z` – высота в системе координат `frame_id` *(м)*;
|
||||
* `yaw` – угол по рысканью *(радианы)*;
|
||||
* `yaw_rate` – угловая скорость по рысканью (при установке yaw в `NaN`) *(рад/с)*;
|
||||
* `speed` – скорость полета (скорость движения setpoint) *(м/с)*;
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит**);
|
||||
* `frame_id`, `update_frame`.
|
||||
|
||||
> **Note** Для полета без изменения угла по рыскаью достаточно установить `yaw` в `NaN` (значение угловой скорости по-умолчанию – 0).
|
||||
|
||||
Полет в глобальную точку со скоростью 5 м/с, оставаясь на текущей высоте (`yaw` установится в 0, коптер сориентируется передом на восток):
|
||||
|
||||
```python
|
||||
@@ -210,15 +215,14 @@ rosservice call /navigate_global "{lat: 55.707033, lon: 37.725010, z: 0.0, yaw:
|
||||
|
||||
Установить цель по позиции и рысканью. Данный сервис следует использовать при необходимости задания продолжающегося потока целевых точек, например, для полета по сложным траекториям (круговой, дугообразной и т. д.).
|
||||
|
||||
> **Hint** Для полета на точку по прямой или взлета используйте более высокоуровневый сервис `navigate`.
|
||||
> **Hint** Для полета на точку по прямой или взлета используйте более высокоуровневый сервис [`navigate`](#navigate).
|
||||
|
||||
Параметры:
|
||||
|
||||
* `x`, `y`, `z` – координаты точки в системе координат `frame_id`;
|
||||
* `yaw` – угол по рысканью;
|
||||
* `yaw_rate` – угловая скорость по рысканью (при установке yaw в NaN);
|
||||
* `speed` – скорость полета (скорость движения setpoint);
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
|
||||
* `x`, `y`, `z` – координаты точки в системе координат `frame_id` *(м)*;
|
||||
* `yaw` – угол по рысканью *(радианы)*;
|
||||
* `yaw_rate` – угловая скорость по рысканью (при установке yaw в NaN) *(рад/с)*;
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит**);
|
||||
* `frame_id`, `update_frame`.
|
||||
|
||||
Зависнуть на месте:
|
||||
@@ -249,10 +253,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);
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
|
||||
* `vx`, `vy`, `vz` – требуемая скорость полета *(м/с)*;
|
||||
* `yaw` – угол по рысканью *(радианы)*;
|
||||
* `yaw_rate` – угловая скорость по рысканью (при установке yaw в NaN) *(рад/с)*;
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит**);
|
||||
* `frame_id`, `update_frame`.
|
||||
|
||||
> **Note** Параметр `frame_id` определяет только ориентацию результирующего вектора скорости, но не его длину.
|
||||
@@ -277,9 +281,9 @@ set_velocity(vx=0.4, vy=0.0, vz=0, yaw=float('nan'), yaw_rate=0.4, frame_id='fcu
|
||||
|
||||
Параметры:
|
||||
|
||||
* `pitch`, `roll`, `yaw` – необходимый угол по тангажу, крену и рысканью (рад.);
|
||||
* `pitch`, `roll`, `yaw` – необходимый угол по тангажу, крену и рысканью *(радианы)*;
|
||||
* `thrust` – уровень газа от 0 (нет газа) до 1 (полный газ);
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит**);
|
||||
* `frame_id`, `update_frame`.
|
||||
|
||||
### set_rates
|
||||
@@ -288,9 +292,9 @@ set_velocity(vx=0.4, vy=0.0, vz=0, yaw=float('nan'), yaw_rate=0.4, frame_id='fcu
|
||||
|
||||
Параметры:
|
||||
|
||||
* `pitch_rate`, `roll_rate`, `yaw_rate` – угловая скорость по танажу, крену и рыканью (рад/с);
|
||||
* `pitch_rate`, `roll_rate`, `yaw_rate` – угловая скорость по танажу, крену и рыканью *(рад/с)*;
|
||||
* `thrust` – уровень газа от 0 (нет газа) до 1 (полный газ).
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит, если находится на полу!**);
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит**);
|
||||
|
||||
### land
|
||||
|
||||
|
||||
@@ -20,6 +20,15 @@ def get_distance(x1, y1, z1, x2, y2, z2):
|
||||
|
||||
---
|
||||
|
||||
Функция для приблизительного определения расстояния (в метрах) между двумя глобальными координатами (широта/долгота):
|
||||
|
||||
```python
|
||||
def get_distance_global(lat1, lon1, lat2, lon2):
|
||||
return math.hypot(lat1 - lat2, lon1 - lon2) * 1.113195e5
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Взлет и ожидание окончания взлета:
|
||||
|
||||
```python
|
||||
|
||||
1932
docs/tests.md
@@ -5,4 +5,4 @@
|
||||
|
||||
Пароль: `cleverwifi`.
|
||||
|
||||
TODO: иллюстрация.
|
||||
Для изменения настроек Wi-Fi или получения более детальной информации о устройстве сети на Raspberri Pi прочитайте эту [статью](network.md).
|
||||
|
||||
2
image_builder/Jenkinsfile
vendored
@@ -4,7 +4,7 @@ pipeline {
|
||||
string(name: 'GWBT_REF', defaultValue: "master")
|
||||
string(name: 'GWBT_URL', defaultValue: "https://github.com/CopterExpress/clever.git")
|
||||
string(name: 'GWBT_FILE', defaultValue: "")
|
||||
string(name: 'IMAGE_NAME', defaultValue: "\$(cat ${GWBT_FILE} | jq '.repository.name' -r)_${params.GWBT_REF}_\$(cat ${GWBT_FILE} | jq '.release.published_at' -r).img")
|
||||
string(name: 'IMAGE_NAME', defaultValue: "\$(cat ${GWBT_FILE} | jq '.repository.name' -r)-${params.GWBT_REF}.img")
|
||||
string(name: 'GWBT_EVENT', defaultValue: 'release')
|
||||
booleanParam(name: 'ONLY_PUBLISH', defaultValue: false, description: 'ONLY PUBLISH')
|
||||
string(name: 'BUILD_DIR', defaultValue: '/mnt/hdd_builder/workspace', description: 'Build workspace')
|
||||
|
||||
@@ -6,7 +6,19 @@ sudo apt-get install unzip zip git python-pip jq curl
|
||||
sudo pip install YaDiskClient
|
||||
```
|
||||
2. Mount HDD
|
||||
> TODO
|
||||
```bash
|
||||
nano /etc/fstab
|
||||
```
|
||||
```
|
||||
proc /proc proc defaults 0 0
|
||||
PARTUUID=37665771-01 /boot vfat defaults 0 2
|
||||
PARTUUID=37665771-02 / ext4 defaults,noatime 0 1
|
||||
# a swapfile is not a swap partition, no line here
|
||||
# use dphys-swapfile swap[on|off] for that
|
||||
/dev/sdb1 none swap sw 0 0
|
||||
/dev/sdb2 /mnt/hdd_system ext4 defaults,acl 0 0
|
||||
/dev/sdb3 /mnt/hdd_builder ext4 defaults,acl 0 0
|
||||
```
|
||||
|
||||
3. Enable swap on HDD
|
||||
> TODO:
|
||||
|
||||
103
image_builder/autosizer.sh
Executable file
@@ -0,0 +1,103 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
if [ $(whoami) != "root" ]; then
|
||||
echo \
|
||||
&& echo "********************************************************************" \
|
||||
&& echo "******************** This should be run as root ********************" \
|
||||
&& echo "********************************************************************" \
|
||||
&& echo \
|
||||
&& exit 1
|
||||
fi
|
||||
|
||||
if [[ -z $1 ]]; then
|
||||
echo "================================================================================"
|
||||
echo -e "\033[0;31m\033[1mAutomatic Image file resizer\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1mDescription:\033[0m\033[0m This script shrink your image to 10MiB free space"
|
||||
echo -e "if you didn't set FREE_SPACE in MiB (see usage below)."
|
||||
echo -e "\033[0;31m\033[1mAuthors:\033[0m\033[0m Artem Smirnov @urpylka, SirLagz"
|
||||
echo
|
||||
echo -e "\033[0;31m\033[1mUsage:\033[0m\033[0m ./autosizer.sh PATH_TO_IMAGE FREE_SPACE"
|
||||
echo
|
||||
echo -e "\033[0;31m\033[1mRequirements:\033[0m\033[0m parted, losetup, e2fsck, resize2fs, bc, truncate"
|
||||
echo "================================================================================"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "================================================================================"
|
||||
strImgFile=$1
|
||||
echo -e "\033[0;31m\033[1mPath to image: $strImgFile\033[0m\033[0m"
|
||||
echo "================================================================================"
|
||||
|
||||
if [[ ! -e $strImgFile ]]; then
|
||||
echo -e "\033[0;31m\033[1mError: File doesn't exist\033[0m\033[0m"
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "================================================================================"
|
||||
partinfo=`parted -m $strImgFile unit B print`
|
||||
echo -e "\033[0;31m\033[1mPartition information:\033[0m\033[0m\n$partinfo"
|
||||
echo "================================================================================"
|
||||
|
||||
partnumber=`echo "$partinfo" | grep ext4 | awk -F: '{ print $1 }'`
|
||||
echo -e "\033[0;31m\033[1mPartition number: $partnumber\033[0m\033[0m"
|
||||
echo "================================================================================"
|
||||
|
||||
partstart=`echo "$partinfo" | grep ext4 | awk -F: '{ print substr($2,0,length($2)-1) }'`
|
||||
echo -e "\033[0;31m\033[1mPartition start: $partstart (bytes)\033[0m\033[0m"
|
||||
echo "================================================================================"
|
||||
|
||||
loopback=`losetup -f --show -o $partstart $strImgFile`
|
||||
echo -e "\033[0;31m\033[1mLoopback device: $loopback\033[0m\033[0m"
|
||||
echo "================================================================================"
|
||||
|
||||
set +e
|
||||
e2fsck -fvy $loopback
|
||||
set -e
|
||||
|
||||
echo "================================================================================"
|
||||
minsize=`resize2fs -P $loopback | awk -F': ' '{ print $2 }'`
|
||||
#minsize=`resize2fs -P $loopback 2> /dev/null | awk -F': ' '{ print $2 }'`
|
||||
echo -e "\033[0;31m\033[1mMinsize: $minsize (4KiB)\033[0m\033[0m"
|
||||
echo "================================================================================"
|
||||
|
||||
# Default add 10MiB free space to image, if $2 doesn't set
|
||||
FREE_SPACE=${2:-10}
|
||||
|
||||
FREE_SPACE=$(($FREE_SPACE*1024*1024/4096))
|
||||
|
||||
minsize=`echo "$minsize+$FREE_SPACE" | bc`
|
||||
echo -e "\033[0;31m\033[1mMinsize + $FREE_SPACE (4KiB): $minsize (4KiB)\033[0m\033[0m"
|
||||
echo "================================================================================"
|
||||
|
||||
resize2fs -p $loopback $minsize
|
||||
sleep 1
|
||||
losetup -d $loopback
|
||||
|
||||
echo "================================================================================"
|
||||
partnewsize=`echo "$minsize * 4096" | bc`
|
||||
echo -e "\033[0;31m\033[1mNew size of part: $minsize (4KiB) = $partnewsize (bytes)\033[0m\033[0m"
|
||||
echo "================================================================================"
|
||||
|
||||
newpartend=`echo "$partstart + $partnewsize" | bc`
|
||||
echo -e "\033[0;31m\033[1mNew end of part (Part start + part new size):\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1m$partstart (bytes) + $partnewsize (bytes) = $newpartend (bytes)\033[0m\033[0m"
|
||||
echo "================================================================================"
|
||||
|
||||
part1=`parted $strImgFile rm 2`
|
||||
echo "================================================================================"
|
||||
part2=`parted $strImgFile unit B mkpart primary $partstart $newpartend`
|
||||
|
||||
echo "================================================================================"
|
||||
endresult=`parted -m $strImgFile unit B print free | tail -1 | awk -F: '{ print substr($2,0,length($2)-1) }'`
|
||||
echo -e "\033[0;31m\033[1mSize of result image: $endresult (bytes)\033[0m\033[0m"
|
||||
echo "================================================================================"
|
||||
|
||||
truncate -s $endresult $strImgFile
|
||||
|
||||
echo "================================================================================"
|
||||
partinfo=`parted -m $strImgFile unit B print`
|
||||
echo -e "\033[0;31m\033[1mPartition information:\033[0m\033[0m\n$partinfo"
|
||||
echo "================================================================================"
|
||||
@@ -6,10 +6,15 @@ pipeline {
|
||||
string(name: 'IMAGE_VERSION', defaultValue: 'no_version', description: 'Image version')
|
||||
|
||||
string(name: 'BUILD_DIR', defaultValue: '/mnt/hdd_builder/workspace', description: 'Build workspace')
|
||||
string(name: 'MOUNT_POINT', defaultValue: '/mnt/hdd_builder/image', description: 'Mount point')
|
||||
|
||||
string(name: 'RPI_DONWLOAD_URL', defaultValue: 'https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2017-12-01/2017-11-29-raspbian-stretch-lite.zip')
|
||||
// TODO: Add mirrorparameters
|
||||
|
||||
string(name: 'GWBT_URL', defaultValue: 'https://github.com/CopterExpress/clever.git')
|
||||
|
||||
// Experimental function
|
||||
booleanParam(name: 'SHRINK', defaultValue: true, description: 'SHRINK IMAGE')
|
||||
booleanParam(name: 'DISCOVER_ROS_PACKAGES', defaultValue: false, description: 'DISCOVER ROS PACKAGES')
|
||||
}
|
||||
environment {
|
||||
DEBIAN_FRONTEND = 'noninteractive'
|
||||
@@ -27,7 +32,7 @@ pipeline {
|
||||
SIZE = '7G'
|
||||
}
|
||||
steps {
|
||||
sh "$WORKSPACE/image_builder/image_config.sh resize_fs $SIZE ${params.BUILD_DIR} ${params.IMAGE_NAME}"
|
||||
sh "$WORKSPACE/image_builder/image_config.sh resize_fs ${params.BUILD_DIR}/${params.IMAGE_NAME} $SIZE"
|
||||
}
|
||||
}
|
||||
stage('Initialize image') {
|
||||
@@ -36,7 +41,7 @@ pipeline {
|
||||
}
|
||||
// TODO: Transfer apps.sh initialisation code here
|
||||
steps {
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} ${params.MOUNT_POINT} $WORKSPACE/$EXECUTE_FILE ${params.IMAGE_VERSION} \$(basename ${params.RPI_DONWLOAD_URL})"
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE ${params.IMAGE_VERSION} \$(basename ${params.RPI_DONWLOAD_URL})"
|
||||
}
|
||||
}
|
||||
stage('Hardware setup') {
|
||||
@@ -44,7 +49,7 @@ pipeline {
|
||||
EXECUTE_FILE = 'image_builder/scripts/hardware_setup.sh'
|
||||
}
|
||||
steps {
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} ${params.MOUNT_POINT} $WORKSPACE/$EXECUTE_FILE"
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE"
|
||||
}
|
||||
}
|
||||
stage('Software install') {
|
||||
@@ -52,7 +57,7 @@ pipeline {
|
||||
EXECUTE_FILE = 'image_builder/scripts/software_install.sh'
|
||||
}
|
||||
steps {
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} ${params.MOUNT_POINT} $WORKSPACE/$EXECUTE_FILE"
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE"
|
||||
}
|
||||
}
|
||||
stage('Network setup') {
|
||||
@@ -60,17 +65,30 @@ pipeline {
|
||||
EXECUTE_FILE = 'image_builder/scripts/network_setup.sh'
|
||||
}
|
||||
steps {
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} ${params.MOUNT_POINT} $WORKSPACE/$EXECUTE_FILE"
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE"
|
||||
}
|
||||
}
|
||||
stage('Install ROS') {
|
||||
environment {
|
||||
EXECUTE_FILE = 'image_builder/scripts/ros_install.sh'
|
||||
MOVE_FILE = 'image_builder/kinetic-ros-coex.rosinstall'
|
||||
MOVE_TO = '/home/pi/ros_catkin_ws'
|
||||
}
|
||||
steps {
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} ${params.MOUNT_POINT} $WORKSPACE/$EXECUTE_FILE"
|
||||
sh "if ! ${params.DISCOVER_ROS_PACKAGES}; then $WORKSPACE/image_builder/image_config.sh copy_to_chroot ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$MOVE_FILE $MOVE_TO; fi"
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE ${params.GWBT_URL} ${params.GWBT_REF} ${params.DISCOVER_ROS_PACKAGES}"
|
||||
}
|
||||
}
|
||||
// TODO: Add finalising step, transfer mirror removal from ros.sh
|
||||
stage('Shrink image') {
|
||||
environment {
|
||||
EXECUTE_FILE = 'image_builder/scripts/change_boot_part.sh'
|
||||
}
|
||||
when { expression { return params.SHRINK } }
|
||||
steps {
|
||||
sh "$WORKSPACE/image_builder/autosizer.sh ${params.BUILD_DIR}/${params.IMAGE_NAME}"
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} $WORKSPACE/$EXECUTE_FILE"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,24 +15,24 @@ get_image() {
|
||||
# TEMPLATE: get_image $BUILD_DIR $RPI_DONWLOAD_URL $IMAGE_NAME
|
||||
|
||||
local RPI_ZIP_NAME=$(basename $2)
|
||||
if [ ! -e "$1/$RPI_ZIP_NAME" ];
|
||||
if [ ! -e "$1/${RPI_ZIP_NAME}" ];
|
||||
then
|
||||
echo "$(date) | 1. Downloading original Linux distribution"
|
||||
wget -nv -O $1/$RPI_ZIP_NAME $2
|
||||
wget -nv -O $1/${RPI_ZIP_NAME} $2
|
||||
echo "$(date) | Downloading complete"
|
||||
else
|
||||
echo "$(date) | 1. Linux distribution already donwloaded"
|
||||
fi
|
||||
echo "$(date) | 2. Unzipping Linux distribution image"
|
||||
local RPI_IMAGE_NAME=$(echo $RPI_ZIP_NAME | sed 's/zip/img/')
|
||||
unzip -p $1/$RPI_ZIP_NAME $RPI_IMAGE_NAME > $1/$3
|
||||
local RPI_IMAGE_NAME=$(echo ${RPI_ZIP_NAME} | sed 's/zip/img/')
|
||||
unzip -p $1/${RPI_ZIP_NAME} ${RPI_IMAGE_NAME} > $1/$3
|
||||
echo "$(date) | Unzipping complete"
|
||||
}
|
||||
|
||||
resize_fs() {
|
||||
|
||||
# STATIC FUNCTION
|
||||
# TEMPLATE: resize_fs $SIZE $BUILD_DIR $IMAGE_NAME
|
||||
# TEMPLATE: resize_fs $IMAGE_PATH $SIZE
|
||||
|
||||
# Partitions numbers
|
||||
local BOOT_PARTITION=1
|
||||
@@ -58,50 +58,31 @@ resize_fs() {
|
||||
# TODO: Check sfdisk exit code
|
||||
|
||||
echo -e "\033[0;31m\033[1mTruncate image\033[0m\033[0m" \
|
||||
&& truncate -s$1 $2/$3 \
|
||||
&& echo "Mount loop-image: $2/$3" \
|
||||
&& local DEV_IMAGE=$(losetup -Pf $2/$3 --show) \
|
||||
&& truncate -s$2 $1 \
|
||||
&& echo "Mount loop-image: $1" \
|
||||
&& local DEV_IMAGE=$(losetup -Pf $1 --show) \
|
||||
&& sleep 0.5 \
|
||||
&& echo -e "\033[0;31m\033[1mMount loop-image: $1\033[0m\033[0m" \
|
||||
&& echo ", +" | sfdisk -N 2 $DEV_IMAGE \
|
||||
&& echo ", +" | sfdisk -N ${ROOT_PARTITION} ${DEV_IMAGE} \
|
||||
&& sleep 0.5 \
|
||||
&& losetup -d $DEV_IMAGE \
|
||||
&& losetup -d ${DEV_IMAGE} \
|
||||
&& sleep 0.5 \
|
||||
&& local DEV_IMAGE=$(losetup -Pf $2/$3 --show) \
|
||||
&& local DEV_IMAGE=$(losetup -Pf $1 --show) \
|
||||
&& sleep 0.5 \
|
||||
&& echo -e "\033[0;31m\033[1mCheck & repair filesystem after expand partition\033[0m\033[0m" \
|
||||
&& e2fsck -fvy "${DEV_IMAGE}p${ROOT_PARTITION}" \
|
||||
&& echo -e "\033[0;31m\033[1mExpand filesystem\033[0m\033[0m" \
|
||||
&& resize2fs "${DEV_IMAGE}p${ROOT_PARTITION}" \
|
||||
&& echo -e "\033[0;31m\033[1mUmount loop-image\033[0m\033[0m" \
|
||||
&& losetup -d $DEV_IMAGE
|
||||
&& losetup -d ${DEV_IMAGE}
|
||||
|
||||
set -e
|
||||
}
|
||||
|
||||
burn_image() {
|
||||
|
||||
# STATIC FUNCTION
|
||||
# TEMPLATE: burn_image $IMAGE_PATH $MICROSD_DEV
|
||||
|
||||
echo -e "\033[0;31m\033[1mBurn image\033[0m\033[0m" \
|
||||
&& dd if=$1 of=$2 \
|
||||
&& echo -e "\033[0;31m\033[1mBurn image finished!\033[0m\033[0m"
|
||||
}
|
||||
|
||||
burn_and_reboot() {
|
||||
|
||||
# STATIC FUNCTION
|
||||
# TEMPLATE: burn_and_reboot $IMAGE_PATH $MICROSD_DEV
|
||||
|
||||
burn_image $1 $2 \
|
||||
&& reboot
|
||||
}
|
||||
|
||||
mount_system() {
|
||||
|
||||
# STATIC FUNCTION
|
||||
# TEMPLATE: mount_system $IMAGE $MOUNT_POINT
|
||||
# TEMPLATE: mount_system $IMAGE
|
||||
|
||||
# Partitions numbers
|
||||
local BOOT_PARTITION=1
|
||||
@@ -117,48 +98,49 @@ mount_system() {
|
||||
local DEV_IMAGE=$(losetup -Pf $1 --show)
|
||||
sleep 0.5
|
||||
|
||||
echo -e "\033[0;31m\033[1mMount dirs $2 & $2/boot\033[0m\033[0m"
|
||||
#mount $3 $2
|
||||
#mount $4 $2/boot
|
||||
mount "${DEV_IMAGE}p${ROOT_PARTITION}" $2
|
||||
mount "${DEV_IMAGE}p${BOOT_PARTITION}" $2/boot
|
||||
# Get temp directory to mount image
|
||||
local MOUNT_POINT=$(mktemp -d)
|
||||
|
||||
echo -e "\033[0;31m\033[1mMount dirs ${MOUNT_POINT} & ${MOUNT_POINT}/boot\033[0m\033[0m"
|
||||
mount "${DEV_IMAGE}p${ROOT_PARTITION}" ${MOUNT_POINT}
|
||||
mount "${DEV_IMAGE}p${BOOT_PARTITION}" ${MOUNT_POINT}/boot
|
||||
|
||||
echo -e "\033[0;31m\033[1mBind system dirs\033[0m\033[0m"
|
||||
# https://github.com/debian-pi/raspbian-ua-netinst/issues/314
|
||||
echo "Mounting /proc in chroot... "
|
||||
if [ ! -d $2/proc ] ; then
|
||||
mkdir -p $2/proc \
|
||||
&& echo "Created $2/proc"
|
||||
if [ ! -d ${MOUNT_POINT}/proc ] ; then
|
||||
mkdir -p ${MOUNT_POINT}/proc \
|
||||
&& echo "Created ${MOUNT_POINT}/proc"
|
||||
fi
|
||||
mount -t proc -o nosuid,noexec,nodev proc $2/proc \
|
||||
mount -t proc -o nosuid,noexec,nodev proc ${MOUNT_POINT}/proc \
|
||||
&& echo "OK"
|
||||
|
||||
echo "Mounting /sys in chroot... "
|
||||
if [ ! -d $2/sys ] ; then
|
||||
mkdir -p $2/sys \
|
||||
&& echo "Created $2/sys"
|
||||
if [ ! -d ${MOUNT_POINT}/sys ] ; then
|
||||
mkdir -p ${MOUNT_POINT}/sys \
|
||||
&& echo "Created ${MOUNT_POINT}/sys"
|
||||
fi
|
||||
mount -t sysfs -o nosuid,noexec,nodev sysfs $2/sys \
|
||||
mount -t sysfs -o nosuid,noexec,nodev sysfs ${MOUNT_POINT}/sys \
|
||||
&& echo "OK"
|
||||
|
||||
echo "Mounting /dev/ and /dev/pts in chroot... " \
|
||||
&& mkdir -p -m 755 $2/dev/pts \
|
||||
&& mount -t devtmpfs -o mode=0755,nosuid devtmpfs $2/dev \
|
||||
&& mount -t devpts -o gid=5,mode=620 devpts $2/dev/pts \
|
||||
&& mkdir -p -m 755 ${MOUNT_POINT}/dev/pts \
|
||||
&& mount -t devtmpfs -o mode=0755,nosuid devtmpfs ${MOUNT_POINT}/dev \
|
||||
&& mount -t devpts -o gid=5,mode=620 devpts ${MOUNT_POINT}/dev/pts \
|
||||
&& echo "OK"
|
||||
# mount -t devpts none "$2/dev/pts" -o ptmxmode=0666,newinstance
|
||||
# ln -fs "pts/ptmx" "$2/dev/ptmx"
|
||||
# mount -t devpts none "${MOUNT_POINT}/dev/pts" -o ptmxmode=0666,newinstance
|
||||
# ln -fs "pts/ptmx" "${MOUNT_POINT}/dev/ptmx"
|
||||
|
||||
# mount -o bind /dev $2/dev
|
||||
# mount -t proc proc $2/proc
|
||||
# mount -t devpts devpts $2/dev/pts
|
||||
# mount -o bind /dev ${MOUNT_POINT}/dev
|
||||
# mount -t proc proc ${MOUNT_POINT}/proc
|
||||
# mount -t devpts devpts ${MOUNT_POINT}/dev/pts
|
||||
|
||||
# mount -t proc proc $2/proc
|
||||
# mount -t sysfs sys $2/sys
|
||||
# mount --bind /dev $2/dev
|
||||
# mount -t proc proc ${MOUNT_POINT}/proc
|
||||
# mount -t sysfs sys ${MOUNT_POINT}/sys
|
||||
# mount --bind /dev ${MOUNT_POINT}/dev
|
||||
|
||||
echo -e "\033[0;31m\033[1mCopy DNS records\033[0m\033[0m" \
|
||||
&& cp -L /etc/resolv.conf $2/etc/resolv.conf
|
||||
&& cp -L /etc/resolv.conf ${MOUNT_POINT}/etc/resolv.conf
|
||||
|
||||
# https://wiki.archlinux.org/index.php/Change_root_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)
|
||||
# http://www.unix-lab.org/posts/chroot/
|
||||
@@ -167,15 +149,15 @@ mount_system() {
|
||||
# http://unixteam.ru/content/virtualizaciya-ili-zapuskaem-prilozhenie-v-chroot-okruzhenii-razmyshleniya
|
||||
# http://help.ubuntu.ru/wiki/%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_grub
|
||||
echo -e "\033[0;31m\033[1mEnter chroot\033[0m\033[0m" \
|
||||
&& chroot $2 /bin/bash
|
||||
&& chroot ${MOUNT_POINT} /bin/bash
|
||||
|
||||
umount_system $2 $DEV_IMAGE
|
||||
umount_system ${MOUNT_POINT} ${DEV_IMAGE}
|
||||
}
|
||||
|
||||
execute() {
|
||||
|
||||
# STATIC FUNCTION
|
||||
# TEMPLATE: execute $IMAGE $MOUNT_POINT $EXECUTE_FILE ...
|
||||
# TEMPLATE: execute $IMAGE $EXECUTE_FILE ...
|
||||
|
||||
# Partitions numbers
|
||||
local BOOT_PARTITION=1
|
||||
@@ -185,50 +167,87 @@ execute() {
|
||||
local DEV_IMAGE=$(losetup -Pf $1 --show)
|
||||
sleep 0.5
|
||||
|
||||
echo -e "\033[0;31m\033[1mMount dirs $2 & $2/boot\033[0m\033[0m"
|
||||
mount "${DEV_IMAGE}p${ROOT_PARTITION}" $2
|
||||
mount "${DEV_IMAGE}p${BOOT_PARTITION}" $2/boot
|
||||
# Get temp directory to mount image
|
||||
local MOUNT_POINT=$(mktemp -d)
|
||||
|
||||
echo -e "\033[0;31m\033[1mMount dirs ${MOUNT_POINT} & ${MOUNT_POINT}/boot\033[0m\033[0m"
|
||||
mount "${DEV_IMAGE}p${ROOT_PARTITION}" ${MOUNT_POINT}
|
||||
mount "${DEV_IMAGE}p${BOOT_PARTITION}" ${MOUNT_POINT}/boot
|
||||
|
||||
echo -e "\033[0;31m\033[1mBind system dirs\033[0m\033[0m"
|
||||
echo "Mounting /proc in chroot... "
|
||||
if [ ! -d $2/proc ] ; then
|
||||
mkdir -p $2/proc
|
||||
echo "Created $2/proc"
|
||||
if [ ! -d ${MOUNT_POINT}/proc ] ; then
|
||||
mkdir -p ${MOUNT_POINT}/proc
|
||||
echo "Created ${MOUNT_POINT}/proc"
|
||||
fi
|
||||
mount -t proc -o nosuid,noexec,nodev proc $2/proc \
|
||||
mount -t proc -o nosuid,noexec,nodev proc ${MOUNT_POINT}/proc \
|
||||
&& echo "OK"
|
||||
|
||||
echo "Mounting /sys in chroot... "
|
||||
if [ ! -d $2/sys ] ; then
|
||||
mkdir -p $2/sys
|
||||
echo "Created $2/sys"
|
||||
if [ ! -d ${MOUNT_POINT}/sys ] ; then
|
||||
mkdir -p ${MOUNT_POINT}/sys
|
||||
echo "Created ${MOUNT_POINT}/sys"
|
||||
fi
|
||||
mount -t sysfs -o nosuid,noexec,nodev sysfs $2/sys \
|
||||
mount -t sysfs -o nosuid,noexec,nodev sysfs ${MOUNT_POINT}/sys \
|
||||
&& echo "OK"
|
||||
|
||||
echo "Mounting /dev/ and /dev/pts in chroot... " \
|
||||
&& mkdir -p -m 755 $2/dev/pts \
|
||||
&& mount -t devtmpfs -o mode=0755,nosuid devtmpfs $2/dev \
|
||||
&& mount -t devpts -o gid=5,mode=620 devpts $2/dev/pts \
|
||||
&& mkdir -p -m 755 ${MOUNT_POINT}/dev/pts \
|
||||
&& mount -t devtmpfs -o mode=0755,nosuid devtmpfs ${MOUNT_POINT}/dev \
|
||||
&& mount -t devpts -o gid=5,mode=620 devpts ${MOUNT_POINT}/dev/pts \
|
||||
&& echo "OK"
|
||||
|
||||
echo -e "\033[0;31m\033[1mCopy DNS records\033[0m\033[0m" \
|
||||
&& cp -L /etc/resolv.conf $2/etc/resolv.conf
|
||||
&& cp -L /etc/resolv.conf ${MOUNT_POINT}/etc/resolv.conf
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | Enter chroot\033[0m\033[0m"
|
||||
script_name=$(basename $3)
|
||||
script_path_root="$2/root/$script_name"
|
||||
local script_name=$(basename $2)
|
||||
local script_path_root="${MOUNT_POINT}/root/${script_name}"
|
||||
# Copy script into chroot fs
|
||||
# TODO: Find more suitable location for temporary script storage
|
||||
cp "$3" "$script_path_root"
|
||||
cp "$2" "${script_path_root}"
|
||||
# Its important to save arguments (direct ${@:4} causes problems)
|
||||
script_args="${@:4}"
|
||||
script_args="${@:3}"
|
||||
# Run script in chroot with additional arguments
|
||||
chroot $2 /bin/sh -c "/root/$script_name $script_args"
|
||||
chroot ${MOUNT_POINT} /bin/sh -c "/root/${script_name} ${script_args}"
|
||||
# Removing script from chroot fs
|
||||
rm "$script_path_root"
|
||||
rm "${script_path_root}"
|
||||
|
||||
umount_system $2 $DEV_IMAGE
|
||||
umount_system ${MOUNT_POINT} ${DEV_IMAGE}
|
||||
}
|
||||
|
||||
copy_to_chroot() {
|
||||
|
||||
# STATIC FUNCTION
|
||||
# TEMPLATE: copy_to_chroot $IMAGE $MOVE_FILE $MOVE_TO
|
||||
|
||||
# Partitions numbers
|
||||
local BOOT_PARTITION=1
|
||||
local ROOT_PARTITION=2
|
||||
|
||||
echo -e "\033[0;31m\033[1mMount loop-image: $1\033[0m\033[0m"
|
||||
local DEV_IMAGE=$(losetup -Pf $1 --show)
|
||||
sleep 0.5
|
||||
|
||||
# Get temp directory to mount image
|
||||
local MOUNT_POINT=$(mktemp -d)
|
||||
|
||||
echo -e "\033[0;31m\033[1mMount dirs ${MOUNT_POINT} & ${MOUNT_POINT}/boot\033[0m\033[0m"
|
||||
mount "${DEV_IMAGE}p${ROOT_PARTITION}" ${MOUNT_POINT}
|
||||
mount "${DEV_IMAGE}p${BOOT_PARTITION}" ${MOUNT_POINT}/boot
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | Enter chroot\033[0m\033[0m"
|
||||
file_name=$(basename $2)
|
||||
file_path_root="${MOUNT_POINT}$3/${file_name}"
|
||||
# Copy script into chroot fs
|
||||
# TODO: Find more suitable location for temporary script storage
|
||||
if [ ! -d ${file_path_root} ] ; then
|
||||
mkdir -p ${file_path_root} \
|
||||
&& echo "Created ${file_path_root}"
|
||||
fi
|
||||
cp "$2" "${file_path_root}"
|
||||
|
||||
umount_system ${MOUNT_POINT} ${DEV_IMAGE}
|
||||
}
|
||||
|
||||
umount_system() {
|
||||
@@ -268,51 +287,6 @@ umount_system() {
|
||||
losetup -d $2
|
||||
}
|
||||
|
||||
install_docker() {
|
||||
|
||||
# STATIC FUNCTION
|
||||
# TEMPLATE: install_docker $IMAGE $MOUNT_POINT
|
||||
|
||||
# https://askubuntu.com/questions/485567/unexpected-end-of-file
|
||||
mount_system $1 $2 << EOF
|
||||
#!/bin/bash
|
||||
# https://www.raspberrypi.org/blog/docker-comes-to-raspberry-pi/
|
||||
curl -sSL https://get.docker.com | sh
|
||||
usermod -aG docker pi
|
||||
systemctl enable docker
|
||||
service docker start
|
||||
docker pull smirart/rpi-ros:sshd
|
||||
docker run -di --restart unless-stopped -p 192.168.0.121:2202:22 -t smirart/rpi-ros:sshd
|
||||
EOF
|
||||
}
|
||||
|
||||
test_docker() {
|
||||
|
||||
# STATIC FUNCTION
|
||||
# TEMPLATE: test_docker $IMAGE $MOUNT_POINT
|
||||
|
||||
mount_system $1 $2 << EOF
|
||||
#!/bin/bash
|
||||
# https://www.raspberrypi.org/blog/docker-comes-to-raspberry-pi/
|
||||
service docker start
|
||||
sleep 1
|
||||
docker images
|
||||
docker ps -a
|
||||
EOF
|
||||
}
|
||||
|
||||
# очистить history
|
||||
# https://askubuntu.com/questions/191999/how-to-clear-bash-history-completely
|
||||
# cat /dev/null > ~/.bash_history && history -c && exit
|
||||
#
|
||||
# screen in chroot
|
||||
# getty tty
|
||||
# https://stackoverflow.com/questions/19104894/screen-must-be-connected-to-a-terminal/25646444
|
||||
#
|
||||
# docker in chroot
|
||||
# service docker start
|
||||
# https://forums.docker.com/t/cannot-connect-to-the-docker-daemon-is-the-docker-daemon-running-on-this-host/8925/17
|
||||
|
||||
publish_image() {
|
||||
|
||||
# STATIC FUNCTION
|
||||
@@ -328,6 +302,8 @@ publish_image() {
|
||||
echo -e "\033[0;31m\033[1m$(date) | Zipping complete!\033[0m\033[0m"
|
||||
else
|
||||
echo -e "\033[0;31m\033[1m$(date) | Zip-archive already created\033[0m\033[0m"
|
||||
cd $1 && rm $2.zip && zip $2.zip $2
|
||||
echo -e "\033[0;31m\033[1m$(date) | Old archive was deleted & create new\033[0m\033[0m"
|
||||
fi
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | Upload image\033[0m\033[0m"
|
||||
@@ -379,30 +355,30 @@ echo "\$5: $5"
|
||||
echo "\$6: $6"
|
||||
echo "\$7: $7"
|
||||
|
||||
# test_docker
|
||||
# install_docker
|
||||
# burn_image
|
||||
|
||||
case "$1" in
|
||||
mount_system)
|
||||
# mount_system $IMAGE $MOUNT_POINT
|
||||
mount_system $2 $3;;
|
||||
# mount_system $IMAGE
|
||||
mount_system $2;;
|
||||
|
||||
get_image)
|
||||
# get_image $BUILD_DIR $RPI_DONWLOAD_URL $IMAGE_NAME
|
||||
get_image $2 $3 $4;;
|
||||
|
||||
resize_fs)
|
||||
# resize_fs $SIZE $BUILD_DIR $IMAGE_NAME
|
||||
resize_fs $2 $3 $4 $5;;
|
||||
# resize_fs $IMAGE_PATH $SIZE
|
||||
resize_fs $2 $3;;
|
||||
|
||||
publish_image)
|
||||
# publish_image $BUILD_DIR $IMAGE_NAME $YA_SCRIPT $CONFIG_FILE $RELEASE_ID $RELEASE_BODY
|
||||
publish_image $2 $3 $4 $5 $6 "$7";;
|
||||
|
||||
execute)
|
||||
# execute $IMAGE $MOUNT_POINT $EXECUTE_FILE ...
|
||||
execute $2 $3 $4 ${@:5};;
|
||||
# execute $IMAGE $EXECUTE_FILE ...
|
||||
execute $2 $3 ${@:4};;
|
||||
|
||||
copy_to_chroot)
|
||||
# copy_to_chroot $IMAGE $MOVE_FILE $MOVE_TO
|
||||
copy_to_chroot $2 $3 $4;;
|
||||
|
||||
*)
|
||||
echo "Enter one of: mount_system, get_image, resize_fs, publish_image, execute";;
|
||||
|
||||
680
image_builder/kinetic-ros-coex.rosinstall
Normal file
@@ -0,0 +1,680 @@
|
||||
- tar:
|
||||
local-name: catkin
|
||||
uri: https://github.com/ros-gbp/catkin-release/archive/release/kinetic/catkin/0.7.11-0.tar.gz
|
||||
version: catkin-release-release-kinetic-catkin-0.7.11-0
|
||||
- tar:
|
||||
local-name: cmake_modules
|
||||
uri: https://github.com/ros-gbp/cmake_modules-release/archive/release/kinetic/cmake_modules/0.4.1-0.tar.gz
|
||||
version: cmake_modules-release-release-kinetic-cmake_modules-0.4.1-0
|
||||
- tar:
|
||||
local-name: gencpp
|
||||
uri: https://github.com/ros-gbp/gencpp-release/archive/release/kinetic/gencpp/0.6.0-0.tar.gz
|
||||
version: gencpp-release-release-kinetic-gencpp-0.6.0-0
|
||||
- tar:
|
||||
local-name: geneus
|
||||
uri: https://github.com/tork-a/geneus-release/archive/release/kinetic/geneus/2.2.6-0.tar.gz
|
||||
version: geneus-release-release-kinetic-geneus-2.2.6-0
|
||||
- tar:
|
||||
local-name: genlisp
|
||||
uri: https://github.com/ros-gbp/genlisp-release/archive/release/kinetic/genlisp/0.4.16-0.tar.gz
|
||||
version: genlisp-release-release-kinetic-genlisp-0.4.16-0
|
||||
- tar:
|
||||
local-name: genmsg
|
||||
uri: https://github.com/ros-gbp/genmsg-release/archive/release/kinetic/genmsg/0.5.10-0.tar.gz
|
||||
version: genmsg-release-release-kinetic-genmsg-0.5.10-0
|
||||
- tar:
|
||||
local-name: gennodejs
|
||||
uri: https://github.com/RethinkRobotics-release/gennodejs-release/archive/release/kinetic/gennodejs/2.0.1-0.tar.gz
|
||||
version: gennodejs-release-release-kinetic-gennodejs-2.0.1-0
|
||||
- tar:
|
||||
local-name: genpy
|
||||
uri: https://github.com/ros-gbp/genpy-release/archive/release/kinetic/genpy/0.6.7-0.tar.gz
|
||||
version: genpy-release-release-kinetic-genpy-0.6.7-0
|
||||
- tar:
|
||||
local-name: message_generation
|
||||
uri: https://github.com/ros-gbp/message_generation-release/archive/release/kinetic/message_generation/0.4.0-0.tar.gz
|
||||
version: message_generation-release-release-kinetic-message_generation-0.4.0-0
|
||||
- tar:
|
||||
local-name: message_runtime
|
||||
uri: https://github.com/ros-gbp/message_runtime-release/archive/release/kinetic/message_runtime/0.4.12-0.tar.gz
|
||||
version: message_runtime-release-release-kinetic-message_runtime-0.4.12-0
|
||||
- tar:
|
||||
local-name: ros/mk
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/mk/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-mk-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/ros
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/ros/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-ros-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosbash
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosbash/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosbash-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosboost_cfg
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosboost_cfg/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosboost_cfg-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosbuild
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosbuild/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosbuild-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosclean
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosclean/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosclean-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/roscreate
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/roscreate/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-roscreate-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/roslang
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/roslang/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-roslang-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/roslib
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/roslib/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-roslib-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosmake
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosmake/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosmake-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosunit
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosunit/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosunit-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros_comm/message_filters
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/message_filters/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-message_filters-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/ros_comm
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/ros_comm/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-ros_comm-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosbag
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosbag/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosbag-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosbag_storage
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosbag_storage/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosbag_storage-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosconsole
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosconsole/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosconsole-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/roscpp
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/roscpp/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-roscpp-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosgraph
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosgraph/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosgraph-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/roslaunch
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/roslaunch/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-roslaunch-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/roslz4
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/roslz4/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-roslz4-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosmaster
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosmaster/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosmaster-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosmsg
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosmsg/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosmsg-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosnode
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosnode/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosnode-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosout
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosout/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosout-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosparam
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosparam/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosparam-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rospy
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rospy/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rospy-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosservice
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosservice/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosservice-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rostest
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rostest/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rostest-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rostopic
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rostopic/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rostopic-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/roswtf
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/roswtf/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-roswtf-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/topic_tools
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/topic_tools/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-topic_tools-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/xmlrpcpp
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/xmlrpcpp/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-xmlrpcpp-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm_msgs/rosgraph_msgs
|
||||
uri: https://github.com/ros-gbp/ros_comm_msgs-release/archive/release/kinetic/rosgraph_msgs/1.11.2-0.tar.gz
|
||||
version: ros_comm_msgs-release-release-kinetic-rosgraph_msgs-1.11.2-0
|
||||
- tar:
|
||||
local-name: ros_comm_msgs/std_srvs
|
||||
uri: https://github.com/ros-gbp/ros_comm_msgs-release/archive/release/kinetic/std_srvs/1.11.2-0.tar.gz
|
||||
version: ros_comm_msgs-release-release-kinetic-std_srvs-1.11.2-0
|
||||
- tar:
|
||||
local-name: ros_environment
|
||||
uri: https://github.com/ros-gbp/ros_environment-release/archive/release/kinetic/ros_environment/1.0.0-0.tar.gz
|
||||
version: ros_environment-release-release-kinetic-ros_environment-1.0.0-0
|
||||
- tar:
|
||||
local-name: roscpp_core/cpp_common
|
||||
uri: https://github.com/ros-gbp/roscpp_core-release/archive/release/kinetic/cpp_common/0.6.9-0.tar.gz
|
||||
version: roscpp_core-release-release-kinetic-cpp_common-0.6.9-0
|
||||
- tar:
|
||||
local-name: roscpp_core/roscpp_serialization
|
||||
uri: https://github.com/ros-gbp/roscpp_core-release/archive/release/kinetic/roscpp_serialization/0.6.9-0.tar.gz
|
||||
version: roscpp_core-release-release-kinetic-roscpp_serialization-0.6.9-0
|
||||
- tar:
|
||||
local-name: roscpp_core/roscpp_traits
|
||||
uri: https://github.com/ros-gbp/roscpp_core-release/archive/release/kinetic/roscpp_traits/0.6.9-0.tar.gz
|
||||
version: roscpp_core-release-release-kinetic-roscpp_traits-0.6.9-0
|
||||
- tar:
|
||||
local-name: roscpp_core/rostime
|
||||
uri: https://github.com/ros-gbp/roscpp_core-release/archive/release/kinetic/rostime/0.6.9-0.tar.gz
|
||||
version: roscpp_core-release-release-kinetic-rostime-0.6.9-0
|
||||
- tar:
|
||||
local-name: roslisp
|
||||
uri: https://github.com/ros-gbp/roslisp-release/archive/release/kinetic/roslisp/1.9.21-0.tar.gz
|
||||
version: roslisp-release-release-kinetic-roslisp-1.9.21-0
|
||||
- tar:
|
||||
local-name: rospack
|
||||
uri: https://github.com/ros-gbp/rospack-release/archive/release/kinetic/rospack/2.4.4-0.tar.gz
|
||||
version: rospack-release-release-kinetic-rospack-2.4.4-0
|
||||
- tar:
|
||||
local-name: std_msgs
|
||||
uri: https://github.com/ros-gbp/std_msgs-release/archive/release/kinetic/std_msgs/0.5.11-0.tar.gz
|
||||
version: std_msgs-release-release-kinetic-std_msgs-0.5.11-0
|
||||
- tar:
|
||||
local-name: actionlib
|
||||
uri: https://github.com/ros-gbp/actionlib-release/archive/release/kinetic/actionlib/1.11.13-0.tar.gz
|
||||
version: actionlib-release-release-kinetic-actionlib-1.11.13-0
|
||||
- tar:
|
||||
local-name: angles
|
||||
uri: https://github.com/ros-gbp/geometry_angles_utils-release/archive/release/kinetic/angles/1.9.11-0.tar.gz
|
||||
version: geometry_angles_utils-release-release-kinetic-angles-1.9.11-0
|
||||
- tar:
|
||||
local-name: async_web_server_cpp
|
||||
uri: https://github.com/gt-rail-release/async_web_server_cpp-release/archive/release/kinetic/async_web_server_cpp/0.0.3-0.tar.gz
|
||||
version: async_web_server_cpp-release-release-kinetic-async_web_server_cpp-0.0.3-0
|
||||
- tar:
|
||||
local-name: bond_core/bond
|
||||
uri: https://github.com/ros-gbp/bond_core-release/archive/release/kinetic/bond/1.8.1-0.tar.gz
|
||||
version: bond_core-release-release-kinetic-bond-1.8.1-0
|
||||
- tar:
|
||||
local-name: bond_core/bond_core
|
||||
uri: https://github.com/ros-gbp/bond_core-release/archive/release/kinetic/bond_core/1.8.1-0.tar.gz
|
||||
version: bond_core-release-release-kinetic-bond_core-1.8.1-0
|
||||
- tar:
|
||||
local-name: bond_core/bondcpp
|
||||
uri: https://github.com/ros-gbp/bond_core-release/archive/release/kinetic/bondcpp/1.8.1-0.tar.gz
|
||||
version: bond_core-release-release-kinetic-bondcpp-1.8.1-0
|
||||
- tar:
|
||||
local-name: bond_core/bondpy
|
||||
uri: https://github.com/ros-gbp/bond_core-release/archive/release/kinetic/bondpy/1.8.1-0.tar.gz
|
||||
version: bond_core-release-release-kinetic-bondpy-1.8.1-0
|
||||
- tar:
|
||||
local-name: bond_core/smclib
|
||||
uri: https://github.com/ros-gbp/bond_core-release/archive/release/kinetic/smclib/1.8.1-0.tar.gz
|
||||
version: bond_core-release-release-kinetic-smclib-1.8.1-0
|
||||
- tar:
|
||||
local-name: catkin
|
||||
uri: https://github.com/ros-gbp/catkin-release/archive/release/kinetic/catkin/0.7.11-0.tar.gz
|
||||
version: catkin-release-release-kinetic-catkin-0.7.11-0
|
||||
- tar:
|
||||
local-name: class_loader
|
||||
uri: https://github.com/ros-gbp/class_loader-release/archive/release/kinetic/class_loader/0.3.9-0.tar.gz
|
||||
version: class_loader-release-release-kinetic-class_loader-0.3.9-0
|
||||
- tar:
|
||||
local-name: cmake_modules
|
||||
uri: https://github.com/ros-gbp/cmake_modules-release/archive/release/kinetic/cmake_modules/0.4.1-0.tar.gz
|
||||
version: cmake_modules-release-release-kinetic-cmake_modules-0.4.1-0
|
||||
- tar:
|
||||
local-name: common_msgs/actionlib_msgs
|
||||
uri: https://github.com/ros-gbp/common_msgs-release/archive/release/kinetic/actionlib_msgs/1.12.6-0.tar.gz
|
||||
version: common_msgs-release-release-kinetic-actionlib_msgs-1.12.6-0
|
||||
- tar:
|
||||
local-name: common_msgs/diagnostic_msgs
|
||||
uri: https://github.com/ros-gbp/common_msgs-release/archive/release/kinetic/diagnostic_msgs/1.12.6-0.tar.gz
|
||||
version: common_msgs-release-release-kinetic-diagnostic_msgs-1.12.6-0
|
||||
- tar:
|
||||
local-name: common_msgs/geometry_msgs
|
||||
uri: https://github.com/ros-gbp/common_msgs-release/archive/release/kinetic/geometry_msgs/1.12.6-0.tar.gz
|
||||
version: common_msgs-release-release-kinetic-geometry_msgs-1.12.6-0
|
||||
- tar:
|
||||
local-name: common_msgs/nav_msgs
|
||||
uri: https://github.com/ros-gbp/common_msgs-release/archive/release/kinetic/nav_msgs/1.12.6-0.tar.gz
|
||||
version: common_msgs-release-release-kinetic-nav_msgs-1.12.6-0
|
||||
- tar:
|
||||
local-name: common_msgs/sensor_msgs
|
||||
uri: https://github.com/ros-gbp/common_msgs-release/archive/release/kinetic/sensor_msgs/1.12.6-0.tar.gz
|
||||
version: common_msgs-release-release-kinetic-sensor_msgs-1.12.6-0
|
||||
- tar:
|
||||
local-name: common_msgs/stereo_msgs
|
||||
uri: https://github.com/ros-gbp/common_msgs-release/archive/release/kinetic/stereo_msgs/1.12.6-0.tar.gz
|
||||
version: common_msgs-release-release-kinetic-stereo_msgs-1.12.6-0
|
||||
- tar:
|
||||
local-name: common_msgs/trajectory_msgs
|
||||
uri: https://github.com/ros-gbp/common_msgs-release/archive/release/kinetic/trajectory_msgs/1.12.6-0.tar.gz
|
||||
version: common_msgs-release-release-kinetic-trajectory_msgs-1.12.6-0
|
||||
- tar:
|
||||
local-name: common_msgs/visualization_msgs
|
||||
uri: https://github.com/ros-gbp/common_msgs-release/archive/release/kinetic/visualization_msgs/1.12.6-0.tar.gz
|
||||
version: common_msgs-release-release-kinetic-visualization_msgs-1.12.6-0
|
||||
- tar:
|
||||
local-name: cv_camera
|
||||
uri: https://github.com/OTL/cv_camera-release/archive/release/kinetic/cv_camera/0.3.0-0.tar.gz
|
||||
version: cv_camera-release-release-kinetic-cv_camera-0.3.0-0
|
||||
- tar:
|
||||
local-name: diagnostics/diagnostic_updater
|
||||
uri: https://github.com/ros-gbp/diagnostics-release/archive/release/kinetic/diagnostic_updater/1.9.3-0.tar.gz
|
||||
version: diagnostics-release-release-kinetic-diagnostic_updater-1.9.3-0
|
||||
- tar:
|
||||
local-name: dynamic_reconfigure
|
||||
uri: https://github.com/ros-gbp/dynamic_reconfigure-release/archive/release/kinetic/dynamic_reconfigure/1.5.49-0.tar.gz
|
||||
version: dynamic_reconfigure-release-release-kinetic-dynamic_reconfigure-1.5.49-0
|
||||
- tar:
|
||||
local-name: gencpp
|
||||
uri: https://github.com/ros-gbp/gencpp-release/archive/release/kinetic/gencpp/0.6.0-0.tar.gz
|
||||
version: gencpp-release-release-kinetic-gencpp-0.6.0-0
|
||||
- tar:
|
||||
local-name: geneus
|
||||
uri: https://github.com/tork-a/geneus-release/archive/release/kinetic/geneus/2.2.6-0.tar.gz
|
||||
version: geneus-release-release-kinetic-geneus-2.2.6-0
|
||||
- tar:
|
||||
local-name: genlisp
|
||||
uri: https://github.com/ros-gbp/genlisp-release/archive/release/kinetic/genlisp/0.4.16-0.tar.gz
|
||||
version: genlisp-release-release-kinetic-genlisp-0.4.16-0
|
||||
- tar:
|
||||
local-name: genmsg
|
||||
uri: https://github.com/ros-gbp/genmsg-release/archive/release/kinetic/genmsg/0.5.10-0.tar.gz
|
||||
version: genmsg-release-release-kinetic-genmsg-0.5.10-0
|
||||
- tar:
|
||||
local-name: gennodejs
|
||||
uri: https://github.com/RethinkRobotics-release/gennodejs-release/archive/release/kinetic/gennodejs/2.0.1-0.tar.gz
|
||||
version: gennodejs-release-release-kinetic-gennodejs-2.0.1-0
|
||||
- tar:
|
||||
local-name: genpy
|
||||
uri: https://github.com/ros-gbp/genpy-release/archive/release/kinetic/genpy/0.6.7-0.tar.gz
|
||||
version: genpy-release-release-kinetic-genpy-0.6.7-0
|
||||
- tar:
|
||||
local-name: geographic_info/geographic_msgs
|
||||
uri: https://github.com/ros-geographic-info/geographic_info-release/archive/release/kinetic/geographic_msgs/0.5.2-0.tar.gz
|
||||
version: geographic_info-release-release-kinetic-geographic_msgs-0.5.2-0
|
||||
- tar:
|
||||
local-name: geometry/eigen_conversions
|
||||
uri: https://github.com/ros-gbp/geometry-release/archive/release/kinetic/eigen_conversions/1.11.9-0.tar.gz
|
||||
version: geometry-release-release-kinetic-eigen_conversions-1.11.9-0
|
||||
- tar:
|
||||
local-name: geometry/tf
|
||||
uri: https://github.com/ros-gbp/geometry-release/archive/release/kinetic/tf/1.11.9-0.tar.gz
|
||||
version: geometry-release-release-kinetic-tf-1.11.9-0
|
||||
- tar:
|
||||
local-name: geometry2/geometry2
|
||||
uri: https://github.com/ros-gbp/geometry2-release/archive/release/kinetic/geometry2/0.5.17-0.tar.gz
|
||||
version: geometry2-release-release-kinetic-geometry2-0.5.17-0
|
||||
- tar:
|
||||
local-name: geometry2/tf2
|
||||
uri: https://github.com/ros-gbp/geometry2-release/archive/release/kinetic/tf2/0.5.17-0.tar.gz
|
||||
version: geometry2-release-release-kinetic-tf2-0.5.17-0
|
||||
- tar:
|
||||
local-name: geometry2/tf2_bullet
|
||||
uri: https://github.com/ros-gbp/geometry2-release/archive/release/kinetic/tf2_bullet/0.5.17-0.tar.gz
|
||||
version: geometry2-release-release-kinetic-tf2_bullet-0.5.17-0
|
||||
- tar:
|
||||
local-name: geometry2/tf2_eigen
|
||||
uri: https://github.com/ros-gbp/geometry2-release/archive/release/kinetic/tf2_eigen/0.5.17-0.tar.gz
|
||||
version: geometry2-release-release-kinetic-tf2_eigen-0.5.17-0
|
||||
- tar:
|
||||
local-name: geometry2/tf2_geometry_msgs
|
||||
uri: https://github.com/ros-gbp/geometry2-release/archive/release/kinetic/tf2_geometry_msgs/0.5.17-0.tar.gz
|
||||
version: geometry2-release-release-kinetic-tf2_geometry_msgs-0.5.17-0
|
||||
- tar:
|
||||
local-name: geometry2/tf2_kdl
|
||||
uri: https://github.com/ros-gbp/geometry2-release/archive/release/kinetic/tf2_kdl/0.5.17-0.tar.gz
|
||||
version: geometry2-release-release-kinetic-tf2_kdl-0.5.17-0
|
||||
- tar:
|
||||
local-name: geometry2/tf2_msgs
|
||||
uri: https://github.com/ros-gbp/geometry2-release/archive/release/kinetic/tf2_msgs/0.5.17-0.tar.gz
|
||||
version: geometry2-release-release-kinetic-tf2_msgs-0.5.17-0
|
||||
- tar:
|
||||
local-name: geometry2/tf2_py
|
||||
uri: https://github.com/ros-gbp/geometry2-release/archive/release/kinetic/tf2_py/0.5.17-0.tar.gz
|
||||
version: geometry2-release-release-kinetic-tf2_py-0.5.17-0
|
||||
- tar:
|
||||
local-name: geometry2/tf2_ros
|
||||
uri: https://github.com/ros-gbp/geometry2-release/archive/release/kinetic/tf2_ros/0.5.17-0.tar.gz
|
||||
version: geometry2-release-release-kinetic-tf2_ros-0.5.17-0
|
||||
- tar:
|
||||
local-name: geometry2/tf2_sensor_msgs
|
||||
uri: https://github.com/ros-gbp/geometry2-release/archive/release/kinetic/tf2_sensor_msgs/0.5.17-0.tar.gz
|
||||
version: geometry2-release-release-kinetic-tf2_sensor_msgs-0.5.17-0
|
||||
- tar:
|
||||
local-name: geometry2/tf2_tools
|
||||
uri: https://github.com/ros-gbp/geometry2-release/archive/release/kinetic/tf2_tools/0.5.17-0.tar.gz
|
||||
version: geometry2-release-release-kinetic-tf2_tools-0.5.17-0
|
||||
- tar:
|
||||
local-name: image_common/camera_calibration_parsers
|
||||
uri: https://github.com/ros-gbp/image_common-release/archive/release/kinetic/camera_calibration_parsers/1.11.13-0.tar.gz
|
||||
version: image_common-release-release-kinetic-camera_calibration_parsers-1.11.13-0
|
||||
- tar:
|
||||
local-name: image_common/camera_info_manager
|
||||
uri: https://github.com/ros-gbp/image_common-release/archive/release/kinetic/camera_info_manager/1.11.13-0.tar.gz
|
||||
version: image_common-release-release-kinetic-camera_info_manager-1.11.13-0
|
||||
- tar:
|
||||
local-name: image_common/image_transport
|
||||
uri: https://github.com/ros-gbp/image_common-release/archive/release/kinetic/image_transport/1.11.13-0.tar.gz
|
||||
version: image_common-release-release-kinetic-image_transport-1.11.13-0
|
||||
- tar:
|
||||
local-name: mavlink
|
||||
uri: https://github.com/mavlink/mavlink-gbp-release/archive/release/kinetic/mavlink/2018.6.6-0.tar.gz
|
||||
version: mavlink-gbp-release-release-kinetic-mavlink-2018.6.6-0
|
||||
- tar:
|
||||
local-name: mavros/libmavconn
|
||||
uri: https://github.com/mavlink/mavros-release/archive/release/kinetic/libmavconn/0.26.0-0.tar.gz
|
||||
version: mavros-release-release-kinetic-libmavconn-0.26.0-0
|
||||
- tar:
|
||||
local-name: mavros/mavros
|
||||
uri: https://github.com/mavlink/mavros-release/archive/release/kinetic/mavros/0.26.0-0.tar.gz
|
||||
version: mavros-release-release-kinetic-mavros-0.26.0-0
|
||||
- tar:
|
||||
local-name: mavros/mavros_extras
|
||||
uri: https://github.com/mavlink/mavros-release/archive/release/kinetic/mavros_extras/0.26.0-0.tar.gz
|
||||
version: mavros-release-release-kinetic-mavros_extras-0.26.0-0
|
||||
- tar:
|
||||
local-name: mavros/mavros_msgs
|
||||
uri: https://github.com/mavlink/mavros-release/archive/release/kinetic/mavros_msgs/0.26.0-0.tar.gz
|
||||
version: mavros-release-release-kinetic-mavros_msgs-0.26.0-0
|
||||
- tar:
|
||||
local-name: message_generation
|
||||
uri: https://github.com/ros-gbp/message_generation-release/archive/release/kinetic/message_generation/0.4.0-0.tar.gz
|
||||
version: message_generation-release-release-kinetic-message_generation-0.4.0-0
|
||||
- tar:
|
||||
local-name: message_runtime
|
||||
uri: https://github.com/ros-gbp/message_runtime-release/archive/release/kinetic/message_runtime/0.4.12-0.tar.gz
|
||||
version: message_runtime-release-release-kinetic-message_runtime-0.4.12-0
|
||||
- tar:
|
||||
local-name: nodelet_core/nodelet
|
||||
uri: https://github.com/ros-gbp/nodelet_core-release/archive/release/kinetic/nodelet/1.9.14-0.tar.gz
|
||||
version: nodelet_core-release-release-kinetic-nodelet-1.9.14-0
|
||||
- tar:
|
||||
local-name: opencv3
|
||||
uri: https://github.com/ros-gbp/opencv3-release/archive/release/kinetic/opencv3/3.3.1-5.tar.gz
|
||||
version: opencv3-release-release-kinetic-opencv3-3.3.1-5
|
||||
- tar:
|
||||
local-name: orocos_kinematics_dynamics/orocos_kdl
|
||||
uri: https://github.com/smits/orocos-kdl-release/archive/release/kinetic/orocos_kdl/1.3.1-0.tar.gz
|
||||
version: orocos-kdl-release-release-kinetic-orocos_kdl-1.3.1-0
|
||||
- tar:
|
||||
local-name: orocos_kinematics_dynamics/python_orocos_kdl
|
||||
uri: https://github.com/smits/orocos-kdl-release/archive/release/kinetic/python_orocos_kdl/1.3.1-0.tar.gz
|
||||
version: orocos-kdl-release-release-kinetic-python_orocos_kdl-1.3.1-0
|
||||
- tar:
|
||||
local-name: pluginlib
|
||||
uri: https://github.com/ros-gbp/pluginlib-release/archive/release/kinetic/pluginlib/1.11.3-0.tar.gz
|
||||
version: pluginlib-release-release-kinetic-pluginlib-1.11.3-0
|
||||
- tar:
|
||||
local-name: ros/mk
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/mk/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-mk-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/ros
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/ros/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-ros-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosbash
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosbash/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosbash-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosboost_cfg
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosboost_cfg/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosboost_cfg-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosbuild
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosbuild/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosbuild-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosclean
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosclean/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosclean-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/roscreate
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/roscreate/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-roscreate-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/roslang
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/roslang/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-roslang-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/roslib
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/roslib/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-roslib-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosmake
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosmake/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosmake-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros/rosunit
|
||||
uri: https://github.com/ros-gbp/ros-release/archive/release/kinetic/rosunit/1.14.3-0.tar.gz
|
||||
version: ros-release-release-kinetic-rosunit-1.14.3-0
|
||||
- tar:
|
||||
local-name: ros_comm/message_filters
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/message_filters/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-message_filters-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/ros_comm
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/ros_comm/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-ros_comm-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosbag
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosbag/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosbag-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosbag_storage
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosbag_storage/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosbag_storage-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosconsole
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosconsole/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosconsole-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/roscpp
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/roscpp/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-roscpp-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosgraph
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosgraph/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosgraph-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/roslaunch
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/roslaunch/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-roslaunch-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/roslz4
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/roslz4/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-roslz4-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosmaster
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosmaster/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosmaster-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosmsg
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosmsg/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosmsg-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosnode
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosnode/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosnode-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosout
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosout/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosout-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosparam
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosparam/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosparam-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rospy
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rospy/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rospy-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rosservice
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rosservice/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rosservice-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rostest
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rostest/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rostest-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/rostopic
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/rostopic/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-rostopic-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/roswtf
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/roswtf/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-roswtf-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/topic_tools
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/topic_tools/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-topic_tools-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm/xmlrpcpp
|
||||
uri: https://github.com/ros-gbp/ros_comm-release/archive/release/kinetic/xmlrpcpp/1.12.13-0.tar.gz
|
||||
version: ros_comm-release-release-kinetic-xmlrpcpp-1.12.13-0
|
||||
- tar:
|
||||
local-name: ros_comm_msgs/rosgraph_msgs
|
||||
uri: https://github.com/ros-gbp/ros_comm_msgs-release/archive/release/kinetic/rosgraph_msgs/1.11.2-0.tar.gz
|
||||
version: ros_comm_msgs-release-release-kinetic-rosgraph_msgs-1.11.2-0
|
||||
- tar:
|
||||
local-name: ros_comm_msgs/std_srvs
|
||||
uri: https://github.com/ros-gbp/ros_comm_msgs-release/archive/release/kinetic/std_srvs/1.11.2-0.tar.gz
|
||||
version: ros_comm_msgs-release-release-kinetic-std_srvs-1.11.2-0
|
||||
- tar:
|
||||
local-name: ros_environment
|
||||
uri: https://github.com/ros-gbp/ros_environment-release/archive/release/kinetic/ros_environment/1.0.0-0.tar.gz
|
||||
version: ros_environment-release-release-kinetic-ros_environment-1.0.0-0
|
||||
- tar:
|
||||
local-name: ros_tutorials/rospy_tutorials
|
||||
uri: https://github.com/ros-gbp/ros_tutorials-release/archive/release/kinetic/rospy_tutorials/0.7.1-0.tar.gz
|
||||
version: ros_tutorials-release-release-kinetic-rospy_tutorials-0.7.1-0
|
||||
- tar:
|
||||
local-name: rosauth
|
||||
uri: https://github.com/gt-rail-release/rosauth-release/archive/release/kinetic/rosauth/0.1.7-0.tar.gz
|
||||
version: rosauth-release-release-kinetic-rosauth-0.1.7-0
|
||||
- tar:
|
||||
local-name: rosbag_migration_rule
|
||||
uri: https://github.com/ros-gbp/rosbag_migration_rule-release/archive/release/kinetic/rosbag_migration_rule/1.0.0-0.tar.gz
|
||||
version: rosbag_migration_rule-release-release-kinetic-rosbag_migration_rule-1.0.0-0
|
||||
- tar:
|
||||
local-name: rosbridge_suite/rosapi
|
||||
uri: https://github.com/RobotWebTools-release/rosbridge_suite-release/archive/release/kinetic/rosapi/0.9.0-0.tar.gz
|
||||
version: rosbridge_suite-release-release-kinetic-rosapi-0.9.0-0
|
||||
- tar:
|
||||
local-name: rosbridge_suite/rosbridge_library
|
||||
uri: https://github.com/RobotWebTools-release/rosbridge_suite-release/archive/release/kinetic/rosbridge_library/0.9.0-0.tar.gz
|
||||
version: rosbridge_suite-release-release-kinetic-rosbridge_library-0.9.0-0
|
||||
- tar:
|
||||
local-name: rosbridge_suite/rosbridge_server
|
||||
uri: https://github.com/RobotWebTools-release/rosbridge_suite-release/archive/release/kinetic/rosbridge_server/0.9.0-0.tar.gz
|
||||
version: rosbridge_suite-release-release-kinetic-rosbridge_server-0.9.0-0
|
||||
- tar:
|
||||
local-name: rosbridge_suite/rosbridge_suite
|
||||
uri: https://github.com/RobotWebTools-release/rosbridge_suite-release/archive/release/kinetic/rosbridge_suite/0.9.0-0.tar.gz
|
||||
version: rosbridge_suite-release-release-kinetic-rosbridge_suite-0.9.0-0
|
||||
- tar:
|
||||
local-name: rosconsole_bridge
|
||||
uri: https://github.com/ros-gbp/rosconsole_bridge-release/archive/release/kinetic/rosconsole_bridge/0.5.1-0.tar.gz
|
||||
version: rosconsole_bridge-release-release-kinetic-rosconsole_bridge-0.5.1-0
|
||||
- tar:
|
||||
local-name: roscpp_core/cpp_common
|
||||
uri: https://github.com/ros-gbp/roscpp_core-release/archive/release/kinetic/cpp_common/0.6.9-0.tar.gz
|
||||
version: roscpp_core-release-release-kinetic-cpp_common-0.6.9-0
|
||||
- tar:
|
||||
local-name: roscpp_core/roscpp_serialization
|
||||
uri: https://github.com/ros-gbp/roscpp_core-release/archive/release/kinetic/roscpp_serialization/0.6.9-0.tar.gz
|
||||
version: roscpp_core-release-release-kinetic-roscpp_serialization-0.6.9-0
|
||||
- tar:
|
||||
local-name: roscpp_core/roscpp_traits
|
||||
uri: https://github.com/ros-gbp/roscpp_core-release/archive/release/kinetic/roscpp_traits/0.6.9-0.tar.gz
|
||||
version: roscpp_core-release-release-kinetic-roscpp_traits-0.6.9-0
|
||||
- tar:
|
||||
local-name: roscpp_core/rostime
|
||||
uri: https://github.com/ros-gbp/roscpp_core-release/archive/release/kinetic/rostime/0.6.9-0.tar.gz
|
||||
version: roscpp_core-release-release-kinetic-rostime-0.6.9-0
|
||||
- tar:
|
||||
local-name: roslint
|
||||
uri: https://github.com/ros-gbp/roslint-release/archive/release/kinetic/roslint/0.11.0-0.tar.gz
|
||||
version: roslint-release-release-kinetic-roslint-0.11.0-0
|
||||
- tar:
|
||||
local-name: roslisp
|
||||
uri: https://github.com/ros-gbp/roslisp-release/archive/release/kinetic/roslisp/1.9.21-0.tar.gz
|
||||
version: roslisp-release-release-kinetic-roslisp-1.9.21-0
|
||||
- tar:
|
||||
local-name: rospack
|
||||
uri: https://github.com/ros-gbp/rospack-release/archive/release/kinetic/rospack/2.4.4-0.tar.gz
|
||||
version: rospack-release-release-kinetic-rospack-2.4.4-0
|
||||
- tar:
|
||||
local-name: rosserial/rosserial
|
||||
uri: https://github.com/ros-gbp/rosserial-release/archive/release/kinetic/rosserial/0.7.7-0.tar.gz
|
||||
version: rosserial-release-release-kinetic-rosserial-0.7.7-0
|
||||
- tar:
|
||||
local-name: rosserial/rosserial_client
|
||||
uri: https://github.com/ros-gbp/rosserial-release/archive/release/kinetic/rosserial_client/0.7.7-0.tar.gz
|
||||
version: rosserial-release-release-kinetic-rosserial_client-0.7.7-0
|
||||
- tar:
|
||||
local-name: rosserial/rosserial_msgs
|
||||
uri: https://github.com/ros-gbp/rosserial-release/archive/release/kinetic/rosserial_msgs/0.7.7-0.tar.gz
|
||||
version: rosserial-release-release-kinetic-rosserial_msgs-0.7.7-0
|
||||
- tar:
|
||||
local-name: rosserial/rosserial_python
|
||||
uri: https://github.com/ros-gbp/rosserial-release/archive/release/kinetic/rosserial_python/0.7.7-0.tar.gz
|
||||
version: rosserial-release-release-kinetic-rosserial_python-0.7.7-0
|
||||
- tar:
|
||||
local-name: std_msgs
|
||||
uri: https://github.com/ros-gbp/std_msgs-release/archive/release/kinetic/std_msgs/0.5.11-0.tar.gz
|
||||
version: std_msgs-release-release-kinetic-std_msgs-0.5.11-0
|
||||
- tar:
|
||||
local-name: unique_identifier/uuid_msgs
|
||||
uri: https://github.com/ros-geographic-info/unique_identifier-release/archive/release/kinetic/uuid_msgs/1.0.5-0.tar.gz
|
||||
version: unique_identifier-release-release-kinetic-uuid_msgs-1.0.5-0
|
||||
- tar:
|
||||
local-name: urdf/urdf
|
||||
uri: https://github.com/ros-gbp/urdf-release/archive/release/kinetic/urdf/1.12.12-0.tar.gz
|
||||
version: urdf-release-release-kinetic-urdf-1.12.12-0
|
||||
- tar:
|
||||
local-name: urdf/urdf_parser_plugin
|
||||
uri: https://github.com/ros-gbp/urdf-release/archive/release/kinetic/urdf_parser_plugin/1.12.12-0.tar.gz
|
||||
version: urdf-release-release-kinetic-urdf_parser_plugin-1.12.12-0
|
||||
- tar:
|
||||
local-name: usb_cam
|
||||
uri: https://github.com/ros-gbp/usb_cam-release/archive/release/kinetic/usb_cam/0.3.5-0.tar.gz
|
||||
version: usb_cam-release-release-kinetic-usb_cam-0.3.5-0
|
||||
- tar:
|
||||
local-name: vision_opencv/cv_bridge
|
||||
uri: https://github.com/ros-gbp/vision_opencv-release/archive/release/kinetic/cv_bridge/1.12.8-0.tar.gz
|
||||
version: vision_opencv-release-release-kinetic-cv_bridge-1.12.8-0
|
||||
- tar:
|
||||
local-name: web_video_server
|
||||
uri: https://github.com/RobotWebTools-release/web_video_server-release/archive/release/kinetic/web_video_server/0.0.7-0.tar.gz
|
||||
version: web_video_server-release-release-kinetic-web_video_server-0.0.7-0
|
||||
11
image_builder/scripts/change_boot_part.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #1 Change boot partition\033[0m\033[0m"
|
||||
|
||||
sed -i 's/root=[^ ]*/root=\/dev\/mmcblk0p2/' /boot/cmdline.txt
|
||||
sed -i 's/.* \/boot vfat defaults 0 2$/\/dev\/mmcblk0p1 \/boot vfat defaults 0 2/' /etc/fstab
|
||||
sed -i 's/.* \/ ext4 defaults,noatime 0 1$/\/dev\/mmcblk0p2 \/ ext4 defaults,noatime 0 1/' /etc/fstab
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | End of change boot partition\033[0m\033[0m"
|
||||
@@ -38,6 +38,7 @@ echo -e "\033[0;31m\033[1m$(date) | #6 Turn on UART\033[0m\033[0m"
|
||||
# https://github.com/RPi-Distro/raspi-config/pull/75
|
||||
/usr/bin/raspi-config nonint do_serial 1
|
||||
/usr/bin/raspi-config nonint set_config_var enable_uart 1 /boot/config.txt
|
||||
/usr/bin/raspi-config nonint set_config_var dtoverlay pi3-miniuart-bt /boot/config.txt
|
||||
|
||||
# After adding to Raspbian OS
|
||||
# https://github.com/RPi-Distro/raspi-config/commit/d6d9ecc0d9cbe4aaa9744ae733b9cb239e79c116
|
||||
|
||||
@@ -8,10 +8,13 @@ echo -e "\033[0;31m\033[1m$(date) | #1 Write to /etc/wpa_supplicant/wpa_supplica
|
||||
echo "
|
||||
network={
|
||||
ssid=\"CLEVER\"
|
||||
mode=2
|
||||
key_mgmt=WPA-PSK
|
||||
psk=\"cleverwifi\"
|
||||
frequency=2437
|
||||
mode=2
|
||||
proto=RSN
|
||||
key_mgmt=WPA-PSK
|
||||
pairwise=CCMP
|
||||
group=CCMP
|
||||
auth_alg=OPEN
|
||||
}" >> /etc/wpa_supplicant/wpa_supplicant.conf
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #2 Write STATIC to /etc/dhcpcd.conf\033[0m\033[0m"
|
||||
@@ -20,36 +23,23 @@ echo "
|
||||
interface wlan0
|
||||
static ip_address=192.168.11.1/24" >> /etc/dhcpcd.conf
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #3 Write iface to /etc/default/isc-dhcp-server\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1m$(date) | #3 Write dhcp-config to /etc/dnsmasq.conf\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 "
|
||||
interface=wlan0
|
||||
address=/clever/coex/192.168.11.1
|
||||
dhcp-range=192.168.11.100,192.168.11.200,12h
|
||||
no-hosts
|
||||
filterwin2k
|
||||
bogus-priv
|
||||
domain-needed
|
||||
quiet-dhcp6
|
||||
" >> /etc/dnsmasq.conf
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #4 Write dhcp declaration subnet to /etc/dhcp/dhcpd.conf\033[0m\033[0m"
|
||||
|
||||
echo "subnet 192.168.11.0 netmask 255.255.255.0 {
|
||||
range 192.168.11.11 192.168.11.254;
|
||||
#option domain-name-servers 8.8.8.8;
|
||||
#option domain-name "rpi.local";
|
||||
option routers 192.168.11.1;
|
||||
option broadcast-address 192.168.11.255;
|
||||
default-lease-time 600;
|
||||
max-lease-time 7200;
|
||||
}" >> /etc/dhcp/dhcpd.conf
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #5 Write start script for dhcpd to /etc/network/if-up.d/isc-dhcp-server\033[0m\033[0m"
|
||||
|
||||
echo "#!/bin/sh
|
||||
if [ \"\$IFACE\" = \"--all\" ];
|
||||
then sleep 10 && systemctl start isc-dhcp-server.service &
|
||||
fi
|
||||
" > /etc/network/if-up.d/isc-dhcp-server \
|
||||
&& chmod +x /etc/network/if-up.d/isc-dhcp-server
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #6 Write magic script for rename SSID to /etc/rc.local\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1m$(date) | #4 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"
|
||||
|
||||
sed -i "19a$RENAME_SSID" /etc/rc.local
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #7 End of network installation\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1m$(date) | #5 End of network installation\033[0m\033[0m"
|
||||
|
||||
@@ -7,15 +7,14 @@ set -e
|
||||
##################################################################################################################################
|
||||
|
||||
# ros http://wiki.ros.org/action/fullsearch/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi
|
||||
# maintainer @urpylka
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #0 Installing ROS\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1m$(date) | Installing ROS\033[0m\033[0m"
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #1 Installing dirmngr & add key to apt-key\033[0m\033[0m"
|
||||
|
||||
# Install a tool that apt-key uses to add ROS repository key
|
||||
# http://wpblogger.su/tags/apt/
|
||||
apt-get install dirmngr
|
||||
apt-get install --no-install-recommends -y dirmngr=2.1.18-8~deb9u2
|
||||
# setup keys
|
||||
apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
|
||||
|
||||
@@ -31,36 +30,41 @@ apt-get update
|
||||
echo -e "\033[0;31m\033[1m$(date) | #3 Installing 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 \
|
||||
unzip \
|
||||
python-rosdep \
|
||||
python-rosinstall-generator \
|
||||
python-wstool \
|
||||
python-rosinstall \
|
||||
build-essential \
|
||||
cmake \
|
||||
libjpeg8-dev
|
||||
python-rosdep=0.12.2-1 \
|
||||
python-rosinstall-generator=0.1.14-1 \
|
||||
python-wstool=0.1.17-1 \
|
||||
python-rosinstall=0.7.8-1 \
|
||||
build-essential=12.3
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #4 rosdep init && rosdep update\033[0m\033[0m"
|
||||
|
||||
# bootstrap rosdep
|
||||
rosdep init && rosdep update
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #5 Preparing ros_comm packages to kinetic-ros_comm-wet.rosinstall\033[0m\033[0m"
|
||||
# If $3 = false, then discover packages
|
||||
if [ "$3" = "false" ];
|
||||
then
|
||||
echo -e "\033[0;31m\033[1m$(date) | #5 Preparing 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 \
|
||||
&& rosinstall_generator ros_comm --rosdistro kinetic --deps --wet-only --tar > kinetic-ros_comm-wet.rosinstall \
|
||||
&& wstool init src kinetic-ros_comm-wet.rosinstall
|
||||
# create ros catkin workspace
|
||||
mkdir -p /home/pi/ros_catkin_ws && cd /home/pi/ros_catkin_ws \
|
||||
&& rosinstall_generator ros_comm --rosdistro kinetic --deps --wet-only --tar > kinetic-ros_comm-wet.rosinstall \
|
||||
&& wstool init src kinetic-ros_comm-wet.rosinstall
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #6 Preparing other ROS-packages to kinetic-custom_ros.rosinstall\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1m$(date) | #6 Preparing other ROS-packages to kinetic-custom_ros.rosinstall\033[0m\033[0m"
|
||||
|
||||
cd /home/pi/ros_catkin_ws \
|
||||
&& rosinstall_generator \
|
||||
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 cv_bridge cv_camera 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 web_video_server xmlrpcpp mavros opencv3 mavros_extras \
|
||||
--rosdistro kinetic --deps --wet-only --tar > kinetic-custom_ros.rosinstall \
|
||||
&& wstool merge -t src kinetic-custom_ros.rosinstall \
|
||||
&& wstool update -t src
|
||||
cd /home/pi/ros_catkin_ws \
|
||||
&& rosinstall_generator \
|
||||
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 cv_bridge cv_camera 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 web_video_server xmlrpcpp mavros opencv3 mavros_extras \
|
||||
--rosdistro kinetic --deps --wet-only --tar > kinetic-custom_ros.rosinstall \
|
||||
&& wstool merge -t src kinetic-custom_ros.rosinstall \
|
||||
&& wstool update -t src
|
||||
else
|
||||
echo -e "\033[0;31m\033[1m$(date) | #5 Creating manual ros_catkin_ws\033[0m\033[0m"
|
||||
|
||||
mkdir -p /home/pi/ros_catkin_ws && cd /home/pi/ros_catkin_ws \
|
||||
&& wstool init src kinetic-ros-coex.rosinstall
|
||||
fi
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #7 Installing dependencies apps with rosdep\033[0m\033[0m"
|
||||
cd /home/pi/ros_catkin_ws
|
||||
@@ -92,7 +96,6 @@ set -e
|
||||
[[ "$install_ok" == true ]]
|
||||
echo -e "\033[0;31m\033[1m$(date) | End of rosdep install\033[0m\033[0m"
|
||||
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #8 Refactoring usb_cam in SRC\033[0m\033[0m"
|
||||
|
||||
sed -i '/#define __STDC_CONSTANT_MACROS/a\#define PIX_FMT_RGB24 AV_PIX_FMT_RGB24\n#define PIX_FMT_YUV422P AV_PIX_FMT_YUV422P' /home/pi/ros_catkin_ws/src/usb_cam/src/usb_cam.cpp
|
||||
@@ -119,18 +122,16 @@ echo -e "\033[0;31m\033[1m$(date) | #10 Building packages on 1 thread\033[0m\033
|
||||
# TODO: Can we increase threads number with HDD swap?
|
||||
cd /home/pi/ros_catkin_ws && ./src/catkin/bin/catkin_make_isolated --install -j1 -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #12 Creating catkin_ws\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1m$(date) | #11 Remove build_isolated & devel_isolated from ros_catkin_ws\033[0m\033[0m"
|
||||
|
||||
mkdir -p /home/pi/catkin_ws/src \
|
||||
&& cd /home/pi/catkin_ws \
|
||||
&& . /opt/ros/kinetic/setup.sh \
|
||||
&& catkin init \
|
||||
&& wstool init /home/pi/catkin_ws/src
|
||||
rm -rf /home/pi/ros_catkin_ws/build_isolated /home/pi/ros_catkin_ws/devel_isolated
|
||||
chown -Rf pi:pi /home/pi/ros_catkin_ws
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #13 Installing CLEVER-BUNDLE\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1m$(date) | #12 Creating catkin_ws & Installing CLEVER-BUNDLE\033[0m\033[0m"
|
||||
|
||||
cd /home/pi/catkin_ws/src \
|
||||
&& git clone https://github.com/CopterExpress/clever.git clever \
|
||||
git clone $1 /home/pi/catkin_ws/src/clever \
|
||||
&& cd /home/pi/catkin_ws/src/clever \
|
||||
&& git checkout $2 \
|
||||
&& pip install wheel \
|
||||
&& pip install -r /home/pi/catkin_ws/src/clever/clever/requirements.txt \
|
||||
&& cd /home/pi/catkin_ws \
|
||||
@@ -139,30 +140,23 @@ cd /home/pi/catkin_ws/src \
|
||||
&& 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) | #14 Adding mjpg-streamer at /home/pi\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1m$(date) | #13 Remove build dir from catkin_ws\033[0m\033[0m"
|
||||
|
||||
# https://github.com/jacksonliam/mjpg-streamer
|
||||
rm -rf /home/pi/catkin_ws/build
|
||||
chown -Rf pi:pi /home/pi/catkin_ws
|
||||
|
||||
cd /home/pi \
|
||||
&& git clone https://github.com/jacksonliam/mjpg-streamer.git \
|
||||
&& cd /home/pi/mjpg-streamer/mjpg-streamer-experimental \
|
||||
&& make \
|
||||
&& make install
|
||||
echo -e "\033[0;31m\033[1m$(date) | #14 Setup ROS environment\033[0m\033[0m"
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #15 Adding ENV vars\033[0m\033[0m"
|
||||
cat <<EOF | tee -a /home/pi/.bashrc > /dev/null
|
||||
LANG=C.UTF-8
|
||||
LC_ALL=C.UTF-8
|
||||
ROS_DISTRO=kinetic
|
||||
export ROS_IP=192.168.11.1
|
||||
source /opt/ros/kinetic/setup.bash
|
||||
source /home/pi/catkin_ws/devel/setup.bash
|
||||
EOF
|
||||
|
||||
# setup environment
|
||||
echo "LANG=C.UTF-8" >> /home/pi/.bashrc
|
||||
echo "LC_ALL=C.UTF-8" >> /home/pi/.bashrc
|
||||
echo "ROS_DISTRO=kinetic" >> /home/pi/.bashrc
|
||||
echo "export ROS_IP=192.168.11.1" >> /home/pi/.bashrc
|
||||
|
||||
echo "source /opt/ros/kinetic/setup.bash" >> /home/pi/.bashrc \
|
||||
&& echo "source /home/pi/catkin_ws/devel/setup.bash" >> /home/pi/.bashrc
|
||||
|
||||
chown -Rf pi:pi /home/pi
|
||||
|
||||
#echo -e "\033[0;31m\033[1m$(date) | #16 Removing local apt mirror\033[0m\033[0m"
|
||||
#echo -e "\033[0;31m\033[1m$(date) | #14 Removing local apt mirror\033[0m\033[0m"
|
||||
# Restore original sources.list
|
||||
#mv /var/sources.list.bak /etc/apt/sources.list
|
||||
# Clean apt cache
|
||||
@@ -170,4 +164,4 @@ apt-get clean
|
||||
# Remove local mirror repository key
|
||||
#apt-key del COEX-MIRROR
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #16 END of ROS INSTALLATION\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1m$(date) | END of ROS INSTALLATION\033[0m\033[0m"
|
||||
|
||||
@@ -6,23 +6,43 @@ set -e
|
||||
# Image software installation
|
||||
##################################################################################################################################
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #1 Network installing\033[0m\033[0m"
|
||||
echo -e "\033[0;31m\033[1m$(date) | #1 Software installing\033[0m\033[0m"
|
||||
|
||||
# TODO: Use dnsmasq instead of isc-dhcp-server
|
||||
apt-get install --no-install-recommends -y \
|
||||
unzip \
|
||||
zip \
|
||||
ipython \
|
||||
screen \
|
||||
byobu \
|
||||
nmap \
|
||||
lsof \
|
||||
python-pip \
|
||||
git \
|
||||
isc-dhcp-server \
|
||||
tmux \
|
||||
vim \
|
||||
ipython3 \
|
||||
python3-pip
|
||||
unzip=6.0-21 \
|
||||
zip=3.0-11 \
|
||||
ipython=5.1.0-3 \
|
||||
ipython3=5.1.0-3 \
|
||||
screen=4.5.0-6 \
|
||||
byobu=5.112-1 \
|
||||
nmap=7.40-1 \
|
||||
lsof=4.89+dfsg-0.1 \
|
||||
git=1:2.11.0-3+deb9u3 \
|
||||
dnsmasq=2.76-5+rpt1+deb9u1 \
|
||||
tmux=2.3-4 \
|
||||
vim=2:8.0.0197-4+deb9u1 \
|
||||
cmake=3.7.2-1 \
|
||||
python-pip=9.0.1-2+rpt2 \
|
||||
python3-pip=9.0.1-2+rpt2 \
|
||||
libjpeg8-dev=8d1-2 \
|
||||
tcpdump \
|
||||
libpoco-dev=1.7.6+dfsg1-5+deb9u1
|
||||
|
||||
echo -e "\033[0;31m\033[1m$(date) | #2 Adding mjpg-streamer at /home/pi\033[0m\033[0m"
|
||||
# https://github.com/jacksonliam/mjpg-streamer
|
||||
|
||||
git clone https://github.com/jacksonliam/mjpg-streamer.git /home/pi/mjpg-streamer \
|
||||
&& cd /home/pi/mjpg-streamer/mjpg-streamer-experimental \
|
||||
&& make \
|
||||
&& make install \
|
||||
&& chown -Rf pi:pi /home/pi/mjpg-streamer
|
||||
|
||||
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"
|
||||
|
||||