Управление самобалансирующим роботом EduMip с помощью джойстика PS4 dualshock 4 через ROS

_fdnx14qysbx7xanwy1j5snwseo.jpeg
Это простой пример про то, как с помощью ROS можно связать несколько устройств по сети и пересылать данные управления.

Под катом в конце — видеодемонстрация управления роботом с джойстика.
Нам понадобится сам джойстик, можно взять от своей ps4 или купить в магазине. Я купил dualshock 4 v2, первой версии тоже должен работать.

Также нужен блютус на вашем компьютере с ROS, в документации к драйверам рекомендуют usb blutooth адаптеры версии 2.1+. У меня прекрасно заработал со встроенным в ноутбук адаптером. Также можно подключить джойстик и просто usb кабелем.

Затем в Ubuntu c ROS нужно установить драйвер по инструкции.

После установки драйверов и соединения джойстика по блютус, запускаем графическую утилиту jstest-gtk и видим что у нас два джойстика, нам нужен второй, так как на нем есть все кнопки и стики.

wlfveq7wjya3rbkmfq0k23srzti.png

Так как по умолчанию ROS работает с joy0, то нам это надо переопределить на joy1:

sudo chmod a+rw /dev/input/js1
rosparam set joy_node/dev "/dev/input/js1"


Теперь нам нужно соединить это все в единую сеть. Ноутбук с ROS будет master, а EduMip с BeagleBone Blue ROS соединяться по wifi к ноутбуку. Оба устройства находятся в локальной сети wifi роутера.

На вашем ПК установите переменные среды ROS для поиска мастера ros (roscore) на ПК с команд .bashrc (добавьте эти команды в конец вашего файла .bashrc):

"export ROS_MASTER_URI=http://192.168.10.101:11311” <- это сообщает ROS IP-адрес машины, на которой выполняется мастер ros (roscore).
"export ROS_IP=192.168.10.101” <- это сообщает ROS IP-адрес этой машины (вашего ПК).


На вашем EduMIP установите переменные среды ROS чтобы он нашел мастер ros (roscore) на ПК с команд .bashrc (добавьте эти команды в конец вашего файла .bashrc):

"export ROS_MASTER_URI=http://192.168.10.101:11311” <- это сообщает ROS IP-адрес машины, на которой выполняется мастер ros (roscore).
"export ROS_IP=192.168.10.102” <- это говорит ROS IP-адрес этой машины (Ваш EduMIP).


Осталось только написать программу которая будет читать положение стика с джойстика и отправлять в топик, а робот этот топик читать.

// Callback function for joystick pessaged
void joyCallback(const sensor_msgs::Joy::ConstPtr& joy)
{
  // X vel driven by left joystick for and aft
  command_velocity_twist.linear.x = joy->axes[1];
  // heading driven by left joysticj left and right
  command_velocity_twist.angular.z = joy->axes[0];
}

// this function gets called at 10Hz to publish the command_velocity array of 2 floats
void timerCallback(const ros::TimerEvent& event)
{
  cmd_vel_publisher.publish(command_velocity_twist);
}


На вашем ПК вы можете визуально посмотреть nodes и topics, запустив «rqt_graph»:

surhqkd9og14hwlv_c1fgzvbno0.png

Демонстрация управления роботом с помощью джойстика:


Резюме: С помощью ROS можно построить систему для работа распределенную на несколько устройств и например большие вычисления производить на основном компьютере, на самом же роботе оставить только то что нужно для быстрого реагирования. На BeagleBone Blue стоит программируемая подсистеме реального времени (PRU‐ICSS).

PRU-ICSS состоит из микропроцессора на двух 32-битных ядрах, имеющих RISC-архитектуру и работающих на частоте 200МГц. Каждое ядро имеет свою область памяти, а также совместную с Linux область памяти, может использовать выводы общего назначения, расположенные на разъемах P8-P9, и формировать прерывания.

Кроме этого установленный на BeagleBone Blue датчик MPU9250 при изменении положения может формировать прерывание на которой можно повесить свою функцию, так собственно и сделано в EduMip.

Если говорить про следующий шаг эволюции то это ROS2, где одним из отличий является DDS (Data Distribution Service) позволяющий построить сеть разных взаимодействующих роботов и устройств на которых ROS не запущен.

© Habrahabr.ru