mirror of
https://github.com/CopterExpress/clover.git
synced 2026-05-26 11:43:25 +00:00
124 lines
6.3 KiB
Markdown
124 lines
6.3 KiB
Markdown
# Распознавание ArUco-маркеров
|
||
|
||
> **Info** Для распознавания маркеров модуль камеры должен быть корректно подключен и [сконфигурирован](camera.md).
|
||
|
||
Модуль `aruco_detect` распознает ArUco-маркеры и публикует их позиции в ROS-топики и в [TF](frames.md).
|
||
|
||
Эта функция полезна для применения совместно с какой-либо системой позиционирования для дрона, такой как [GPS](gps.md), [Optical Flow](optical_flow.md), PX4Flow, визуальная одометрия, ультразвуковое ([Marvelmind](https://marvelmind.com)) или UWB-позиционирование ([Pozyx](https://www.pozyx.io)).
|
||
|
||
Также возможно применение совместно с [навигацией по карте маркеров](aruco_map.md).
|
||
|
||
## Настройка
|
||
|
||
Для включения модуля аргумент `aruco_detect` в файле `~/catkin_ws/src/clever/clever/launch/aruco.launch` должен быть в значении `true`:
|
||
|
||
```xml
|
||
<arg name="aruco_detect" default="true"/>
|
||
```
|
||
|
||
Для правильной работы в этом же файле в секции `aruco_detect` должны быть выставлены параметры:
|
||
|
||
```xml
|
||
<param name="length" value="0.32"/> <!-- размер маркеров в метрах (не включая белую рамку) -->
|
||
<param name="estimate_poses" value="true"/> <!-- включение вычисления позиций маркеров -->
|
||
<param name="send_tf" value="true"/> <!-- отправлять позиции маркеров в виде TF-фреймов -->
|
||
<param name="known_tilt" value="map"/> <!-- наклон маркеров, см. далее -->
|
||
```
|
||
|
||
Значение параметра `known_tilt` следует выставлять следующим образом:
|
||
|
||
* если *все* маркеры наклеены на полу (земле), выставить значение `map`;
|
||
* если *все* маркеры наклеены на потолке, выставить значение `map_flipped`;
|
||
* противном случае удалить строку с параметром.
|
||
|
||
Если некоторые маркеры имеют размер, отличный значения `length`, их размер может быть переопределен с помощью параметра `length_override`:
|
||
|
||
```xml
|
||
<param name="length_override/3" value="0.1"/> <!-- маркер c id 3 имеет размер 10 см -->
|
||
<param name="length_override/17" value="0.25"/> <!-- маркер c id 17 имеет размер 25 см -->
|
||
```
|
||
|
||
## Система координат
|
||
|
||
С маркером связана следующая система координат:
|
||
|
||
* ось **<font color=red>x</font>** указывает кверху маркера;
|
||
* ось **<font color=green>y</font>** указывает на правую сторону маркера;
|
||
* ось **<font color=blue>z</font>** указывает от плоскости маркера.
|
||
|
||
<img src="../assets/marker-axis.png" width="300">
|
||
|
||
## Работа с распознанными маркерами
|
||
|
||
Наглядно распознанные маркеры можно видеть в топике `aruco_detect/debug`. Просмотреть его можно с помощью [`rqt_image_view`](rviz.md) или через [web_video_server](web_video_server.md) по ссылке http://192.168.11.1:8080/snapshot?topic=/aruco_pose/debug:
|
||
|
||
<img src="../assets/aruco-detect-debug.png" width=600>
|
||
|
||
Распознанные маркеры и их позиции публикуются в топик `aruco_detect/markers`. Чтение топика из Bash:
|
||
|
||
```bash
|
||
rostopic echo /aruco_detect/markers
|
||
```
|
||
|
||
## Навигация по маркерам
|
||
|
||
С использованием модуля [`simple_offboard`](simple_offboard.md) можно осуществлять навигацию по маркерам используя соответствующие TF-фреймы.
|
||
|
||
Полет в точку над маркером 5 на высоту 1 метр:
|
||
|
||
```python
|
||
navigate(frame_id='aruco_5', x=0, y=0, z=1)
|
||
```
|
||
|
||
Полет в точку на метр левее маркера 7 на высоте 2 метра:
|
||
|
||
```python
|
||
navigate(frame_id='aruco_7', x=-1, y=0, z=2)
|
||
```
|
||
|
||
Вращаться против часовой стрелки на высоте 1.5 метра над маркером 10:
|
||
|
||
```python
|
||
navigate(frame_id='aruco_10', x=0, y=0, z=1.5, yaw_rate=0.5)
|
||
```
|
||
|
||
Если необходимый маркер не появится в поле зрения в течение полусекунды, дрон продолжит выполнять предыдущую команду.
|
||
|
||
Подобные значения `frame_id` можно использовать и в других сервисах, например `get_telemetry`. Получение расположения дрона относительно маркера 3:
|
||
|
||
```python
|
||
telem = get_telemetry(frame_id='aruco_3')
|
||
```
|
||
|
||
Если необходимый маркер не появится в поле зрения в течение полусекунды, в полях `telem.x`, `telem.y`, `telem.z`, `telem.yaw` будет значение `NaN`.
|
||
|
||
## Работа с результатом распознавания из Python
|
||
|
||
Чтение топика `aruco_detect/markers` из Python:
|
||
|
||
```python
|
||
import rospy
|
||
from aruco_pose.msg import MarkerArray
|
||
rospy.init_node('my_node')
|
||
|
||
# ...
|
||
|
||
def markers_callback(msg):
|
||
print 'Detected markers:':
|
||
for marker in msg.markers:
|
||
print 'Marker: %s' % marker
|
||
|
||
# Подписываемся. При получении сообщения в топик /foo будет вызвана функция foo_callback.
|
||
rospy.Subscriber('aruco_detect/markers', MarkerArray, markers_callback)
|
||
|
||
# ...
|
||
|
||
rospy.spin()
|
||
```
|
||
|
||
Сообщения будут содержать ID маркера, его угловые точки на изображении и его позицию (относительно камеры).
|
||
|
||
---
|
||
|
||
См. далее: [навигация по картам маркеров](aruco_map.md).
|