

{"id":715,"date":"2016-10-03T13:19:13","date_gmt":"2016-10-03T13:19:13","guid":{"rendered":"http:\/\/project.inria.fr\/softrobot\/?page_id=715"},"modified":"2017-07-28T08:40:13","modified_gmt":"2017-07-28T08:40:13","slug":"forcepointactuator","status":"publish","type":"page","link":"https:\/\/project.inria.fr\/softrobot\/forcepointactuator\/","title":{"rendered":"ForcePointActuator"},"content":{"rendered":"<h1><strong>General description<\/strong><\/h1>\n<p>This component is used to solve an effector constraint by applying a force on a given point of a model.<\/p>\n<div id=\"attachment_781\" style=\"width: 312px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-781\" class=\"wp-image-781\" src=\"http:\/\/project.inria.fr\/softrobot\/files\/2016\/10\/Tissues.gif\" alt=\"\" width=\"302\" height=\"217\" \/><p id=\"caption-attachment-781\" class=\"wp-caption-text\">Simulation of two colliding soft bodies. We control the position (white sphere) of a point of the red body by applying a force on the brown one.<\/p><\/div>\n<h1><strong>Methods description<\/strong><\/h1>\n<p><strong>Requirement<\/strong>:\u00a0<a href=\"http:\/\/project.inria.fr\/softrobot\/documentation\/real-time-inverse-simulation-method\/\">Real time inverse simulation method<\/a><\/p>\n<p><strong>Method<\/strong><\/p>\n<p>Here, the constraint matrix J will contain the given direction of the force in the rows corresponding to the given point of the model, and\u00a0\u03bb will represent the intensity of the applied force.<\/p>\n<h1><strong>How to use the component<\/strong><\/h1>\n<p>To learn how to create a SOFA scene, please refer to the tutorial provided by the SOFA Modeler or <a href=\"https:\/\/www.sofa-framework.org\/community\/doc\/using-sofa\/write-a-scene-in-xml\/\">this<\/a>\u00a0documentation.<br \/>\nAn example is provided in the &#8220;examples&#8221; directory of the plugin. Let&#8217;s consider this deformable object:<\/p>\n<pre>skin = rootNode.createChild('skin')\r\nskin.createObject('EulerImplicit', name='odesolver')\r\nskin.createObject('SparseLDLSolver', name='preconditioner')\r\n\r\nskin.createObject('MeshVTKLoader', name='loader', filename=path+'skin.vtk')\r\nskin.createObject('TetrahedronSetTopologyContainer', src='@loader', name='container')\r\nskin.createObject('TetrahedronSetTopologyModifier')\r\nskin.createObject('TetrahedronSetTopologyAlgorithms')\r\nskin.createObject('TetrahedronSetGeometryAlgorithms')\r\n\r\nskin.createObject('MechanicalObject', name='tetras', showIndices='false', showIndicesScale='4e-5')\r\nskin.createObject('UniformMass', totalmass='0.03')\r\nskin.createObject('TetrahedronFEMForceField', name='FEM', method='large', poissonRatio='0.3', youngModulus='180', drawAsEdges=\"1\")\r\n...\r\nskin.createObject('LinearSolverConstraintCorrection', solverName='preconditioner')\r\n<\/pre>\n<p>You can define the positions on which you want to apply the force and map these position to the deformable object by creating a child node and using a &#8220;Mapping&#8221; component:<\/p>\n<pre>pointForce = skin.createChild('pointForce')\r\npointForce.createObject('MechanicalObject', position=\"72 68 -2 70 70 2 70 70 0\")\r\npointForce.createObject('ForcePointActuator', triangles='@topo.triangles', direction=\"-1 -1 0\", indices=\"0 1 2\", maxForce=\"90\", minForce=\"0\", maxForceVariation=\"5\")\r\npointForce.createObject('BarycentricMapping', name='mapping', mapForces='false', mapMasses='false')<\/pre>\n<p>The direction of the force is specified by the user. By using an &#8220;Effector&#8221; component and the &#8220;QPInverseProblemSolver&#8221; you can solve the inverse problem of finding the right force to apply to solve the effector target.<\/p>\n<h1 align=\"left\"><strong>Data field<\/strong><\/h1>\n<p>Here are described the data fields corresponding to this particular component.<\/p>\n<h2><strong><span style=\"color: #999999;\">Input data<\/span><\/strong><\/h2>\n<p align=\"left\"><strong>indices<\/strong>\u00a0:\u00a0Index of the point of the model on which we want to apply the force.<\/p>\n<p align=\"left\"><strong>maxForce<\/strong>\u00a0<strong>\/minForce<\/strong>: Correspond to the constrainst \u03bb<sub>min<\/sub>\u00a0\u2264 \u03bb\u00a0\u2264\u00a0\u03bb<sub>max<\/sub> where \u03bb represents the force.\u00a0If no values are set by the user, no constraint on \u03bb\u00a0will be considered. Note that the force is constrained to be positive.<\/p>\n<p align=\"left\"><b>maxForceVariation: <\/b>Maximum variation of the force\u00a0allowed. If not set, no max variation will be concidered.<\/p>\n<p align=\"left\"><strong>direction<\/strong>:\u00a0Direction of the force we want to apply.<\/p>\n<h2 align=\"left\"><strong><span style=\"color: #999999;\">Output data<\/span><\/strong><\/h2>\n<p><strong>displacement : <\/strong>Displacement achieved at the end of the time step compared to initial state.\u00a0\u03b4\u00a0= W<sub>aa<\/sub>\u03bb +\u00a0\u03b4<sup>free<\/sup><\/p>\n<p><strong>force <\/strong>: The force\u00a0\u03bb\u00a0applied at the end of the time step.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>General description This component is used to solve an effector constraint by applying a force on a given point of a model. Methods description Requirement:\u00a0Real time inverse simulation method Method Here, the constraint matrix J will contain the given direction of the force in the rows corresponding to the given\u2026<\/p>\n<p> <a class=\"continue-reading-link\" href=\"https:\/\/project.inria.fr\/softrobot\/forcepointactuator\/\"><span>Continue reading<\/span><i class=\"crycon-right-dir\"><\/i><\/a> <\/p>\n","protected":false},"author":850,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-715","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/project.inria.fr\/softrobot\/wp-json\/wp\/v2\/pages\/715","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/project.inria.fr\/softrobot\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/project.inria.fr\/softrobot\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/project.inria.fr\/softrobot\/wp-json\/wp\/v2\/users\/850"}],"replies":[{"embeddable":true,"href":"https:\/\/project.inria.fr\/softrobot\/wp-json\/wp\/v2\/comments?post=715"}],"version-history":[{"count":6,"href":"https:\/\/project.inria.fr\/softrobot\/wp-json\/wp\/v2\/pages\/715\/revisions"}],"predecessor-version":[{"id":827,"href":"https:\/\/project.inria.fr\/softrobot\/wp-json\/wp\/v2\/pages\/715\/revisions\/827"}],"wp:attachment":[{"href":"https:\/\/project.inria.fr\/softrobot\/wp-json\/wp\/v2\/media?parent=715"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}