Это простой пример про то, как с помощью ROS можно связать несколько устройств по сети и пересылать данные управления.
Под катом в конце — видеодемонстрация управления роботом с джойстика.
Нам понадобится сам джойстик, можно взять от своей ps4 или купить в магазине. Я купил dualshock 4 v2, первой версии тоже должен работать.
Также нужен блютус на вашем компьютере с ROS, в документации к драйверам рекомендуют usb blutooth адаптеры версии 2.1+. У меня прекрасно заработал со встроенным в ноутбук адаптером. Также можно подключить джойстик и просто usb кабелем.
Затем в Ubuntu c ROS нужно установить драйвер по инструкции.
После установки драйверов и соединения джойстика по блютус, запускаем графическую утилиту jstest-gtk и видим что у нас два джойстика, нам нужен второй, так как на нем есть все кнопки и стики.
Так как по умолчанию 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»:
Демонстрация управления роботом с помощью джойстика:
Резюме: С помощью ROS можно построить систему для работа распределенную на несколько устройств и например большие вычисления производить на основном компьютере, на самом же роботе оставить только то что нужно для быстрого реагирования. На BeagleBone Blue стоит программируемая подсистеме реального времени (PRU‐ICSS).
PRU-ICSS состоит из микропроцессора на двух 32-битных ядрах, имеющих RISC-архитектуру и работающих на частоте 200МГц. Каждое ядро имеет свою область памяти, а также совместную с Linux область памяти, может использовать выводы общего назначения, расположенные на разъемах P8-P9, и формировать прерывания.
Кроме этого установленный на BeagleBone Blue датчик MPU9250 при изменении положения может формировать прерывание на которой можно повесить свою функцию, так собственно и сделано в EduMip.
Если говорить про следующий шаг эволюции то это ROS2, где одним из отличий является DDS (Data Distribution Service) позволяющий построить сеть разных взаимодействующих роботов и устройств на которых ROS не запущен.