Общайтесь с TurtleBot

В этом примере представлена платформа TurtleBot ® и способы взаимодействия пользователей MATLAB ® с ней. В частности, код в этом примере демонстрирует, как публиковать сообщения в TurtleBot (такие как скорости) и как подписываться на темы, которые публикует TurtleBot (такие как одометрия).

TurtleBot должен работать, чтобы этот пример работал.

Необходимые условия: Запуск с Gazebo и моделируемым TurtleBot или Запуском с реальным TurtleBot

Подключение к TurtleBot

TurtleBot должен работать. Если вы используете настоящий TurtleBot и следовали шагам настройки оборудования в Запуск with a Real TurtleBot, робот работает. Если вы используете TurtleBot в симуляции и следовали шагам настройки в Запуск with Gazebo and a Simulated TurtleBot, запустите один из миров Gazebo ® с рабочего стола (Gazebo Office, для образца).

В вашем MATLAB образца на хост-компьютер, запустите следующую команду. Замените ipaddress с IP-адресом TurtleBot. Эта линия инициализирует ROS и соединяется с TurtleBot.

ipaddress = "http://192.168.178.132:11311";
rosinit(ipaddress)
Initializing global node /matlab_global_node_00696 with NodeURI http://192.168.178.1:64340/

Если сеть, которую вы используете для подключения к TurtleBot, не является сетевым адаптером по умолчанию, можно вручную задать IP-адрес адаптера, который используется для подключения к роботу. Это может произойти, если вы используете беспроводную сеть, но также имеете активное подключение Ethernet. Замените IP_OF_TURTLEBOT с IP-адресом TurtleBot и IP_OF_HOST_COMPUTER с IP-адресом хост-адаптера, который используется для подключения к роботу:

rosinit("IP_OF_TURTLEBOT","NodeHost","IP_OF_HOST_COMPUTER");

Отображение всех доступных тем ROS с помощью:

rostopic list

Если вы не видите никаких тем, то сеть настроена неправильно. Для получения информации о шагах настройки сети см. начало этого документа.

Перемещение робота

Управлять движением TurtleBot можно, опубликовав сообщение в /cmd_vel тема. Сообщение должно иметь тип geometry_msgs/Twist, который содержит данные, задающие желаемые линейную и угловую скорости. Движениями TurtleBot можно управлять через два различных значения: линейная скорость вдоль оси X управляет движением вперед и назад, а угловая скорость вокруг оси Z управляет скоростью вращения основы робота.

Установите переменную velocity чтобы использовать для краткого движения TurtleBot.

velocity = 0.1;     % meters per second

Создайте издателя для /cmd_vel тема и соответствующее сообщение, содержащее значения скорости.

robotCmd = rospublisher("/cmd_vel") ;
velMsg = rosmessage(robotCmd);

Установите прямую скорость (вдоль оси X) робота на основе velocity переменная и публикация команды роботу. Дайте ему двигаться на минутку, а потом доведите его до остановки.

velMsg.Linear.X = velocity;
send(robotCmd,velMsg)
pause(4)
velMsg.Linear.X = 0;
send(robotCmd,velMsg)

Чтобы просмотреть тип сообщения, опубликованного в теме скорости, выполните следующее:

rostopic type /cmd_vel
geometry_msgs/Twist

В теме ожидаются сообщения типа geometry_msgs/Twist, который является именно типом velMsg созданный выше.

Чтобы просмотреть, какие узлы публикуются и подписываются на заданную тему, используйте команду: rostopic info TOPICNAME. Следующая команда приводит список издателей и подписчиков для темы скорости. MATLAB указан как один из издателей.

  rostopic info /cmd_vel
Type: geometry_msgs/Twist
 
Publishers:
* /matlab_global_node_00696 (http://192.168.178.1:64340/)
 
Subscribers:
* /gazebo (http://192.168.178.132:41095/)

Положение и ориентация робота приема

TurtleBot использует /odom тема для публикации его текущей позиции и ориентации (коллективно обозначаемой как положение). Поскольку TurtleBot не оборудован системой GPS, положение будет относительно положения, которое было у робота, когда он был впервые включен.

Создайте абонента для сообщений одометрии

odomSub = rossubscriber("/odom");

Подождите, пока абонент вернет данные, затем извлеките данные и присвойте их переменным x, y, и z:

odomMsg = receive(odomSub,3);
pose = odomMsg.Pose.Pose;
x = pose.Position.X;
y = pose.Position.Y;
z = pose.Position.Z;

Примечание: Если вы видите ошибку, то вероятно, что receive истекло время ожидания команды. Убедитесь, что одометрия публикуется и ваша сеть настроена правильно.

Отобразите значения x, y и z

[x y z]
ans = 1×3

    0.3883    0.0003   -0.0010

Ориентация TurtleBot сохранена как кватернион в Orientation свойство pose. Использовать quat2eul (Robotics System Toolbox) для преобразования в более удобное представление углов Эйлера. Чтобы отобразить текущую ориентацию, theta, робота в степенях, выполните следующие линии.

quat = pose.Orientation;
angles = quat2eul([quat.W quat.X quat.Y quat.Z]);
theta = rad2deg(angles(1))
theta = -0.0274

Получение данных лидара

Подписаться на тему лидара:

lidarSub = rossubscriber("/scan");

После подписки на тему лидара дождитесь данных и затем отобразите их с графиком.

scanMsg = receive(lidarSub);
figure
plot(scanMsg)

Чтобы постоянно отображать обновляющиеся сканы лидара, в то время как робот поворачивается в течение короткого времени, используйте следующий цикл while:

velMsg.Angular.Z = velocity;
send(robotCmd,velMsg)
tic
while toc < 20
  scanMsg = receive(lidarSub);
  plot(scanMsg)
end

velMsg.Angular.Z = 0;
send(robotCmd,velMsg)

Отсоединитесь от робота

Очистить рабочую область издателей, подписчиков и других связанных с ROS объектов, когда вы закончите с ними.

clear

Использование rosshutdown после завершения работы с сетью ROS. Завершите работу глобального узла и отсоединитесь от TurtleBot.

rosshutdown
Shutting down global node /matlab_global_node_00696 with NodeURI http://192.168.178.1:64340/

Следующие шаги

См. следующий пример: Исследуйте основное поведение TurtleBot