From 315439301bc0cfcead8a1d0b9d61c802f49baf0f Mon Sep 17 00:00:00 2001 From: Themis Skamagkis Date: Tue, 21 Oct 2025 15:09:36 +0200 Subject: [PATCH 1/3] [scene] Sync scenes with changes to GenericConstraintSolver in SOFA --- scenes/NeedleInsertion.py | 2 +- scenes/NeedleInsertionCycles.py | 2 +- scenes/NeedleInsertionHaptics.py | 36 +++++++++++++++++++++++--------- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/scenes/NeedleInsertion.py b/scenes/NeedleInsertion.py index 82dd58ef..048216f6 100644 --- a/scenes/NeedleInsertion.py +++ b/scenes/NeedleInsertion.py @@ -60,7 +60,7 @@ def createScene(root): root.addObject("ConstraintAttachButtonSetting") root.addObject("VisualStyle", displayFlags="showVisualModels hideBehaviorModels showCollisionModels hideMappings hideForceFields showWireframe showInteractionForceFields" ) root.addObject("FreeMotionAnimationLoop") - root.addObject("GenericConstraintSolver", tolerance=1e-5, maxIt=5000) + root.addObject("ProjectedGaussSeidelConstraintSolver", tolerance=1e-5, maxIt=5000) root.addObject("CollisionLoop") needleBaseMaster = root.addChild("NeedleBaseMaster") diff --git a/scenes/NeedleInsertionCycles.py b/scenes/NeedleInsertionCycles.py index 1e3656dc..e245e1f5 100644 --- a/scenes/NeedleInsertionCycles.py +++ b/scenes/NeedleInsertionCycles.py @@ -60,7 +60,7 @@ def createScene(root): root.addObject("ConstraintAttachButtonSetting") root.addObject("VisualStyle", displayFlags="showVisualModels hideBehaviorModels showCollisionModels hideMappings hideForceFields showWireframe showInteractionForceFields" ) root.addObject("FreeMotionAnimationLoop") - root.addObject("GenericConstraintSolver", tolerance=0.00001, maxIt=5000, printLog=False, computeConstraintForces=True) + root.addObject("ProjectedGaussSeidelConstraintSolver", tolerance=0.00001, maxIt=5000, printLog=False, computeConstraintForces=True) root.addObject("CollisionLoop") needleBaseMaster = root.addChild("NeedleBaseMaster") diff --git a/scenes/NeedleInsertionHaptics.py b/scenes/NeedleInsertionHaptics.py index f3ea9a72..19e01849 100644 --- a/scenes/NeedleInsertionHaptics.py +++ b/scenes/NeedleInsertionHaptics.py @@ -1,6 +1,6 @@ import Sofa -GeomagicActive = False +GeomagicActive = True g_needleLength=0.200 #(m) g_needleNumberOfElems=40 #(# of edges) @@ -65,7 +65,12 @@ def createScene(root): root.addObject("ConstraintAttachButtonSetting") root.addObject("VisualStyle", displayFlags="showVisualModels hideBehaviorModels showCollisionModels hideMappings hideForceFields showWireframe showInteractionForceFields" ) root.addObject("FreeMotionAnimationLoop") - root.addObject("GenericConstraintSolver", tolerance=0.00001, maxIt=5000, regularizationTerm=0.001) + root.addObject("CollisionPipeline", name='pipeline', depth='6', verbose='0') + root.addObject("BruteForceBroadPhase") + root.addObject("BVHNarrowPhase") + root.addObject("CollisionResponse", name='response', response='FrictionContactConstraint') + root.addObject("LocalMinDistance", name='proximity', alarmDistance='0.1', contactDistance='0.02') + root.addObject("ProjectedGaussSeidelConstraintSolver", tolerance=0.00001, maxIt=5000)#, regularizationTerm=0.001) root.addObject("CollisionLoop") toolController = root.addChild("ToolController") @@ -124,6 +129,8 @@ def createScene(root): needleBodyCollision.addObject("MechanicalObject",name="mstate_body", template="Vec3d", drawMode=0, showObject=False, showObjectScale=10) needleBodyCollision.addObject("EdgeGeometry",name="geom_body",mstate="@mstate_body", topology="@Container_body") needleBodyCollision.addObject("EdgeNormalHandler", name="NeedleBeams", geometry="@geom_body") + #needleBodyCollision.addObject("LineCollisionModel", name="volLineColi") + #needleBodyCollision.addObject("PointCollisionModel", name="volPtColi") needleBodyCollision.addObject("IdentityMapping") needleTipCollision = needle.addChild("tipCollision") @@ -157,11 +164,11 @@ def createScene(root): FFCollision = FF.addChild("Collision") FFCollision.addObject("EdgeSetTopologyContainer", name="Container", src="@../../Needle/bodyCollision/Container_body") FFCollision.addObject("MechanicalObject", name="mstate_coli", constraint="@../../Needle/bodyCollision/mstate_body.constraint") - FFCollision.addObject("RigidMapping") - FFTip = FF.addChild("Tip") - FFTip.addObject("PointSetTopologyContainer", name="Container", src="@../../Needle/tipCollision/Container_tip") - FFTip.addObject("MechanicalObject", name="mstate_coli", constraint="@../../Needle/tipCollision/mstate_tip.constraint") - FFTip.addObject("RigidMapping") + FFCollision.addObject("RigidMapping", globalToLocalCoords=True) + #FFTip = FF.addChild("Tip") + #FFTip.addObject("PointSetTopologyContainer", name="Container", src="@../../Needle/tipCollision/Container_tip") + #FFTip.addObject("MechanicalObject", name="mstate_coli", constraint="@../../Needle/tipCollision/mstate_tip.constraint") + #FFTip.addObject("RigidMapping", globalToLocalCoords=True) volume = root.addChild("Volume") volume.addObject("EulerImplicitSolver") @@ -189,6 +196,9 @@ def createScene(root): volumeCollision.addObject("TriangleGeometry", name="geom_tri", mstate="@mstate_gelColi", topology="@TriContainer",draw=False) volumeCollision.addObject("PhongTriangleNormalHandler", name="SurfaceTriangles", geometry="@geom_tri") volumeCollision.addObject("AABBBroadPhase", name="AABBTriangles", thread=1, nbox=[2,2,3], method=2) + #volumeCollision.addObject("TriangleCollisionModel", name="volTriColi") + #volumeCollision.addObject("LineCollisionModel", name="volLineColi") + #volumeCollision.addObject("PointCollisionModel", name="volPtColi") volumeCollision.addObject("IdentityMapping", name="identityMappingToCollision", input="@../mstate_gel", output="@mstate_gelColi", isMechanical=True) @@ -213,13 +223,19 @@ def createScene(root): shaftGeom="@Needle/bodyCollision/geom_body", volGeom="@Volume/geom_tetra", punctureForceThreshold=1., - tipDistThreshold=0.01, + tipDistThreshold=0.02, drawcollision=True, drawPointsScale=0.0001 ) root.addObject("DistanceFilter",algo="@InsertionAlgo",distance=0.02) root.addObject("SecondDirection",name="punctureDirection",handler="@Volume/collision/SurfaceTriangles") root.addObject("ConstraintUnilateral",input="@InsertionAlgo.collisionOutput",directions="@punctureDirection",draw_scale=0.001, mu=0.001) - root.addObject("FirstDirection",name="bindDirection", handler="@Needle/bodyCollision/NeedleBeams") - root.addObject("ConstraintInsertion",input="@InsertionAlgo.insertionOutput", directions="@bindDirection",draw_scale="0.01", frictionCoeff=0.000) + root.addObject("ConstraintInsertion", + input="@InsertionAlgo.insertionOutput", + directions="@bindDirection", + draw_scale="0.01", + frictionCoeff=0.01, + slipForce=0.4, + popForce=0.10 + ) From bd9622529280e7a61d76ae0d75ff8509832a6661 Mon Sep 17 00:00:00 2001 From: Themis Skamagkis Date: Tue, 21 Oct 2025 15:37:36 +0200 Subject: [PATCH 2/3] [scene] Disable Geomagic in scene --- scenes/NeedleInsertionHaptics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scenes/NeedleInsertionHaptics.py b/scenes/NeedleInsertionHaptics.py index 19e01849..70200bc1 100644 --- a/scenes/NeedleInsertionHaptics.py +++ b/scenes/NeedleInsertionHaptics.py @@ -1,6 +1,6 @@ import Sofa -GeomagicActive = True +GeomagicActive = False g_needleLength=0.200 #(m) g_needleNumberOfElems=40 #(# of edges) From cc9f854ec359fbff7623b7ad73cbc11d1245222e Mon Sep 17 00:00:00 2001 From: Themis Skamagkis Date: Tue, 21 Oct 2025 15:55:42 +0200 Subject: [PATCH 3/3] [scene] Remove leftover experimental stuff --- scenes/NeedleInsertionHaptics.py | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/scenes/NeedleInsertionHaptics.py b/scenes/NeedleInsertionHaptics.py index 70200bc1..7da87449 100644 --- a/scenes/NeedleInsertionHaptics.py +++ b/scenes/NeedleInsertionHaptics.py @@ -65,11 +65,6 @@ def createScene(root): root.addObject("ConstraintAttachButtonSetting") root.addObject("VisualStyle", displayFlags="showVisualModels hideBehaviorModels showCollisionModels hideMappings hideForceFields showWireframe showInteractionForceFields" ) root.addObject("FreeMotionAnimationLoop") - root.addObject("CollisionPipeline", name='pipeline', depth='6', verbose='0') - root.addObject("BruteForceBroadPhase") - root.addObject("BVHNarrowPhase") - root.addObject("CollisionResponse", name='response', response='FrictionContactConstraint') - root.addObject("LocalMinDistance", name='proximity', alarmDistance='0.1', contactDistance='0.02') root.addObject("ProjectedGaussSeidelConstraintSolver", tolerance=0.00001, maxIt=5000)#, regularizationTerm=0.001) root.addObject("CollisionLoop") @@ -129,8 +124,6 @@ def createScene(root): needleBodyCollision.addObject("MechanicalObject",name="mstate_body", template="Vec3d", drawMode=0, showObject=False, showObjectScale=10) needleBodyCollision.addObject("EdgeGeometry",name="geom_body",mstate="@mstate_body", topology="@Container_body") needleBodyCollision.addObject("EdgeNormalHandler", name="NeedleBeams", geometry="@geom_body") - #needleBodyCollision.addObject("LineCollisionModel", name="volLineColi") - #needleBodyCollision.addObject("PointCollisionModel", name="volPtColi") needleBodyCollision.addObject("IdentityMapping") needleTipCollision = needle.addChild("tipCollision") @@ -165,10 +158,10 @@ def createScene(root): FFCollision.addObject("EdgeSetTopologyContainer", name="Container", src="@../../Needle/bodyCollision/Container_body") FFCollision.addObject("MechanicalObject", name="mstate_coli", constraint="@../../Needle/bodyCollision/mstate_body.constraint") FFCollision.addObject("RigidMapping", globalToLocalCoords=True) - #FFTip = FF.addChild("Tip") - #FFTip.addObject("PointSetTopologyContainer", name="Container", src="@../../Needle/tipCollision/Container_tip") - #FFTip.addObject("MechanicalObject", name="mstate_coli", constraint="@../../Needle/tipCollision/mstate_tip.constraint") - #FFTip.addObject("RigidMapping", globalToLocalCoords=True) + FFTip = FF.addChild("Tip") + FFTip.addObject("PointSetTopologyContainer", name="Container", src="@../../Needle/tipCollision/Container_tip") + FFTip.addObject("MechanicalObject", name="mstate_coli", constraint="@../../Needle/tipCollision/mstate_tip.constraint") + FFTip.addObject("RigidMapping", globalToLocalCoords=True) volume = root.addChild("Volume") volume.addObject("EulerImplicitSolver") @@ -196,9 +189,6 @@ def createScene(root): volumeCollision.addObject("TriangleGeometry", name="geom_tri", mstate="@mstate_gelColi", topology="@TriContainer",draw=False) volumeCollision.addObject("PhongTriangleNormalHandler", name="SurfaceTriangles", geometry="@geom_tri") volumeCollision.addObject("AABBBroadPhase", name="AABBTriangles", thread=1, nbox=[2,2,3], method=2) - #volumeCollision.addObject("TriangleCollisionModel", name="volTriColi") - #volumeCollision.addObject("LineCollisionModel", name="volLineColi") - #volumeCollision.addObject("PointCollisionModel", name="volPtColi") volumeCollision.addObject("IdentityMapping", name="identityMappingToCollision", input="@../mstate_gel", output="@mstate_gelColi", isMechanical=True) @@ -223,19 +213,13 @@ def createScene(root): shaftGeom="@Needle/bodyCollision/geom_body", volGeom="@Volume/geom_tetra", punctureForceThreshold=1., - tipDistThreshold=0.02, + tipDistThreshold=0.01, drawcollision=True, drawPointsScale=0.0001 ) root.addObject("DistanceFilter",algo="@InsertionAlgo",distance=0.02) root.addObject("SecondDirection",name="punctureDirection",handler="@Volume/collision/SurfaceTriangles") root.addObject("ConstraintUnilateral",input="@InsertionAlgo.collisionOutput",directions="@punctureDirection",draw_scale=0.001, mu=0.001) + root.addObject("FirstDirection",name="bindDirection", handler="@Needle/bodyCollision/NeedleBeams") - root.addObject("ConstraintInsertion", - input="@InsertionAlgo.insertionOutput", - directions="@bindDirection", - draw_scale="0.01", - frictionCoeff=0.01, - slipForce=0.4, - popForce=0.10 - ) + root.addObject("ConstraintInsertion",input="@InsertionAlgo.insertionOutput", directions="@bindDirection",draw_scale="0.01", frictionCoeff=0.000)