Compare commits
45 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 |
@@ -14,6 +14,8 @@ Use it to learn how to assemble, configure, pilot and program autonomous CLEVER
|
||||
|
||||
**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:
|
||||
|
||||
* Raspbian Stretch
|
||||
|
||||
@@ -4,13 +4,16 @@
|
||||
"author": "Copter Express",
|
||||
"language": "ru",
|
||||
"root": "docs/",
|
||||
"plugins": ["youtube", "richquotes", "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')"/>
|
||||
|
||||
@@ -18,10 +18,11 @@
|
||||
<!-- 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://0.0.0.0:14550@14550" if="$(eval gcs_bridge == 'udp')"/>
|
||||
<param name="gcs_url" value="udp-pb://192.168.11.1:14550@" if="$(eval gcs_bridge == 'udp-b')"/>
|
||||
<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="10"/>
|
||||
<param name="conn/timeout" value="8"/>
|
||||
|
||||
<!-- default px4 params -->
|
||||
<rosparam command="load" file="$(find mavros)/launch/px4_config.yaml"/>
|
||||
|
||||
@@ -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'),
|
||||
@@ -389,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
|
||||
|
||||
@@ -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,15 +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)
|
||||
|
||||
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/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/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/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
|
||||
```
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
Использование QGroundControl через Wi-Fi
|
||||
===
|
||||
|
||||
Возможен контроль, управление и настройка полетного контроллера квадрокоптера с помощью программы QGroundControl по Wi-Fi.
|
||||

|
||||
|
||||
Возможны контроль, управление, калибровка и настройка полетного контроллера квадрокоптера с помощью программы QGroundControl по Wi-Fi.
|
||||
Для этого необходимо подключиться к Wi-Fi сети `CLEVER-xxxx`.
|
||||
|
||||
После чего в launch-файле Клевера `/home/pi/catkin_ws/src/clever/clever/launch/clever.launch` выбрать один из преднастроенных режимов: TCP, UDP, UDP broadcast.
|
||||
После чего в launch-файле Клевера `/home/pi/catkin_ws/src/clever/clever/launch/clever.launch` выбрать один из преднастроенных режимов бриджа.
|
||||
|
||||
После изменения launch-файла необходимо перезагрузить сервис clever:
|
||||
|
||||
@@ -12,50 +14,57 @@
|
||||
sudo systemctl restart clever
|
||||
```
|
||||
|
||||
Подробнее о возможных настройках `gcs_bridge` [на сайте пакета mavros](http://wiki.ros.org/mavros#Connection_URL).
|
||||
|
||||
TCP-бридж
|
||||
---
|
||||
|
||||
Изменить параметр gcs_bridge в launch-файле:
|
||||
Изменить параметр `gcs_bridge` в launch-файле:
|
||||
```xml
|
||||
<arg name="gcs_bridge" default="tcp"/>
|
||||
```
|
||||
|
||||
Затем в программе QGroundControl нужно выбрать Application Settings -> Comm Links -> Add. Создать подключение со следующими настройками:
|
||||
Затем в программе QGroundControl нужно выбрать Application Settings > Comm Links > Add. Создать подключение со следующими настройками:
|
||||
|
||||

|
||||
|
||||
Затем необходимо выбрать в списке подключений "Clever" и нажать "Connect".
|
||||
|
||||
UDP-бридж
|
||||
UDP бридж (с автоматическим подключением)
|
||||
---
|
||||
|
||||
Изменить параметр gcs_bridge в launch-файле:
|
||||
```xml
|
||||
<arg name="gcs_bridge" default="udp-b"/>
|
||||
```
|
||||
|
||||
При открытии программы QGroundControl соединение должно установиться автоматически.
|
||||
|
||||
|
||||
UDP-бридж (без автоматического подключения)
|
||||
---
|
||||
|
||||
Изменить параметр `gcs_bridge` в launch-файле:
|
||||
|
||||
```xml
|
||||
<arg name="gcs_bridge" default="udp"/>
|
||||
```
|
||||
|
||||
Затем в программе QGroundControl нужно выбрать Application Settings -> Comm Links -> Add. Создать подключение со следующими настройками:
|
||||
Затем в программе QGroundControl нужно выбрать Application Settings > Comm Links > Add. Создать подключение со следующими настройками:
|
||||
|
||||

|
||||
|
||||
Затем необходимо выбрать в списке подключений "CLEVER" и нажать "Connect".
|
||||
|
||||
|
||||
|
||||
UDP broadcast-бридж
|
||||
---
|
||||
|
||||
Для использования UDP broadcast-бриджа необходимо установить параметр `gcs_bridge` в значение `udp-b`:
|
||||
> **Hint** Особенностью UDP broadcast-бриджа является возможность просмотра телеметрии дрона одновременно с нескольких устройств (например с телефона и компьютера). Также он хорошо подходит для организации сети из устройств при помощи роутера.
|
||||
|
||||
Изменить параметр `gcs_bridge` в launch-файле:
|
||||
|
||||
```xml
|
||||
<arg name="gcs_bridge" default="udp-b"/>
|
||||
<arg name="gcs_bridge" default="udp-pb"/>
|
||||
```
|
||||
|
||||
При использовании UDB broadcast-бриджа достаточно подключиться к Wi-Fi сети Клевера. QGroundControl должен подключиться к коптеру автоматически. Также при использовании UDP broadcast возможна работа с коптером одновременно с нескольких устройств (например, одновременно QGroundControl на ноутбуке и смартфоне).
|
||||
|
||||
> **Note** UDP broadcast-бридж является наиболее быстрым соединением, но связь в нем менее стабильная: иногда могут возникать проблемы при загрузке миссии на коптер, а также при калибровке сенсоров.
|
||||
|
||||
___
|
||||
После успешного подключения можно настраивать, калибровать и просматривать состояние квадкоптера без проводов.
|
||||
|
||||

|
||||
При открытии программы 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. Финальная гонка.
|
||||
|
||||
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 грамм), чем стандартная, и на управляемость и время полета почти не влияет.
|
||||
|
||||
Отдельно стоит сказать, что излишние вибрации, если таковые имеются, можно убрать путем более жесткого крепления защиты к коптеру.
|
||||
|
||||
В итоге получилась необычная защита для коптера с небольшим весом и интересным дизайном, открывающая новые горизонты для полетов в тех местах, где летать для коптера раньше было опасно.
|
||||
@@ -1,13 +1,15 @@
|
||||
Управление Клевером со смартфона
|
||||
===
|
||||
|
||||
Для управления Клевером со смартфона через Wi-Fi необходимо установить приложение – [iOS](), Android (в разработке).
|
||||
**WORK-IN-PROGRESS**
|
||||
|
||||
Для управления Клевером со смартфона через Wi-Fi необходимо установить приложение – iOS (TODO), Android (TODO).
|
||||
|
||||

