2D Collision not Working in Pychrono

21 views
Skip to first unread message

Siddharth L

unread,
Oct 7, 2025, 4:45:42 AM (22 hours ago) Oct 7
to ProjectChrono
Hi All,

I'm with simple two level MBD Mechanism, In that 2D Collision is not working.
I not sure it due bug or, I'm not handling it properly. Kindly help me to resolve this issue.

Code :
```
import pychrono.core as chrono
import pychrono.irrlicht as chronoirr


# --- SYSTEM & MATERIALS ---
sys = chrono.ChSystemNSC()
mat = chrono.ChContactMaterialNSC()
sys.SetGravitationalAcceleration(chrono.ChVector3d(0, 0, 0))

# --- KEY REFERENCE POINTS (GENERIC NAMES) ---
# BODY 1 (main rotating body)
body1_pivot = chrono.ChVector3d(0, 13.692, 0)
body1_armA_end = chrono.ChVector3d(0, -13.692, 0)
body1_armB_end = chrono.ChVector3d(-12.74229169, -25.36073728, 0)

# BODY 2 (secondary body)
body2_pivot = chrono.ChVector3d(1.40186, -22.50787380, 0)
body2_armA_end = chrono.ChVector3d(-11.27933961, 11.62809944, 0)
body2_armB_end = chrono.ChVector3d(5.64177978, -19.92728796, 0)

# --- STATIC REFERENCE BODY ---
staticbody = chrono.ChBody()
staticbody.SetFixed(True)
staticbody.SetPos(chrono.ChVector3d(0, 0, 0))
sys.Add(staticbody)
# --- BODY 1 SETUP ---
body1_axis_sys = chrono.ChFramed(chrono.ChCoordsysd(body1_pivot, chrono.QUNIT))

body1 = chrono.ChBody()
body1.SetPos(body1_axis_sys.GetPos())
body1.SetFixed(False)
body1.SetMass(1)
body1.SetInertiaXX(chrono.ChVector3d(1e3, 1e3, 1e3))
body1.EnableCollision(True)

# Collision shape on BODY 1 (a small cylinder located at armB end)
body1_contact_cyl = chrono.ChCollisionShapeCylinder(mat, 0.81823296, 0.1)
body1.AddCollisionShape(body1_contact_cyl, chrono.ChFramed(body1_armB_end, chrono.QUNIT))
sys.Add(body1)

# Visual cylinder at the same place
body1_vis_cyl = chrono.ChVisualShapeCylinder(0.81823296, 0.1)
body1.AddVisualShape(body1_vis_cyl, chrono.ChFramed(body1_armB_end, chrono.QUNIT))

# Visualize BODY 1 arms (lines from pivot-local origin to endpoints)
local_body1_armA_end = chrono.ChVector3d(0, -13.692, 0)
local_body1_armB_end = chrono.ChVector3d(-12.74229169, -25.36073728, 0)

body1_armA_visual = chrono.ChVisualShapeLine()
body1_armA_visual.SetColor(chrono.ChColor(0.1, 0.9, 0.1))
body1_armA_visual.SetLineGeometry(chrono.ChLineSegment(chrono.ChVector3d(0, 0, 0), local_body1_armA_end))

body1_armB_visual = chrono.ChVisualShapeLine()
body1_armB_visual.SetColor(chrono.ChColor(0.1, 0.9, 0.1))
body1_armB_visual.SetLineGeometry(chrono.ChLineSegment(chrono.ChVector3d(0, 0, 0), local_body1_armB_end))

body1.AddVisualShape(body1_armA_visual)
body1.AddVisualShape(body1_armB_visual)

# Revolute joint for BODY 1 at body1_pivot
body1_revolute = chrono.ChLinkLockRevolute()
mframe = chrono.ChFramed(body1_pivot, chrono.QUNIT)
body1_revolute.Initialize(body1, staticbody, mframe)
sys.Add(body1_revolute)
min_angle = 0 * chrono.CH_DEG_TO_RAD
max_angle = 270 * chrono.CH_DEG_TO_RAD
body1_revolute.LimitRz().SetActive(True)
body1_revolute.LimitRz().SetMin(min_angle)
body1_revolute.LimitRz().SetMax(max_angle)

# Applied force/torque on BODY 1
body1_force = chrono.ChForce()
body1.AddForce(body1_force)
body1_force.SetMode(chrono.ChForce.FORCE)
body1_force.SetDir(chrono.ChVector3d(1, 0, 0))
body1_force.SetVrelpoint(body1_armA_end)
body1_force.SetMforce(5)  # magnitude

# --- BODY 2 SETUP ---
body2 = chrono.ChBody()
body2.SetPos(body2_pivot)  # Center of mass
body2.SetFixed(False)
body2.SetInertiaXX(chrono.ChVector3d(1e3, 1e3, 1e3))
body2.EnableCollision(True)
body2.SetMass(1)
sys.AddBody(body2)

# Revolute joint for BODY 2 at body2_pivot
body2_revolute = chrono.ChLinkLockRevolute()
mframe = chrono.ChFramed(body2_pivot, chrono.QUNIT)
body2_revolute.Initialize(staticbody, body2, mframe)
sys.Add(body2_revolute)
min_angle = 90 * chrono.CH_DEG_TO_RAD
max_angle = 180 * chrono.CH_DEG_TO_RAD
body2_revolute.LimitRz().SetActive(True)
body2_revolute.LimitRz().SetMin(min_angle)
body2_revolute.LimitRz().SetMax(max_angle)

# Contact material (for 2D arc + cylinder on body2)
contact_mat = chrono.ChContactMaterialNSC()
contact_mat.SetFriction(0.4)
contact_mat.SetRestitution(0.1)

# BODY 2: 2D arc shape (collision + visual)
center = chrono.ChCoordsysd(chrono.ChVector3d(0, 0, 0))
radius = 17
angle_start = 134.128 * chrono.CH_DEG_TO_RAD
angle_end = 142.532 * chrono.CH_DEG_TO_RAD

arc = chrono.ChLineArc(center, radius, angle_start, angle_end, True)
arc_shape = chrono.ChCollisionShapeArc2D(contact_mat, arc, radius)
body2.AddCollisionShape(arc_shape)

body2_arc_visual = chrono.ChVisualShapeLine()
body2_arc_visual.SetColor(chrono.ChColor(0.9, 0.1, 0.1))
body2_arc_visual.SetLineGeometry(arc)
body2.AddVisualShape(body2_arc_visual)

# BODY 2 arms (visual)
body2_armB_visual = chrono.ChVisualShapeLine()
body2_armB_visual.SetColor(chrono.ChColor(0.1, 0.9, 0.1))
body2_armB_visual.SetLineGeometry(chrono.ChLineSegment(chrono.ChVector3d(0, 0, 0), body2_armB_end))
body2.AddVisualShape(body2_armB_visual)

# BODY 2 cylinder contact + visual at armA end
body2_contact_cyl = chrono.ChCollisionShapeCylinder(mat, 0.8, 0.1)
body2.AddCollisionShape(body2_contact_cyl, chrono.ChFramed(body2_armA_end, chrono.QUNIT))

body2_vis_cyl = chrono.ChVisualShapeCylinder(0.81823296, 0.1)
body2.AddVisualShape(body2_vis_cyl, chrono.ChFramed(body2_armA_end, chrono.QUNIT))

# Applied force/torque on BODY 2
body2_force = chrono.ChForce()
body2.AddForce(body2_force)
body2_force.SetMode(chrono.ChForce.FORCE)
body2_force.SetDir(chrono.ChVector3d(1, 0, 0))
body2_force.SetVrelpoint(body2_armB_end)
body2_force.SetMforce(5)

# --- VISUALIZATION & SIMULATION LOOP ---
vis = chronoirr.ChVisualSystemIrrlicht()
vis.AttachSystem(sys)
vis.SetWindowSize(1024, 768)
vis.SetWindowTitle('Two-Body Mechanism ')
vis.Initialize()
# vis.SetBackgroundColor(chrono.ChColor(1, 1, 1))
vis.AddCamera(chrono.ChVector3d(0, 0, 60))
vis.AddTypicalLights()
vis.EnableAbsCoordsysDrawing(True)
vis.EnableLinkFrameDrawing(True)

while vis.Run():
    vis.BeginScene()
    vis.Render()
    vis.EndScene()
    sys.DoStepDynamics(1e-3)


```
Reply all
Reply to author
Forward
0 new messages