mirror of
https://github.com/CopterExpress/clover.git
synced 2026-05-26 21:19:35 +00:00
docs: spelling
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
Основной туториал по rosserial: http://wiki.ros.org/rosserial_arduino/Tutorials
|
||||
|
||||
Arudino необходимо установить на Клевер и подключить по USB-порту.
|
||||
Arduino необходимо установить на Клевер и подключить по USB-порту.
|
||||
|
||||
## Настройка Arduino IDE
|
||||
|
||||
@@ -14,7 +14,7 @@ Arudino необходимо установить на Клевер и подк
|
||||
rosrun rosserial_arduino make_libraries.py .
|
||||
```
|
||||
|
||||
Полученный каталог `ros_lib` необходимо скопировать в `<папку скетчей>/libraries` на компьютере с Arudino IDE.
|
||||
Полученный каталог `ros_lib` необходимо скопировать в `<папку скетчей>/libraries` на компьютере с Arduino IDE.
|
||||
|
||||
## Настройка Raspberry Pi
|
||||
|
||||
@@ -49,7 +49,7 @@ while(/* условие */) {
|
||||
}
|
||||
```
|
||||
|
||||
Для огранизации долгих задержек используйте задержки в цикле с периодическим вызовом функции `hn.spinOnce()`:
|
||||
Для организации долгих задержек используйте задержки в цикле с периодическим вызовом функции `hn.spinOnce()`:
|
||||
|
||||
```cpp
|
||||
// Задержка на 8 секунд
|
||||
@@ -202,7 +202,7 @@ getTelemetry.call(gt_req, gt_res);
|
||||
|
||||
## Проблемы
|
||||
|
||||
При использовании Arudino Nano может не хватать оперативной памяти (RAM). В таком случае в Aruino IDE будут появляться сообщения, типа:
|
||||
При использовании Arduino Nano может не хватать оперативной памяти (RAM). В таком случае в Arduino IDE будут появляться сообщения, типа:
|
||||
|
||||
```
|
||||
Глобальные переменные используют 1837 байт (89%) динамической памяти, оставляя 211 байт для локальных переменных. Максимум: 2048 байт.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
> **Note** Документация для версий [образа](microsd_images.md), начиная с **0.15**. Для более ранних версий см. [документацию для версии **0.14**](https://github.com/CopterExpress/clever/blob/v0.14/docs/ru/aruco.md).
|
||||
|
||||
[ArUco-маркеры](https://docs.opencv.org/3.2.0/d5/dae/tutorial_aruco_detection.html) — это популярная технология для позиционирования
|
||||
роботехнических систем с использованием компьютерного зрения.
|
||||
робототехнических систем с использованием компьютерного зрения.
|
||||
|
||||
Пример ArUco-маркеров:
|
||||
|
||||
@@ -61,7 +61,7 @@ sudo systemctl restart clever
|
||||
<!-- длина стороны маркера в метрах -->
|
||||
<param name="markers_side" value="0.3362"/>
|
||||
|
||||
<!-- растояние между маркерами -->
|
||||
<!-- расстояние между маркерами -->
|
||||
<param name="markers_sep" value="0.46"/>
|
||||
</node>
|
||||
```
|
||||
@@ -90,7 +90,7 @@ sudo systemctl restart clever
|
||||
|
||||
При полетах необходимо убедиться, что наклеенные на пол метки соответствуют карте.
|
||||
|
||||
В топике `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)\) доступен текущий результат распознования меток:
|
||||
В топике `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
|
||||
|
||||
@@ -104,9 +104,9 @@ TODO
|
||||
|
||||
_Примечание_: указанное выше определение приведено для ситуации, когда поле маркеров лежит на полу.
|
||||
|
||||
Таким образом, нулевой является левая нижня точка маркерного поля. Угол по рысканью считается равным 0, когда коптер смотрит направо \(по оси x\).
|
||||
Таким образом, нулевой является левая нижняя точка маркерного поля. Угол по рысканью считается равным 0, когда коптер смотрит направо \(по оси x\).
|
||||
|
||||

|
||||

|
||||
|
||||
### Настройка полетного контролера
|
||||
|
||||
|
||||
@@ -1,227 +1,227 @@
|
||||
# Калибровка камеры
|
||||
|
||||
Компьютерное зрение получает все более широкое распространение. Зачастую, алгоритмы компьютерного зрения работают неточно, получая искаженное изображение с камеры, что особенно характерно для fisheye-камер.
|
||||
|
||||

|
||||
|
||||
> Изображение "скруглено" ближе к краям.
|
||||
|
||||
Какой-либо алгоритм компьютерного зрения будет воспринимать информацию с этой картинки неправильно. Для устранения подобных искажений камера, получающая изображения, должна быть откалибрована в соответствии со своими особенностями.
|
||||
|
||||
## Установка скрипта
|
||||
|
||||
Для начала, необходимо установить необходимые библиотеки:
|
||||
|
||||
```
|
||||
pip install numpy
|
||||
pip install opencv-python
|
||||
pip install glob
|
||||
pip install pyyaml
|
||||
pip install urllib.request
|
||||
```
|
||||
|
||||
Затем скачиваем скрипт из репозитория:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/tinderad/clever_cam_calibration.git
|
||||
```
|
||||
|
||||
Переходим в скачанную папку и устанавливаем скрипт:
|
||||
|
||||
```bash
|
||||
cd clever_cam_calibration
|
||||
sudo python setup.py build
|
||||
sudo python setup.py install
|
||||
```
|
||||
|
||||
Если вы используете Windows, тогда скачайте архив из [репозитория](https://github.com/tinderad/clever_cam_calibration/archive/master.zip), распакуйте его и установите:
|
||||
|
||||
```bash
|
||||
cd path\to\archive\clever_cam_calibration\
|
||||
python setup.py build
|
||||
python setup.py install
|
||||
```
|
||||
|
||||
> path\to\archive - путь до распакованного архива.
|
||||
|
||||
## Подготовка к калибровке
|
||||
|
||||
Вам необходимо подготовить калибровочную мишень. Она представляет собой «шахматную доску». Файл можно взять [отсюда](https://www.oreilly.com/library/view/learning-opencv-3/9781491937983/assets/lcv3_ac01.png).
|
||||
Наклейте распечатанную мишень на любую твердую поверхность. Посчитайте количество пересечений в длину и в ширину доски, измерьте размер клетки (в мм).
|
||||
|
||||

|
||||
|
||||
Включите Клевер и подключитесь к его Wifi.
|
||||
|
||||
> Перейдите на 192.168.11.1:8080 и проверьте, получает ли компьютер изображения из топика image_raw.
|
||||
|
||||
## Калибровка
|
||||
|
||||
Запустите скрипт **_calibrate_cam_**:
|
||||
|
||||
**Windows:**
|
||||
|
||||
```bash
|
||||
>path\to\python\Scripts\calibrate_cam.exe
|
||||
```
|
||||
|
||||
> path\to\Python - путь до директории Python
|
||||
|
||||
**Linux:**
|
||||
|
||||
```bash
|
||||
>calibrate_cam
|
||||
```
|
||||
|
||||
Задайте параметры доски:
|
||||
|
||||
```bash
|
||||
>calibrate_cam
|
||||
Chessboard width: # Перекрестий в ширину
|
||||
Chessboard height: # Перекрестий в длину
|
||||
Square size: # Длина ребра клетки (в мм)
|
||||
Saving mode (YES - on): # Режим сохранения
|
||||
```
|
||||
|
||||
> Режим сохранения: если включен, то все полученные фотографии будут сохраняться в нынешней директории.
|
||||
|
||||
Скрипт начнет свою работу:
|
||||
|
||||
...
|
||||
Calibration started!
|
||||
Commands:
|
||||
help, catch (key: Enter), delete, restart, stop, finish
|
||||
|
||||
Чтобы откалибровать камеру, вам требуется сделать как минимум 25 фото шахматной доски с различных ракурсов.
|
||||
|
||||

|
||||
|
||||
Чтобы сделать фото, введите команду **_catch_**.
|
||||
|
||||
```bash
|
||||
>catch
|
||||
```
|
||||
|
||||
Программа будет информировать вас о состоянии калибровки.
|
||||
|
||||
```bash
|
||||
...
|
||||
Chessboard not found, now 0 (25 required)
|
||||
> # Enter
|
||||
---
|
||||
Image added, now 1 (25 required)
|
||||
```
|
||||
|
||||
> Вместо того, чтобы каждый раз вводить команду **_catch_**, Вы можете просто нажимать клавишу **_Enter_** (вводить пустую строку).
|
||||
|
||||
После того, как будет набрано достаточное количество изображений, введите команду **_finish_**.
|
||||
|
||||
```bash
|
||||
...
|
||||
>finish
|
||||
Calibration successful!
|
||||
```
|
||||
|
||||
**Калибровка по существующим изображениям:**
|
||||
|
||||
Если же у вас уже есть изображения, то вы можете откалибровать камеру по ним при помощи скрипта **_calibrate_cam_ex_**.
|
||||
|
||||
```bash
|
||||
>calibrate_cam_ex
|
||||
```
|
||||
|
||||
Указываем характеристики мишени, а так же путь до папки с изображениями:
|
||||
|
||||
```bash
|
||||
>calibrate_cam_ex
|
||||
Chessboard width: # Перекрестий в ширину
|
||||
Chessboard height: # Перекрестий в длину
|
||||
Square size: # Длина ребра клетки (в мм)
|
||||
Path: # Путь до папки с изображениями
|
||||
```
|
||||
|
||||
В остальном этот скрипт работает аналогично **_calibrate_cam_**.
|
||||
|
||||
Программа обработает все полученные фотографии, и создаст файл **_camera_info_****_._****_yaml_** в нынешней директории. При помощи этого файла можно будет выравнивать искажения на изображениях, полученных с этой камеры.
|
||||
|
||||
> Если вы поменяете разрешение получаемого изображения, вам нужно будет снова калибровать камеру.
|
||||
|
||||
## Исправление искажений
|
||||
|
||||
За получение исправленного изображения отвечает функция **_get_undistorted_image(cv2_image, camera_info)_**:
|
||||
|
||||
* **_cv2_image_**: Закодированное в массив cv2 изображение.
|
||||
* **_camera_****___****_info_**: Путь до файла калибровки.
|
||||
|
||||
Функция возвращает массив cv2, в котором закодировано исправленное изображение.
|
||||
|
||||
> Если вы используете fisheye-камеру, поставляемую вместе с Клевером, то для обработки изображений разрешением 320x240 или 640x480 вы можете использовать уже существующие параметры калибровки. Для этого в качестве аргумента **_camera_info_** передайте параметры **_clever_cam_calibration.clevercamcalib.CLEVER_FISHEYE_CAM_320_** или **_clever_cam_calibration.clevercamcalib.CLEVER_FISHEYE_CAM_640_** соответственно.
|
||||
|
||||
## Примеры работы
|
||||
|
||||
Изначальные изображения:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Иcправленные изображения:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Пример использования
|
||||
|
||||
**Обработка потока изображений с камеры**.
|
||||
|
||||
Данная программа получает изображения с камеры Клевера и выводит их на экран в исправленном виде, используя существующий калибровочный файл.
|
||||
|
||||
```python
|
||||
import clevercamcalib.clevercamcalib as ccc
|
||||
import cv2
|
||||
import urllib.request
|
||||
import numpy as np
|
||||
while True:
|
||||
req = urllib.request.urlopen('http://192.168.11.1:8080/snapshot?topic=/main_camera/image_raw')
|
||||
arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
|
||||
image = cv2.imdecode(arr, -1)
|
||||
undistorted_img = ccc.get_undistorted_image(image, ccc.CLEVER_FISHEYE_CAM_640)
|
||||
cv2.imshow("undistort", undistorted_img)
|
||||
cv2.waitKey(33)
|
||||
cv2.destroyAllWindows()
|
||||
```
|
||||
|
||||
## Использование для ArUco
|
||||
|
||||
Чтобы применить параметры калибровки к системе ArUco-навигации, требуется перенести калибровочный .yaml файл на Raspberry Pi Клевера и инициализировать его.
|
||||
|
||||
> Не забудьте подключиться к WiFI Клевера.
|
||||
|
||||
Для передачи файла используется протокол SFTP. В данном примере используется программа WinSCP.
|
||||
|
||||
Подключимся к Raspberry Pi по SFTP:
|
||||
|
||||
> Пароль: _**raspberry**_
|
||||
|
||||

|
||||
|
||||
Нажимаем “Войти”. Переходим в _**/home/pi/catkin_ws/src/clever/clever/camera_info/**_ и копируем туда калибровочный .yaml файл:
|
||||
|
||||

|
||||
|
||||
Теперь мы должны выбрать этот файл в конфигурации ArUco. Для этого используется связь по протоколу SSH. В данном примере используется программа PuTTY.
|
||||
|
||||
Подключимся к Raspberry Pi по SSH:
|
||||
|
||||

|
||||
|
||||
Войдем под логином _**pi**_ и паролем _**raspberry**_, перейдем в директорию _**/home/pi/catkin_ws/src/clever/clever/launch**_ и начнем редактировать конфигурацию _**main_camera.launch**_:
|
||||
|
||||

|
||||
|
||||
В строке _**camera node**_ заменим параметр _**camera_info**_ на _**camera_info.yaml**_:
|
||||
|
||||

|
||||
|
||||
> Не забудьте изменить разрешение камеры.
|
||||
# Калибровка камеры
|
||||
|
||||
Компьютерное зрение получает все более широкое распространение. Зачастую, алгоритмы компьютерного зрения работают неточно, получая искаженное изображение с камеры, что особенно характерно для fisheye-камер.
|
||||
|
||||

|
||||
|
||||
> Изображение "скруглено" ближе к краям.
|
||||
|
||||
Какой-либо алгоритм компьютерного зрения будет воспринимать информацию с этой картинки неправильно. Для устранения подобных искажений камера, получающая изображения, должна быть откалибрована в соответствии со своими особенностями.
|
||||
|
||||
## Установка скрипта
|
||||
|
||||
Для начала, необходимо установить необходимые библиотеки:
|
||||
|
||||
```
|
||||
pip install numpy
|
||||
pip install opencv-python
|
||||
pip install glob
|
||||
pip install pyyaml
|
||||
pip install urllib.request
|
||||
```
|
||||
|
||||
Затем скачиваем скрипт из репозитория:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/tinderad/clever_cam_calibration.git
|
||||
```
|
||||
|
||||
Переходим в скачанную папку и устанавливаем скрипт:
|
||||
|
||||
```bash
|
||||
cd clever_cam_calibration
|
||||
sudo python setup.py build
|
||||
sudo python setup.py install
|
||||
```
|
||||
|
||||
Если вы используете Windows, тогда скачайте архив из [репозитория](https://github.com/tinderad/clever_cam_calibration/archive/master.zip), распакуйте его и установите:
|
||||
|
||||
```bash
|
||||
cd path\to\archive\clever_cam_calibration\
|
||||
python setup.py build
|
||||
python setup.py install
|
||||
```
|
||||
|
||||
> path\to\archive - путь до распакованного архива.
|
||||
|
||||
## Подготовка к калибровке
|
||||
|
||||
Вам необходимо подготовить калибровочную мишень. Она представляет собой «шахматную доску». Файл можно взять [отсюда](https://www.oreilly.com/library/view/learning-opencv-3/9781491937983/assets/lcv3_ac01.png).
|
||||
Наклейте распечатанную мишень на любую твердую поверхность. Посчитайте количество пересечений в длину и в ширину доски, измерьте размер клетки (в мм).
|
||||
|
||||

|
||||
|
||||
Включите Клевер и подключитесь к его Wi-Fi.
|
||||
|
||||
> Перейдите на 192.168.11.1:8080 и проверьте, получает ли компьютер изображения из топика image_raw.
|
||||
|
||||
## Калибровка
|
||||
|
||||
Запустите скрипт **_calibrate_cam_**:
|
||||
|
||||
**Windows:**
|
||||
|
||||
```bash
|
||||
>path\to\python\Scripts\calibrate_cam.exe
|
||||
```
|
||||
|
||||
> path\to\Python - путь до директории Python
|
||||
|
||||
**Linux:**
|
||||
|
||||
```bash
|
||||
>calibrate_cam
|
||||
```
|
||||
|
||||
Задайте параметры доски:
|
||||
|
||||
```bash
|
||||
>calibrate_cam
|
||||
Chessboard width: # Перекрестий в ширину
|
||||
Chessboard height: # Перекрестий в длину
|
||||
Square size: # Длина ребра клетки (в мм)
|
||||
Saving mode (YES - on): # Режим сохранения
|
||||
```
|
||||
|
||||
> Режим сохранения: если включен, то все полученные фотографии будут сохраняться в нынешней директории.
|
||||
|
||||
Скрипт начнет свою работу:
|
||||
|
||||
...
|
||||
Calibration started!
|
||||
Commands:
|
||||
help, catch (key: Enter), delete, restart, stop, finish
|
||||
|
||||
Чтобы откалибровать камеру, вам требуется сделать как минимум 25 фото шахматной доски с различных ракурсов.
|
||||
|
||||

|
||||
|
||||
Чтобы сделать фото, введите команду **_catch_**.
|
||||
|
||||
```bash
|
||||
>catch
|
||||
```
|
||||
|
||||
Программа будет информировать вас о состоянии калибровки.
|
||||
|
||||
```bash
|
||||
...
|
||||
Chessboard not found, now 0 (25 required)
|
||||
> # Enter
|
||||
---
|
||||
Image added, now 1 (25 required)
|
||||
```
|
||||
|
||||
> Вместо того, чтобы каждый раз вводить команду **_catch_**, Вы можете просто нажимать клавишу **_Enter_** (вводить пустую строку).
|
||||
|
||||
После того, как будет набрано достаточное количество изображений, введите команду **_finish_**.
|
||||
|
||||
```bash
|
||||
...
|
||||
>finish
|
||||
Calibration successful!
|
||||
```
|
||||
|
||||
**Калибровка по существующим изображениям:**
|
||||
|
||||
Если же у вас уже есть изображения, то вы можете откалибровать камеру по ним при помощи скрипта **_calibrate_cam_ex_**.
|
||||
|
||||
```bash
|
||||
>calibrate_cam_ex
|
||||
```
|
||||
|
||||
Указываем характеристики мишени, а так же путь до папки с изображениями:
|
||||
|
||||
```bash
|
||||
>calibrate_cam_ex
|
||||
Chessboard width: # Перекрестий в ширину
|
||||
Chessboard height: # Перекрестий в длину
|
||||
Square size: # Длина ребра клетки (в мм)
|
||||
Path: # Путь до папки с изображениями
|
||||
```
|
||||
|
||||
В остальном этот скрипт работает аналогично **_calibrate_cam_**.
|
||||
|
||||
Программа обработает все полученные фотографии, и создаст файл **_camera_info_****_._****_yaml_** в нынешней директории. При помощи этого файла можно будет выравнивать искажения на изображениях, полученных с этой камеры.
|
||||
|
||||
> Если вы поменяете разрешение получаемого изображения, вам нужно будет снова калибровать камеру.
|
||||
|
||||
## Исправление искажений
|
||||
|
||||
За получение исправленного изображения отвечает функция **_get_undistorted_image(cv2_image, camera_info)_**:
|
||||
|
||||
* **_cv2_image_**: Закодированное в массив cv2 изображение.
|
||||
* **_camera_****___****_info_**: Путь до файла калибровки.
|
||||
|
||||
Функция возвращает массив cv2, в котором закодировано исправленное изображение.
|
||||
|
||||
> Если вы используете fisheye-камеру, поставляемую вместе с Клевером, то для обработки изображений разрешением 320x240 или 640x480 вы можете использовать уже существующие параметры калибровки. Для этого в качестве аргумента **_camera_info_** передайте параметры **_clever_cam_calibration.clevercamcalib.CLEVER_FISHEYE_CAM_320_** или **_clever_cam_calibration.clevercamcalib.CLEVER_FISHEYE_CAM_640_** соответственно.
|
||||
|
||||
## Примеры работы
|
||||
|
||||
Изначальные изображения:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Иcправленные изображения:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## Пример использования
|
||||
|
||||
**Обработка потока изображений с камеры**.
|
||||
|
||||
Данная программа получает изображения с камеры Клевера и выводит их на экран в исправленном виде, используя существующий калибровочный файл.
|
||||
|
||||
```python
|
||||
import clevercamcalib.clevercamcalib as ccc
|
||||
import cv2
|
||||
import urllib.request
|
||||
import numpy as np
|
||||
while True:
|
||||
req = urllib.request.urlopen('http://192.168.11.1:8080/snapshot?topic=/main_camera/image_raw')
|
||||
arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
|
||||
image = cv2.imdecode(arr, -1)
|
||||
undistorted_img = ccc.get_undistorted_image(image, ccc.CLEVER_FISHEYE_CAM_640)
|
||||
cv2.imshow("undistort", undistorted_img)
|
||||
cv2.waitKey(33)
|
||||
cv2.destroyAllWindows()
|
||||
```
|
||||
|
||||
## Использование для ArUco
|
||||
|
||||
Чтобы применить параметры калибровки к системе ArUco-навигации, требуется перенести калибровочный .yaml файл на Raspberry Pi Клевера и инициализировать его.
|
||||
|
||||
> Не забудьте подключиться к WiFI Клевера.
|
||||
|
||||
Для передачи файла используется протокол SFTP. В данном примере используется программа WinSCP.
|
||||
|
||||
Подключимся к Raspberry Pi по SFTP:
|
||||
|
||||
> Пароль: _**raspberry**_
|
||||
|
||||

|
||||
|
||||
Нажимаем “Войти”. Переходим в _**/home/pi/catkin_ws/src/clever/clever/camera_info/**_ и копируем туда калибровочный .yaml файл:
|
||||
|
||||

|
||||
|
||||
Теперь мы должны выбрать этот файл в конфигурации ArUco. Для этого используется связь по протоколу SSH. В данном примере используется программа PuTTY.
|
||||
|
||||
Подключимся к Raspberry Pi по SSH:
|
||||
|
||||

|
||||
|
||||
Войдем под логином _**pi**_ и паролем _**raspberry**_, перейдем в директорию _**/home/pi/catkin_ws/src/clever/clever/launch**_ и начнем редактировать конфигурацию _**main_camera.launch**_:
|
||||
|
||||

|
||||
|
||||
В строке _**camera node**_ заменим параметр _**camera_info**_ на _**camera_info.yaml**_:
|
||||
|
||||

|
||||
|
||||
> Не забудьте изменить разрешение камеры.
|
||||
|
||||
@@ -44,7 +44,7 @@ raspistill -o test-image.jpg
|
||||
|
||||
Основная статья: http://wiki.ros.org/cv_bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython.
|
||||
|
||||
Пример создания подписчика на топик с изображением с основной камеры для обрабоки с использованием OpenCV:
|
||||
Пример создания подписчика на топик с изображением с основной камеры для обработки с использованием OpenCV:
|
||||
|
||||
```python
|
||||
import rospy
|
||||
@@ -84,7 +84,7 @@ image_pub.publish(bridge.cv2_to_imgmsg(cv_image, 'bgr8'))
|
||||
|
||||
> **Hint** Для высокоскоростного распознавания и позиционирования лучше использовать [ArUco-маркеры](aruco.md).
|
||||
|
||||
Для программирования различных действий коптера при детектировании нужных [QR-кодов](https://ru.wikipedia.org/wiki/QR-код) можно использовать бибилиотеку [ZBar](http://zbar.sourceforge.net). Ее нужно установить в помощью pip:
|
||||
Для программирования различных действий коптера при детектировании нужных [QR-кодов](https://ru.wikipedia.org/wiki/QR-код) можно использовать библиотеку [ZBar](http://zbar.sourceforge.net). Ее нужно установить в помощью pip:
|
||||
|
||||
```bash
|
||||
sudo pip install zbar
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
## T-plug
|
||||
|
||||
Аналог XT-60. Имеет различные вариации для упрозщения разъединения.
|
||||
Аналог XT-60. Имеет различные вариации для упрощения разъединения.
|
||||
|
||||
<img src="../assets/t-plug.jpg" alt="T-plug" width=200>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
## Gold bullet Conector или "Бананы"
|
||||
|
||||
Существует великое множество штырьковых разъёмов типа Gold bullet Conector. Разъёмы данного типа отличаются друг от друга диаметром и размером. Наиболее распространены разъёмы с диаметром коннектора 2 мм, 3 мм и 4 мм.
|
||||
Существует великое множество штырьковых разъёмов типа Gold bullet Connector. Разъёмы данного типа отличаются друг от друга диаметром и размером. Наиболее распространены разъёмы с диаметром коннектора 2 мм, 3 мм и 4 мм.
|
||||
Часто используется для создания беспаечных соединений на PDB и моторах.
|
||||
|
||||
<img src="../assets/Banana.jpg" alt="Banana" width=200>
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
|
||||
Для удобного редактирования текста, вы можете использовать текстовые редакторы с поддержкой Markdown: [Typora](https://typora.io), [Dillinger](https://dillinger.io/) (веб), [VSCode](https://code.visualstudio.com) с плагином [Markdown Editor](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.MarkdownEditor).
|
||||
|
||||
Для VSCode также рекомендуется использование плагина [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker) ([словарь для русского языка](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker-russian)).
|
||||
|
||||
Для локальной сборки статического сайта документации необходимо использовать утилиту [`gitbook-cli`](https://github.com/GitbookIO/gitbook-cli).
|
||||
|
||||
## Исправление ошибок в документации
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Copter Hack 2017
|
||||
===
|
||||
|
||||
28–30 июля 2017 "Коптер Экпресс" провел хакатон "Copter Hack 2017", на котором необходимо было запрограммировать "Клевер" на автономный танец-полет под случайную музыку.
|
||||
28–30 июля 2017 "Коптер Экспресс" провел хакатон "Copter Hack 2017", на котором необходимо было запрограммировать "Клевер" на автономный танец-полет под случайную музыку.
|
||||
|
||||
Победителем стала команда "Ящеры".
|
||||
|
||||
@@ -29,7 +29,7 @@ rosrun web_video_server web_video_server
|
||||
|
||||
Открыть в браузере страницу ``http://<ip raspberry>:8080``.
|
||||
|
||||
**Внимание**: раздача видеострима сильно снижает производительность распознования маркеров для полета.
|
||||
**Внимание**: раздача видеострима сильно снижает производительность распознавания маркеров для полета.
|
||||
|
||||
SSID Wi-Fi
|
||||
---
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Логи и топики PX4
|
||||
===
|
||||
|
||||
Для детального анализа поведения прошивки PX4 можно просмотреть полетные логи. Полетные логи представляют собой сообщения в [uORB-топиках](https://dev.px4.io/en/middleware/uorb.html), записанные в файл с раширением `.ulg`. Лог-файл можно скачать с помощью QGroundControl по Wi-Fi или USB во вкладке *Log Download*:
|
||||
Для детального анализа поведения прошивки PX4 можно просмотреть полетные логи. Полетные логи представляют собой сообщения в [uORB-топиках](https://dev.px4.io/en/middleware/uorb.html), записанные в файл с расширением `.ulg`. Лог-файл можно скачать с помощью QGroundControl по Wi-Fi или USB во вкладке *Log Download*:
|
||||
|
||||

|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
|
||||
### FlightPlot
|
||||
|
||||
Также лог-файл можно анализировать с помомщью программы FlightPlot. Актуальную версию программы можно [скачать](https://github.com/PX4/FlightPlot/releases) на GitHub.
|
||||
Также лог-файл можно анализировать с помомщ
|
||||
ью программы FlightPlot. Актуальную версию программы можно [скачать](https://github.com/PX4/FlightPlot/releases) на GitHub.
|
||||
|
||||
В программе можно просмотреть полный список записанных топиков (*Fields List*). В нем нужно выбрать необходимые топики, после чего они появятся на графике:
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
* `map` — координаты относительно точки инициализации полетного контроллера: белая сетка на иллюстрации;
|
||||
* `base_link` — координаты относительно квадрокоптера: схематичное изображение квадрокоптера на иллюстрации;
|
||||
* `body` — координаты относительно квадрокоптера без учета наклонов по тангажу и крену: красная, синия и зеленая линии на иллюстрации.
|
||||
* `body` — координаты относительно квадрокоптера без учета наклонов по тангажу и крену: красная, синяя и зеленая линии на иллюстрации.
|
||||
|
||||
> **Hint** В соответствии с [соглашением](http://www.ros.org/reps/rep-0103.html), для фреймов, связанных с коптером, ось X направлена вперед, Y – налево и Z – вверх.
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ irw
|
||||
|
||||
Это значит, что ваша конфигурация корректно распознается программой и теперь вы можете запрограммировать нужные вам действия в случае нажатия определенной клавиши.
|
||||
|
||||
## Работа с ИК-датчками в Python
|
||||
## Работа с ИК-датчиками в Python
|
||||
|
||||
Чтобы иметь возможность использовать сигналы с ИК-приемника в Python программах, вам потребуется пакет `python-lirc`. [Установите его](#install) при необходимости.
|
||||
|
||||
@@ -169,7 +169,7 @@ end
|
||||
|
||||
+ `prog` – имя программы, которое вы будете вызывать в своем скрипте
|
||||
+ `button` – наименование клавиши, которое вы вводили во время настройки пульта
|
||||
+ `config` – информация, которая будет передана вашей программе в случае нажатия указаной клавиши
|
||||
+ `config` – информация, которая будет передана вашей программе в случае нажатия указанной клавиши
|
||||
|
||||
Все настройки выполнены и теперь можно переходить непосредственно к программированию ИК-сигналов.
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
Рекомендуемая для Клевера модель дальномера – STM VL53L1X. Это дальномер может измерять расстояния от 0 до 4 м, при этом обеспечивая высокую точность измерений.
|
||||
|
||||
На [образе для Raspberry Pi](microsd_images.md) предустановен соответствующий ROS-драйвер.
|
||||
На [образе для Raspberry Pi](microsd_images.md) предустановлен соответствующий ROS-драйвер.
|
||||
|
||||
### Подключение к Raspberry Pi
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
<arg name="rangefinder_vl53l1x" default="true"/>
|
||||
```
|
||||
|
||||
По умолчания драйер дальномера передает данные в Pixhawk (через топик `/mavros/distance_sensor/rangefinder_sub`). Для просмотра данных из топика используйте команду:
|
||||
По умолчания драйвер дальномера передает данные в Pixhawk (через топик `/mavros/distance_sensor/rangefinder_sub`). Для просмотра данных из топика используйте команду:
|
||||
|
||||
```bash
|
||||
rostopic echo mavros/distance_sensor/rangefinder_sub
|
||||
@@ -52,7 +52,7 @@ rospy.Subscriber('mavros/distance_sensor/rangefinder_sub', Range, range_callback
|
||||
|
||||
### Визуализация данных
|
||||
|
||||
Для посмотроения графика по данным с дальномера может быть использован rqt_multiplot.
|
||||
Для построения графика по данным с дальномера может быть использован rqt_multiplot.
|
||||
|
||||
Для визуализации данных может быть использован rviz. Для этого необходимо добавить топик типа `sensor_msgs/Range` в визуализацию:
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Полетные режимы
|
||||
===
|
||||
|
||||
Режим полетного контроллера определяет, как именно коптер (или другое ТС) должно себя вести: каким обрзом интерпретировать входящие команды и сигналы с пульта.
|
||||
Режим полетного контроллера определяет, как именно коптер (или другое ТС) должно себя вести: каким образом интерпретировать входящие команды и сигналы с пульта.
|
||||
|
||||
PX4
|
||||
---
|
||||
@@ -31,7 +31,7 @@ PX4
|
||||
В режиме автоматического полета квадрокоптер игнорирует сигналы с пульта.
|
||||
|
||||
* **AUTO.MISSION** – PX4 выполняет заранее загруженную в квадрокоптер миссию (миссия загружается с помощью QGroundControl, или по [MAVLink](mavlink.md) используя [MAVROS](mavros.md).
|
||||
* **AUTO.RTL** – коптер автоматически вовращается в точку взлета.
|
||||
* **AUTO.RTL** – коптер автоматически возвращается в точку взлета.
|
||||
* **AUTO.LAND** – коптер выполняет посадку.
|
||||
|
||||
### Управление с внешнего компьютера
|
||||
|
||||
@@ -150,7 +150,7 @@ ___
|
||||
Работа сети на [образе](microsd_images.md) поддерживается двумя предустановленными службами:
|
||||
|
||||
* **networking** — служба включает все сетевые интерфейсы в момент запуска [5].
|
||||
* **dhcpcd** — служба обеспечивает настройку адресации и маршрутризации на интерфейсах, полученных динамически или указаных в файле настроек статически.
|
||||
* **dhcpcd** — служба обеспечивает настройку адресации и маршрутизации на интерфейсах, полученных динамически или указанных в файле настроек статически.
|
||||
|
||||
Для работы в режиме роутера (точки доступа) RPi необходим DHCP сервер. Он служит для автоматической выдачи настроек текущей сети подключившимся клиентам. В роли такого сервера может выступать `isc-dhcp-server` или `dnsmasq`.
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
* ориентация коптера (в локальной системе координат) – pitch (тангаж), roll (крен), yaw (рысканье) (одно из представлений);
|
||||
* позиция коптера (в локальной системе координат) – x, y, z;
|
||||
* скорость коптера (в локальной системе координат) – vx, vy, vz;
|
||||
* глобальные координаты коптера – lattitude, longitude, altitude;
|
||||
* глобальные координаты коптера – latitude, longitude, altitude;
|
||||
* высота над поверхностью;
|
||||
* другие параметры (дрейф гироскопов, скорость ветра и пр.).
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
`EKF2_AID_MASK` – выбор датчиков, которые используются EKF2 для вычисления состояния коптера.
|
||||
|
||||
`EKF2_HGT_MODE` – основной источник данных о высоте (z в локальной системе координт):
|
||||
`EKF2_HGT_MODE` – основной источник данных о высоте (z в локальной системе координат):
|
||||
|
||||
* 0 – давление с барометра.
|
||||
* 1 – GPS.
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
Данные параметры настраивают полет коптера по позиции (режимы POSCTL, OFFBOARD, AUTO).
|
||||
|
||||
`MPC_THR_HOVER` – газ висения. Данный параметр наобходимо установить на примерный процент газа, необходимый для того, чтобы коптер удерживал высоту. Если коптер имеет тенденцию набирать или терять высоту в режиме удержания высоты – можно уменьшить или увеличить это значение.
|
||||
`MPC_THR_HOVER` – газ висения. Данный параметр необходимо установить на примерный процент газа, необходимый для того, чтобы коптер удерживал высоту. Если коптер имеет тенденцию набирать или терять высоту в режиме удержания высоты – можно уменьшить или увеличить это значение.
|
||||
|
||||
`MPC_XY_P` – коэффициент *P* регулятора по позиции. Этот параметр влияет на то, насколько резко коптер будет выполнять заданные команды по позиции. Слишком большое значение может вызвать перестрелы.
|
||||
|
||||
@@ -67,6 +67,6 @@ TODO
|
||||
|
||||
## Sensors
|
||||
|
||||
Включение, выключение и настройка различных датчков.
|
||||
Включение, выключение и настройка различных датчиков.
|
||||
|
||||
TODO
|
||||
|
||||
@@ -3,7 +3,7 @@ ROS
|
||||
|
||||
Основная статья: http://wiki.ros.org
|
||||
|
||||
ROS – это широко используемый фреймворк для создания сложных и распределенных роботехнических систем.
|
||||
ROS – это широко используемый фреймворк для создания сложных и распределенных робототехнических систем.
|
||||
|
||||
Установка
|
||||
---
|
||||
@@ -23,9 +23,9 @@ ROS уже установлен на [образе для RPi](microsd_images.md
|
||||
|
||||
Основная статья: http://wiki.ros.org/Nodes
|
||||
|
||||
ROS-нода – это специальная программа (обычно написанная на Python или C++), которая взаимодействует с другими нодами посредством ROS-топиков и ROS-сервисов. Разделение сложных роботехнических систем на изолированные ноды дает определеные преимущества: понижается связанность кода, повышается переиспользуемость и надежность.
|
||||
ROS-нода – это специальная программа (обычно написанная на Python или C++), которая взаимодействует с другими нодами посредством ROS-топиков и ROS-сервисов. Разделение сложных робототехнических систем на изолированные ноды дает определенные преимущества: понижается связанность кода, повышается переиспользуемость и надежность.
|
||||
|
||||
Очень многие роботехнические библиотеки и драйвера выполнены именно в виде ROS-нод.
|
||||
Очень многие робототехнические библиотеки и драйвера выполнены именно в виде ROS-нод.
|
||||
|
||||
Для того, чтобы превратить обычную программу в ROS-ноду, необходимо подключить к ней библиотеку `rospy` или `roscpp` и добавить инициализирующий код.
|
||||
|
||||
@@ -108,4 +108,4 @@ rosservice call /get_telemetry "{frame_id: ''}"
|
||||
|
||||
Основная статья: http://wiki.ros.org/ROS/Tutorials/MultipleMachines.
|
||||
|
||||
Преимуществом использования ROS явлется возможность распределения нод на несколько машин в сети. Например, ноду, осуществляющую распознование образом на изображении можно запустить на более мощном компьютере; ноду, управляющую коптером можно запустить непосредствено на Raspberry Pi, подключенном к полетому контроллеру и т. д.
|
||||
Преимуществом использования ROS является возможность распределения нод на несколько машин в сети. Например, ноду, осуществляющую распознавание образом на изображении можно запустить на более мощном компьютере; ноду, управляющую коптером можно запустить непосредственно на Raspberry Pi, подключенном к полетому контроллеру и т. д.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||

|
||||
|
||||
Инструмент [rviz](http://wiki.ros.org/rviz) позволяет в реальном времени визуализировать на 3D-сцене все компоненты роботехнической системы — системы координат, движущиеся части, показания датчиков, изображения с камер.
|
||||
Инструмент [rviz](http://wiki.ros.org/rviz) позволяет в реальном времени визуализировать на 3D-сцене все компоненты робототехнической системы — системы координат, движущиеся части, показания датчиков, изображения с камер.
|
||||
|
||||
[rqt](http://wiki.ros.org/rqt) – это набор GUI для анализа и контроля ROS-систем. Например, `rqt_image_view` позволяет просматривать топики с изображениями, `rqt_multiplot` – строить графики по значениям в топиках и т. д.
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ rosrun clever selfcheck.py
|
||||
|
||||
* FCU – проверка корректности соединения с полетным контроллером;
|
||||
* IMU – проверка корректности данных с IMU;
|
||||
* Local position – наличие локалной позиции дрона;
|
||||
* Local position – наличие локальной позиции дрона;
|
||||
* Velocity estimation – оценка скоростей дрона (**запрещено выполнять автономный взлет при ошибках в этой проверке!**);
|
||||
* Global position (GPS) – наличие глобальной позиции (требуется GPS);
|
||||
* Camera – корректная работа камеры Raspberry.
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
## Установка QGroundControl
|
||||
|
||||
* Скачиваем установочный файл для Windows/iOS по ссылке [QGroundCongtrol](http://qgroundcontrol.com/downloads/).
|
||||
* Соглашаемся с установкой драйверов при инсталяции
|
||||
* Соглашаемся с установкой драйверов при инсталляции
|
||||
|
||||
## Форматирование карты памяти
|
||||
|
||||
* Устанавливаем карту памяти microSD в адаптер.
|
||||
* Форматируем карту в файловую систему FAT32
|
||||
правый клие на диске > Форматирование.
|
||||
* Выполняем "Безопасное извлечение" карты напанели инструментов, далее извлекаем карту.
|
||||
правый клик на диске > Форматирование.
|
||||
* Выполняем "Безопасное извлечение" карты на панели инструментов, далее извлекаем карту.
|
||||
* Устанавливаем microSD карту в полетный контроллер Pixhawk.
|
||||
|
||||
## Обновление прошивки Pixhawk
|
||||
|
||||
@@ -33,7 +33,7 @@ set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)
|
||||
land = rospy.ServiceProxy('land', Trigger)
|
||||
```
|
||||
|
||||
Неиспользуемые фукнции-прокси можно удалить из кода.
|
||||
Неиспользуемые функции-прокси можно удалить из кода.
|
||||
|
||||
Описание API
|
||||
---
|
||||
@@ -112,7 +112,7 @@ rosservice call /get_telemetry "{frame_id: ''}"
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит**);
|
||||
* `frame_id` – [система координат](frames.md), в которой заданы `x`, `y`, `z` и `yaw` (по умолчанию: `map`).
|
||||
|
||||
> **Note** Для полета без изменения угла по рыскаью достаточно установить `yaw` в `NaN` (значение угловой скорости по-умолчанию – 0).
|
||||
> **Note** Для полета без изменения угла по рысканью достаточно установить `yaw` в `NaN` (значение угловой скорости по-умолчанию – 0).
|
||||
|
||||
Взлет на высоту 1.5 м со скоростью взлета 0.5 м/с:
|
||||
|
||||
@@ -182,7 +182,7 @@ rosservice call /navigate "{x: 0.0, y: 0.0, z: 2, yaw: 0.0, yaw_rate: 0.0, speed
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит**);
|
||||
* `frame_id` – [система координат](frames.md), в которой заданы `z` и `yaw` (по умолчанию: `map`).
|
||||
|
||||
> **Note** Для полета без изменения угла по рыскаью достаточно установить `yaw` в `NaN` (значение угловой скорости по-умолчанию – 0).
|
||||
> **Note** Для полета без изменения угла по рысканью достаточно установить `yaw` в `NaN` (значение угловой скорости по-умолчанию – 0).
|
||||
|
||||
Полет в глобальную точку со скоростью 5 м/с, оставаясь на текущей высоте (`yaw` установится в 0, коптер сориентируется передом на восток):
|
||||
|
||||
@@ -277,11 +277,11 @@ set_velocity(vx=0.4, vy=0.0, vz=0, yaw=float('nan'), yaw_rate=0.4, frame_id='bod
|
||||
|
||||
### set_rates
|
||||
|
||||
Установить угловые скорости по тагажу, крену и рысканью и уровень газа (примерный аналог управления в [режиме `ACRO`](modes.md)). Это самый низкий уровень управления коптером (исключая непосредственный контроль оборотов моторов). Данный сервис может быть использован для автоматического выполнения акробатических трюков (например, флипа).
|
||||
Установить угловые скорости по тангажу, крену и рысканью и уровень газа (примерный аналог управления в [режиме `ACRO`](modes.md)). Это самый низкий уровень управления коптером (исключая непосредственный контроль оборотов моторов). Данный сервис может быть использован для автоматического выполнения акробатических трюков (например, флипа).
|
||||
|
||||
Параметры:
|
||||
|
||||
* `pitch_rate`, `roll_rate`, `yaw_rate` – угловая скорость по танажу, крену и рыканью *(рад/с)*;
|
||||
* `pitch_rate`, `roll_rate`, `yaw_rate` – угловая скорость по тангажу, крену и рыканью *(рад/с)*;
|
||||
* `thrust` – уровень газа от 0 (нет газа, пропеллеры остановлены) до 1 (полный газ).
|
||||
* `auto_arm` – перевести коптер в `OFFBOARD` и заармить автоматически (**коптер взлетит**);
|
||||
|
||||
@@ -315,5 +315,5 @@ rosservice call /land "{}"
|
||||
Дополнительные материалы
|
||||
------------------------
|
||||
|
||||
* [Полеты в поле ArUco-макеров](aruco.md).
|
||||
* [Полеты в поле ArUco-маркеров](aruco.md).
|
||||
* [Примеры программ и сниппеты](snippets.md).
|
||||
|
||||
@@ -72,4 +72,4 @@ QGroundControl автоматически подключится к запуще
|
||||
|
||||
```bash
|
||||
roslaunch mavros px4.launch fcu_url:=udp://@127.0.0.1:14557
|
||||
```
|
||||
```
|
||||
|
||||
@@ -11,7 +11,7 @@ Python
|
||||
|
||||
### # {#distance}
|
||||
|
||||
Функция определения расстяния между двумя точками (**важно**: точки должны быть в одной [системе координат](frames.md)):
|
||||
Функция определения расстояния между двумя точками (**важно**: точки должны быть в одной [системе координат](frames.md)):
|
||||
|
||||
```python
|
||||
def get_distance(x1, y1, z1, x2, y2, z2):
|
||||
@@ -108,7 +108,7 @@ pose.pose.position.z = 3
|
||||
pose.pose.orientation.w = 1
|
||||
|
||||
frame_id = 'base_link' # целевой фрейм
|
||||
transform_timeout = rospy.Duration(0.2) # таймаут ожидания транформации
|
||||
transform_timeout = rospy.Duration(0.2) # таймаут ожидания трансформации
|
||||
|
||||
# Преобразовываем позицию из старого фрейма в новый:
|
||||
new_pose = tf_buffer.transform(pose, frame_id, transform_timeout)
|
||||
@@ -127,7 +127,7 @@ flipped = not -PI_2 <= telem.pitch <= PI_2 or not -PI_2 <= telem.roll <= PI_2
|
||||
|
||||
### # {#angle-hor}
|
||||
|
||||
Рассчет общего угла коптера к горизонту:
|
||||
Расчет общего угла коптера к горизонту:
|
||||
|
||||
```python
|
||||
PI_2 = math.pi / 2
|
||||
|
||||
@@ -25,7 +25,7 @@ UART – последовательный асинхронный интерфе
|
||||
|
||||
Подробнее про UART на Raspberry Pi в [официальной статье](https://www.raspberrypi.org/documentation/configuration/uart.md).
|
||||
|
||||
Данные интерфейсы с помощью вентелей микроконтроллера можно переключать между двуями физическими выходами:
|
||||
Данные интерфейсы с помощью вентелей микроконтроллера можно переключать между двумя физическими выходами:
|
||||
|
||||
1. разъём UART на GPIO;
|
||||
2. Bluetooth модуль RPi.
|
||||
@@ -37,7 +37,7 @@ UART – последовательный асинхронный интерфе
|
||||
Для удобства работы с этими выходами в Raspbian существуют алиасы:
|
||||
|
||||
* `/dev/serial0` – всегда указывает на то TTY устройство, что подключено к GPIO портам.
|
||||
* `/dev/serial1` – всегда указывает на то TTY устройство, что подключено к Bluetooh модулю.
|
||||
* `/dev/serial1` – всегда указывает на то TTY устройство, что подключено к Bluetooth модулю.
|
||||
|
||||
### Настройка UART на Raspberry Pi
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Просмотр изображений с камер
|
||||
|
||||
Для просмотра изображений с камер (или других ROS-топиков) можно воспользовться [rviz](rviz.md), rqt, или смотреть их через браузер, используя web\_video\_server.
|
||||
Для просмотра изображений с камер (или других ROS-топиков) можно воспользоваться [rviz](rviz.md), rqt, или смотреть их через браузер, используя web\_video\_server.
|
||||
|
||||
См. подробнее про [использование rqt](rviz.md).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user