Этот пример вводит платформу TurtleBot® и пути, которыми пользователи MATLAB® могут взаимодействовать с ним. А именно, код в этом примере демонстрирует, как опубликовать сообщения к TurtleBot (такие как скорости) и как подписаться на темы, которые TurtleBot публикует (такие как одометрия).
TurtleBot должен запускаться для этого примера, чтобы работать.
Предпосылки: Запуск с Gazebo и моделируемым TurtleBot или Запуск с действительным TurtleBot
Этот пример дает обзор работы с TurtleBot с помощью его нативного интерфейса ROS. Пакет Поддержки Robotics System Toolbox™ для Роботов TurtleBot®-Based обеспечивает более оптимизированный интерфейс к TurtleBot. Это позволяет вам:
Получите данные о датчике и отправьте команды управления, явным образом не вызывая команды ROS
Свяжитесь прозрачно с моделируемым роботом в Gazebo или с физическим TurtleBot
Чтобы установить пакет поддержки, откройтесь, Дополнения> Получают Пакеты Аппаратной поддержки на вкладке MATLAB Home и выбирают "TurtleBot-Based Robots". Также используйте roboticsAddons
команду.
TurtleBot должен запускаться. Если вы используете действительный TurtleBot и выполнили шаги настройки оборудования в Запуске с Действительным TurtleBot, робот запускается. Если вы используете TurtleBot в симуляции и выполнили шаги настройки в Запуске с Gazebo и Моделируемым TurtleBot, запустите один из миров Gazebo® с рабочего стола (Gazebo TurtleBot World
, например).
В вашем экземпляре MATLAB на хосте - компьютере запустите следующую команду. Замените ipaddress
на IP-адрес TurtleBot. Эта строка инициализирует ROS и соединяется с TurtleBot.
ipaddress = '192.168.203.129';
rosinit(ipaddress)
Initializing global node /matlab_global_node_43053 with NodeURI http://192.168.203.1:55724/
Если сеть, которую вы используете, чтобы соединиться с 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 путем публикации сообщения к теме /mobile_base/commands/velocity
. Сообщение должно иметь тип geometry_msgs/Twist
и содержит данные, задающие, желал линейных и угловых скоростей. Перемещениями TurtleBot можно управлять через два различных значения: линейная скорость вдоль средств управления Осью X прямое и обратное движение и угловая скорость вокруг оси Z контролирует скорость вращения основы робота.
Установите переменную velocity
использовать для краткого перемещения TurtleBot.
velocity = 0.1; % meters per second
Создайте издателя для темы /mobile_base/commands/velocity
и соответствующего сообщения, содержащего скоростные значения.
robot = rospublisher('/mobile_base/commands/velocity') ;
velmsg = rosmessage(robot);
Установите прямую скорость (вдоль Оси X) робота на основе переменной velocity
и опубликуйте команду к роботу. TurtleBot продвинется маленькое расстояние и затем остановится.
velmsg.Linear.X = velocity; send(robot,velmsg);
Из соображений безопасности будет только продолжать движение TurtleBot, если он постоянно получит скоростные данные по теме /mobile_base/commands/velocity
.
Чтобы просмотреть тип сообщения, опубликованного скоростной темой, выполните следующее:
rostopic type /mobile_base/commands/velocity
geometry_msgs/Twist
Тема ожидает сообщения типа geometry_msgs/Twist
, который является точно типом velmsg
, который вы создали выше.
Чтобы просмотреть, который узлы публикуют и подписывают на данную тему, используйте команду: rostopic
info TOPICNAME
. Следующие списки команд издатели и подписчики для скоростной темы. MATLAB перечислен как один из издателей.
rostopic info /mobile_base/commands/velocity
Type: geometry_msgs/Twist Publishers: * /matlab_global_node_43053 (http://192.168.203.1:55724/) * /mobile_base_nodelet_manager (http://192.168.203.129:45425/) Subscribers: * /gazebo (http://192.168.203.129:40018/)
OPTIONAL: Если вы используете действительный TurtleBot, можно отправить звуковые команды в него.
soundpub = rospublisher('/mobile_base/commands/sound', 'kobuki_msgs/Sound') soundmsg = rosmessage('kobuki_msgs/Sound'); soundmsg.Value = 6; % Any number 0-6 send(soundpub,soundmsg);
TurtleBot использует тему /odom
, чтобы опубликовать ее текущее положение и ориентацию (коллективно обозначенный как положение). Поскольку TurtleBot не оборудован системой GPS, положение будет относительно положения, которое имел робот, когда это было сначала включено.
Создайте подписчика для сообщений одометрии
odom = rossubscriber('/odom');
Ожидайте подписчика, чтобы возвратить данные, затем извлечь данные и присвоить его переменным x, y, и z:
odomdata = receive(odom,3); pose = odomdata.Pose.Pose; x = pose.Position.X; y = pose.Position.Y; z = pose.Position.Z;
Примечание: Если вы видите ошибку, затем вероятно что приведенная к таймауту команда receive
. Убедитесь, что одометрия публикуется и что ваша сеть настраивается правильно.
Отобразите x, y, и z значения
[x,y,z]
ans = 1×3
1.8626 -0.0309 0
Ориентация TurtleBot хранится как кватернион в переменной pose.Orientation
. Используйте quat2eul
, чтобы преобразовать в более удобное представление Углов Эйлера. Чтобы отобразить текущую ориентацию, theta
, робота в градусах, выполняют следующие строки.
quat = pose.Orientation; angles = quat2eul([quat.W quat.X quat.Y quat.Z]); theta = rad2deg(angles(1))
theta = 4.4540
Убедитесь, что ваша камера Kinect® запускается. Если вы перечисляете темы снова с rostopic
list
, вы видите, что перечислены много тем, начинающихся /camera
. С действительным оборудованием TurtleBot можно найти следующую тему:
/camera/rgb/image_color/compressed
Подпишитесь на сжатую тему изображений.
if ismember('/camera/rgb/image_color/compressed', rostopic('list')) imsub = rossubscriber('/camera/rgb/image_color/compressed'); end
Если вы используете Gazebo, список тем отличается. Используйте следующую тему вместо этого:
/camera/rgb/image_raw
Подпишитесь на тему сырых данных изображений.
if ismember('/camera/rgb/image_raw', rostopic('list')) imsub = rossubscriber('/camera/rgb/image_raw'); end
После подписки на тему изображений ожидайте данных и затем отобразите его с imshow
.
img = receive(imsub); figure imshow(readImage(img));
Пример изображения реального мира от камеры Kinect выглядит так:
Чтобы отобразить постоянно обновляющее изображение от камеры Kinect, используйте следующий цикл с условием продолжения:
tic; while toc < 20 img = receive(imsub); imshow(readImage(img)) end
Очистите рабочую область издателей, подписчиков и других СВЯЗАННЫХ С ROS объектов, когда вы будете закончены с ними:
clear
Используйте rosshutdown
, если вы сделаны, работая с сетью ROS. Закройте глобальный узел и отключитесь от TurtleBot.
rosshutdown
Shutting down global node /matlab_global_node_43053 with NodeURI http://192.168.203.1:55724/
Обратитесь к следующему примеру: Исследуйте Основное Поведение TurtleBot