www.gusucode.com > robotsimulink 工具箱 matlab源码程序 > robotsimulink/robotslros/+robotics/+slros/+internal/+cgen/ROSModelInfo.m
classdef ROSModelInfo %This class is for internal use only. It may be removed in the future. % ROSModelInfo is a utility class that encapsulates information about % ROS blocks in a Simulink model. % % See also: cgen.ROSBlockInfo % Copyright 2014-2016 The MathWorks, Inc. properties(SetAccess=private) %Model - Name of Simulink model Model %LibraryBlocks - List of ROS publish, subscribe, and blank message blocks in the model LibraryBlocks %ParameterBlocks - List of ROS get / set parameter blocks ParameterBlocks % List of top-level message types in the model (i.e., the % message types used in Subscribe, Publish and Blank Message % blocks). This list may have duplicates, and it *does not* include % nested message types. TopLevelMsgTypes % The name of the ROS node corresponding to the Simulink model NodeName % Info about Subscribe blocks in model (list of cgen.ROSMessageBlockInfo objects) SubscriberList = robotics.slros.internal.cgen.ROSMessageBlockInfo.empty % Info about Publish blocks in model (list of cgen.ROSMessageBlockInfo objects) PublisherList = robotics.slros.internal.cgen.ROSMessageBlockInfo.empty %ParameterGetterList - Info about Get Parameter blocks in model % This is a list of cgen.ROSParameterBlockInfo objects. ParameterGetterList = robotics.slros.internal.cgen.ROSParameterBlockInfo.empty %ParameterSetterList - Info about Set Parameter blocks in model % This is a list of cgen.ROSParameterBlockInfo objects. ParameterSetterList = robotics.slros.internal.cgen.ROSParameterBlockInfo.empty end %% methods function obj= ROSModelInfo(model) obj.Model = model; obj.NodeName = model; [obj.LibraryBlocks, obj.ParameterBlocks, obj.TopLevelMsgTypes] = ... robotics.slros.internal.bus.Util.getROSBlocksInModel(model); obj = getInfoFromROSBlocks(obj); end function msgTypes = getMessageTypesInModel(obj) % returns the unique top-level message types in model msgTypes = unique( obj.TopLevelMsgTypes); end end %% methods(Access=private) function obj = getInfoFromROSBlocks(obj) obj.NodeName = obj.Model; [obj.SubscriberList, obj.PublisherList] = ... obj.getInfoFromPubSubBlocks; [obj.ParameterGetterList, obj.ParameterSetterList] = ... obj.getInfoFromParameterBlocks; end function [subList, pubList] = getInfoFromPubSubBlocks(obj) %getInfoFromPubSubBlocks Iterate over blocks and extract information from pub/sub blocks subList = []; pubList = []; for i=1:numel(obj.LibraryBlocks) block = obj.LibraryBlocks{i}; maskType = get_param(block, 'MaskType'); if strcmpi(maskType, 'ROS Blank Message') continue; end switch lower(maskType) case 'ros publish' sysObjBlock = [block '/SinkBlock']; case 'ros subscribe' sysObjBlock = [block '/SourceBlock']; otherwise assert(false, sprintf('Unexpected mask type %s for block %s', ... maskType, block)); end s = robotics.slros.internal.cgen.ROSMessageBlockInfo; s.MsgType = get_param(block, 'messageType'); s.SlBusName = get_param(sysObjBlock, 'SLBusName'); s.Label = get_param(sysObjBlock, 'BlockId'); s.Comment = sprintf('For Block %s', block); s.CppRosType = robotics.slros.internal.cgen.Util.rosMsgTypeToCppClass(s.MsgType); % consistency check expectedBusName = ... robotics.slros.internal.bus.Util.rosMsgTypeToBusName(s.MsgType, obj.Model); assert(strcmpi(s.SlBusName, expectedBusName), ... sprintf('Mismatch: %s, %s', s.SlBusName, expectedBusName)); switch lower(maskType) case 'ros publish' pubList = [pubList s]; %#ok<AGROW> case 'ros subscribe' subList = [subList s]; %#ok<AGROW> end end end function [paramGetList, paramSetList] = getInfoFromParameterBlocks(obj) %getInfoFromParameterBlocks Iterate over blocks and extract information from parameter blocks paramGetList = []; paramSetList = []; for i = 1:numel(obj.ParameterBlocks) block = obj.ParameterBlocks{i}; s = robotics.slros.internal.cgen.ROSParameterBlockInfo; s.ParamType = get_param(block, 'ParameterType'); s.Label = get_param(block, 'BlockId'); s.Comment = sprintf('For Block %s', block); % Convert from Simulink to C++ type s.CppParamType = robotics.slros.internal.sim.DataTypes.simulinkToCpp(s.ParamType); % Convert from Simulink to ROS C++ type parameterType = get_param(block, 'ParameterType'); % Decide if this type corresponds to an array or a scalar % parameter. s.IsArray = ~robotics.slros.internal.sim.DataTypes.isSimulinkDataTypeScalar(parameterType); s.ROSCppParamType = robotics.slros.internal.sim.DataTypes.simulinkToROSCpp(s.ParamType, s.IsArray); maskType = get_param(block, 'MaskType'); switch lower(maskType) case 'ros get parameter' paramGetList = [paramGetList s]; %#ok<AGROW> case 'ros set parameter' paramSetList = [paramSetList s]; %#ok<AGROW> end end end end end