Merge branch 'master' into buster

This commit is contained in:
Alexey Rogachevskiy
2019-11-18 17:17:56 +03:00
36 changed files with 293 additions and 70 deletions

View File

@@ -109,7 +109,7 @@ jobs:
- wget https://github.com/okalachev/editorconfig-checker/releases/download/1.2.1-disable-spaces-amount/ec-linux-amd64
- chmod +x ec-linux-amd64
script:
- ./ec-linux-amd64 -spaces-after-tabs -e "roslib.js|ros3d.js|eventemitter2.js|draw.cpp|BinUtils.swift|\.idea|apps/android/app|Assets.xcassets|test_parser_pass.txt|test_node_failure.txt|aruco_pose/vendor"
- ./ec-linux-amd64 -spaces-after-tabs -e "roslib.js|ros3d.js|eventemitter2.js|draw.cpp|BinUtils.swift|\.idea|apps/android/app|Assets.xcassets|test_parser_pass.txt|test_node_failure.txt|aruco_pose/vendor|\.stl"
stages:
- Build
- Annotate

View File

@@ -111,6 +111,7 @@ cd /home/pi/catkin_ws/src/clever
NPM_CONFIG_UNSAFE_PERM=true npm install gitbook-cli -g
NPM_CONFIG_UNSAFE_PERM=true gitbook install
gitbook build
touch node_modules/CATKIN_IGNORE docs/CATKIN_IGNORE _book/CATKIN_IGNORE # ignore documentation files by catkin
echo_stamp "Installing additional ROS packages"
apt-get install -y --no-install-recommends \

View File

@@ -17,7 +17,7 @@ EXCLUDE = 'rviz.png', 'ssid.png', 'sitl_docker_demo.png', 'qgc-params.png', 'but
'cl3_mountBEC.JPG', 'cl3_mountRpiCamera.JPG', 'clever4-front-black-large.png', \
'qgc-battery.png', 'qgc-radio.png', 'qgc-cal-acc.png', 'qgc-esc.png', 'qgc-cal-compass.png', \
'qgc.png', 'qgc-parameters.png', 'clever4-front-white-large.png', 'qgc-modes.png', \
'qgc-requires-setup.png', 'clever4-front-white.png', 'clever4-kit-white.png', '26_1.png'
'qgc-requires-setup.png', 'clever4-front-white.png', 'clever4-kit-white.png', '26_1.png', 'battery_holder.stl'
code = 0

View File

@@ -8,7 +8,7 @@
<arg name="optical_flow" default="false"/>
<arg name="aruco" default="false"/>
<arg name="rangefinder_vl53l1x" default="false"/>
<arg name="led" default="false"/>
<arg name="led" default="true"/>
<arg name="rc" default="true"/>
<!-- log formatting -->

View File

@@ -9,7 +9,7 @@
<node pkg="ws281x" name="led" type="ws281x_node" clear_params="true" output="screen" if="$(arg ws281x)">
<param name="led_count" value="58"/>
<param name="gpio_pin" value="21"/>
<param name="brightness" value="100"/>
<param name="brightness" value="64"/>
<param name="strip_type" value="WS2811_STRIP_GRB"/>
<param name="target_frequency" value="800000"/>
<param name="dma" value="10"/>

View File

@@ -1,5 +1,5 @@
<launch>
<arg name="fcu_conn" default="usb"/>
<arg name="fcu_conn" default="usb"/> <!-- options: usb, uart, tcp, udp, sitl -->
<arg name="fcu_ip" default="127.0.0.1"/>
<arg name="gcs_bridge" default="tcp"/>
<arg name="viz" default="true"/>
@@ -13,9 +13,12 @@
<!-- USB connection -->
<param name="fcu_url" value="/dev/px4fmu" if="$(eval fcu_conn == 'usb')"/>
<!-- sitl -->
<!-- sitl before PX4 1.9.0 -->
<param name="fcu_url" value="udp://@$(arg fcu_ip):14557" if="$(eval fcu_conn == 'udp')"/>
<!-- sitl since PX4 1.9.0 -->
<param name="fcu_url" value="udp://@$(arg fcu_ip):14580" if="$(eval fcu_conn == 'sitl')"/>
<!-- 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')"/>

View File

@@ -13,6 +13,7 @@
<arg name="rosbridge" value="$(arg rosbridge)"/>
<arg name="aruco" default="false"/>
<arg name="rangefinder_vl53l1x" default="false"/>
<arg name="led" default="false"/>
<arg name="rc" default="false"/>
</include>
</launch>

View File

@@ -224,6 +224,12 @@ def check_fcu():
else:
info('LPE_FUSION: barometer fusion is disabled')
mag_yaw_w = get_param('ATT_W_MAG')
if mag_yaw_w == 0:
info('magnetometer weight (ATT_W_MAG) is zero, better for indoor flights')
else:
info('magnetometer weight (ATT_W_MAG) is non-zero (%.2f), better for outdoor flights', mag_yaw_w)
elif est == 2:
info('selected estimator: EKF2')
else:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 523 KiB

After

Width:  |  Height:  |  Size: 322 KiB

