mirror of
https://github.com/CopterExpress/clover.git
synced 2026-05-27 13:39:33 +00:00
* builder: Build against Buster * builder: Use correct repository specifications * builder: Move ld.so.preload to have less errors * builder: Use coex repo to install Monkey * builder: Search for buster ROS packages * aruco_pose: Vendor in aruco library from OpenCV 3.4.6 * builder: Move to ROS Melodic * builder: Update kernel version * aruco_pose, clever: Remove opencv3 ROS dependency * builder: Update rosdep * travis: Disable eclint for vendored aruco library * tests: Don't try to locate opencv in ros * roscore: Use melodic distribution * Revert "aruco_pose: Vendor in aruco library from OpenCV 3.4.6" This reverts commit 9c14a8c002bb3396f9a7d9b2ba39969207f066ba. * aruco_pose: Vendor opencv_contrib/aruco again * builder: Add led packages * builder: Remove unused builder code * travis: Add native tests * builder: Set permissions for standalone-install * builder: Use -y for package installation * builder: Add repo for standalone build * builder: Use correct file types for standalone install * aruco_pose: Accept rgb8 map images * builder: Disable mjpg_streamer test * aruco_pose: Allow rgb8 map images (again) * builder: Re-add mjpgstreamer * builder: Install tornado==4.2.1 for rosbridge_suite * builder: Use more recent base image * builder: Use default kernel * builder: Move ld.so.preload back after tests * builder: Disable catkin tests These tests fail on a remote machine but seem to pass just fine on real hardware. Something must have changed between Kinetic and Melodic, and we must investigate more, but for now we just need a working image. * aruco_pose: Remove unused vendored code * selfcheck: Update systemd-analyze regex * builder: Add opencv repository * rosdep: Update package definitions for Melodic * rosdep: Use proper yaml formatting * travis: Remove unnecessary space * docs: Reference Melodic wherever possible
112 lines
5.7 KiB
Markdown
112 lines
5.7 KiB
Markdown
ROS
|
||
===
|
||
|
||
Основная статья: http://wiki.ros.org
|
||
|
||
ROS – это широко используемый фреймворк для создания сложных и распределенных робототехнических систем.
|
||
|
||
Установка
|
||
---
|
||
|
||
Основная статья: http://wiki.ros.org/melodic/Installation/Ubuntu
|
||
|
||
ROS уже установлен на [образе для RPi](image.md).
|
||
|
||
Для использования ROS на компьютере рекомендуется ОС Ubuntu Linux (либо виртуальная машина, например [Parallels Desktop Lite](https://itunes.apple.com/ru/app/parallels-desktop-lite/id1085114709?mt=12) или [VirtualBox](https://www.virtualbox.org)).
|
||
|
||
> **Note** Для дистрибутива ROS Melodic рекомендуется Ubuntu версии 18.04.
|
||
|
||
Концепции
|
||
---
|
||
|
||
### Ноды
|
||
|
||
Основная статья: http://wiki.ros.org/Nodes
|
||
|
||
ROS-нода – это специальная программа (обычно написанная на Python или C++), которая взаимодействует с другими нодами посредством ROS-топиков и ROS-сервисов. Разделение сложных робототехнических систем на изолированные ноды дает определенные преимущества: понижается связанность кода, повышается переиспользуемость и надежность.
|
||
|
||
Очень многие робототехнические библиотеки и драйвера выполнены именно в виде ROS-нод.
|
||
|
||
Для того, чтобы превратить обычную программу в ROS-ноду, необходимо подключить к ней библиотеку `rospy` или `roscpp` и добавить инициализирующий код.
|
||
|
||
Пример ROS-ноды на языке Python:
|
||
|
||
```python
|
||
import rospy
|
||
|
||
rospy.init_node('my_ros_node') # имя ROS-ноды
|
||
|
||
rospy.spin() # входим в бесконечный цикл...
|
||
```
|
||
|
||
### Топики
|
||
|
||
Основная статья: http://wiki.ros.org/Topics
|
||
|
||
Топик – это именованная шина данных, по которой ноды обмениваются сообщениями. Любая нода может *опубликовать* сообщение в произвольный топик, а также *подписаться* на произвольный топик.
|
||
|
||
Пример публикации сообщения типа [`std_msgs/String`](http://docs.ros.org/api/std_msgs/html/msg/String.html) (строка) в топик `/foo` на языке Python:
|
||
|
||
```python
|
||
from std_msgs.msg import String
|
||
|
||
# ...
|
||
|
||
foo_pub = rospy.Publisher('/foo', String, queue_size=1) # создаем Publisher'а
|
||
|
||
# ...
|
||
|
||
foo_pub.publish(data='Hello, world!') # публикуем сообщение
|
||
```
|
||
|
||
Пример подписки на топик `/foo`:
|
||
|
||
```python
|
||
def foo_callback(msg):
|
||
print msg.data
|
||
|
||
# Подписываемся. При получении сообщения в топик /foo будет вызвана функция foo_callback.
|
||
rospy.Subscriber('/foo', String, foo_callback)
|
||
```
|
||
|
||
Также, существует возможность работы с топиками с помощью утилиты `rostopic`. Например, с помощью следующей команды можно просматривать сообщения, публикуемые в топик `/mavros/state`:
|
||
|
||
```bash
|
||
rostopic echo /mavros/state
|
||
```
|
||
|
||
### Сервисы
|
||
|
||
Основная статья: http://wiki.ros.org/Services
|
||
|
||
Сервис – это некоторый аналог функции, которая может быть вызвана из одной ноды, а обработана в другой. У сервиса есть имя, аналогичное имени топика, и 2 типа сообщений: тип запроса и тип ответа.
|
||
|
||
Пример вызова ROS-сервиса из языка Python:
|
||
|
||
```python
|
||
from clever.srv import GetTelemetry
|
||
|
||
# ...
|
||
|
||
# Создаем обертку над сервисом get_telemetry пакета clever с типом GetTelemetry:
|
||
get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
|
||
|
||
# Вызываем сервис и получаем телеметрию квадрокоптера:
|
||
telemetry = get_telemetry()
|
||
```
|
||
|
||
С сервисами можно также работать при помощи утилиты `rosservice`. Так можно вызвать сервис `/get_telemetry` из командной строки:
|
||
|
||
```bash
|
||
rosservice call /get_telemetry "{frame_id: ''}"
|
||
```
|
||
|
||
Больше примеров использования сервисов для автономных полетов квадрокоптера Клевер можно посмотреть в [документации ноды simple_offboard](simple_offboard.md).
|
||
|
||
Работа на нескольких машинах
|
||
---
|
||
|
||
Основная статья: http://wiki.ros.org/ROS/Tutorials/MultipleMachines.
|
||
|
||
Преимуществом использования ROS является возможность распределения нод на несколько машин в сети. Например, ноду, осуществляющую распознавание образом на изображении можно запустить на более мощном компьютере; ноду, управляющую коптером можно запустить непосредственно на Raspberry Pi, подключенном к полетному контроллеру и т. д.
|