Это последняя четвертая статья, запланированная в ряд .
В этой статье я расскажу об использовании джойстика PS3 Dualshock для управления роботом через ROS на примере управления простым сервоприводом, который использовался в руководство для rosserial_arduino. Кому интересно, смотрите кат.
Установка поддержки джойстика PS3 (Dualshock)
Нам понадобится сам джойстик PS3 Dualshock.и адаптер Bluetooth, например этот
Я также использую крепление для камеры (например, такой ), сервоуправление:
Скрипт RetroPie-Setup нам понадобится для установки аппаратной поддержки джойстика Dualshock на Raspberry Pi. Давайте скачаем это отсюда и установите:
Сначала выберите «Обновить настройку ReproPie».git clone https://github.com/RetroPie/RetroPie-Setup.git cd RetroPie-Setup/ sudo .
/retropie_setup.sh
Затем снова запускаем скрипт Retropie_setup.sh. Выберите «Настройка/Конфигурация» > «310 Установить/подключить контроллер PS3».
Следуйте инструкциям и установите.
После завершения установки вам нужно будет подключить джойстик к USB-порту и нажать «ОК».
После этого нужно отключить джойстик от USB-порта и нажать круглую кнопку PS. Bluetooth-соединение будет установлено.
Джойстик теперь сопряжен и готов к использованию.
Проверить джойстик можно с помощью графической утилиты jstest-gtk: sudo apt-get install jstest-gtk.
Запустим утилиту: jstest-gtk
Интерфейс программы очень простой.
Попробуйте нажать кнопки, и вы сразу увидите, как индикаторы выполнения рядом с соответствующими названиями осей для кнопок-заставок начинают меняться или кнопки загораются при нажатии кнопки.
После нажатия кнопок вы увидите следующую картинку
После нажатия кнопки «бампер» вы увидите следующую картину
Для использования джойстика в ROS необходимо установить соответствующие пакеты: rosinstall_generator ros_comm joystick_drivers image_transport --rosdistro indigo --deps --wet-only --exclude roslisp --tar > indigo-custom_ros.rosinstall
wstool update -t src
rosdep install --from-paths src --ignore-src --rosdistro indigo -y -r --os=debian:jessie
sudo .
/src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/indigo
Стек joystick_drivers включает в себя все необходимые узлы и драйверы.
Основная цель этого стека — преобразовать события джойстика в сообщения ROS. В частности, нам понадобится узел радости.
Подробное описание его можно найти на страница вместе с обучающими материалами Здесь И Здесь .
Использование джойстика от ROS
Для начала давайте запустим узел радости: rosrun joy joy_node
Подключаем джойстик, нажимаем круглую кнопку питания PS и делаем:
rostopic echo joy
Вывод будет примерно таким:
---
axes: (0.0, 0.0, 0.0, 0.0)
buttons: (0, 0, 0, 0, 0)
---
axes: (0.0, 0.0, 0.0, 0.12372203916311264)
buttons: (0, 0, 0, 0, 0)
---
axes: (0.0, 0.0, -0.18555253744125366, 0.12372203916311264)
buttons: (0, 0, 0, 0, 0)
---
Сообщения, публикуемые узлом радости, имеют тип Sensor_msgs/Joy и включают линейную и угловую скорость.
Значения скорости включены в поле осей: первое значение определяет угловую скорость, второе — линейную скорость.
Посмотреть структуру сообщений Joy можно с помощью команды: rosmsg show sensor_msgs/Joy
Команда покажет следующую структуру: std_msgs/Header header
uint32 seq
time stamp
string frame_id
float32[] axes
int32[] buttons
Мы создадим скетч для управления сервоприводом.
Давайте создадим эскиз.
Для управления сервоприводом нам понадобится библиотека Ардуино сервопривод .
Подключение сервопривода к Arduino можно увидеть в руководство .
Пишем эскиз.
Во-первых, давайте добавим файл заголовка для сообщений Sensor_msgs/Joy вверху файла: #include <sensor_msgs/Joy.h>
Добавим заголовочные файлы для библиотеки Servo и для ROS: #include <Servo.h>
#include <ros.h>
Ниже приведен стандартный код скетча rosserial_arduino: ros::NodeHandle nh;
Servo servo;
// Indices of components in joy message
int linear_ind = 1;
int angular_ind = 0;
void servo_cb(const sensor_msgs::Joy& joy)
{
float angular = joy.axes[angular_ind];
float linear = joy.axes[linear_ind];
int cur_pos = servo.read();
if(angular > 0)
{
nh.loginfo("Turn left");
cur_pos = cur_pos - 20;
servo.write(cur_pos);
}
else if(angular < 0)
{
nh.loginfo("Turn right");
cur_pos = cur_pos + 20;
servo.write(cur_pos);
}
}
ros::Subscriber<sensor_msgs::Joy> sub("joy", &servo_cb);
void setup()
{
pinMode(13, OUTPUT);
nh.initNode();
nh.subscribe(sub);
servo.attach(9); // attach it to pin 9
}
void loop()
{
nh.spinOnce();
delay(1);
}
В методе настройки привязываем сервопривод к пину 9 и проводим стандартную инициализацию узла rosserial_arduino.
В эскизе следует обратить внимание на линии: // Indices of components in joy message
int linear_ind = 1;
int angular_ind = 0;
, где указываем индексы значений угловой и линейной скорости в массиве axes в сообщении Sensor_msgs/Joy. Мы просто создаем подписчика на тему радости и обрабатываем полученное сообщение в методе servo_cb. Здесь мы извлекаем значения угловой и линейной скорости.
В этом эскизе мы используем только угловую скорость, поскольку определяем вращение сервопривода.
Направление вращения определяется исходя из соотношения кнопок джойстика и направления осей.
Пример двух основных кнопок «бампера» можно увидеть на изображении с страницы .
Здесь указано, что ось 16 задает вращение (левое нажатие – положительное значение, правое – отрицательное).
В соответствии с этим правилом на эскизе определяется поворот влево-вправо (угловая скорость – угловое поле).
Ось 17 задает движение вперед – назад: вперед – положительное, назад – отрицательное.
Значения этой оси соответствуют линейной скорости (линейному полю): float linear = joy.axes[linear_ind];
Используя крепление для камеры, вы можете установить плату камеры Raspberry Pi и управлять ею, вращая сервопривод:
Таким способом можно написать логику контроллера для мобильного робота, определив действия по управлению для определенных кнопок джойстика (управление кнопкой «бампер» с помощью наклона или с помощью кнопок вверх-вниз-влево-вправо).
Как видите, джойстику для управления роботом можно найти множество применений.
Все это возможно благодаря тому, что ROS предоставляет удобный интерфейс для подключения джойстика PS3 Dualshock к роботу на платформе Raspberry Pi и позволяет очень легко реализовать логику управления различными сервоприводами робота.
Желаю всем удачи в проектах по робототехнике с использованием ROS и Raspberry Pi! Теги: #Raspberry Pi #Робототехника #arduino #ros #robotics #rosserial
-
Ирландия
19 Oct, 24 -
Godaddy.com Выставлен На Продажу
19 Oct, 24 -
Измерение Против Иллюзий
19 Oct, 24