BIN
docs/assets/4/31_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 KiB

BIN
docs/assets/4/43_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

BIN
docs/assets/coexpix-top.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 KiB

View File

@@ -1,6 +1,6 @@
Using an external 3G modem
===
To use an external 3G modem on Raspberry, you can use the [`sakis3g`] package (https://github.com/Trixarian/sakis3g-source).
To use an external 3G modem on Raspberry, you can use the [`sakis3g`](https://github.com/Trixarian/sakis3g-source) package.
TODO

View File

@@ -77,5 +77,3 @@
* [Human pose estimation drone control](human_pose_estimation_drone_control.md)
* [Copter Hack 2018](copterhack2018.md)
* [Copter Hack 2017](copterhack2017.md)
* Textbook
* [Theory and Videos](lessons.md)

View File

@@ -61,6 +61,8 @@ Usage example:
rosrun aruco_pose genmap.py 0.33 2 4 1 1 0 > ~/catkin_ws/src/clever/aruco_pose/map/test_map.txt
```
<!-- You can also use the [online map editor](arucogenmap.md) to create ArUco maps. -->
### Checking the map
The currently active map is posted in the `/aruco_map/image` ROS topic. It can be viewed using [web_video_server](web_video_server.md) by opening the following link: http://192.168.11.1:8080/snapshot?topic=/aruco_map/image
@@ -102,6 +104,12 @@ If you're using **LPE** (`SYS_MC_EST_GROUP` parameter is set to `local_position_
* Vision position standard deviations: `LPE_VIS_XY` = 0.1 m, `LPE_VIS_Z` = 0.1 m.
* `LPE_VIS_DELAY` = 0 sec.
<!-- * Compass should not be fused: `ATT_W_MAG` = 0 -->
> **Hint** We recommend using **LPE** for marker-based navigation.
You may use [the `selfcheck.py` utility](selfcheck.md) to check your settings.
> **Hint** In order to use LPE with the Pixhawk v1 hardware you should download the [`px4fmu-v2_lpe.px4` firmware](firmware.md)
## Flight
@@ -112,18 +120,21 @@ You will also be able to use `navigate`, `set_position` and `set_velocity` ROS s
```python
# Takeoff should be performed in the "body" frame; "aruco_map" frame will appear as soon as the drone detects the marker field
navigate(0, 0, 2, frame_id='body', speed=0.5, auto_arm=True) # Takeoff and hover 2 metres above the ground
navigate(x=0, y=0, z=2, frame_id='body', speed=0.5, auto_arm=True) # Takeoff and hover 2 metres above the ground
time.sleep(5)
# Fly to the (2, 2) point on the marker field while being 2 metres above it
navigate(2, 2, 2, speed=1, frame_id='aruco_map')
navigate(x=2, y=2, z=2, speed=1, frame_id='aruco_map')
```
Starting from the [image](image.md) version 0.18, the drone also can fly relative to a marker in the map, even if it doesn't see it:
### Using a specific marker frame
Starting with the [image](image.md) version 0.18, the drone also can fly relative to a marker in the map, even if it is not currently visible. Like with [single-marker navigation](aruco_marker.md#working-with-detected-markers), this works by setting the frame_id parameter to aruco_ID, where ID is the desired marker number.
The folloding code will move the drone to the point 1 meter above the center of marker 5:
```python
# Fly to 1 meter above the marker 5
navigate(frame_id='aruco_5', x=0, y=0, z=1)
```

View File

@@ -97,6 +97,8 @@ Perform these actions for each motor.
Motors with **<font color=red>red</font>** nuts should rotate **counterclockwise**, the ones with **black** nuts should rotate **clockwise**. Correct rotation direction should also be printed on the motors. You can use a servo tester or your RC transmitter and receiver to check rotation direction.
<img src="../assets/4/props/props_rotation.png" width=300 class="zoom center">
The following describes how to use your RC gear to check the motor direction.
### Setting up PWM mode on RC
@@ -181,31 +183,35 @@ The flight controller expects PPM signal from your RC gear. Switch your transmit
## Mounting the flight controller
1. Align the flight controller so that the arrows on the controller and on the top carbon deck point in the same direction.
2. Attach the flight controller to the flight controller plate using 3M double-sided adhesive pads.
3. Connect the power cable to the **"POWER"** input of the flight controller.
1. Insert the microSD card into your flight controller.
<img src="../assets/4/pix/pixracer_sdcard.png" width=300 class="zoom center border">
2. Align the flight controller so that the arrows on the controller and on the top carbon deck point in the same direction.
3. Attach the flight controller to the flight controller plate using 3M double-sided adhesive pads.
4. Connect the power cable to the **"POWER"** input of the flight controller.
<div class="image-group">
<img src="../assets/4/18.png" width=300 class="zoom border">
<img src="../assets/4/18_1.png" width=300 class="zoom border">
</div>
4. Attach four 40 mm aluminum spacers to the top carbon deck using M3x10 screws.
5. Attach four 40 mm aluminum spacers to the top carbon deck using M3x10 screws.
<div class="image-group">
<img src="../assets/4/19.png" width=300 class="zoom border">
<img src="../assets/4/19_1.png" width=300 class="zoom border">
</div>
5. Connect signal wires to the flight controller as shown in these pictures:
6. Connect signal wires to the flight controller as shown in these pictures:
<div class="image-group">
<img src="../assets/4/20.png" width=300 class="zoom border">
<img src="../assets/4/20_1.png" width=300 class="zoom border">
</div>
6. Attach two 15 mm spacers to the top carbon deck using M3x8 screws.
7. Attach two 15 mm spacers to the top carbon deck and the front arms using M3x10 screws (this was already described in the "Frame Assembly" section, p. 2).
7. Attach two 15 mm spacers to the top carbon deck using M3x8 screws.
8. Attach two 15 mm spacers to the top carbon deck and the front arms using M3x10 screws (this was already described in the "Frame Assembly" section, p. 2).
<div class="image-group">
<img src="../assets/4/21.png" width=300 class="zoom border">
@@ -224,15 +230,19 @@ The flight controller expects PPM signal from your RC gear. Switch your transmit
## Installing the Raspberry Pi
1. Attach the Raspberry Pi using four standoffs.
2. Route the BEC wires through the channel in the top carbon deck.
1. Insert your microSD card [with our image](image.md) into the Raspberry Pi
<img src="../assets/4/rpi/rpi_sdcard.png" width=300 class="zoom center border">
2. Attach the Raspberry Pi using four standoffs.
3. Route the BEC wires through the channel in the top carbon deck.
<div class="image-group">
<img src="../assets/4/24.png" width=300 class="zoom border">
<img src="../assets/4/26.png" width=300 class="zoom border">
</div>
3. Connect the BEC outputs according to the following image:
4. Connect the BEC outputs according to the following image:
<img src="../assets/4/26_1.png" width=300 class="zoom center border">
@@ -252,7 +262,10 @@ The flight controller expects PPM signal from your RC gear. Switch your transmit
1. Power the LED strip from a separate BEC. Connect the **«+»** and **«-»** leads to **5v** and **Ground** respectively.
2. Connect the **D** lead to GPIO21 (consult the [relevant article](leds.md) for more information).
<img src="../assets/4/31_1.png" width=300 class="zoom center border">
<div class="image-group">
<img src="../assets/4/31_1.png" width=300 class="zoom border">
<img src="../assets/4/31_2.png" width=300 class="zoom border">
</div>
## Installing the camera cable
@@ -339,6 +352,9 @@ The flight controller expects PPM signal from your RC gear. Switch your transmit
</div>
4. Connect the flight controller to the Raspberry Pi using retractable USB cable.
<img src="../assets/4/43_1.png" width=300 class="zoom center border">
5. Attach the USB cable reel where convenient using 3M double-sided adhesive pads while making sure the cable does not interfere with the propellers.
<div class="image-group">

View File

@@ -43,7 +43,7 @@ Additionally you can specify an arbitrary capture parameter using its [OpenCV co
```xml
<param name="property_0_code" value="21"/> <!-- property code 21 is CAP_PROP_AUTO_EXPOSURE -->
<param name="property_0_value" value="0.25"/> <!-- property values are normalized as per OpenCV specs, even for "menu" controls; 0.25 means "use manual exposure" -->
<param name="cv_cap_prop_exposure" value="0.3"> <!-- set exposure to 30% of maximum value -->
<param name="cv_cap_prop_exposure" value="0.3"/> <!-- set exposure to 30% of maximum value -->
```
## Computer vision

View File

@@ -1,16 +1,28 @@
Coordinate systems (frames)
===
> **Note** Documentation for the [image](image.md), versions, starting with **0.15**. For older versions refer to [documentation for version **0.14**](https://github.com/CopterExpress/clever/blob/v0.14/docs/ru/frames.md).
> **Note** The following applies to [image](image.md) version 0.15 and up. See [previous version of the article](https://github.com/CopterExpress/clever/blob/v0.14/docs/ru/frames.md) (Russian only) for older images.
![Clever coordinates systems (TF2)](../assets/frames.png)
![TF2 Clever frames](../assets/frames.png)
Main frames in package `clever`:
Main frames in the `clever` package:
* `map` coordinates relative to the point of flight controller initialization: the white grid in the illustration;
* `base_link` — coordinates relative to the quadcopter: schematic image of the quadcopter in the illustration;
* `body` — coordinates relative to the quadcopter regardless of pitch and roll: red, blue and green lines in the illustration.
* `map` has its origin at the flight controller initialization point and may be considered stationary. It is shown as a white grid on the image above;
* `base_link` is rigidly bound to the drone. It is shown by the simplified drone model on the image above;
* `body` is bound to the drone, but its Z axis points up regardless of the drone's pitch and roll. It is shown by the red, blue and green lines in the illustration;
* `navigate_target` is bound to the current navigation target (as set by the [navigate](simple_offboard.md#navigate) service).
> **Hint** In accordance with [the agreement](http://www.ros.org/reps/rep-0103.html), for frames associated with the copter, the X-axis directed forward, Y to the left, and Z up.
> **Hint** Frames that are bound to the drone are oriented according to [the ROS convention](http://www.ros.org/reps/rep-0103.html): the X axis points forward, Y to the left, and Z up.
More clearly, 3D visualization of the coordinate systems can be viewed using [rviz](rviz.md).
3D visualization of the coordinate systems can be viewed using [rviz](rviz.md).
tf2
--
Read more at http://wiki.ros.org/tf2
tf2 ROS package is used extensively in the Clever platform. tf2 is a set of libraries for C++, Python and other programming languages that are used to work with the frames. Internally, ROS nodes publish `TransformStamped` messages to `/tf` topic with transforms between frames at certain points in time.
The [`simple_offboard`](simple_offboard.md) node can be used to request the drone position in an arbitrary frame by setting the `frame_id` argument appropriately in a call to `get_telemetry` service.
tf2 can be used from Python to transform coordinates (for objects like PoseStamped and PointStamped) from one frame to another

View File

@@ -20,6 +20,8 @@ Optical Flow publishes data in `mavros/px4flow/raw/send` topic. In the topic `op
## Setup of the flight controler
> **Hint** Suggested parameters are applied automatically in [our custom PX4 firmware](firmware.md#modified-firmware-for-clever).
When using **EKF2** (parameter `SYS_MC_EST_GROUP` = `ekf2`):
* `EKF2_AID_MASK` flag 'use optical flow' is on.

View File

@@ -1,11 +1,11 @@
Simple OFFBOARD
===
> **Note** Documentation for the [image](image.md), versions, starting with **0.15**. For older versions refer to [documentation for version **0.14**](https://github.com/CopterExpress/clever/blob/v0.14/docs/ru/simple_offboard.md).
> **Note** The following applies to [image](image.md) versions **0.15** and up. Older documentation is still avaliable [for version **0.14**](https://github.com/CopterExpress/clever/blob/v0.14/docs/ru/simple_offboard.md) (Russian only).
<!-- -->
> **Hint** For autonomous flights it is recommanded to use [special PX4 firmware for Clever](firmware.md#modified-firmware-for-clever).
> **Hint** We recommend using our [special PX4 firmware for Clever](firmware.md#modified-firmware-for-clever) for autonomous flights.
The `simple_offboard` module of the `clever` package is intended for simplified programming of the autonomous drone flight (`OFFBOARD` [flight mode](modes.md)). It allows setting the desired flight tasks, and automatically transforms [coordinates between frames](frames.md).
@@ -140,6 +140,12 @@ Flying 3 m to the right from the drone:
navigate(x=0, y=-3, z=0, speed=1, frame_id='body')
```
Flying 2 m to the left from the last navigation target:
```python
navigate(x=0, y=2, z=0, speed=1, frame_id='navigate_target')
```
Turn 90 degrees counterclockwise:
```python
@@ -170,6 +176,8 @@ Ascending to the altitude of 2 m (command line):
rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, yaw_rate: 0.0, speed: 0.5, frame_id: 'body', auto_arm: true}"
```
> **Note** Consider using the `navigate_target` frame instead of `body` for missions that primarily use relative movements forward/back/left/right. This negates inaccuracies in relative point calculations.
### navigate_global
Flying in a straight line to a point in the global coordinate system (latitude/longitude).

View File

@@ -43,10 +43,12 @@
* [Визуализация с помощью rviz](rviz.md)
* [Автозапуск ПО](autolaunch.md)
* Дополнительные материалы
* [COEX Pix](coex_pix.md)
* [Гид по автономному полету](auto_setup.md)
* [Имя хоста](hostname.md)
* [Симулятор](sitl.md)
* [Настройка PID](pid_tuning.md)
* [STL-модели Клевера](models.md)
* [Docker-контейнер с симулятором](sitl_docker.md)
* [Установка ROS Kinetic](ros-install.md)
* [Пилотирование со смартфона](rc.md)
@@ -82,6 +84,7 @@
* [Генератор ArUco карт](arucogenmap.md)
* [Модель аэротакси в городе](bigchallenges.md)
* [Шаровая защита коптера](shield.md)
* [Дрон для 3D-сканирования человека](3dscan.md)
* [Распознавание лиц](face_recognition.md)
* [Управление дроном силой мысли](control_emotions.md)
* [Подсчет количества объектов c камеры](object_counting.md)

View File

@@ -120,18 +120,21 @@ rosrun aruco_pose genmap.py 0.33 2 4 1 1 0 > ~/catkin_ws/src/clever/aruco_pose/m
```python
# Вначале необходимо взлететь, чтобы коптер увидел карту меток и появился фрейм aruco_map:
navigate(0, 0, 2, frame_id='body', speed=0.5, auto_arm=True) # взлет на 2 метра
navigate(x=0, y=0, z=2, frame_id='body', speed=0.5, auto_arm=True) # взлет на 2 метра
time.sleep(5)
# Полет в координату 2:2 маркерного поля, высота 2 метра
navigate(2, 2, 2, speed=1, frame_id='aruco_map') # полет в координату 2:2, высота 3 метра
navigate(x=2, y=2, z=2, speed=1, frame_id='aruco_map') # полет в координату 2:2, высота 3 метра
```
Начиная с версии [образа](image.md) 0.18, доступны также полеты относительно отдельного маркера в карте, даже если дрон его не видит:
### Полет в координаты по ID маркера
Начиная с версии [образа](image.md) 0.18, доступны также полёты относительно отдельного маркера в карте, даже если дрон его не видит. По аналогии с [навигацией по отдельным маркерам](aruco_marker.md#навигация-по-маркерам) при настройке карты маркеров дрон сможет лететь в координаты относительно отдельного маркера, используя фрейм aruco_ID с соответствующим ID маркера.
Полет в точку над маркером 5 на высоту 1 метр:
```python
# Полет на высоту 1 м над маркером 5
navigate(frame_id='aruco_5', x=0, y=0, z=1)
```

View File

@@ -97,6 +97,8 @@
Моторы с **<font color=red>красными</font>** гайками должны вращаться **против** часовой стрелки, с **чёрными** - **по** часовой стрелке. Правильные направления вращения также указаны на самих моторах. Для проверки направления вращения можно использовать серво-тестер или радиоприёмник с пультом.
<img src="../assets/4/props/props_rotation.png" width=300 class="zoom center">
Использование радиоприёмника и пульта описано ниже.
### Перевод пульта в режим PWM
@@ -181,31 +183,35 @@
## Установка полётного контроллера
1. Установите полетный контроллер на пластину с помощью двухстороннего скотча.
2. Стрелки на полетном контроллере и центральной деке должны быть направлены в одну сторону.
3. Подключите шлейф питания PDB к разъему *"POWER"* полетного контроллера, закрутив его в "косичку" для взаимной фиксации проводов.
1. Вставьте карту microSD в полётный контроллер
<img src="../assets/4/pix/pixracer_sdcard.png" width=300 class="zoom center border">
2. Установите полетный контроллер на пластину с помощью двухстороннего скотча.
3. Стрелки на полетном контроллере и центральной деке должны быть направлены в одну сторону.
4. Подключите шлейф питания PDB к разъему *"POWER"* полетного контроллера, закрутив его в "косичку" для взаимной фиксации проводов.
<div class="image-group">
<img src="../assets/4/18.png" width=300 class="zoom border">
<img src="../assets/4/18_1.png" width=300 class="zoom border">
</div>
4. Установите 4 алюминиевые стойки 40 мм с помощью винтов М3х10.
5. Установите 4 алюминиевые стойки 40 мм с помощью винтов М3х10.
<div class="image-group">
<img src="../assets/4/19.png" width=300 class="zoom border">
<img src="../assets/4/19_1.png" width=300 class="zoom border">
</div>
5. Подключите сигнальные провода регуляторов к полетному контроллеру следующим образом:
6. Подключите сигнальные провода регуляторов к полетному контроллеру следующим образом:
<div class="image-group">
<img src="../assets/4/20.png" width=300 class="zoom border">
<img src="../assets/4/20_1.png" width=300 class="zoom border">
</div>
6. Установите 2 стойки "мама-мама" 15 мм на центральную деку с помощью винтов М3х8.
7. Другие 2 стойки были установлены ранее в разделе "Сборка рамы", п. 2.
7. Установите 2 стойки "мама-мама" 15 мм на центральную деку с помощью винтов М3х8.
8. Другие 2 стойки были установлены ранее в разделе "Сборка рамы", п. 2.
<div class="image-group">
<img src="../assets/4/21.png" width=300 class="zoom border">
@@ -224,15 +230,19 @@
## Установка Raspberry Pi
1. Установите плату Raspberry Pi на стойки, используя 4 стойки "папа-мама".
2. Протяните провода от BEC через паз в центральной раме.
1. Вставьте карту microSD с [записанным образом](image.md) в Raspberry Pi
<img src="../assets/4/rpi/rpi_sdcard.png" width=300 class="zoom center border">
2. Установите плату Raspberry Pi на стойки, используя 4 стойки "папа-мама".
3. Протяните провода от BEC через паз в центральной раме.
<div class="image-group">
<img src="../assets/4/24.png" width=300 class="zoom border">
<img src="../assets/4/26.png" width=300 class="zoom border">
</div>
3. Подключите провод питания от BEC к Raspberry, согласно схеме:
4. Подключите провод питания от BEC к Raspberry, согласно схеме:
<img src="../assets/4/26_1.png" width=300 class="zoom center border">
@@ -252,7 +262,10 @@
1. Питание для ленты берется от второго BEC. Подключите контакты *«-»* и *«+»* к *Ground* и *5v* на ленте соответственно.
2. Подключите контакт *D* к GPIO-пину на Raspberry. Рекомендуется использовать пин GPIO21.
<img src="../assets/4/31_1.png" width=300 class="zoom center border">
<div class="image-group">
<img src="../assets/4/31_1.png" width=300 class="zoom border">
<img src="../assets/4/31_2.png" width=300 class="zoom border">
</div>
## Установка шлейфа для камеры
@@ -339,6 +352,9 @@
</div>
4. Подключите USB кабель к разъему на полетном контроллере и USB разъему Raspberry Pi.
<img src="../assets/4/43_1.png" width=300 class="zoom center border">
5. Зафиксируйте "улитку" кабеля в удобном месте с помощью двухстороннего скотча так, чтобы провод не мешал вращению винтов.
<div class="image-group">

View File

@@ -45,7 +45,7 @@ raspistill -o test-image.jpg
```xml
<param name="property_0_code" value="21"/> <!-- property code 21 is CAP_PROP_AUTO_EXPOSURE -->
<param name="property_0_value" value="0.25"/> <!-- property values are normalized as per OpenCV specs, even for "menu" controls; 0.25 means "use manual exposure" -->
<param name="cv_cap_prop_exposure" value="0.3"> <!-- set exposure to 30% of maximum value -->
<param name="cv_cap_prop_exposure" value="0.3"/> <!-- set exposure to 30% of maximum value -->
```
## Компьютерное зрение

60
docs/ru/coex_pix.md Normal file
View File

@@ -0,0 +1,60 @@
# COEX Pix
Полетный контроллер **COEX Pix** является модифицированным аналогом полетного контроллера [Pixracer](https://docs.px4.io/v1.9.0/en/flight_controller/pixracer.html). Этот полетный контроллер поставляется с наборами **Клевер 4** и далее.
## Ревизия 1.1
### Характеристики
* Размеры платы 35x35 мм.
* Диаметр монтажных отверстий 3.2 мм.
* Расстояние между центрами монтажных отверстий 30.5 мм.
* Масса платы (без проводов) 9 г.
* Диапазон рабочих температур -5...+65 ºC.
* Диапазон входного напряжения 4.8...5.5 В.
### Основные элементы
* Основной SOC *STM32F427VIT6*.
* Память FRAM *FM25V02A*.
* Датчики:
* *MPU9250* (9 DOF) 3-х осевой магнитометр, 3-х осевой гироскоп, 3-х осевой акселерометр.
* *MS5607* датчик атмосферного давления.
### Разъемы
* *TELEM 1* (JST-GH 4 pin) разъем для подключения телеметрии, порт 1, протокол UART.
* *TELEM 2* (JST-GH 4 pin) разъем для подключения телеметрии, порт 2, протокол UART.
* *GPS* (JST-GH 6 pin) разъем для подключения ГПС модуля (UART) с компасом (I2C).
* *I2C* (JST-GH 4 pin) разъем для подключения поддерживаемых I2C устройств.
* *PWR* (JST-GH 6 pin) разъем для подключения питания с платы COEX PDB или аналогичной, датчиков напряжения и тока.
* *RC IN* (JST-GH 4 pin) разъем для подключения радиоприемника аппаратуры радиоуправления, канала для * снятия показаний RSSI. Поддерживаемые RC протоколы PPM и SBUS.
* Разьем Micro USB для подключения к ПК для настройки и коммуникации по протоколу USB 2.0/1.1
* Слот для карты памяти MicroSD, до 32 ГБ.
* Серворазъемы для подключения контроллеров моторов и других устройств.
### Схемы расположения контактов
<img src="../assets/coexpix-top.jpg" width=400 class=zoom>
<img src="../assets/coexpix-bottom.jpg" width=400 class=zoom>
> **Note** На плате ревизии 1.0 RC IN разъем располагался на месте разъема Micro SD. Распиновка самого разъема осталась такой же.
### Установка на Клевере
**Важно**: плата спроектирована для удобной установки на Клевере с поворотом на 180º по крену и 90º по рысканью (стрелка на плате находится снизу и указывает направо). Таким образом, параметр ориентации автопилота PX4 устанавливается в значение `SENS_BOARD_ROT` = `ROLL 180, YAW 90`.
### Рекомендации
Во время установки полетного контроллера, учитывайте возможные влияния магнитных полей от силовых проводов и платы распределения питания на магнитометр. В случае установки данной платы над платой распределения питания, рекомендуется (в случае использования внутреннего магнитометра) поднять плату на высоту не менее 15 мм от платы распределения питания и силовых проводов. Силовой провод от аккумуляторной батареи старайтесь зафиксировать соответственно.
В случае использования внешнего GPS модуля со встроенным магнитометром, внутренний магнитометр рекомендуется отключать.
В случае, если на дроне не предусмотрен защитный кожух, рекомендуется изолировать барометр поролоновой губкой (достаточно подложить губку между полетным контроллером и нижней частью корпуса (платой распределения питания), либо зафиксировать иным способом.
При подключении питания в разъем PWR, на разъеме **+** будет напряжение 5 вольт, его можно использовать для питания сервомашинок. Не рекомендуется подключать дополнительные источники питания в разъем **+**, если питание подается в разъем PWR. Питать полетный контроллер одновременно от USB и PWR\AUX разъемов допускается.
### Особенности платы
Для повышения надежности и стабильности, плата оснащена низкошумящими понижающими преобразователями. Установлен входной LC фильтр, а также ферритовые фильтры в цепях питания.

View File

@@ -18,11 +18,11 @@ Timepad: https://copterexpress.timepad.ru/event/1017592/.
Этот параметр устанавливается для того, чтобы на программном уровне настроить ориентацию вашего *IMU* датчика находящегося на полетном контроллере.
### Полет с использованием Optical Flow
### Рекомендуемая версия образа
При полете только с использованием Optical Flow необходимо в QGroundControl в параметре `LPE_FUSION` включить галочку `pub agl as lpos down`.
Для Raspberry Pi версий до 3B+: [v0.18](https://github.com/CopterExpress/clever/releases/tag/v0.18)
Необходимо также убедиться, что лазерный дальномер корректно установлен и работает (см. [конфигурирование дальномера](laser.md)).
Для Raspberry Pi версии 4: [v0.19-alpha.1](https://github.com/CopterExpress/clever/releases/tag/v0.19-alpha.1)
### Ориентация камеры
@@ -30,6 +30,47 @@ Timepad: https://copterexpress.timepad.ru/event/1017592/.
Подробнее см. статью [Ориентация камеры](camera_frame.md).
### Полет с использованием Optical Flow
Для включения optical flow установите параметры `optical_flow` и `rangefinder_vl53l1x` в файле `clever.launch` в `true`.
Также необходимо в QGroundControl в параметре `LPE_FUSION` включить галочку `pub agl as lpos down`.
Необходимо также убедиться, что лазерный дальномер корректно установлен и работает (см. [конфигурирование дальномера](laser.md)).
Подробнее: [Использование Optical Flow](optical_flow.md).
### Использование карты маркеров
Для настройки большой карты маркеров используйте карту с названием `cmit.txt`. Далее используйте [инструкцию](aruco_map.md).
### Аккумуляторы
**При полетах обязательно использование датчика напряжения ("пищалки"). В случае выхода из строя аккумулятора новый не предоставляется!**
### Съемка видео
Снимайте **ВСЕ** ваши полеты на видео! В случае поломки дрона на защите сможете показать видео, что будет учтено при оценке.
### Проблема с yaw
При полете по маркерам (VPE) в прошивке v1.8.2-clever.7 возможно есть ошибка, которая проявляется в том, что дрон не держит yaw по маркерам. Если у вас есть такая проблема, попробуйте залить более старую прошивку v1.8.2-clever.6, доступную по ссылке https://github.com/CopterExpress/Firmware/releases/tag/v1.8.2-clever.6. Для COEX Pix необходимо скачивать файл `px4fmu-v4_default.px4`.
### Проблема с navigate
В образе 0.18 обнаружился баг из-за которого дрон может летать по точкам слишком быстро. Если у вас это происходит, поставьте в файле `~/catkin_ws/src/clever/clever/launch/clever.launch` параметр `nav_from_sp` в значение `false` таким образом:
```xml
<!-- simplified offboard control -->
<node name="simple_offboard" pkg="clever" type="simple_offboard" output="screen" clear_params="true">
<param name="reference_frames/body" value="map"/>
<param name="reference_frames/base_link" value="map"/>
<param name="reference_frames/navigate_target" value="map"/>
<param name="reference_frames/navigate_target" value="map"/>
<param name="nav_from_sp" value="false"/>
</node>
```
## Лекции
Лекция 1: введение  https://www.youtube.com/watch?v=cjtmZNuq7z0.
@@ -41,3 +82,13 @@ Timepad: https://copterexpress.timepad.ru/event/1017592/.
Лекция 4: автономные полеты: https://www.youtube.com/watch?v=ThXiNG1IzvI.
См. также другие видео на канале COEX на YouTube: https://www.youtube.com/channel/UCeCu93sLBkcgbIkIC7Jaauw/featured.
## Результаты
Команды-победители:
1. Бульболет – доставка картошки с помощью умной лебедки.
2. Copter don't hurt me – управление дроном с помощью нейроинтерфейса.
3. import torch  active track на нейронках.
4. Автобот freeze light через бота ВКонтакте.
5. Stardust Crusaders  AR среда симуляции для дронов.

View File

@@ -9,7 +9,8 @@
* `map` — координаты относительно точки инициализации полетного контроллера: белая сетка на иллюстрации;
* `base_link` — координаты относительно квадрокоптера: схематичное изображение квадрокоптера на иллюстрации;
* `body` — координаты относительно квадрокоптера без учета наклонов по тангажу и крену: красная, синяя и зеленая линии на иллюстрации.
* `body` — координаты относительно квадрокоптера без учета наклонов по тангажу и крену: красная, синяя и зеленая линии на иллюстрации;
* `navigate_target` координаты точки, в которую сейчас летит дрон (с использованием [navigate](simple_offboard.md#navigate)).
> **Hint** В соответствии с [соглашением](http://www.ros.org/reps/rep-0103.html), для фреймов, связанных с коптером, ось X направлена вперед, Y налево и Z вверх.

View File

@@ -1,4 +1,4 @@
# Управление дроном для оценки позы человека
# Управление дроном при помощи позы человека
## Демонстрация

15
docs/ru/models.md Normal file
View File

@@ -0,0 +1,15 @@
# STL-модели
На этой странице представлены STL-модели некоторых деталей квадрокоптеров Клевер.
## Клевер 4
### Холдер для АКБ
Файл: [`battery_holder.stl`](https://github.com/CopterExpress/clever/raw/master/docs/assets/battery_holder.stl).
Материал печати: PLA/ABS/SBS.
Заполнение: не менее 50%.
Функция: устанавливается на деталь "дека монтажная", после чего позволяет надежно фиксировать АКБ с помощью ремешка. Также имеется возможность установки индикатора напряжения (с помощью 3М-скотча).

View File

@@ -1,10 +1,10 @@
# Использование Optical Flow
При использовании технологии Optical Flow возможен полет в режиме POSCTL и автономные полеты по камере, направленной вниз, за счет измерения сдвигов текстуры поверхности пола.
При использовании технологии Optical Flow возможен полет в режиме POSCTL и автономные полеты ([режим OFFBOARD](simple_offboard.md)) по камере, направленной вниз, за счет измерения сдвигов текстуры поверхности пола.
## Включение
> **Hint** Рекомендуется использование [специальной сборки PX4 для Клевера](firmware.md#прошивка-для-клевера).
> **Hint** Необходимо использование [специальной сборки PX4 для Клевера](firmware.md#прошивка-для-клевера).
Необходимо использование дальномера. [Подключите и настройте дальномер VL53L1X](laser.md), используя инструкцию.
@@ -20,17 +20,7 @@ Optical Flow публикует данные в топик `mavros/px4flow/raw/s
## Настройка полетного контроллера
При использовании **EKF2** (параметр `SYS_MC_EST_GROUP` = `ekf2`):
* `EKF2_AID_MASK` включен флажок use optical flow.
* `EKF2_OF_DELAY`  0.
* `EKF2_OF_QMIN` 10.
* `EKF2_OF_N_MIN`  0.05.
* `EKF2_OF_N_MAX` - 0.2.
* `SENS_FLOW_ROT` No rotation (отсутствие поворота).
* `SENS_FLOW_MAXHGT` 4.0 (для дальномера VL53L1X)
* `SENS_FLOW_MINHGT` 0.01 (для дальномера VL53L1X)
* Опционально: `EKF2_HGT_MODE` range sensor (см. [конфигурирование дальномера](laser.md)).
> **Hint** При использовании [сборки PX4 для Клевера](firmware.md#прошивка-для-клевера) необходимые параметры PX4 применятся автоматически.
При использовании **LPE** (параметр `SYS_MC_EST_GROUP` = `local_position_estimator, attitude_estimator_q`):
@@ -44,6 +34,18 @@ Optical Flow публикует данные в топик `mavros/px4flow/raw/s
* `SENS_FLOW_MINHGT` 0.01 (для дальномера VL53L1X)
* Опционально: `LPE_FUSION` – включен флажок pub agl as lpos down (см. [конфигурирование дальномера](laser.md).
При использовании **EKF2** (параметр `SYS_MC_EST_GROUP` = `ekf2`):
* `EKF2_AID_MASK` включен флажок use optical flow.
* `EKF2_OF_DELAY`  0.
* `EKF2_OF_QMIN` 10.
* `EKF2_OF_N_MIN`  0.05.
* `EKF2_OF_N_MAX` - 0.2.
* `SENS_FLOW_ROT` No rotation (отсутствие поворота).
* `SENS_FLOW_MAXHGT` 4.0 (для дальномера VL53L1X)
* `SENS_FLOW_MINHGT` 0.01 (для дальномера VL53L1X)
* Опционально: `EKF2_HGT_MODE` range sensor (см. [конфигурирование дальномера](laser.md)).
Для проверки правильности всех настроек можно [воспользоваться утилитой `selfcheck.py`](selfcheck.md).
## Полет в POSCTL
@@ -63,7 +65,13 @@ navigate(z=1.5, frame_id='body', auto_arm=True)
Полет вперед на 1 м:
```python
navigate(x=1.5, frame_id='body')
navigate(x=1, frame_id='body')
```
Полет назад на 1 м (относительно предыдущей целевой точки):
```python
navigate(x=-1, frame_id='navigate_target')
```
При использовании Optical Flow возможна также [навигация по ArUco-маркерам](aruco_marker.md), в том числе [используя VPE](aruco_map.md).

View File

@@ -140,6 +140,12 @@ navigate(x=5, y=0, z=3, speed=0.8, yaw=float('nan'))
navigate(x=0, y=-3, z=0, speed=1, frame_id='body')
```
Полет влево на 2 м относительно последней целевой точки полета дрона:
```python
navigate(x=0, y=2, z=0, speed=1, frame_id='navigate_target')
```
Повернуться на 90 градусов против часовой:
```python
@@ -170,6 +176,8 @@ navigate(x=3, y=0, z=0, speed=0.5, yaw=float('nan'), yaw_rate=0.2, frame_id='bod
rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, yaw_rate: 0.0, speed: 0.5, frame_id: 'body', auto_arm: true}"
```
> **Note** При программировании миссии дрона в терминах "вперед-назад-влево-вправо" рекомендуется использовать систему координат `navigate_target` вместо `body`, чтобы не учитывать неточность прилета дрона в предыдущую целевую точку при вычислении следующей.
### navigate_global
Полет по прямой в точку в глобальной системе координат (широта/долгота).