diff --git a/.travis.yml b/.travis.yml index 474b79d5..35f99dce 100644 --- a/.travis.yml +++ b/.travis.yml @@ -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 diff --git a/builder/image-ros.sh b/builder/image-ros.sh index 26e7ca37..2b1622e2 100755 --- a/builder/image-ros.sh +++ b/builder/image-ros.sh @@ -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 \ diff --git a/check_assets_size.py b/check_assets_size.py index 95fb0067..f9f78142 100755 --- a/check_assets_size.py +++ b/check_assets_size.py @@ -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 diff --git a/clever/launch/clever.launch b/clever/launch/clever.launch index ca8664e6..befbe3ae 100644 --- a/clever/launch/clever.launch +++ b/clever/launch/clever.launch @@ -8,7 +8,7 @@ - + diff --git a/clever/launch/led.launch b/clever/launch/led.launch index 7ed5a956..ef2fb643 100644 --- a/clever/launch/led.launch +++ b/clever/launch/led.launch @@ -9,7 +9,7 @@ - + diff --git a/clever/launch/mavros.launch b/clever/launch/mavros.launch index 55ea987e..ae53b486 100644 --- a/clever/launch/mavros.launch +++ b/clever/launch/mavros.launch @@ -1,5 +1,5 @@ - + @@ -13,9 +13,12 @@ - + + + + diff --git a/clever/launch/sitl.launch b/clever/launch/sitl.launch index e574a1ae..048f3b53 100644 --- a/clever/launch/sitl.launch +++ b/clever/launch/sitl.launch @@ -13,6 +13,7 @@ + diff --git a/clever/src/selfcheck.py b/clever/src/selfcheck.py index db979e0f..a1442718 100755 --- a/clever/src/selfcheck.py +++ b/clever/src/selfcheck.py @@ -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: diff --git a/docs/assets/4/31_1.png b/docs/assets/4/31_1.png index 3f21072a..ccf0a8fc 100644 Binary files a/docs/assets/4/31_1.png and b/docs/assets/4/31_1.png differ diff --git a/docs/assets/4/31_2.png b/docs/assets/4/31_2.png new file mode 100644 index 00000000..b5259c1b Binary files /dev/null and b/docs/assets/4/31_2.png differ diff --git a/docs/assets/4/43_1.png b/docs/assets/4/43_1.png new file mode 100644 index 00000000..eabd1bcd Binary files /dev/null and b/docs/assets/4/43_1.png differ diff --git a/docs/assets/4/pix/pixracer_sdcard.png b/docs/assets/4/pix/pixracer_sdcard.png new file mode 100644 index 00000000..9c1609c6 Binary files /dev/null and b/docs/assets/4/pix/pixracer_sdcard.png differ diff --git a/docs/assets/4/props/props_rotation.png b/docs/assets/4/props/props_rotation.png new file mode 100644 index 00000000..f6809946 Binary files /dev/null and b/docs/assets/4/props/props_rotation.png differ diff --git a/docs/assets/4/rpi/rpi_sdcard.png b/docs/assets/4/rpi/rpi_sdcard.png new file mode 100644 index 00000000..892484db Binary files /dev/null and b/docs/assets/4/rpi/rpi_sdcard.png differ diff --git a/docs/assets/battery_holder.stl b/docs/assets/battery_holder.stl new file mode 100644 index 00000000..9def7fb7 Binary files /dev/null and b/docs/assets/battery_holder.stl differ diff --git a/docs/assets/coexpix-bottom.jpg b/docs/assets/coexpix-bottom.jpg new file mode 100644 index 00000000..f7dde5bf Binary files /dev/null and b/docs/assets/coexpix-bottom.jpg differ diff --git a/docs/assets/coexpix-top.jpg b/docs/assets/coexpix-top.jpg new file mode 100644 index 00000000..4ac595f2 Binary files /dev/null and b/docs/assets/coexpix-top.jpg differ diff --git a/docs/en/3g.md b/docs/en/3g.md index 0da112ef..2359ac30 100644 --- a/docs/en/3g.md +++ b/docs/en/3g.md @@ -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 diff --git a/docs/en/SUMMARY.md b/docs/en/SUMMARY.md index 82b72ef1..ca1ea2b2 100644 --- a/docs/en/SUMMARY.md +++ b/docs/en/SUMMARY.md @@ -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) diff --git a/docs/en/aruco_map.md b/docs/en/aruco_map.md index cd6a97ca..bee1b8b7 100644 --- a/docs/en/aruco_map.md +++ b/docs/en/aruco_map.md @@ -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 ``` + + ### 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. + + +> **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) ``` diff --git a/docs/en/assemble_4.md b/docs/en/assemble_4.md index 3812f570..6e92e0e4 100644 --- a/docs/en/assemble_4.md +++ b/docs/en/assemble_4.md @@ -97,6 +97,8 @@ Perform these actions for each motor. Motors with **red** 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. + + 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. + + + +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.
-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.
-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:
-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).
@@ -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 + + + +2. Attach the Raspberry Pi using four standoffs. +3. Route the BEC wires through the channel in the top carbon deck.
-3. Connect the BEC outputs according to the following image: +4. Connect the BEC outputs according to the following image: @@ -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). - +
+ + +
## Installing the camera cable @@ -339,6 +352,9 @@ The flight controller expects PPM signal from your RC gear. Switch your transmit
4. Connect the flight controller to the Raspberry Pi using retractable USB cable. + + + 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.
diff --git a/docs/en/camera.md b/docs/en/camera.md index 2620facd..821bc741 100644 --- a/docs/en/camera.md +++ b/docs/en/camera.md @@ -43,7 +43,7 @@ Additionally you can specify an arbitrary capture parameter using its [OpenCV co ```xml - + ``` ## Computer vision diff --git a/docs/en/frames.md b/docs/en/frames.md index 94d6159d..9d3bcffd 100644 --- a/docs/en/frames.md +++ b/docs/en/frames.md @@ -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 diff --git a/docs/en/optical_flow.md b/docs/en/optical_flow.md index 0db4f4e8..0876a357 100644 --- a/docs/en/optical_flow.md +++ b/docs/en/optical_flow.md @@ -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. diff --git a/docs/en/simple_offboard.md b/docs/en/simple_offboard.md index 72c06006..5441e2e6 100644 --- a/docs/en/simple_offboard.md +++ b/docs/en/simple_offboard.md @@ -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). diff --git a/docs/ru/SUMMARY.md b/docs/ru/SUMMARY.md index 183b231c..b7ed4acc 100644 --- a/docs/ru/SUMMARY.md +++ b/docs/ru/SUMMARY.md @@ -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) diff --git a/docs/ru/aruco_map.md b/docs/ru/aruco_map.md index f531f3b0..bebeef1a 100644 --- a/docs/ru/aruco_map.md +++ b/docs/ru/aruco_map.md @@ -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) ``` diff --git a/docs/ru/assemble_4.md b/docs/ru/assemble_4.md index 6974f965..dec9e260 100644 --- a/docs/ru/assemble_4.md +++ b/docs/ru/assemble_4.md @@ -97,6 +97,8 @@ Моторы с **красными** гайками должны вращаться **против** часовой стрелки, с **чёрными** - **по** часовой стрелке. Правильные направления вращения также указаны на самих моторах. Для проверки направления вращения можно использовать серво-тестер или радиоприёмник с пультом. + + Использование радиоприёмника и пульта описано ниже. ### Перевод пульта в режим PWM @@ -181,31 +183,35 @@ ## Установка полётного контроллера -1. Установите полетный контроллер на пластину с помощью двухстороннего скотча. -2. Стрелки на полетном контроллере и центральной деке должны быть направлены в одну сторону. -3. Подключите шлейф питания PDB к разъему *"POWER"* полетного контроллера, закрутив его в "косичку" для взаимной фиксации проводов. +1. Вставьте карту microSD в полётный контроллер + + + +2. Установите полетный контроллер на пластину с помощью двухстороннего скотча. +3. Стрелки на полетном контроллере и центральной деке должны быть направлены в одну сторону. +4. Подключите шлейф питания PDB к разъему *"POWER"* полетного контроллера, закрутив его в "косичку" для взаимной фиксации проводов.
-4. Установите 4 алюминиевые стойки 40 мм с помощью винтов М3х10. +5. Установите 4 алюминиевые стойки 40 мм с помощью винтов М3х10.
-5. Подключите сигнальные провода регуляторов к полетному контроллеру следующим образом: +6. Подключите сигнальные провода регуляторов к полетному контроллеру следующим образом:
-6. Установите 2 стойки "мама-мама" 15 мм на центральную деку с помощью винтов М3х8. -7. Другие 2 стойки были установлены ранее в разделе "Сборка рамы", п. 2. +7. Установите 2 стойки "мама-мама" 15 мм на центральную деку с помощью винтов М3х8. +8. Другие 2 стойки были установлены ранее в разделе "Сборка рамы", п. 2.
@@ -224,15 +230,19 @@ ## Установка Raspberry Pi -1. Установите плату Raspberry Pi на стойки, используя 4 стойки "папа-мама". -2. Протяните провода от BEC через паз в центральной раме. +1. Вставьте карту microSD с [записанным образом](image.md) в Raspberry Pi + + + +2. Установите плату Raspberry Pi на стойки, используя 4 стойки "папа-мама". +3. Протяните провода от BEC через паз в центральной раме.
-3. Подключите провод питания от BEC к Raspberry, согласно схеме: +4. Подключите провод питания от BEC к Raspberry, согласно схеме: @@ -252,7 +262,10 @@ 1. Питание для ленты берется от второго BEC. Подключите контакты *«-»* и *«+»* к *Ground* и *5v* на ленте соответственно. 2. Подключите контакт *D* к GPIO-пину на Raspberry. Рекомендуется использовать пин GPIO21. - +
+ + +
## Установка шлейфа для камеры @@ -339,6 +352,9 @@
4. Подключите USB кабель к разъему на полетном контроллере и USB разъему Raspberry Pi. + + + 5. Зафиксируйте "улитку" кабеля в удобном месте с помощью двухстороннего скотча так, чтобы провод не мешал вращению винтов.
diff --git a/docs/ru/camera.md b/docs/ru/camera.md index 830e6019..0a80ee9a 100644 --- a/docs/ru/camera.md +++ b/docs/ru/camera.md @@ -45,7 +45,7 @@ raspistill -o test-image.jpg ```xml - + ``` ## Компьютерное зрение diff --git a/docs/ru/coex_pix.md b/docs/ru/coex_pix.md new file mode 100644 index 00000000..8d6d7110 --- /dev/null +++ b/docs/ru/coex_pix.md @@ -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 ГБ. +* Серворазъемы – для подключения контроллеров моторов и других устройств. + +### Схемы расположения контактов + + + + + +> **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 фильтр, а также ферритовые фильтры в цепях питания. diff --git a/docs/ru/copterhack2019.md b/docs/ru/copterhack2019.md index d3b563f1..9c9ae698 100644 --- a/docs/ru/copterhack2019.md +++ b/docs/ru/copterhack2019.md @@ -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 + + + + + + + + +``` + ## Лекции Лекция 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 среда симуляции для дронов. diff --git a/docs/ru/frames.md b/docs/ru/frames.md index 0d479ead..cd7c1c03 100644 --- a/docs/ru/frames.md +++ b/docs/ru/frames.md @@ -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 – вверх. diff --git a/docs/ru/human_pose_estimation_drone_control.md b/docs/ru/human_pose_estimation_drone_control.md index ed451bfc..20298f03 100644 --- a/docs/ru/human_pose_estimation_drone_control.md +++ b/docs/ru/human_pose_estimation_drone_control.md @@ -1,4 +1,4 @@ -# Управление дроном для оценки позы человека +# Управление дроном при помощи позы человека ## Демонстрация diff --git a/docs/ru/models.md b/docs/ru/models.md new file mode 100644 index 00000000..ae839738 --- /dev/null +++ b/docs/ru/models.md @@ -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М-скотча). diff --git a/docs/ru/optical_flow.md b/docs/ru/optical_flow.md index 0ecc1352..99c75c41 100644 --- a/docs/ru/optical_flow.md +++ b/docs/ru/optical_flow.md @@ -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). diff --git a/docs/ru/simple_offboard.md b/docs/ru/simple_offboard.md index d2c49b0d..b86d4ade 100644 --- a/docs/ru/simple_offboard.md +++ b/docs/ru/simple_offboard.md @@ -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 Полет по прямой в точку в глобальной системе координат (широта/долгота).