sofa
sofa copied to clipboard
How to make a beam collide with other objects
Hello, thank you for good simulator.
I'm using sofa framework with sofapython in python 3.8.19, Ubuntu 20.04.6 LTS and making an environment of catheter in vessel. I want to make some objects in the simulator which interact with catheter.
Therefore, I made a sphere, but it doesn't interact with the catheter. When the catheter contact with the sphere, it doesn't react, but some notice appears on the prompt.
How can I ensure interaction between the catheter and the sphere?
- The video when the catheter touches the sphere. The catheter interacts well with the vessel.
https://github.com/sofa-framework/sofa/assets/144453949/d2a36d11-ffee-4ff8-9898-c25817227aad
- The message when the catheter touches the sphere.
184
[WARNING] [LCPConstraintSolver(LCPConstraintSolver)] No convergence in unbuilt nlcp gaussseidel function : error =5.62447e-05 after 1000 iterations
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
[WARNING] [IntersectorMap] Element Intersector SphereCollisionModel<StdRigidTypes<3u,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> NOT FOUND within : RayCollisionModel-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> nullptr
RayCollisionModel-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> nullptr
RayCollisionModel-SphereCollisionModel<StdRigidTypes<3u,double>> Ray-TSphere<StdRigidTypes<3u,double>>
RayCollisionModel-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> Ray-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
RayCollisionModel-TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> Ray-TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
RayCollisionModel-TetrahedronCollisionModel Ray-Tetrahedron
CubeCollisionModel-CubeCollisionModel Cube-Cube
LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
SphereCollisionModel<StdRigidTypes<3u,double>>-SphereCollisionModel<StdRigidTypes<3u,double>> TSphere<StdRigidTypes<3u,double>>-TSphere<StdRigidTypes<3u,double>>
SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdRigidTypes<3u,double>> TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdRigidTypes<3u,double>>
SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> nullptr
TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> nullptr
TetrahedronCollisionModel-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> Tetrahedron-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
[WARNING] [IntersectorMap] Element Intersector SphereCollisionModel<StdRigidTypes<3u,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> NOT FOUND within : RayCollisionModel-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> nullptr
RayCollisionModel-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> nullptr
RayCollisionModel-SphereCollisionModel<StdRigidTypes<3u,double>> Ray-TSphere<StdRigidTypes<3u,double>>
RayCollisionModel-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> Ray-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
RayCollisionModel-TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> Ray-TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
RayCollisionModel-TetrahedronCollisionModel Ray-Tetrahedron
CubeCollisionModel-CubeCollisionModel Cube-Cube
LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TLine<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
SphereCollisionModel<StdRigidTypes<3u,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> nullptr
SphereCollisionModel<StdRigidTypes<3u,double>>-SphereCollisionModel<StdRigidTypes<3u,double>> TSphere<StdRigidTypes<3u,double>>-TSphere<StdRigidTypes<3u,double>>
SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdRigidTypes<3u,double>> TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdRigidTypes<3u,double>>
SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-LineCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> nullptr
TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-SphereCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> TTriangle<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TSphere<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>-TriangleCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> nullptr
TetrahedronCollisionModel-PointCollisionModel<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>> Tetrahedron-TPoint<StdVectorTypes<Vec<3u,double>,Vec<3u,double>,double>>
208
209
210
211
- My entire code. The vessel file is from here, carotids.stl.
import Sofa
import Sofa
import Sofa.SofaGL
import os
import numpy as np
import pygame
from scipy.spatial.transform import Rotation as R
import time
import PIL.Image
import OpenGL.GL
import OpenGL.GLU
path = os.path.dirname(os.path.abspath(__file__))+'/vessel/'
model = 'phantom'
display_size = (640, 480)
def init_display(root):
"""Initialize OpenGL and pygame.
Parameters:
----------
root: Sofa.Core.Node
Root node of Sofa simulator.
Returns:
-------
None.
"""
pygame.display.init()
pygame.display.set_mode(display_size, pygame.DOUBLEBUF | pygame.OPENGL)
OpenGL.GL.glClear(OpenGL.GL.GL_COLOR_BUFFER_BIT | OpenGL.GL.GL_DEPTH_BUFFER_BIT)
OpenGL.GL.glEnable(OpenGL.GL.GL_LIGHTING)
OpenGL.GL.glEnable(OpenGL.GL.GL_DEPTH_TEST)
Sofa.SofaGL.glewInit()
Sofa.Simulation.initVisual(root)
Sofa.Simulation.initTextures(root)
OpenGL.GL.glMatrixMode(OpenGL.GL.GL_PROJECTION)
OpenGL.GL.glLoadIdentity()
OpenGL.GLU.gluPerspective(45, (display_size[0] / display_size[1]), 0.1, 50.0)
OpenGL.GL.glMatrixMode(OpenGL.GL.GL_MODELVIEW)
OpenGL.GL.glLoadIdentity()
def simple_render(root):
"""Render camera of root onto pygame.
Get the OpenGL Context to render an image (snapshot) of the simulation state
Parameters:
----------
root: Sofa.Core.Node
Root node of Sofa simulator.
Returns:
-------
None.
"""
zNear = 0.1; zFar = 0 # For penetrate infinite view.
OpenGL.GL.glClear(OpenGL.GL.GL_COLOR_BUFFER_BIT | OpenGL.GL.GL_DEPTH_BUFFER_BIT)
OpenGL.GL.glEnable(OpenGL.GL.GL_LIGHTING)
OpenGL.GL.glEnable(OpenGL.GL.GL_DEPTH_TEST)
OpenGL.GL.glMatrixMode(OpenGL.GL.GL_PROJECTION)
OpenGL.GL.glLoadIdentity()
OpenGL.GLU.gluPerspective(45, (display_size[0] / display_size[1]), zNear, zFar)
OpenGL.GL.glMatrixMode(OpenGL.GL.GL_MODELVIEW)
OpenGL.GL.glLoadIdentity()
cameraMVM = root.camera.getOpenGLModelViewMatrix()
OpenGL.GL.glMultMatrixd(cameraMVM)
Sofa.SofaGL.draw(root)
pygame.display.flip()
def GetFrame():
"""
Get frame image as numpy.
Parameters:
----------
kwargs: Dictionary
Initialization of the arguments.
Returns:
-------
image: np.ndarray
"""
buffer = OpenGL.GL.glReadPixels(0, 0, *display_size, OpenGL.GL.GL_RGB, OpenGL.GL.GL_UNSIGNED_BYTE)
image_array = np.fromstring(buffer, np.uint8)
if image_array.shape != (0,):
image = image_array.reshape(display_size[1], display_size[0], 3)
else:
image = np.zeros((display_size[1], display_size[0], 3))
image = np.flipud(image)
return image
def SaveImage(image:np.ndarray, filename:str):
im = PIL.Image.fromarray(image)
im.save(filename)
def createScene(root):
root.addObject('RequiredPlugin', pluginName=['BeamAdapter',
'SofaMiscCollision',
'SofaConstraint',
'SofaImplicitOdeSolver',
'SofaGeneralLinearSolver',
'SofaBoundaryCondition',
'SofaDeformable',
'SofaTopologyMapping',
'SofaOpenglVisual,'
'SofaMeshCollision',
'Sofa.Component.Collision.Detection.Algorithm',
'Sofa.Component.IO.Mesh',
'Sofa.GL.Component.Rendering3D',
'Sofa.GL.Component.Shader'
])
root.addObject('FreeMotionAnimationLoop')
root.addObject('VisualStyle', displayFlags=['showVisualModels',
'showCollisionModels',
])
root.addObject('LCPConstraintSolver', mu='0.1', tolerance='1e-10', maxIt='1000', build_lcp='false')
root.addObject('DefaultPipeline', draw='0', depth='6', verbose='1')
root.addObject('BruteForceBroadPhase', name='N2')
root.addObject('BVHNarrowPhase')
root.addObject('LocalMinDistance', contactDistance='1', alarmDistance='3', name='localmindistance', angleCone='0.02')
root.addObject('DefaultContactManager', name='Response', response='FrictionContactConstraint')
name='guide'
straightLength=980.0
length=1000.0
numEdges=200
youngModulus=20000
spireDiameter=25
numEdgesCollis=[50,10]
spireHeight=0.0
densityOfBeams=[30,5]
youngModulusExtremity=10000
topoLines_guide = root.addChild('topoLines_'+name)
topoLines_guide.addObject('WireRestShape', name=name+'RestShape',
straightLength=straightLength, length=length,
numEdges=numEdges, youngModulus=youngModulus,
spireDiameter=spireDiameter, numEdgesCollis=numEdgesCollis,
printLog=True, template='Rigid3d', spireHeight=spireHeight,
densityOfBeams=densityOfBeams, youngModulusExtremity=youngModulusExtremity)
topoLines_guide.addObject('MechanicalObject', name='dofTopo2', template='Rigid3d')
topoLines_guide.addObject('EdgeSetTopologyContainer', name='meshLinesGuide')
topoLines_guide.addObject('EdgeSetTopologyModifier', name='Modifier')
topoLines_guide.addObject('EdgeSetGeometryAlgorithms', name='GeomAlgo', template='Rigid3d')
xtip=[1, 0, 0]
instruments=['guide']
step=0.5
listening=True
startingPos=[0, 0, 0, 1, 0, 0, 0]
rotationInstrument=[0, 0, 0]
speed=0
controlledInstrument=0
InstrumentCombined = root.addChild('InstrumentCombined')
InstrumentCombined.addObject('EulerImplicitSolver', rayleighStiffness=0.2,
printLog=False, rayleighMass=0.1)
InstrumentCombined.addObject('BTDLinearSolver', verification=False,
subpartSolve=False, verbose=False)
InstrumentCombined.addObject('RegularGridTopology', name='meshLinesCombined',
zmax=1, zmin=1, nx=60, ny=1, nz=1,
xmax=1.0, xmin=0.0, ymin=0, ymax=0)
InstrumentCombined.addObject('MechanicalObject', showIndices=False, name='DOFs', template='Rigid3d', ry=-90)
for i in range(len(instruments)):
InstrumentCombined.addObject('WireBeamInterpolation', WireRestShape='@../topoLines_'+instruments[i]+'/'+instruments[i]+'RestShape',
radius=0.15, printLog=False, name='Interpol'+instruments[i])
InstrumentCombined.addObject('AdaptiveBeamForceFieldAndMass', massDensity=0.00000155,
name=instruments[i]+'ForceField', interpolation='@Interpol'+instruments[i])
InstrumentCombined.addObject('InterventionalRadiologyController', xtip=xtip, name='m_ircontroller',
instruments=['Interpol'+instruments[i] for i in range(len(instruments))],
step=step, printLog=True,
listening=listening, template='Rigid3d', startingPos=startingPos,
rotationInstrument=rotationInstrument, speed=speed,
controlledInstrument=controlledInstrument)
InstrumentCombined.addObject('LinearSolverConstraintCorrection', wire_optimization='true', printLog=False)
InstrumentCombined.addObject('FixedConstraint', indices=0, name='FixedConstraint')
InstrumentCombined.addObject('RestShapeSpringsForceField', points='@m_ircontroller.indexFirstNode',
angularStiffness=1e8, stiffness=1e8)
# Collision model
Collis = InstrumentCombined.addChild('Collis')
#Collis.activated = 'true'
Collis.addObject('EdgeSetTopologyContainer', name='collisEdgeSet')
Collis.addObject('EdgeSetTopologyModifier', name='colliseEdgeModifier')
Collis.addObject('MechanicalObject', name='CollisionDOFs')
Collis.addObject('MultiAdaptiveBeamMapping', controller='../m_ircontroller',
useCurvAbs=True, printLog=False, name='collisMap')
Collis.addObject('LineCollisionModel', proximity=0.0, group=1)
Collis.addObject('PointCollisionModel', proximity=0.0, group=1)
# Visualization Guide
VisuGuide = InstrumentCombined.addChild('VisuGuide')
#VisuGuide.activated = 'true'
VisuGuide.addObject('MechanicalObject', name='Quads')
VisuGuide.addObject('QuadSetTopologyContainer', name='ContainerGuide')
VisuGuide.addObject('QuadSetTopologyModifier', name='Modifier')
VisuGuide.addObject('QuadSetGeometryAlgorithms', name='GeomAlgo', template='Vec3d')
VisuGuide.addObject('Edge2QuadTopologicalMapping', radius='1', listening=True,
input='@../../topoLines_guide/meshLinesGuide',
nbPointsOnEachCircle='10', flipNormals='true', output='@ContainerGuide')
VisuGuide.addObject('AdaptiveBeamMapping', interpolation='@../InterpolGuide',
name='visuMapGuide', output='@Quads', isMechanical=False,
input='@../DOFs', useCurvAbs=True, printLog=True)
TriangleTopology = VisuGuide.addChild('TriangleTopology')
TriangleTopology.addObject('TriangleSetTopologyContainer', name='TriangleContainer')
TriangleTopology.addObject('TriangleSetTopologyModifier', name='Modifier')
TriangleTopology.addObject('TriangleSetGeometryAlgorithms', name='GeomAlgo', template='Vec3d')
TriangleTopology.addObject('Quad2TriangleTopologicalMapping', input='@../ContainerGuide', output='@TriangleContainer')
# Ogl model
VisuOgl = VisuGuide.addChild('VisuOgl')
VisuOgl.addObject('OglModel', color=[0.2, 0.2, 0.8], triangles='@../TriangleTopology/TriangleContainer.triangles',
material='texture Ambient 1 0.2 0.2 0.2 0.0 Diffuse 1 1.0 1.0 1.0 1.0 Specular 1 1.0 1.0 1.0 1.0 Emissive 0 0.15 0.05 0.05 0.0 Shininess 1 20', name='Visual')
VisuOgl.addObject('IdentityMapping', input='@../Quads', output='@Visual')
scale=1.5
rotation=[-40.0, 0.0, 0.0]
stl = 'carotids.stl'
VISUAL = True
vessels = root.addChild('Vessels')
vessels.addObject('MeshSTLLoader', filename=stl, flipNormals=False, triangulate=True, name='meshLoader', scale=scale, rotation=rotation)
vessels.addObject('MeshTopology', position='@meshLoader.position', triangles='@meshLoader.triangles')
vessels.addObject('MechanicalObject', name='DOFs1', scale=1, rotation=rotation)
vessels.addObject('TriangleCollisionModel', moving=False, simulated=False)
vessels.addObject('LineCollisionModel', moving=False, simulated=False)
vessels.addObject('PointCollisionModel', moving=False, simulated=False)
vessels.addObject('OglModel', color=[1, 0, 0, 0.3], src='@meshLoader', name='Visual', rotation=rotation)
# Add a sphere.
newSphere = root.addChild('FixedSphere')
newSphere.addObject('EulerImplicitSolver')
newSphere.addObject('CGLinearSolver', threshold='1e-09', tolerance='1e-09', iterations='200')
MO = newSphere.addObject('MechanicalObject', showObject=True, position=[0, 200, 200, 0, 0, 0, 0], name='Particle', template='Rigid3d')
Mass = newSphere.addObject('UniformMass', totalMass=1)
Force = newSphere.addObject('ConstantForceField', name="CFF", totalForce=[0, 0, 0, 0, 0, 0] )
Sphere = newSphere.addObject('SphereCollisionModel', name="SCM", radius=30.0 )
newSphere.addObject('FixedConstraint', name='FixedConstraint', indices=0)
newSphere.addObject('OglModel', color=[1, 0, 0, 0.3], name='Visual')
# visualizing
source = [-600,0,300]
lookAt = source+np.array([1,0,0])
orientation = [ 0, -0.70710678, 0, 0.70710678]
root.addObject("LightManager")
root.addObject("DirectionalLight", direction=[-1,0,0])
root.addObject('InteractiveCamera', name='camera', position=source,
lookAt=lookAt, orientation=orientation)
if __name__ == "__main__":
# Read real information from real world.
pass
# One simulation for one root. Maybe.
# Create scene and initialize simulation.
root = Sofa.Core.Node("root")
createScene(root)
Sofa.Simulation.init(root)
# Initialize pygame.
init_display(root)
try:
for i in range(10000):
root.InstrumentCombined.m_ircontroller.findData('xtip').value =\
root.InstrumentCombined.m_ircontroller.findData('xtip').value \
+ np.array([2,110,2], dtype=float)
# Calculate simulator one step.
Sofa.Simulation.animate(root, root.dt.value)
Sofa.Simulation.updateVisual(root)
time.sleep(root.dt.value)
# Visualize in pygame.
simple_render(root)
# Save image of pygame.
image = GetFrame()
SaveImage(image, f"screen.jpeg")
print(i)
except KeyboardInterrupt:
pass
How can I ensure interaction between the catheter and the sphere?