mirror of
https://github.com/CopterExpress/clover.git
synced 2026-06-04 00:39:32 +00:00
Compare commits
13 Commits
v0.16-alph
...
v0.16
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
995a1395de | ||
|
|
99f207d0f6 | ||
|
|
29c401e5fa | ||
|
|
b3c0e2d290 | ||
|
|
d053571053 | ||
|
|
e59a0221ca | ||
|
|
b53bf19c8d | ||
|
|
b6c493513c | ||
|
|
24bf9f8907 | ||
|
|
3338d42a77 | ||
|
|
27e890825d | ||
|
|
68f810cd1a | ||
|
|
0c872a101f |
@@ -1,5 +1,4 @@
|
|||||||
iOS-приложение для управления Клевером
|
# iOS-приложение для управления Клевером
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
Для установки зависимостей необходим [CocoaPods](https://cocoapods.org):
|
Для установки зависимостей необходим [CocoaPods](https://cocoapods.org):
|
||||||
|
|
||||||
@@ -8,3 +7,11 @@ pod install
|
|||||||
```
|
```
|
||||||
|
|
||||||
Для разработки и сборки откройте в XCode файл `cleverrc.xcworkspace`.
|
Для разработки и сборки откройте в XCode файл `cleverrc.xcworkspace`.
|
||||||
|
|
||||||
|
## Политика конфиденциальности
|
||||||
|
|
||||||
|
App Store приложение CLEVER RC не собирает и не хранит каких-либо личных данных пользователя.
|
||||||
|
|
||||||
|
## Privacy policy
|
||||||
|
|
||||||
|
The App Store app CLEVER RC does not collect and store any personal user data.
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ After=roscore.service
|
|||||||
User=pi
|
User=pi
|
||||||
EnvironmentFile=/lib/systemd/system/roscore.env
|
EnvironmentFile=/lib/systemd/system/roscore.env
|
||||||
ExecStart=/opt/ros/kinetic/bin/roslaunch clever clever.launch --wait --screen
|
ExecStart=/opt/ros/kinetic/bin/roslaunch clever clever.launch --wait --screen
|
||||||
Restart=on-abort
|
Restart=on-failure
|
||||||
|
RestartSec=3
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|||||||
8
builder/assets/ros_python_paths
Normal file
8
builder/assets/ros_python_paths
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Defaults env_keep += "PYTHONPATH"
|
||||||
|
Defaults env_keep += "PATH"
|
||||||
|
Defaults env_keep += "ROS_ROOT"
|
||||||
|
Defaults env_keep += "ROS_MASTER_URI"
|
||||||
|
Defaults env_keep += "ROS_PACKAGE_PATH"
|
||||||
|
Defaults env_keep += "ROS_LOCATIONS"
|
||||||
|
Defaults env_keep += "ROS_HOME"
|
||||||
|
Defaults env_keep += "ROS_LOG_DIR"
|
||||||
@@ -6,7 +6,8 @@ After=network.target
|
|||||||
User=pi
|
User=pi
|
||||||
EnvironmentFile=/lib/systemd/system/roscore.env
|
EnvironmentFile=/lib/systemd/system/roscore.env
|
||||||
ExecStart=/opt/ros/kinetic/bin/roscore
|
ExecStart=/opt/ros/kinetic/bin/roscore
|
||||||
Restart=on-abort
|
Restart=on-failure
|
||||||
|
RestartSec=3
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/clever.
|
|||||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/roscore.env' '/lib/systemd/system/'
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/roscore.env' '/lib/systemd/system/'
|
||||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/roscore.service' '/lib/systemd/system/'
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/roscore.service' '/lib/systemd/system/'
|
||||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-rosdep-clever.yaml' '/etc/ros/rosdep/'
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-rosdep-clever.yaml' '/etc/ros/rosdep/'
|
||||||
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/ros_python_paths' '/etc/sudoers.d/'
|
||||||
# ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-ros-clever.rosinstall' '/home/pi/ros_catkin_ws/'
|
# ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-ros-clever.rosinstall' '/home/pi/ros_catkin_ws/'
|
||||||
# Add PX4 udev rules
|
# Add PX4 udev rules
|
||||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/99-px4fmu.rules' '/lib/udev/rules.d/'
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/99-px4fmu.rules' '/lib/udev/rules.d/'
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ tcpdump \
|
|||||||
ltrace \
|
ltrace \
|
||||||
libpoco-dev=1.7.6+dfsg1-5+deb9u1 \
|
libpoco-dev=1.7.6+dfsg1-5+deb9u1 \
|
||||||
python-rosdep \
|
python-rosdep \
|
||||||
python-rosinstall-generator=0.1.14-1 \
|
python-rosinstall-generator \
|
||||||
python-wstool=0.1.17-1 \
|
python-wstool=0.1.17-1 \
|
||||||
python-rosinstall=0.7.8-1 \
|
python-rosinstall=0.7.8-1 \
|
||||||
build-essential=12.3 \
|
build-essential=12.3 \
|
||||||
@@ -113,6 +113,7 @@ echo_stamp "Installing pip"
|
|||||||
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
|
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
|
||||||
python3 get-pip.py
|
python3 get-pip.py
|
||||||
python get-pip.py
|
python get-pip.py
|
||||||
|
rm get-pip.py
|
||||||
#my_travis_retry pip install --upgrade pip
|
#my_travis_retry pip install --upgrade pip
|
||||||
#my_travis_retry pip3 install --upgrade pip
|
#my_travis_retry pip3 install --upgrade pip
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ def check(name):
|
|||||||
for f in failures:
|
for f in failures:
|
||||||
rospy.logwarn('%s: %s', name, f)
|
rospy.logwarn('%s: %s', name, f)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
for f in failures:
|
||||||
|
rospy.logwarn('%s: %s', name, f)
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
rospy.logwarn('%s: exception occurred', name)
|
rospy.logwarn('%s: exception occurred', name)
|
||||||
return
|
return
|
||||||
@@ -59,7 +61,7 @@ param_get = rospy.ServiceProxy('mavros/param/get', ParamGet)
|
|||||||
def get_param(name):
|
def get_param(name):
|
||||||
res = param_get(param_id=name)
|
res = param_get(param_id=name)
|
||||||
if not res.success:
|
if not res.success:
|
||||||
failure('Unable to retrieve PX4 parameter%s', name)
|
failure('Unable to retrieve PX4 parameter %s', name)
|
||||||
else:
|
else:
|
||||||
if res.value.integer != 0:
|
if res.value.integer != 0:
|
||||||
return res.value.integer
|
return res.value.integer
|
||||||
|
|||||||
@@ -528,12 +528,13 @@ bool serve(enum setpoint_type_t sp_type, float x, float y, float z, float vx, fl
|
|||||||
nav_speed = speed;
|
nav_speed = speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sp_type == NAVIGATE || sp_type == NAVIGATE_GLOBAL || sp_type == POSITION || sp_type == VELOCITY) {
|
// if (sp_type == NAVIGATE || sp_type == NAVIGATE_GLOBAL || sp_type == POSITION || sp_type == VELOCITY) {
|
||||||
if (std::isnan(yaw) && yaw_rate == 0) {
|
// if (std::isnan(yaw) && yaw_rate == 0) {
|
||||||
// keep yaw unchanged
|
// // keep yaw unchanged
|
||||||
yaw = tf2::getYaw(local_position.pose.orientation);
|
// // TODO: this is incorrect, because we need yaw in desired frame
|
||||||
}
|
// yaw = tf2::getYaw(local_position.pose.orientation);
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
if (sp_type == POSITION || sp_type == NAVIGATE || sp_type == NAVIGATE_GLOBAL || sp_type == VELOCITY || sp_type == ATTITUDE) {
|
if (sp_type == POSITION || sp_type == NAVIGATE || sp_type == NAVIGATE_GLOBAL || sp_type == VELOCITY || sp_type == ATTITUDE) {
|
||||||
// destination point and/or yaw
|
// destination point and/or yaw
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ int main(int argc, char **argv) {
|
|||||||
nh_priv.param<string>("offset_frame_id", offset_frame_id, "");
|
nh_priv.param<string>("offset_frame_id", offset_frame_id, "");
|
||||||
nh_priv.param<string>("mavros/local_position/frame_id", local_frame_id, "map");
|
nh_priv.param<string>("mavros/local_position/frame_id", local_frame_id, "map");
|
||||||
nh_priv.param<string>("mavros/local_position/tf/child_frame_id", child_frame_id, "base_link");
|
nh_priv.param<string>("mavros/local_position/tf/child_frame_id", child_frame_id, "base_link");
|
||||||
offset_timeout = ros::Duration(nh_priv.param("offset_timeout", 5.0));
|
offset_timeout = ros::Duration(nh_priv.param("offset_timeout", 3.0));
|
||||||
|
|
||||||
if (!frame_id.empty()) {
|
if (!frame_id.empty()) {
|
||||||
ROS_INFO("vpe_publisher: using data from TF");
|
ROS_INFO("vpe_publisher: using data from TF");
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
«Клевер» — это учебный конструктор программируемого квадрокоптера, состоящего из популярных открытых компонентов, а также набор необходимой документации и библиотек для работы с ним.
|
«Клевер» — это учебный конструктор программируемого квадрокоптера, состоящего из популярных открытых компонентов, а также набор необходимой документации и библиотек для работы с ним.
|
||||||
|
|
||||||
Набор включает в себя полетный контроллер Pixhawk/Pixracer с полетным стеком PX4, Raspberry Pi 3 в качестве управлящего бортового компьютера, модуль камеры для реализации полетов с использованием компьютерного зрения, а также набор различных датчиков и другой периферии.
|
Набор включает в себя полетный контроллер Pixhawk/Pixracer с полетным стеком PX4, Raspberry Pi 3 в качестве управляющего бортового компьютера, модуль камеры для реализации полетов с использованием компьютерного зрения, а также набор различных датчиков и другой периферии.
|
||||||
|
|
||||||
На базе точно такой же платформы были созданы многие «большие» проекты компании Copter Express, например, дроны для [пиар-акций по автономной доставке пиццы](https://www.youtube.com/watch?v=hmkAoZOtF58) (Самара, Казань); дрон-доставщик кофе в Сколково, мониторинговый дрон с зарядной станцией, дроны-победители на полевых испытаниях «[Робокросс-2016](https://www.youtube.com/watch?v=dGbDaz_VmYU)», «[Робокросс-2017](https://youtu.be/AQnd2CRczbQ)» и многие другие.
|
На базе точно такой же платформы были созданы многие «большие» проекты компании Copter Express, например, дроны для [пиар-акций по автономной доставке пиццы](https://www.youtube.com/watch?v=hmkAoZOtF58) (Самара, Казань); дрон-доставщик кофе в Сколково, мониторинговый дрон с зарядной станцией, дроны-победители на полевых испытаниях «[Робокросс-2016](https://www.youtube.com/watch?v=dGbDaz_VmYU)», «[Робокросс-2017](https://youtu.be/AQnd2CRczbQ)» и многие другие.
|
||||||
|
|
||||||
@@ -15,6 +15,8 @@
|
|||||||
|
|
||||||
Также у нас есть чат для программистов, которые разрабатывают под PX4, автономную навигацию в помещениях и рои дронов https://t.me/DroneCode.
|
Также у нас есть чат для программистов, которые разрабатывают под PX4, автономную навигацию в помещениях и рои дронов https://t.me/DroneCode.
|
||||||
|
|
||||||
|
The English version of this documentation [is available](../en/).
|
||||||
|
|
||||||
Образ для Raspberry Pi
|
Образ для Raspberry Pi
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,10 @@
|
|||||||
* [ROS](ros.md)
|
* [ROS](ros.md)
|
||||||
* [MAVROS](mavros.md)
|
* [MAVROS](mavros.md)
|
||||||
* [Автономный полет в OFFBOARD](simple_offboard.md)
|
* [Автономный полет в OFFBOARD](simple_offboard.md)
|
||||||
* [Навигация по ArUco-маркерам](aruco.md)
|
* Визуальные маркеры (ArUco)
|
||||||
|
* [Общая информация](aruco.md)
|
||||||
|
* [Распознавание маркеров](aruco_marker.md)
|
||||||
|
* [Распознавание карт маркеров](aruco_map.md)
|
||||||
* [Навигация по Optical Flow](optical_flow.md)
|
* [Навигация по Optical Flow](optical_flow.md)
|
||||||
* [Автоматическая проверка](selfcheck.md)
|
* [Автоматическая проверка](selfcheck.md)
|
||||||
* [Примеры кода](snippets.md)
|
* [Примеры кода](snippets.md)
|
||||||
|
|||||||
165
docs/ru/aruco.md
165
docs/ru/aruco.md
@@ -1,172 +1,23 @@
|
|||||||
# Навигация с использованием ArUco-маркеров
|
# ArUco-маркеры
|
||||||
|
|
||||||
> **Note** Документация для версий [образа](microsd_images.md), начиная с **0.15**. Для более ранних версий см. [документацию для версии **0.14**](https://github.com/CopterExpress/clever/blob/v0.14/docs/ru/aruco.md).
|
> **Note** Документация для версий [образа](microsd_images.md), начиная с версии **0.16**. Для более ранних версий см. [документацию для версии **0.15.1**](https://github.com/CopterExpress/clever/blob/v0.15.1/docs/ru/aruco.md).
|
||||||
|
|
||||||
[ArUco-маркеры](https://docs.opencv.org/3.2.0/d5/dae/tutorial_aruco_detection.html) — это популярная технология для позиционирования
|
[ArUco-маркеры](https://docs.opencv.org/3.2.0/d5/dae/tutorial_aruco_detection.html) — это популярная технология для позиционирования
|
||||||
робототехнических систем с использованием компьютерного зрения.
|
робототехнических систем с использованием компьютерного зрения.
|
||||||
|
|
||||||
Пример ArUco-маркеров:
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
> **Hint** При печати визуальных маркеров необходимо использовать максимально матовую бумагу. Глянцевая бумага будет бликовать на свету, сильно ухудшая качество распознавания.
|
> **Hint** При печати визуальных маркеров необходимо использовать максимально матовую бумагу. Глянцевая бумага будет бликовать на свету, сильно ухудшая качество распознавания.
|
||||||
|
|
||||||
Для быстрого генерирования маркеров для печати можно использовать онлайн-инструмент: http://chev.me/arucogen/.
|
Для быстрого генерирования маркеров для печати можно использовать онлайн-инструмент: http://chev.me/arucogen/.
|
||||||
|
|
||||||
## aruco\_pose
|
На [образе Клевера для RPi](microsd_images.md) предустановлен пакет `aruco_pose`, предназначенный для работы с ArUco-маркерами.
|
||||||
|
|
||||||
Модуль `aruco_pose` позволяет восстанавливать позицию коптера относительно карты ArUco-маркеров и сообщать ее полетному контролеру, используя механизм [Vision Position Estimation](https://dev.px4.io/en/ros/external_position_estimation.html).
|
## Режимы работы
|
||||||
|
|
||||||
При наличии источника положения коптера по маркерам появляется возможность производить точную автономную indoor-навигацию по позициям при помощи модуля [simple\_offboard](simple_offboard.md).
|
Клевер имеет несколько преднастроенных режимов работы с ArUco-маркерами:
|
||||||
|
|
||||||
### Включение
|
* [распознавание и навигация по отдельным маркерам](aruco_marker.md);
|
||||||
|
* [распознавание и навигация по картам маркеров](aruco_map.md).
|
||||||
|
|
||||||
Необходимо убедиться, что в launch-файле Клевера \(`~/catkin_ws/src/clever/clever/launch/clever.launch`\) включен запуск aruco\_pose и [камеры для компьютерного зрения](camera.md):
|
> **Info** Исчерпывающую документацию по пакету `aruco_pose` на английском языке можно посмотреть [на GitHub](https://github.com/CopterExpress/clever/blob/master/aruco_pose/README.md).
|
||||||
|
|
||||||
```xml
|
|
||||||
<arg name="main_camera" default="true"/>
|
|
||||||
```
|
|
||||||
|
|
||||||
```xml
|
|
||||||
<arg name="aruco" default="true"/>
|
|
||||||
```
|
|
||||||
|
|
||||||
При изменении launch-файла необходимо перезапустить пакет `clever`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl restart clever
|
|
||||||
```
|
|
||||||
|
|
||||||
### Настройка карты ArUco-меток
|
|
||||||
|
|
||||||
В качестве карты меток можно использовать автоматически сгенерированный [ArUco-board](https://docs.opencv.org/trunk/db/da9/tutorial_aruco_board_detection.html).
|
|
||||||
|
|
||||||
Настройка карты меток производится с помощью файла `~/catkin_ws/src/clever/clever/launch/aruco.launch`. Для использования ArUco-board введите его параметры:
|
|
||||||
|
|
||||||
```xml
|
|
||||||
<node pkg="nodelet" type="nodelet" name="aruco_pose" args="load aruco_pose/aruco_pose nodelet_manager">
|
|
||||||
<param name="frame_id" value="aruco_map_raw"/>
|
|
||||||
<!-- тип маркерного поля -->
|
|
||||||
<param name="type" value="gridboard"/>
|
|
||||||
|
|
||||||
<!-- количество маркеров по x -->
|
|
||||||
<param name="markers_x" value="1"/>
|
|
||||||
|
|
||||||
<!-- количество маркеров по y -->
|
|
||||||
<param name="markers_y" value="6"/>
|
|
||||||
|
|
||||||
<!-- ID маркера первого маркера (левого верхнего) -->
|
|
||||||
<param name="first_marker" value="240"/>
|
|
||||||
|
|
||||||
<!-- длина стороны маркера в метрах -->
|
|
||||||
<param name="markers_side" value="0.3362"/>
|
|
||||||
|
|
||||||
<!-- расстояние между маркерами -->
|
|
||||||
<param name="markers_sep" value="0.46"/>
|
|
||||||
</node>
|
|
||||||
```
|
|
||||||
|
|
||||||
Можно задать отдельно расстояние между маркерами по горизонтали и вертикали:
|
|
||||||
|
|
||||||
```xml
|
|
||||||
<!-- расстояние между маркерами по горизонтали -->
|
|
||||||
<param name="markers_sep_x" value="0.97"/>
|
|
||||||
|
|
||||||
<!-- расстояние между маркерами по вертикали -->
|
|
||||||
<param name="markers_sep_y" value="1.435"/>
|
|
||||||
```
|
|
||||||
|
|
||||||
Если используется карта с нестандартным порядком ID меток, то можно использовать параметр `marker_ids`:
|
|
||||||
|
|
||||||
```xml
|
|
||||||
<rosparam param="marker_ids">[5, 7, 9, 11, 13, 15]</rosparam>
|
|
||||||
```
|
|
||||||
|
|
||||||
Нумерация маркеров ведется с левого верхнего угла поля.
|
|
||||||
|
|
||||||
Для контроля карты, по которой в данный момент коптер осуществляет навигацию, можно просмотреть содержимое топика `aruco_pose/map_image`. Через браузер его можно просмотреть при помощи [web\_video\_server](web_video_server.md) по ссылке [http://192.168.11.1:8080/snapshot?topic=/aruco\_pose/map\_image](http://192.168.11.1:8080/snapshot?topic=/aruco_pose/map_image):
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
При полетах необходимо убедиться, что наклеенные на пол метки соответствуют карте.
|
|
||||||
|
|
||||||
В топике `aruco_pose/debug` \([http://192.168.11.1:8080/snapshot?topic=/aruco\_pose/debug](http://192.168.11.1:8080/snapshot?topic=/aruco_pose/debug)\) доступен текущий результат распознавания меток:
|
|
||||||
|
|
||||||
TODO
|
|
||||||
|
|
||||||
### Система координат
|
|
||||||
|
|
||||||
По [соглашению](http://www.ros.org/reps/rep-0103.html), в маркерном поле используется стандартная система координат ENU:
|
|
||||||
|
|
||||||
* x — вправо \(условный "восток"\);
|
|
||||||
* y — вперед \(условный "север"\);
|
|
||||||
* z — вверх.
|
|
||||||
|
|
||||||
_Примечание_: указанное выше определение приведено для ситуации, когда поле маркеров лежит на полу.
|
|
||||||
|
|
||||||
Таким образом, нулевой является левая нижняя точка маркерного поля. Угол по рысканью считается равным 0, когда коптер смотрит направо \(по оси x\).
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### Настройка полетного контролера
|
|
||||||
|
|
||||||
Для правильной работы Vision Position Estimation необходимо \(через [QGroundControl](gcs_bridge.md)\) убедиться, что:
|
|
||||||
|
|
||||||
* **Для Pixhawk**: Установлена прошивка с LPE \(local position estimator\). Для Pixhawk необходимо [скачать прошивку `px4fmu-v2_lpe.px4`](https://github.com/PX4/Firmware/releases).
|
|
||||||
|
|
||||||
**Для Pixracer**: параметр `SYS_MC_EST_GROUP` должен быть установлен в `local_position_estimator, attitude_estimator_q`.
|
|
||||||
|
|
||||||
> **Note** После изменения значения параметра `SYS_MC_EST_GROUP` необходимо перезагрузить полетный контроллер.
|
|
||||||
* В параметре `LPE_FUSION` включены **только** флажки `vision position`, `land detector`. Итоговое значение _20_.
|
|
||||||
* Выключен компас: `ATT_W_MAG` = 0
|
|
||||||
* Вес угла по рысканью по зрению: `ATT_W_EXT_HDG` = 0.5
|
|
||||||
* Включена ориентация по Yaw по зрению: `ATT_EXT_HDG_M` = 2 `MOCAP`.
|
|
||||||
* Настройки VPE: `LPE_VIS_DELAY` = 0 sec, `LPE_VIS_XY` = 0.1 m, `LPE_VIS_Z` = 0.15 m.
|
|
||||||
* Рекомендуемые настройки land detector'а:
|
|
||||||
* `COM_DISARM_LAND` = 1 s
|
|
||||||
* `LNDMC_ROT_MAX` = 45 deg
|
|
||||||
* `LNDMC_THR_RANGE` = 0.5
|
|
||||||
* `LNDMC_Z_VEL_MAX` = 1 m/s
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Для простоты настройки можно воспользоваться готовым файлом настроек для [Clever 2](https://github.com/CopterExpress/clever/blob/master/docs/assets/Clever2LPE_160118.params) или для [Clever 3](https://github.com/CopterExpress/clever/blob/master/docs/assets/Clever3_LPE_020218.params) и вгрузить его в контроллер с помощью меню Tools - Load from file из раздела Parameters в QGroundControl.
|
|
||||||
|
|
||||||

|
|
||||||
-->
|
|
||||||
|
|
||||||
### Полет
|
|
||||||
|
|
||||||
При правильной настройке коптер начнет удерживать позицию по VPE \(в [режимах](modes.md) `POSCTL` или `OFFBOARD`\) автоматически.
|
|
||||||
|
|
||||||
Для [автономных полетов](simple_offboard.md) можно будет использовать функции `navigate`, `set_position`, `set_velocity`. Для полета в определенные координаты маркерного поля необходимо использовать фрейм `aruco_map`:
|
|
||||||
|
|
||||||
```python
|
|
||||||
# Вначале необходимо взлететь, чтобы коптер увидел карту меток
|
|
||||||
# и появился фрейм aruco_map:
|
|
||||||
navigate(0, 0, 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 метра
|
|
||||||
```
|
|
||||||
|
|
||||||
См. [другие функции](simple_offboard.md) simple_offboard.
|
|
||||||
|
|
||||||
### Расположение маркеров на потолке
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Для навигации по маркерам, расположенным на потолке, необходимо поставить основную камеру так, чтобы она смотрела вверх и [установить соответствующий фрейм камеры](camera_frame.md).
|
|
||||||
|
|
||||||
Чтобы задавать карту маркеров в "перевернутой" системе координат, необходимо изменить параметр `aruco_orientation` в файле `~/catkin_ws/src/clever/clever/aruco.launch`:
|
|
||||||
|
|
||||||
```xml
|
|
||||||
<param name="aruco_orientation" value="map_upside_down"/>
|
|
||||||
```
|
|
||||||
|
|
||||||
При задании вышеуказанного параметра фрейм aruco\_map также окажется "перевернутым". Таким образом, для полета на высоту 2 метра ниже потолка, аргумент `z` нужно устанавливать в 2:
|
|
||||||
|
|
||||||
```python
|
|
||||||
navigate(x=1, y=2, z=1.1, speed=0.5, frame_id='aruco_map')
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
# ArUco-маркеры
|
|
||||||
|
|
||||||
> **Note** Документация для версий [образа](microsd_images.md), начиная с версии **0.16**. Для более ранних версий см. [документацию для версии **0.15.1**](https://github.com/CopterExpress/clever/blob/v0.15.1/docs/ru/aruco.md).
|
|
||||||
|
|
||||||
[ArUco-маркеры](https://docs.opencv.org/3.2.0/d5/dae/tutorial_aruco_detection.html) — это популярная технология для позиционирования
|
|
||||||
робототехнических систем с использованием компьютерного зрения.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
> **Hint** При печати визуальных маркеров необходимо использовать максимально матовую бумагу. Глянцевая бумага будет бликовать на свету, сильно ухудшая качество распознавания.
|
|
||||||
|
|
||||||
Для быстрого генерирования маркеров для печати можно использовать онлайн-инструмент: http://chev.me/arucogen/.
|
|
||||||
|
|
||||||
На [образе Клевера для RPi](microsd_images.md) предустановлен пакет `aruco_pose`, предназначенный для работы с ArUco-маркерами.
|
|
||||||
|
|
||||||
## Режимы работы
|
|
||||||
|
|
||||||
Клевер имеет несколько преднастроенных режимов работы с ArUco-маркерами:
|
|
||||||
|
|
||||||
* [распознавание и навигация по отдельным маркерам](aruco_marker.md);
|
|
||||||
* [распознавание и навигация по картам маркеров](aruco_map.md).
|
|
||||||
|
|
||||||
> **Info** Исчерпывающую документацию по пакету `aruco_pose` на английском языке можно посмотреть [на GitHub](https://github.com/CopterExpress/clever/blob/master/aruco_pose/README.md).
|
|
||||||
@@ -100,6 +100,8 @@ navigate(x=1.5, frame_id='body')
|
|||||||
* изменить значение параметра `MPC_THR_HOVER`;
|
* изменить значение параметра `MPC_THR_HOVER`;
|
||||||
* выставить `MPC_ALT_MODE` = 2 (Terrain following).
|
* выставить `MPC_ALT_MODE` = 2 (Terrain following).
|
||||||
|
|
||||||
|
При использовании Optical Flow максимальная горизонтальная скорость дополнительно ограничивается. За это косвенно отвечает параметр `SENS_FLOW_MAXR` (максимальная достоверная "угловая скорость" оптического потока). При нормальном полёте горизонтальная скорость будет регулироваться так, чтобы показания Optical Flow не превышали 50% значения данного параметра.
|
||||||
|
|
||||||
## Неисправности
|
## Неисправности
|
||||||
|
|
||||||
При появлении в QGC ошибок типа `EKF INTERNAL CHECKS` попробуйте перезагрузить EKF2. Для этого наберите в MAVLink-консоли:
|
При появлении в QGC ошибок типа `EKF INTERNAL CHECKS` попробуйте перезагрузить EKF2. Для этого наберите в MAVLink-консоли:
|
||||||
|
|||||||
Reference in New Issue
Block a user