Здравейте всички,

Имам някои персонализирани 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')

Това заобикаля гореспоменатия бъг.

ВИЖТЕ ПЪЛНИЯ ОТГОВОР, КЛИКНЕТЕ ВЪРХУ ВРЪЗКА