Surface Pressure Actuator

General description

The “SurfacePressureActuator” component simulates an actuator that applies pressure on a surface to solve an effector constraint.

Methods description

Requirement: Real time inverse simulation method

Definition: Pressure is the amount of force acting per unit of area:

P = F / S

where P is the pressure, F is the normal force and S is the area of surface where the force is applied

Method

We want to be homogeneous to a force:

Jλ = F = P × S

For this type of actuation, the effort λ represents the pressure exerted on the cavity wall. A single constraint is set for each pneumatic actuator. Indeed, the pressure inside the cavity is uniform over the wall. The corresponding Jacobian matrix J is built as follows. For each triangle t of the cavity wall, we compute its area at and its normal direction nt.
The multiplication of these results by the pressure gives the vector of force applied by the pneumatic actuation on the triangle. Thus, we divide the triangle area by 3 to distribute the contribution to its nodes (see figure below). We sum up the results of each triangle in the corresponding column of J:

Ji = ∑{t| i point of t} n× a/ 3

 

Thus, each point receives the contribution of each element it is part of. λ then represents the intensity of the pressure.

Copie de accordion

Example of a pneumatic actuation on an accordion model: (left) Accordion at rest. (middle) Accordion when inflated. (right) Method of pressure distribution on the cavity wall vertices.

How to use the component

To learn how to create a SOFA scene, please refer to the tutorial provided by the SOFA Modeler or this documentation.

To simulate a pressure in a cavity of a three dimensional model, you will need two meshes. The surface of the cavity (in red in the bunny example) and the three dimensional mesh you want to deform with pressure. As an actuator is used to solve an effector constraint, you will also need to put an effector constraint in your scene. To solve the inverse problem, you must use an inverse problem solver component (for exemple QPInverseProblemSolver) and put it on the top of the scene graph.

rootNode.createObject('QPInverseProblemSolver', printLog='0')
(...)

#goal
goal = rootNode.createChild('goal')
goal.createObject('EulerImplicit', firstOrder='1')
goal.createObject('CGLinearSolver', iterations='100')
goal.createObject('MechanicalObject', name='goalMO', position='-4. 1. 3.')
goal.createObject('Sphere', radius='0.25')
goal.createObject('UncoupledConstraintCorrection')
 
#bunny
bunny = rootNode.createChild('bunny')
(...)

#bunny/effector
effector = bunny.createChild('effector')
effector.createObject('MechanicalObject', name="effectorPoint", position="-4. 1. 3.")
effector.createObject('PositionEffector', template='Vec3d', indices="0", effectorGoal="@../../goal/goalMO.position")
effector.createObject('BarycentricMapping', mapForces="false", mapMasses="false")

#bunny/cavity
cavity = bunny.createChild('cavity')
cavity.createObject('MeshObjLoader', name='loader', filename=path+'cavity.obj')
cavity.createObject('Mesh', src='@loader', name='topo')
cavity.createObject('MechanicalObject', name='cavity')
cavity.createObject('SurfacePressureActuator', template='Vec3d', triangles='@topo.triangles', maxPressure='40', minPressure='0')
 cavity.createObject('BarycentricMapping', name='mapping', mapForces='false', mapMasses='false')

An example is provided in the “examples” directory of the plugin.

Special issues

This component exists in two versions, with and without the suffix “GS”. Using the “SurfacePressureActuatorGS” means that you will use the Gauss-Seidel resolution. Thus, the inverse problem solver of your scene must be the “GenericConstraintSolver”. Make sure that the effector used also has the suffix “GS”. In this particular case, the effector component must be set before the actuator in the scene.

Data field

Here are described the data fields corresponding to this particular component.

Input data 

triangles/quads List of triangles/quads on which the pressure is applied. If no list is given (i.e no triangles and no quads), the component will fill the two lists with the context topology.
maxPressure Corresponds to the constraint 0 ≤ λ ≤ λmax. If no value is set by the user, no constraint on λ will be considered. Note that the force λ is constrained to be positive.
maxVolumeGrowth  Correspond to the constraints δ = Waaλ + δfree ≤ δmax where δ represents the volume growth of the cavity. If no value is set by the user, no limit will be considered.
visualization If set to true, the value of the pressure will be displayed in the scene.
showVisuScale Scale for visualization.

Output data

initialCavityVolume  Volume of the cavity at the initial step (only relevant if the mesh is closed).
cavityVolume  Volume of the cavity at the end of the time step (only relevant if the mesh is closed).
pressure  Resulting pressure λ.
volumeGrowth Resulting volume growth δ = Waaλ + δfree with respect to the initial state.
sendValues
(GS case) 
Computed values to be sent to the real actuator. For now, this output is specific to the control of PressureCylinderRobot.

 

 

 

 

 

Comments are closed.