Здравейте всички,
Имам някои персонализирани ROS съобщения, които съм заредил в MATLAB, използвайки рутината rosgenmsg. Всичко мина добре и те се показват при обаждане на rosmsg list.
Когато отидох да прочета съобщения от персонализирания тип от моя rosbag, получих следната грешка:
Reference to non-existent field 'Forces_'. Error in robotics.ros.custom.msggen.sfm_msgs.Forces/reload (line 165) Forces_Cell = arrayfun(@(x) feval([obj.SfmMsgsForceClass '.loadobj'], x), strObj.Forces_, 'UniformOutput', false); Error in robotics.ros.Message/fromStruct (line 172) obj.reload(sObj); Error in robotics.ros.BagSelection/readMessages (line 280) msgs{i}.fromStruct(msgStructs{i});
Направих известно проучване как работи функцията и откъде идва грешката. в
robotics.ros.Message/fromStruct
кодът се опитва да създаде обект на съобщение от информацията за чантата (която е във формат структура). За моето персонализирано съобщение от тип
sfm_msgs/Forces
имената на полетата за съобщението и структурите (те се генерират автоматично от rosgenmsg) се различават:
K>> msgs{1} ans = ROS Forces message with properties: MessageType: 'sfm_msgs/Forces' Header: [1×1 Header] Forces_: [0×1 Force]
срещу
K>> msgStructs{1} ans = struct with fields: MessageType: 'sfm_msgs/Forces' Header: [1×1 struct] Forces: [1×6 struct]
Това води до най-горната грешка в моето съобщение за грешка. Както споменахме, тази разлика в именуването се генерира автоматично от рутината rosgenmsg.
Оригиналните дефиниции на .msg съобщения са:
Forces.msg:
std_msgs/Header header Force[] forces
Force.msg:
uint8 ATTRACTIVE=0 uint8 INT_ROBOT=1 uint8 INT_OBSTACLE=2 uint8 INT_HUMAN=3 uint8 type string entity_name geometry_msgs/Vector3 force
Така че, да. Нямам представа как да поправя това и доколкото смятам, че това е грешка в рутината rosgenmsg. Надяваме се, че някои от вас гуру имат идея!
P.S. Използвам MATLAB версия: 9.4.0.813654 (R2018a) с Robotics System Toolbox версия 2.0 (R2018a)
ЗАБЕЛЕЖКА:-
Matlabsolutions.com предоставя най-новата помощ за домашна работа на MatLab, помощ за задания на MatLab, Помощ за финансови задачи за студенти, инженери и изследователи в множество клонове като ECE, EEE, CSE, механични, граждански със 100% изход. Код на Matlab за B.E, B .Tech, M.E, M.Tech, Ph.D. Учени със 100% гарантирана поверителност. Вземете MATLAB проекти с изходен код за вашето обучение и изследвания.
Свързах се с поддръжката на MATLAB и те ме уведомиха, че има няколко известни грешки с функцията readMessages и че трябва да използвам опциите „DataFormat“, „struct“. Тази опция е по-бърза, не изисква персонализирано генериране на код на съобщение (без извикване на rosgenmsg) и по този начин не предизвиква грешката ми. Опитах това и работи.
Промяната, която направих по този начин, беше; от:
readMessages(bagfile)
To:
readMessages(bagfile, 'DataFormat', 'struct')
Това заобикаля гореспоменатия бъг.
ВИЖТЕ ПЪЛНИЯ ОТГОВОР, КЛИКНЕТЕ ВЪРХУ ВРЪЗКА