4.7  Sensors : reference information#

After a description of standard input forms in section 4.6, this section is a reference for sensor definition strategies in SDT. Sensors are used for

  • experimental modal analysis where tests are shown as wire frame, see section 2.8. In this configuration translation sensors are the only considered and trans, triax and laser provide simplified calls to generate the associated translation sensors.
  • test/analysis correlation, see section 3.1. Topology correlation is the process in which sensor output is related to the DOFs of the underlying FEM. This is implemented as the SensMatch command detailed section 4.7.1. In the case of translation measurements, this is only needed for test/analysis correlation.
  • FEM modeling to characterize outputs of interest in state-space models for example. Additional sensor types are then used
    • rel relative displacement sensor.
    • general general sensor (low level).
    • resultant fixed matrix resultant force sensor.
    • strain strain or stress sensor.
    When considering sensors in FEM models, fe_case Sens accepts options vel and acc to specify that certain sensors should measure velocity or acceleration.

The underlying idea of sensors is that outputs are related to degree of freedom or state through an observation equation {y}=[c]{q}. This general objective is supported by the use of SensDof entries.

4.7.1  Topology correlation and observation matrix#

This section lists the main commands used to build the observation matrix once sensors are defined :

  • Match all sensors to FEM mesh elements with SensMatch
  • Build the observation matrix from the matched sensors with Sens
  • Generate DofLoad at sensor location/direction with DofLoadSensDof

SensMatch#

Once sensors defined (see trans, ...), sensors must be matched to elements of the mesh. This is done using
model = fe_case(model,'sensmatch',SensDofEntryName);

You may omit to provide the name if there is only one sensor set. The command builds the observation matrix associated to each sensor of the entry Name, and stores it as a .cta field, and associated .DOF, in the sensor stack.

Storing information in the stack allows multiple partial matches before generating the global observation matrix. The observation matrix is then obtained using
Sens = fe_case(model,'sens',SensDofEntryName);

The matching operation requires finding the elements that contain each sensor and the position within the reference element shape so that shape functions can be used to interpolate the response. Typical variants are

  • a radius can be specified to modify the default sphere in which a match is sought : all elements whose center of gravity is inside de sphere will be considered. This is typically needed in cases some large elements.

    model=fe_case(model,'sensmatch radius1.0',Name)

    For fine match strategies a second radius value corresponding to the maximum distance allowed to match a point can be provided : all matches above this distance are not retained and the match search procedure continues.

    To avoid evaluating the match for all the elements inside the search radius, which could take long time, the algorithm starts with the element whose center of gravity is the closest to the node to match. If the match is below the maximum distance, it is validated. If not, nearby elements are iteratively detected and evaluated for match. For computational speed matters, only 5 iterations can be performed for each point to match but this can be increased using the SearchIter option. The line below for example looks iteratively at elements in the sphere of radius 1 (from the closest one to all nearby ones) and stops as soon as a match distance below 0.1 is reached.

    model=fe_case(model,'SensMatch radius 1 .1 -SearchIter Inf',Name);

  • elements on which to match can be specified as a FindElt string. In particular, matching nodes outside volumes is not accepted. To obtain a match in cases where test nodes are located outside volume elements, you must thus match on the volume surface using
    fe_case(model,'sensmatch radius1.0',Name,'selface')
    which selects external surface of volumes and allows a normal projection towards the surface and thus proper match of sensors outside the model volume.

    Note that this selection does not yet let you selected implicit elements within a superelement.

  • Matching on elements is not always acceptable, one can then force matching to the closest node. SensMatch-Near uses the motion at the matched node. SensMatch-Rigid uses a rigid body constraints to account for the distance between the matched node and the sensor (but is thus only applicable to cases with rotations defined at the nearby node).

In an automated match, the sensor is not always matched to the correct elements on which the sensor is glued, you may want to ensure that the observation matrices created by these commands only use nodes associated to a subset of elements. You can use a selection to define element subset on which perform the match. If you want to match one or more specific sensors to specific element subset, you can give cell array with SensId of sensor to match in a first column and with element string selector in a second column.
model=fe_case(model,'SensMatch',Name,{SensIdVector,'FindEltString'});

