540 lines
36 KiB
Markdown
540 lines
36 KiB
Markdown
# Требования
|
||
## Требования к устройству
|
||
* Процессор - 4 и более ядер
|
||
* Оперативная память - 8 ГБ и более
|
||
* Графика - Минимально: любая интегрированная графика (Intel HD * Graphics, AMD Radeon Vega), поддерживающая OpenGL 3.3. Чем мощнее, тем лучше
|
||
* Место на диске - 50 ГБ или более
|
||
## Требования к системе
|
||
* Операционная система - Ubuntu 24.04 LTS Desktop (64 bit)
|
||
|
||
Рекомендуется установить на устройство отдельной системой в режиме dualboot или использовать виртуальную машину для установки. В случае виртуальной машины, важно выделить ей минимальные требуемые ресурсы на вашем устройстве из списка выше. Производительность в виртуальной машине может быть ниже, чем при нативной установке.
|
||
|
||
# Установка
|
||
### 1. Установка ROS2 Jazzy:
|
||
Данная инструкция дублирует команды из [официальной документации ROS2](https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debs.html) по установке.
|
||
|
||
Подготавливаем систему к установке
|
||
``` bash
|
||
sudo apt update && sudo apt install locales
|
||
sudo locale-gen en_US en_US.UTF-8
|
||
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
|
||
export LANG=en_US.UTF-8
|
||
```
|
||
|
||
Устанавливаем зависимости
|
||
``` bash
|
||
sudo apt install software-properties-common
|
||
sudo add-apt-repository universe
|
||
```
|
||
``` bash
|
||
sudo apt update && sudo apt install curl -y
|
||
export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}')
|
||
curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
|
||
sudo dpkg -i /tmp/ros2-apt-source.deb
|
||
```
|
||
|
||
Устанавливаем полную версию ROS2 Jazzy
|
||
``` bash
|
||
sudo apt install ros-jazzy-desctop-full
|
||
```
|
||
|
||
(Опционально) Можно добавить сурс (source) команду для ROS2 в ```~/.bashrc```, чтобы не нужно каждый раз в новом терминале вводить ```source /opt/ros/jazzy/setup.bash```
|
||
``` bash
|
||
echo 'source /opt/ros/jazzy/setup.bash' >> ~/.bashrc
|
||
```
|
||
|
||
Устанавливаем инструмент сборки colcon
|
||
``` bash
|
||
sudo apt install python3-colcon-common-extensions
|
||
```
|
||
|
||
### 2. Установка симулятора Webots:
|
||
|
||
Данная инструкция дублирует команды из [официальной документации Webots](https://cyberbotics.com/doc/guide/installation-procedure#installing-the-debian-package-with-the-advanced-packaging-tool-apt) по установке.
|
||
|
||
Устанавливаем файл подписи Cyberbotics
|
||
```bash
|
||
sudo mkdir -p /etc/apt/keyrings
|
||
|
||
cd /etc/apt/keyrings
|
||
|
||
sudo wget -q https://cyberbotics.com/Cyberbotics.asc
|
||
```
|
||
|
||
Конфигурируем менеджер пакетов
|
||
```bash
|
||
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/Cyberbotics.asc] https://cyberbotics.com/debian binary-amd64/" | sudo tee /etc/apt/sources.list.d/Cyberbotics.list
|
||
|
||
sudo apt update
|
||
```
|
||
|
||
Устанаваливаем Webots
|
||
```bash
|
||
sudo apt install webots
|
||
```
|
||
|
||
Настраиваем переменную окружения
|
||
```bash
|
||
echo "export WEBOTS_HOME=/snap/webots/current/usr/share/webots" >> ~/.bashrc
|
||
```
|
||
|
||
### 3. Установка ROS2 пакетов симулятора
|
||
|
||
Создаем папку рабочего пространства с любым именем в домашней директории, в данном примере используем папку `ros2_ws`
|
||
```bash
|
||
mkdir ~/ros2_ws/src -p
|
||
```
|
||
|
||
Скачиваем требуемые пакеты
|
||
```bash
|
||
cd ~/ros2_ws/src
|
||
|
||
git clone https://gitlab.mobird.dev/fms_group/ar_webots_fms_ros2.git
|
||
|
||
git clone https://gitlab.mobird.dev/fms_group/ar_arm95_moveit_config.git
|
||
|
||
git clone https://gitlab.mobird.dev/fms_group/ar_aruco_detect_ros2.git
|
||
|
||
git clone https://gitlab.mobird.dev/fms_group/ar_dual_lidar_merge_ros2.git
|
||
|
||
git clone https://gitlab.mobird.dev/fms_group/ar_nav_ros2.git
|
||
```
|
||
|
||
Устанавливаем зависимости через инструмент rosdep
|
||
```bash
|
||
cd ~/ros2_ws
|
||
|
||
sudo rosdep init
|
||
rosdep update
|
||
rosdep install --from-paths src -y --ignore-src
|
||
```
|
||
|
||
Собираем пакеты
|
||
|
||
```bash
|
||
cd ~/ros2_ws
|
||
colcon build --symlink-install
|
||
```
|
||
Перед запуском симулятора необходимо выполнить сурс (source) собранных файлов из папки `ros2_ws`, **это необходимо делать в каждом новом открытом терминале**
|
||
```bash
|
||
source /ros2_ws/install/setup.bash
|
||
```
|
||
|
||
(Опционально) данный сурс можно также добавить в ```~/.bashrc```
|
||
|
||
### 4. Установка пакетов навигации и slam для RMC1
|
||
Создайте отдельное рабочее пространство для пакетов навигации, в данном примере это будет `nav2_ws`. Клонируем в него файлы Nav2.
|
||
```bash
|
||
mkdir ~/nav2_ws/src -p
|
||
git clone https://github.com/ros-planning/navigation2.git -b 1.3.10
|
||
```
|
||
Устанавливаем зависимости через инструмент rosdep
|
||
```bash
|
||
cd ~/nav2_ws
|
||
|
||
sudo rosdep init
|
||
rosdep update
|
||
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro jazzy
|
||
```
|
||
После этого собираем пакеты. Сборка может занять некоторое время, ~30 минут в зависимости от мощности ПК
|
||
```bash
|
||
cd ~/nav2_ws
|
||
colcon build --symlink-install
|
||
```
|
||
Далее создаем новую папку, в данном примере это будет `slam_ws` и загружаем в нее файлы SLAM
|
||
```bash
|
||
mkdir ~/slam_ws/src -p
|
||
git clone https://github.com/SteveMacenski/slam_toolbox.git -b 2.8.3
|
||
```
|
||
Устанавливаем зависимости через инструмент rosdep
|
||
```bash
|
||
cd ~/slam_ws
|
||
|
||
sudo rosdep init
|
||
rosdep update
|
||
rosdep install -y -r -q --from-paths src --ignore-src --rosdistro jazzy
|
||
```
|
||
После этого собираем пакеты. Сборка может занять некоторое время, ~5 минут в зависимости от мощности ПК
|
||
```bash
|
||
cd ~/slam_ws
|
||
colcon build --symlink-install
|
||
```
|
||
Перед запуском симулятора необходимо выполнить сурс (source) собранных файлов из папок `nav2_ws` и `nav2_ws`, **это необходимо делать в каждом новом открытом терминале**
|
||
```bash
|
||
source /nav2_ws/install/setup.bash
|
||
source /slam_ws/install/setup.bash
|
||
```
|
||
(Опционально) данный сурс можно также добавить в ```~/.bashrc```
|
||
|
||
# Запуск модулей
|
||
## Модуль Б. Разработка и настройка навигационных алгоритмов для РМК
|
||
```
|
||
Задание:
|
||
1) РМК-2 стоит на точке старта над стартовым aruco-маркером.
|
||
Необходимо по команде старта эксперта отправить роботу целевую точку, в которую должен
|
||
приехать РМК-2.
|
||
2) После прибытия к целевой точке, РМК-2 должен вернуться в точку
|
||
старта, однако в этот раз перед стартом робота эксперт выставит на маршрут
|
||
робота препятствие, которое необходимо обнаружить и объехать.
|
||
```
|
||
|
||
Чтобы запустить симуляцию данного задания, запустите launch файл:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 launch ar_webots_fms_ros2 module2.launch.py
|
||
```
|
||
|
||
При первом запуске мира могут долго скачиваться некоторые ассеты для карты, поэтому, если робот не появился, то перезапустите симулятор.
|
||
|
||
При успешном запуске в симуляторе должна быть такая картина:
|
||

|
||
|
||
В окне симулятора будут также отображаться изображения с камер робота. Предупреждения (warning) в консоли симулятора можно игнорировать.
|
||
|
||
Для визуальной оценки данных, которые получают датчики робота RMC2, можно использовать программу Rviz2. В пакете есть готовый скрипт для запуска настроенного под робота окна Rviz2.
|
||
|
||
Для запуска откройте новый терминал и выполните:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 launch ar_webots_fms_ros2 rviz_rmc2.launch.py
|
||
```
|
||
Откроется следующее окно:
|
||

|
||
|
||
Красные и синие точки отображают данные переднего и заднего лидара соответственно. Белые точки - объедененный скан переднего и заднего лидара.
|
||
|
||
Слева снизу можно видеть изображение, которое передает камера, расположенная на дне робота. Поверх этого изображения также отрисовываются визуальные данные из Rviz2, которые попадают в поле зрения визуализируемой камеры. На скриншоте выше, например, видно, что камера "видит" некоторые оси координат робота. Но пусть вас не смущают эти визуализации, на самом изображении это все отсутствует.
|
||
|
||
Чтобы управлять роботом RMC2 в ручном режиме, можно запустить скрипт телеопераций, который позволит задавать скорость и направление робота через клавиатуру. Для запуска откройте новый терминал и выполните:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 run ar_nav_ros2 teleop --ros-args -r __ns:=/RMC2
|
||
```
|
||
|
||
Перед вами появится инструкция с клавишами клавиатуры в следующем формате:
|
||
|
||
```txt
|
||
Control Your Robot!
|
||
---------------------------
|
||
Moving around:
|
||
q w e
|
||
a s d
|
||
x
|
||
w/x : increase/decrease linear X velocity
|
||
q/e : increase/decrease linear Y velocity
|
||
a/d : increase/decrease angular velocity
|
||
space key, s : force stop
|
||
CTRL-C to quit
|
||
```
|
||
|
||
Чтобы заспавнить препятствие на карте, воспользуйтесь launch файлом в новом терминале:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 launch ar_webots_fms_ros2 spawn_object.launch.py x:=-4.0 y:=1.0 angle_z:=0.0 object_name:=obstacle
|
||
```
|
||
В качестве аргументов `x`,`y` и `angle_z` в виде чисел с плавающей точкой можно задать координаты и ориентацию объекта. Чтобы задать уникальное имя объекта, укажите его в виде аргумента `name`.
|
||
|
||
## Модуль В. Системы технического зрения с использованием инструментов искусственного интеллекта
|
||
|
||
```
|
||
Этот модуль направлен на обучение и интеграцию нейросетевой модели для автоматического распознавания. Конкурсанты должны самостоятельно собрать и разметить датасет, выбрать подходящую архитектуру нейросети, обучить ее и интегрировать в систему управления манипулятором.
|
||
|
||
Задание:
|
||
На специальной полке на соревновательном поле будут лежать N > 3 коробок. РМК-1 с манипулятором в стартовом положении около полки перпендикулярно ей (камера на манипуляторе смотрит вертикально вниз) смотрит на эту полку сверху.
|
||
С помощью генератора случайных чисел эксперт выбирает деталь, необходимую для захвата манипулятором. Конкурсанты должны запустить свой разработанный алгоритм, указать целевую деталь (1 - молоток, 2 - гаечный ключ, 3 - пассатижи) и начать выполнение.
|
||
РМК-1 должен автономно определить с помощью размеченного датасета, какая коробка его интересует, определить ее местоположение относительно базы манипулятора, направить манипулятор в нужную точку, схватить коробку схватом и поднять в стартовое положение.
|
||
После этого опустить коробку на пустое место на этой же полке.
|
||
```
|
||
|
||
Чтобы запустить симуляцию данного задания, запустите launch файл:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 launch ar_webots_fms_ros2 module3.launch.py
|
||
```
|
||
|
||
При первом запуске мира могут долго скачиваться некоторые ассеты для карты, поэтому, если робот не появился, то перезапустите симулятор.
|
||
|
||
При успешном запуске в симуляторе должна быть такая картина:
|
||

|
||
|
||
Предупреждения (warning) в консоли симулятора можно игнорировать.
|
||
|
||
Для визуальной оценки данных, которые получают датчики робота RMC1, можно использовать программу Rviz2. В пакете есть готовый скрипт для запуска настроенного под робота окна Rviz2.
|
||
|
||
Для запуска откройте новый терминал и выполните:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 launch ar_webots_fms_ros2 rviz_rmc1.launch.py
|
||
```
|
||
|
||
Откроется следующее окно:
|
||

|
||
|
||
Данные для обучения нейросети можно собрать, перемещая камеру и объекты в симуляторе и делая скриншоты.
|
||
|
||
Красные и синие точки отображают данные переднего и заднего лидара соответственно. Белые точки - объедененный скан переднего и заднего лидара.
|
||
|
||
Слева снизу можно видеть изображение, которое передает камера, расположенная на захвате манипулятора. Поверх этого изображения также отрисовываются визуальные данные из Rviz2, которые попадают в поле зрения визуализируемой камеры. На скриншоте выше, например, видно, что камера "видит" некоторые оси координат робота. Но пусть вас не смущают эти визуализации, на самом изображении это все отсутствует.
|
||
|
||
Чтобы управлять роботом RMC1 в ручном режиме, можно запустить скрипт телеопераций, который позволит задавать скорость и направление робота через клавиатуру. Для запуска откройте новый терминал и выполните:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 run ar_nav_ros2 teleop --ros-args -r __ns:=/RMC1
|
||
```
|
||
|
||
Перед вами появится инструкция с клавишами клавиатуры в следующем формате:
|
||
|
||
```txt
|
||
Control Your Robot!
|
||
---------------------------
|
||
Moving around:
|
||
q w e
|
||
a s d
|
||
x
|
||
w/x : increase/decrease linear X velocity
|
||
q/e : increase/decrease linear Y velocity
|
||
a/d : increase/decrease angular velocity
|
||
space key, s : force stop
|
||
CTRL-C to quit
|
||
```
|
||
|
||
Чтобы запустить готовый пакет навигации Nav2, откройте новый терминал и выполните:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 launch ar_nav_ros2 bringup_launch.py
|
||
```
|
||
Запуск может занять около 15 секунд.
|
||
|
||
После того, как стек навигации успешно запуститься, можно воспользоваться визуализацией Rviz2. Для запуска откройте новый терминал и выполните:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 launch ar_nav_ros2 rviz.launch.py
|
||
```
|
||
Откроется следующее окно:
|
||

|
||
|
||
В данном окне отображается 2D карта поля, показания лидара, локальная и глобальная карты занятости, границы робота и его траектории во время движения. Первоначально роботу необходимо задать начальную позицию, если его позиция на карте отличается от реальной. Для этого в верхней панели выберите инструмент `2D Pose Estimate`, кликните им в нужную точку и задайте ориентацию с помощью стрелки.
|
||
|
||
Чтобы задать целевую точку, выберите инструмент `2D Goal Pose`, кликните им в нужную точку и задайте ориентацию с помощью стрелки. Робот начнет движение по отрисованной траектории.
|
||
|
||
Для визуальной отладки манипулятора Arm95 и его управления через графический интерфейс, есть еще один готовый конфиг для Rviz2. Для запуска откройте новый терминал и выполните:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 launch ar_webots_fms_ros2 rviz_arm95.launch.py
|
||
```
|
||
|
||
Откроется следующее окно:
|
||

|
||
|
||
Для ручного управления манипулятором в поле `Planning Group` выбираем *arm95_group*.
|
||
|
||
Теперь в визуализации можно потянуть за стрелки или за голубую сферу и задать конечное положение манипулятора.
|
||
Чтобы переместить манипулятор в заданное положение нажимаем кнопку `Plan`, затем `Execute`. Либо одной кнопкой сразу: `Plan & Execute`. Если удалось построить траекторию в заданну. точку, манипулятор должен переместиться. Можно проверить это в симуляторе Webots.
|
||
|
||
Для ручного управления схватом в поле `Planning Group` выбираем *gripper*.
|
||
Затем в поле `Goal State` выбираем `open` или `close` и затем нажимаем `Plan & Execute`.
|
||
|
||
## Модуль Д. Решение складского кейса гетерогенной группой РМК
|
||
|
||
```
|
||
Конкурсанты должны обеспечить взаимодействие РМК-1 (оснащенного
|
||
манипулятором) и РМК-2 (оснащенного подъемным механизмом) для
|
||
выполнения последовательных (или параллельных) операций по
|
||
транспортировке стеллажа и комплектации заказа
|
||
|
||
Задание:
|
||
|
||
1) РМК-2 выполняет транспортировку стеллажа из точки хранения в
|
||
точку комплектации.
|
||
2) РМК-1 выполняет операцию комплектации (picking) требуемой
|
||
детали со стеллажа.
|
||
3) РМК-1 доставляет деталь в точку сдачи.
|
||
4) РМК-2 выполняет транспортировку стеллажа из точки комплектации
|
||
в точку хранения.
|
||
5) Оба РМК возвращаются в исходные позиции
|
||
```
|
||
|
||
Чтобы запустить симуляцию данного задания, запустите launch файл:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 launch ar_webots_fms_ros2 module5.launch.py
|
||
```
|
||
|
||
При первом запуске мира могут долго скачиваться некоторые ассеты для карты, поэтому, если робот не появился, то перезапустите симулятор.
|
||
|
||
При успешном запуске в симуляторе должна быть такая картина:
|
||

|
||
|
||
Предупреждения (warning) в консоли симулятора можно игнорировать.
|
||
|
||
Далее запустите пакеты наыигации Nav2, откройте новый терминал и выполните:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
ros2 launch ar_nav_ros2 bringup_launch.py
|
||
```
|
||
|
||
В этом модуле можно использовать все предыдущие конфиги Rviz2 под каждого робота:
|
||
**Не забудьте выполнить сурсы (source), если они не добавлены в ваш ~/.bashrc**
|
||
```bash
|
||
# Для RMC1
|
||
ros2 launch ar_webots_fms_ros2 rviz_rmc1.launch.py
|
||
|
||
# Для манипулятора ARM95
|
||
ros2 launch ar_webots_fms_ros2 rviz_arm95.launch.py
|
||
|
||
# Для RMC2
|
||
ros2 launch ar_webots_fms_ros2 rviz_rmc2.launch.py
|
||
|
||
# Для Nav2
|
||
ros2 launch ar_nav_ros2 rviz.launch.py
|
||
```
|
||
|
||
# Управление
|
||
|
||
## Робот RMC1
|
||
### Топики ROS2
|
||
Робот RMC1 использует имя `RMC1` в поле `namespace` топиков ROS2. Ниже приведен список доступных топиков для взаимодействия:
|
||
* `/RMC1/odometry` [nav_msgs/msg/Odometry] - положение робота по колесной одометрии
|
||
* `/RMC1/scan` [sensor_msgs/msg/LaserScan] - объединенный скан переднего и заднего лидара
|
||
* `/RMC1/scan_back` [sensor_msgs/msg/LaserScan] - скан заднего лидара
|
||
publisher
|
||
* `/RMC1/scan_front` [sensor_msgs/msg/LaserScan] - скан переднего лидара
|
||
* `/RMC1/cmd_vel` [geometry_msgs/msg/Twist] - целевая скорость платформы
|
||
* `/tf_static` [tf2_msgs/msg/TFMessage] - дерево статических преобразований между деталями робота
|
||
* `/tf` [tf2_msgs/msg/TFMessage] - дерево динамическиз преобразований между роботом и миром
|
||
* `/RMC1/arm95/camera_gripper/image_color` [sensor_msgs/msg/Image] - изображение с камеры манипулятора
|
||
|
||
### Управление манипулятором
|
||
Чтобы управлять манипулятором, используйте файл с примером из пакета `ar_webots_ros2/ar_webots_ros2/moveit_api_example.py`, его содержимое приведено ниже:
|
||
``` python3
|
||
import time
|
||
import rclpy
|
||
from rclpy.logging import get_logger
|
||
from geometry_msgs.msg import PoseStamped
|
||
from tf_transformations import quaternion_from_euler
|
||
|
||
# moveit python library
|
||
from moveit.planning import MoveItPy
|
||
|
||
def plan_and_execute(robot, planning_component, logger, sleep_time=0.0):
|
||
plan_result = planning_component.plan()
|
||
if plan_result:
|
||
logger.info("Executing plan")
|
||
robot_trajectory = plan_result.trajectory
|
||
robot.execute(robot_trajectory, controllers=[])
|
||
else:
|
||
logger.error("Planning failed")
|
||
time.sleep(sleep_time)
|
||
|
||
def main():
|
||
rclpy.init()
|
||
# Инициализация объектов MoveItPy
|
||
arm95 = MoveItPy(node_name="moveit_py", name_space="/RMC1/arm95")
|
||
arm95_arm = arm95.get_planning_component("arm95_group") # Объект - манипулятор
|
||
gripper = arm95.get_planning_component("gripper") # Объект - захват
|
||
|
||
# Пример открытия захвата
|
||
gripper.set_goal_state(configuration_name="open")
|
||
plan_and_execute(arm95, gripper, logger, sleep_time=0.0)
|
||
|
||
# Пример закрытия захвата
|
||
gripper.set_goal_state(configuration_name="closed")
|
||
plan_and_execute(arm95, gripper, logger, sleep_time=0.0)
|
||
|
||
# Задать текущее положение манипулятора как начальное
|
||
arm95_arm.set_start_state_to_current_state()
|
||
|
||
# Целевая ориентация схвата в углах Эйлера относительно основания "Base_link"
|
||
# Задается в виде roll, pitch, yaw
|
||
# Ориентация из углов Эцлера переводится в кватернион
|
||
q = quaternion_from_euler(3.14, 0.0, 1.57)
|
||
|
||
# Задать целевую позицию в формате PoseStamped сообщения
|
||
pose_goal = PoseStamped()
|
||
pose_goal.header.frame_id = "Base_link" # Движение относительно основания манипулятора
|
||
pose_goal.pose.orientation.x = q[0] # Ориентация робота задается через кватернион
|
||
pose_goal.pose.orientation.y = q[1] # Ориентация робота задается через кватернион
|
||
pose_goal.pose.orientation.z = q[2] # Ориентация робота задается через кватернион
|
||
pose_goal.pose.orientation.w = q[3] # Ориентация робота задается через кватернион
|
||
pose_goal.pose.position.x = -0.2 # Координата x захвата относительно основания "Base_link"
|
||
pose_goal.pose.position.y = -0.5 # Координата y захвата относительно основания "Base_link"
|
||
pose_goal.pose.position.z = 0.7 # Координата z захвата относительно основания "Base_link"
|
||
arm95_arm.set_goal_state(pose_stamped_msg=pose_goal, pose_link="gripper_base") # Задается тип движения по заданной позиции
|
||
plan_and_execute(arm95, arm95_arm, logger, sleep_time=0.0) # Запуск перемещения в заданную позицию
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
```
|
||
|
||
Запускать данный файл необходимо через `ar_webots_ros2/launch/moveit_api_example.launch.py` файл, в котором в moveit контроллер передаются параметры манипулятоар и захвата.
|
||
|
||
### Управление навигацией Nav2
|
||
Чтобы использовать навигацию Nav2, необходимо написать скрипт с использованием пакета `nav2_simple_commander`. Используйте его при запущенной навигации. Пример управляющего скрипта представлен ниже:
|
||
``` python3
|
||
from nav2_simple_commander.robot_navigator import BasicNavigator, TaskResult
|
||
import rclpy
|
||
|
||
rclpy.init()
|
||
nav = BasicNavigator() # Создание экземпляра контроллера
|
||
|
||
# ...
|
||
|
||
nav.setInitialPose(init_pose) # Задание исходной позиции в формате PoseStamped
|
||
|
||
# ...
|
||
|
||
path = nav.getPath(init_pose, goal_pose) # Построить маршрут из исходной точки в целевую (PoseStamped), проверка что путь существует
|
||
|
||
# ...
|
||
|
||
nav.goToPose(goal_pose) # Задать роботу цлевую позицию в формате PoseStamped
|
||
while not nav.isTaskComplete(): # Цикл выполнения целевой точки, пока она не будет достигнута
|
||
feedback = nav.getFeedback() # Информация о выполнении задачи
|
||
if feedback.navigation_duration > 600: # Сравнение времени выполнения задачи с заданным временем
|
||
nav.cancelTask() # Остановить выполнение целевой точки
|
||
|
||
# ...
|
||
|
||
result = nav.getResult() # Получение результата о выполнении задачи
|
||
if result == TaskResult.SUCCEEDED:
|
||
print('Goal succeeded!')
|
||
elif result == TaskResult.CANCELED:
|
||
print('Goal was canceled!')
|
||
elif result == TaskResult.FAILED:
|
||
print('Goal failed!')
|
||
```
|
||
|
||
Для запуска достаточно создать экземпляр контроллера, задать начальную и целевую точки. Робот начнет двиижение.
|
||
|
||
Подробнее о работе с `nav2_simple_commander` можете уздать в [официальной документации](https://docs.nav2.org/commander_api/index.html).
|
||
|
||
## Робот RMC2
|
||
### Топики ROS2
|
||
Робот RMC2 использует имя `RMC2` в поле `namespace` топиков ROS2. Ниже приведен список доступных топиков для взаимодействия:
|
||
* `/RMC2/aruco_id` [std_msgs/msg/String] - ID найденного нижней камерой ArUco маркера
|
||
* `/RMC2/camera_bottom/image_color` [sensor_msgs/msg/Image] - изображение с нижней камеры (геометрический центр робота)
|
||
* `/RMC2/depth_camera/image` [sensor_msgs/msg/Image] - изображение с передней камеры
|
||
* `/RMC2/depth_camera/point_cloud` [sensor_msgs/msg/PointCloud2] - облако точек с передней камеры глубины
|
||
* `/RMC2/lift_status` [std_msgs/msg/String] - состояние лифта (moving / success)
|
||
* `/RMC2/lift` [std_msgs/msg/Float64] - поднятие лифта на заданную высоту
|
||
* `/RMC2/odometry` [nav_msgs/msg/Odometry] колесная одометрия робота
|
||
* `/RMC2/scan` [sensor_msgs/msg/LaserScan] - объединенный скан переднего и заднего лидара
|
||
* `/RMC2/scan_back` [sensor_msgs/msg/LaserScan] - скан заднего лидара
|
||
publisher
|
||
* `/RMC2/scan_front` [sensor_msgs/msg/LaserScan] - скан переднего лидара
|
||
* `/RMC2/cmd_vel` [geometry_msgs/msg/Twist] - целевая скорость платформы
|
||
* `/tf_static` [tf2_msgs/msg/TFMessage] - дерево статических преобразований между деталями робота
|
||
* `/tf` [tf2_msgs/msg/TFMessage] - дерево динамическиз преобразований между роботом и миром
|
||
|
||
Чтобы робот начал перемещение, необходиом начать публиковать в топик `/RMC2/cmd_vel` целевую скорость. Кинематика робота РМК2 позволяет задачать линейную скорость по оси `x` и угловую по оси `z` робота.
|
||
|
||
Чтобы управлять положением подъемного лифта, необходимо отправить в топик `/RMC2/lift` число с плавающей точкой с высотой, на которую поднимется лифт. Значение `0.0` соответствует полностью опущенному положению лифта. Значения `0.1` соответстует поднятому положению. Этого достаточно, чтобы поднять стеллаж с объектами. Лифт имеет 2 фиксированных положения, промежуточного не существует.
|
||
|
||
# Дополнительная информация
|
||
## Поле
|
||
Соревновательное поле размечено ArUco маркерами в соответствии со следующим изображением:
|
||

|
||
|
||
Маркеры ArUco имеют уникальные ID адреса от 0 до 35, верх маркера соответствует верху цифры на изображении выше. Инпче говоря, все маркеры ориентированы верхней гранью в одну сторону.
|
||
|
||
Начало координат поля в Webots совпадает с маркером ID = 0, направление векторов координат показано на картинке выше: ось X смотрит вправо, ось Y смотрит вверх. |