|
||||
|
||||
> **Warning** Мобильный пульт предназначен в первую очередь для полетов в помещении на дальность не более 10-15 м. Большое количество Wi-Fi сетей также может ухудшить отзывчивость и дальность пульта.
|
||||
|
||||
> **Info** Также управление со смартфона [доступно в мобильной версия приложения](https://docs.qgroundcontrol.com/en/SettingsView/VirtualJoystick.html) QGroundControl.
|
||||
Также управление со смартфона [доступно в мобильной версия приложения](https://docs.qgroundcontrol.com/en/SettingsView/VirtualJoystick.html) QGroundControl.
|
||||
|
||||
Настройка
|
||||
---
|
||||
|
||||
@@ -68,9 +68,10 @@ release = rospy.ServiceProxy('release', Trigger)
|
||||
* `frame_id` – фрейм;
|
||||
* `connected` – есть ли подключение к <abbr title="Flight Control Unit, полетный контроллер">FCU</abbr>;
|
||||
* `armed` – состояние `armed` винтов (винты включены, если true);
|
||||
* `mode` - текущий [полетный режим](modes.md);
|
||||
* `mode` – текущий [полетный режим](modes.md);
|
||||
* `x, y, z` – локальная позиция коптера *(м)*;
|
||||
* `lat, lon` – широта, долгота *(градусы)*, необходимо наличие [gps](gps.md));
|
||||
* `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` – угол по крену *(радианы)*;
|
||||
|
||||
1932
docs/tests.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:
|
||||
|
||||
@@ -96,3 +96,8 @@ 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,7 +6,6 @@ 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
|
||||
@@ -14,7 +13,7 @@ pipeline {
|
||||
string(name: 'GWBT_URL', defaultValue: 'https://github.com/CopterExpress/clever.git')
|
||||
|
||||
// Experimental function
|
||||
booleanParam(name: 'SHRINK', defaultValue: false, description: 'SHRINK IMAGE')
|
||||
booleanParam(name: 'SHRINK', defaultValue: true, description: 'SHRINK IMAGE')
|
||||
booleanParam(name: 'DISCOVER_ROS_PACKAGES', defaultValue: false, description: 'DISCOVER ROS PACKAGES')
|
||||
}
|
||||
environment {
|
||||
@@ -42,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') {
|
||||
@@ -50,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') {
|
||||
@@ -58,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') {
|
||||
@@ -66,24 +65,29 @@ 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 "if ! ${params.DISCOVER_ROS_PACKAGES}; then $WORKSPACE/image_builder/image_config.sh copy_to_chroot ${params.BUILD_DIR}/${params.IMAGE_NAME} ${params.MOUNT_POINT} $WORKSPACE/$MOVE_FILE; fi"
|
||||
sh "$WORKSPACE/image_builder/image_config.sh execute ${params.BUILD_DIR}/${params.IMAGE_NAME} ${params.MOUNT_POINT} $WORKSPACE/$EXECUTE_FILE ${params.GWBT_URL} ${params.DISCOVER_ROS_PACKAGES}"
|
||||
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,17 +15,17 @@ 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"
|
||||
}
|
||||
|
||||
@@ -63,9 +63,9 @@ resize_fs() {
|
||||
&& 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 ${ROOT_PARTITION} $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 $1 --show) \
|
||||
&& sleep 0.5 \
|
||||
@@ -74,7 +74,7 @@ resize_fs() {
|
||||
&& 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
|
||||
}
|
||||
@@ -82,7 +82,7 @@ resize_fs() {
|
||||
mount_system() {
|
||||
|
||||
# STATIC FUNCTION
|
||||
# TEMPLATE: mount_system $IMAGE $MOUNT_POINT
|
||||
# TEMPLATE: mount_system $IMAGE
|
||||
|
||||
# Partitions numbers
|
||||
local BOOT_PARTITION=1
|
||||
@@ -98,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/
|
||||
@@ -148,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
|
||||
@@ -166,56 +167,59 @@ 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 $MOUNT_POINT $MOVE_FILE
|
||||
# TEMPLATE: copy_to_chroot $IMAGE $MOVE_FILE $MOVE_TO
|
||||
|
||||
# Partitions numbers
|
||||
local BOOT_PARTITION=1
|
||||
@@ -225,44 +229,25 @@ copy_to_chroot() {
|
||||
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[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"
|
||||
fi
|
||||
mount -t proc -o nosuid,noexec,nodev proc $2/proc \
|
||||
&& echo "OK"
|
||||
|
||||
echo "Mounting /sys in chroot... "
|
||||
if [ ! -d $2/sys ] ; then
|
||||
mkdir -p $2/sys
|
||||
echo "Created $2/sys"
|
||||
fi
|
||||
mount -t sysfs -o nosuid,noexec,nodev sysfs $2/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 \
|
||||
&& echo "OK"
|
||||
|
||||
echo -e "\033[0;31m\033[1mCopy DNS records\033[0m\033[0m" \
|
||||
&& cp -L /etc/resolv.conf $2/etc/resolv.conf
|
||||
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"
|
||||
script_name=$(basename $3)
|
||||
script_path_root="$2/root/$script_name"
|
||||
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
|
||||
cp "$3" "$script_path_root"
|
||||
if [ ! -d ${file_path_root} ] ; then
|
||||
mkdir -p ${file_path_root} \
|
||||
&& echo "Created ${file_path_root}"
|
||||
fi
|
||||
cp "$2" "${file_path_root}"
|
||||
|
||||
umount_system $2 $DEV_IMAGE
|
||||
umount_system ${MOUNT_POINT} ${DEV_IMAGE}
|
||||
}
|
||||
|
||||
umount_system() {
|
||||
@@ -317,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"
|
||||
@@ -370,8 +357,8 @@ echo "\$7: $7"
|
||||
|
||||
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
|
||||
@@ -386,11 +373,11 @@ case "$1" in
|
||||
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 $MOUNT_POINT $MOVE_FILE
|
||||
# copy_to_chroot $IMAGE $MOVE_FILE $MOVE_TO
|
||||
copy_to_chroot $2 $3 $4;;
|
||||
|
||||
*)
|
||||
|
||||
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
|
||||
|
||||
@@ -7,7 +7,6 @@ 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) | Installing ROS\033[0m\033[0m"
|
||||
|
||||
@@ -15,7 +14,7 @@ echo -e "\033[0;31m\033[1m$(date) | #1 Installing dirmngr & add key to apt-key\0
|
||||
|
||||
# Install a tool that apt-key uses to add ROS repository key
|
||||
# http://wpblogger.su/tags/apt/
|
||||
apt-get install --no-install-recommends -y 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,19 +30,19 @@ 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 \
|
||||
python-rosdep \
|
||||
python-rosinstall-generator \
|
||||
python-wstool \
|
||||
python-rosinstall \
|
||||
build-essential
|
||||
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
|
||||
|
||||
# If $2 = false, then discover packages
|
||||
if [ "$2" = "false" ];
|
||||
# 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"
|
||||
|
||||
@@ -64,7 +63,6 @@ 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 \
|
||||
&& mv /root/kinetic-ros-coex.rosinstall kinetic-ros-coex.rosinstall \
|
||||
&& wstool init src kinetic-ros-coex.rosinstall
|
||||
fi
|
||||
|
||||
@@ -132,6 +130,8 @@ chown -Rf pi:pi /home/pi/ros_catkin_ws
|
||||
echo -e "\033[0;31m\033[1m$(date) | #12 Creating catkin_ws & Installing CLEVER-BUNDLE\033[0m\033[0m"
|
||||
|
||||
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 \
|
||||
|
||||
@@ -10,22 +10,24 @@ 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 \
|
||||
git \
|
||||
dnsmasq \
|
||||
tmux \
|
||||
vim \
|
||||
ipython3 \
|
||||
cmake \
|
||||
python-pip \
|
||||
python3-pip \
|
||||
libjpeg8-dev
|
||||
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
|
||||
|
||||