This is illustrated below in forcing the interpolation of test node 1206 to use FEM nodes in the plane where it is glued.

 cf=demosdt('DemoGartDataCoshape plot');
 fe_case(cf,'sensmatch -near')
 sdth.urn('Tab(Cases,sensors){Proview,on}',cf);
 % use fecom CursorSelOn to see how each sensor is matched.
 cf.CStack{'sensors'}.Stack{18,3}
 % modify link to 1206 to be on proper surface
 cf.mdl=fe_case(cf.mdl,'SensMatch-near',...
     'sensors',{1206.03,'withnode {z>.16}'});
 cf.CStack{'sensors'}.Stack{18,3}
 % force link to given node (may need to adjust distance)
 cf.mdl=fe_case(cf.mdl,'SensMatch-rigid radius .5','sensors',{1205.08,21});
 cf.CStack{'sensors'}.Stack{19,3}

fecom('showlinks sensors');fecom('textnode',[1206 1205])

Sens, observation#

This command is used after SensMatch to build the observation equation that relates the response at sensors to the response a DOFs

 
    (4.1)

where the c matrix in stored in the sens.cta field and DOFs expected for q are given in sens.tdof.

After the matching phase, one can build the observation matrix with
SensFull=fe_case(model,'sens',SensDofEntryName) or when using a reduced superelement model SensRed=fe_case(model,'sensSE',SensDofEntryName). Note that with superelements, you can also define a field .UseSE=1 in the sensor entry to force use of the reduced model. This is needed for the generation of reduced selections in feplot (typically cf.sel='-Test').

The following example illustrates nominal strategies to generate the observed shape, here for a static response.

model=demosdt('demoUbeamSens'); def=fe_simul('static',model);

% Manual observation, using {y} = [c] {q} sens=fe_case(model,'sens'); def=feutilb('placeindof',sens.DOF,def); % If DOF numbering differs % could use sens=feutilb('placeindof',def.DOF,sens); if all DOF present y=sens.cta*def.def % Automated curve generation C1=fe_case('sensObserve',model,'sensor 1',def)

DofLoadSensDof#

The generation of loads is less general than that of sensors. As a result it may be convenient to use reciprocity to define a load by generating the collocated sensor. When a sensor is defined, and the topology correlation performed with SensMatch, one can define an actuator from this sensor using
model=fe_case(model,'DofLoad SensDof',Input_Name,'Sens_Name:Sens_Nb') or for model using superelements
model=fe_case(model,'DofLoad SensDofSE',Input_Name,'Sens_Name:Sens_Nb').
Sens_Name is the name of the sensor set entry in the model stack of the translation sensor that defines the actuator, and Sens_Nb is its number in this stack entry. Thus Sensors:1 2 5 will define actuators with sensors 1, 2 and 5 for SensDof entry Sensors. Input_Name is the name of the DofLoad entry that will be created in the model stack to describe the actuator.

Note that a verification of directions can be performed a posteriori using feutilb GeomRB.

Animation of sensor wire-frame models#

This is discussed in section 2.8.3.

Obsolete#

SDT 5.3 match strategies are still available. Only the arigid match has not been ported to SDT 6.1. This section thus documents SDT 5.3 match calls.

For topology correlation, the sensor configuration must be stored in the sens.tdof field and active FEM DOFs must be declared in sens.DOF. If you do not have your analysis modeshapes yet, you can use sens.DOF=feutil('getdof',sens.DOF). With these fields and a combined test/FEM model you can estimate test node motion from FEM results. Available interpolations are

  • near defines the projection based on a nearest node match.
  • rigid defines the projection based on a nearest node match but assumes a rigid body link between the DOFs of the FE model and the test DOFs to obtain the DOF definition vector adof describing DOFs used for FEM results.
  • arigid is a variant of the rigid link that estimates rotations based on translations of other nodes. This interpolation is more accurate than rigid for solid elements (since they don't have rotational DOFs) and shells (since the value of drilling rotations is often poorly related to the physical rotation of a small segment).

At each point, you can see which interpolations you are using with
fe_sens('info',sens). Note that when defining test nodes in a local basis, the node selection commands are applied in the global coordinate system.

The interpolations are stored in the sens.cta field. With that information you can predict the response of the FEM model at test nodes. For example

 [model,def]=demosdt('demo GartDataCoshape');
 model=fe_sens('rigid sensors',model); % link sensors to model
 % display sensor wire-frame and animate FEM modes
 cf=feplot; cf.model=model; cf.sel='-sensors';
 cf.def=def;fecom(';undefline;scd.5;ch7')