В этом примере представлена платформа TurtleBot ® и способы взаимодействия пользователей MATLAB ® с ней. В частности, код в этом примере демонстрирует, как публиковать сообщения в TurtleBot (такие как скорости) и как подписываться на темы, которые публикует TurtleBot (такие как одометрия).
TurtleBot должен работать, чтобы этот пример работал.
Необходимые условия: Запуск с Gazebo и моделируемым 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