Этот пример вводит платформу TurtleBot® и пути, которыми пользователи MATLAB® могут взаимодействовать с ним. А именно, код в этом примере демонстрирует, как опубликовать сообщения к TurtleBot (такие как скорости) и как подписаться на темы, которые TurtleBot публикует (такие как одометрия).
TurtleBot должен запускаться для этого примера, чтобы работать.
Предпосылки: Запуск с Gazebo и симулированным TurtleBot или Запуск с действительным TurtleBot
Этот пример дает обзор работы с TurtleBot® с помощью его нативного интерфейса ROS. Пакет Поддержки ROS Toolbox™ для основанных на TurtleBot Роботов обеспечивает более оптимизированный интерфейс к TurtleBot. Это позволяет вам:
Получите данные о датчике и отправьте команды управления, явным образом не вызывая команды ROS.
Свяжитесь прозрачно с симулированным роботом в Gazebo или с физическим TurtleBot.
Чтобы установить пакет поддержки, откройтесь, Дополнения> Получают Пакеты Аппаратной поддержки на вкладке MATLAB Home и выбирают основанных на ROS Toolbox™ Support Package for TurtleBot Роботов. В качестве альтернативы используйте rosAddons
команда.
TurtleBot должен запускаться. Если вы используете действительный TurtleBot и выполнили шаги настройки оборудования в Запуске с Действительным TurtleBot, робот запускается. Если вы используете TurtleBot в симуляции и выполнили шаги настройки в Запуске с Gazebo и Симулированным TurtleBot, запустите один из миров Gazebo® с рабочего стола (Gazebo TurtleBot World
, например).
В вашем экземпляре MATLAB на хосте - компьютере запустите следующую команду. Замените ipaddress
с IP-адресом TurtleBot. Эта линия инициализирует ROS и соединяется с TurtleBot.
ipaddress = "http://192.168.233.133:11311"
ipaddress = "http://192.168.233.133:11311"
rosinit(ipaddress)
Initializing global node /matlab_global_node_83565 with NodeURI http://192.168.233.1:53035/
Если сеть, которую вы используете, чтобы соединиться с 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_83565 (http://192.168.233.1:53035/) * /mobile_base_nodelet_manager (http://192.168.233.133:38305/) Subscribers: * /gazebo (http://192.168.233.133:42482/)
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.7048 -0.4924 0
Ориентация TurtleBot хранится как кватернион в Orientation
свойство pose
Использование quat2eul
преобразовывать в более удобное представление Углов Эйлера. Отобразить текущую ориентацию, theta
, из робота в градусах, выполните следующие линии.
quat = pose.Orientation; angles = quat2eul([quat.W quat.X quat.Y quat.Z]); theta = rad2deg(angles(1))
theta = 4.6005
Убедитесь, что ваша камера 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 на 20 второго времени, используйте следующий цикл с условием продолжения:
tic; while toc < 20 img = receive(imsub); imshow(readImage(img)) end
Очистите рабочую область издателей, подписчиков и других СВЯЗАННЫХ С ROS объектов, когда вы будете закончены с ними.
clear
Используйте rosshutdown
если вы сделаны, работая с сетью ROS. Закройте глобальный узел и отключитесь от TurtleBot.
rosshutdown
Shutting down global node /matlab_global_node_83565 with NodeURI http://192.168.233.1:53035/
Обратитесь к следующему примеру: Исследуйте Основное Поведение TurtleBot