Я заметил, что заполнение сообщений ROS значениями происходит довольно медленно. Заполнение 16 полей сообщения занимает в среднем около 2,2 мс. Хотя это не так уж много само по себе, это быстро добавляется в контур управления. Рассматриваемое сообщение представляет собой управляющую команду, которую необходимо отправить с частотой около 10 Гц как минимум 10 различным роботам. Это означает, что как минимум пятая часть контрольного интервала тратится на «создание» сообщений. Вместе с тем, что rostime («сейчас») тоже медленный (https://www.mathworks.com/matlabcentral/answers/658878-rostime-call-is-slow?s_tid=srchtitle), это почти не оставляет времени для фактическое вычисление управляющих команд.

Интересно, делаю ли я что-то принципиально неправильное или API Matlab ROS просто такой медленный?

Скрипт для заполнения сообщения ROS по времени:

cmdFullStateMsg = rosmessage("crazyflie_driver/FullState");
pos = ones(3, 1);
vel = ones(3, 1);
acc = ones(3, 1);
yaw = 1;
omega = ones(3, 1);
quat = eul2quat([0, 0, yaw], 'xyz');
tic
for i = 1:1000  
    cmdFullStateMsg.Pose.Position.X    = pos(1);
    cmdFullStateMsg.Pose.Position.Y    = pos(2);
    cmdFullStateMsg.Pose.Position.Z    = pos(3);
    cmdFullStateMsg.Twist.Linear.X     = vel(1);
    cmdFullStateMsg.Twist.Linear.Y     = vel(2);
    cmdFullStateMsg.Twist.Linear.Z     = vel(3);
    cmdFullStateMsg.Acc.X              = acc(1);
    cmdFullStateMsg.Acc.Y              = acc(2);
    cmdFullStateMsg.Acc.Z              = acc(3);
    cmdFullStateMsg.Pose.Orientation.W = quat(1);
    cmdFullStateMsg.Pose.Orientation.X = quat(2);
    cmdFullStateMsg.Pose.Orientation.Y = quat(3);
    cmdFullStateMsg.Pose.Orientation.Z = quat(4);
    cmdFullStateMsg.Twist.Angular.X    = omega(1);
    cmdFullStateMsg.Twist.Angular.Y    = omega(2);
    cmdFullStateMsg.Twist.Angular.Z    = omega(3);   
end
cmd_full_state_msg_time = toc / 1000

ОТВЕЧАТЬ

Matlabsolutions.com предоставляет последнюю Помощь по домашним заданиям MatLab, Помощь по заданию MatLab для студентов, инженеров и исследователей в различных отраслях, таких как ECE, EEE, CSE, Mechanical, Civil со 100% выходом. Код Matlab для BE, B.Tech , ME, M.Tech, к.т.н. Ученые со 100% конфиденциальностью гарантированы. Получите проекты MATLAB с исходным кодом для обучения и исследований.

Причина проблем с производительностью

Доступ к вложенным сообщениям (до R2020b)

Исходя из вашего другого вопроса, я предполагаю, что вы используете R2019a. Все выпуски до R2020a используют rosjava под капотом, а сообщения содержат объекты сообщений Java. Это означает, что когда вы используете поля глубоко вложенных сообщений либо для установки, либо для получения данных, MATLAB должен выполнить несколько преобразований объектов сообщения.

Например, когда вы звоните:

cmdFullStateMsg.Pose.Position.X = pos(1)

затем МАТЛАБ:

  • Доступ к объекту Java-сообщения геометрии_msgs/Pose из свойства «Поза».
  • Преобразует это в объект MATLAB robotics.ros.msggen.geometry_msgs.Pose.
  • Доступ к объекту Java-сообщения геометрии_msgs/Point из свойства «Позиция».
  • Преобразует это в объект MATLAB robotics.ros.msggen.geometry_msgs.Point.
  • Получает доступ к свойству «X» базового Java-сообщения геометрии_msgs/Point и присваивает ему предоставленное значение.
  • Присваивает соответствующие свойства различным объектам на всем протяжении вложенного дерева.

Многократные звонки в rosmessage

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

Решения

Отказ от ответственности

Улучшение производительности — это то, что я вижу, в частности, благодаря случайным измерениям (тик-так) на моей машине. Вы можете не увидеть такого же улучшения в зависимости от вашего компьютера, ресурсов, среды, структуры кода или других факторов.

Извлечение вложенных сообщений перед установкой значений

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

СМОТРИТЕ ПОЛНЫЙ ОТВЕТ НАЖМИТЕ НА ССЫЛКУ

https://www.matlabsolutions.com/resources/populating-ros-messages-is-slow.php