Thank you, Radu.
Your example file helped me a lot in modeling my mechanism. However, the collision is still not working, and I’m not sure whether it’s a bug or if I’m not handling it correctly.
Here is my code:
```
import pychrono as chrono
import pychrono.irrlicht as chronoirr
import math
FORCE = 10
MASS = 1
INERTIA = 1
SAFE_MARGIN = 0
sys = chrono.ChSystemNSC()
sys.SetCollisionSystemType(chrono.ChCollisionSystem.Type_BULLET)
# chrono.ChCollisionModel.SetDefaultSuggestedEnvelope(1)
# chrono.ChCollisionModel.SetDefaultSuggestedMargin(1)
contact_mat = chrono.ChContactMaterialNSC()
# Create the ground body
ground = chrono.ChBody()
ground.SetFixed(True)
sys.Add(ground)
# BODY 1
local_origin = chrono.ChVector3d(0, 0, 0)
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)
Rr = 0.81823296
# BODY 2
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)
Rp = 17
body2_arc_start = 134.128 * chrono.CH_DEG_TO_RAD
body2_arc_end = 150.532 * chrono.CH_DEG_TO_RAD
# BODY 3
body3_pivot = chrono.ChVector3d(-2.22722111, -60.06300000, 0)
body3_armA_end = chrono.ChVector3d(5.98395158, 21.89565732, 0)
body3_armB_end = chrono.ChVector3d(-24.06887303, -12.10667160, 0)
Rl = 2
# --- 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.EnableCollision(True)
sys.Add(body1)
body1_path = chrono.ChLinePath()
body1_path.SetClosed(False)
body1_cir1 = chrono.ChLineArc(chrono.ChCoordsysd(body1_armB_end), Rr, 0, chrono.CH_2PI, True)
body1_path.AddSubLine(body1_cir1)
body1_coll = chrono.ChCollisionShapePath2D(contact_mat, body1_path)
body1.AddCollisionShape(body1_coll, chrono.ChFramed())
body1.GetCollisionModel().SetSafeMargin(SAFE_MARGIN)
body1_asset = chrono.ChVisualShapeLine()
body1_asset.SetLineGeometry(body1_path)
body1.AddVisualShape(body1_asset)
body1_arm1 = chrono.ChLineSegment(local_origin, body1_armA_end)
body1_arm2 = chrono.ChLineSegment(local_origin, body1_armB_end)
body1_arm_coll1 = chrono.ChCollisionShapeSegment2D(contact_mat, body1_arm1, 0.2)
body1_arm_coll2 = chrono.ChCollisionShapeSegment2D(contact_mat, body1_arm2, 0.2)
body1_arm1_vis = chrono.ChVisualShapeLine()
body1_arm1_vis.SetLineGeometry(body1_arm1)
body1.AddVisualShape(body1_arm1_vis)
body1_arm2_vis = chrono.ChVisualShapeLine()
body1_arm2_vis.SetLineGeometry(body1_arm2)
body1.AddVisualShape(body1_arm2_vis)
body1_revolute = chrono.ChLinkLockRevolute()
mframe = chrono.ChFramed(body1_axis_sys.GetPos(), chrono.QUNIT)
body1_revolute.Initialize(body1, ground, mframe)
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)
sys.Add(body1_revolute)
force_on_body1 = chrono.ChForce()
body1.AddForce(force_on_body1)
force_on_body1.SetMode(chrono.ChForce.FORCE)
force_on_body1.SetDir(chrono.ChVector3d(1, 0, 0))
force_on_body1.SetVrelpoint(body1_armA_end)
force_on_body1.SetMforce(FORCE)
# -------------- BODY 2 -----------------
body2_axis_sys = chrono.ChFramed(chrono.ChCoordsysd(body2_pivot, chrono.QUNIT))
body2 = chrono.ChBody()
body2.SetPos(body2_axis_sys.GetPos())
body2.SetFixed(False)
body2.EnableCollision(True)
sys.Add(body2)
body2_path1 = chrono.ChLinePath()
body2_path1.SetClosed(False)
body2_arc1 = chrono.ChLineArc(chrono.ChCoordsysd(local_origin), Rp, body2_arc_start, body2_arc_end, True)
body2_path1.AddSubLine(body2_arc1)
body2_coll1 = chrono.ChCollisionShapePath2D(contact_mat, body2_path1)
body2.AddCollisionShape(body2_coll1, chrono.ChFramed())
body2.GetCollisionModel().SetSafeMargin(SAFE_MARGIN)
body2_asset1 = chrono.ChVisualShapeLine()
body2_asset1.SetLineGeometry(body2_path1)
body2.AddVisualShape(body2_asset1)
body2_path2 = chrono.ChLinePath()
body2_path2.SetClosed(False)
body2_arc2 = chrono.ChLineArc(chrono.ChCoordsysd(body2_armA_end), 0.8, 0, chrono.CH_2PI, True)
body2_path2.AddSubLine(body2_arc2)
body2_coll2 = chrono.ChCollisionShapePath2D(contact_mat, body2_path2)
body2.AddCollisionShape(body2_coll2, chrono.ChFramed())
body2.GetCollisionModel().SetSafeMargin(SAFE_MARGIN)
body2_asset2 = chrono.ChVisualShapeLine()
body2_asset2.SetLineGeometry(body2_path2)
body2.AddVisualShape(body2_asset2)
body2_arm2 = chrono.ChLineSegment(local_origin, body2_armB_end)
body2_arm_coll = chrono.ChCollisionShapeSegment2D(contact_mat, body2_arm2, 0.2)
body2_arm2_vis = chrono.ChVisualShapeLine()
body2_arm2_vis.SetLineGeometry(body2_arm2)
body2.AddVisualShape(body2_arm2_vis)
body2_revolute = chrono.ChLinkLockRevolute()
mframe = chrono.ChFramed(body2_axis_sys.GetPos(), chrono.QUNIT)
body2_revolute.Initialize(body2, ground, mframe)
sys.Add(body2_revolute)
# -------------- BODY 3 -----------------
body3_axis_sys = chrono.ChFramed(chrono.ChCoordsysd(body3_pivot, chrono.QUNIT))
body3 = chrono.ChBody()
body3.SetPos(body3_axis_sys.GetPos())
body3.SetFixed(False)
body3.SetAngVelLocal(chrono.ChVector3d(0, 0, -50))
body3.EnableCollision(True)
sys.Add(body3)
body3_path = chrono.ChLinePath()
body3_path.SetClosed(False)
body3_cir1 = chrono.ChLineArc(chrono.ChCoordsysd(body3_armA_end), Rl, 0, chrono.CH_2PI, True)
body3_path.AddSubLine(body3_cir1)
body3_coll = chrono.ChCollisionShapePath2D(contact_mat, body3_path)
body3.AddCollisionShape(body3_coll, chrono.ChFramed())
body3.GetCollisionModel().SetSafeMargin(SAFE_MARGIN)
body3_asset = chrono.ChVisualShapeLine()
body3_asset.SetLineGeometry(body3_path)
body3.AddVisualShape(body3_asset)
body3_arm1 = chrono.ChLineSegment(local_origin, body3_armA_end)
body3_arm2 = chrono.ChLineSegment(local_origin, body3_armB_end)
body3_arm_coll1 = chrono.ChCollisionShapeSegment2D(contact_mat, body3_arm1, 0.2)
body3_arm_coll2 = chrono.ChCollisionShapeSegment2D(contact_mat, body3_arm2, 0.2)
body3_arm1_vis = chrono.ChVisualShapeLine()
body3_arm1_vis.SetLineGeometry(body3_arm1)
body3.AddVisualShape(body3_arm1_vis)
body3_arm2_vis = chrono.ChVisualShapeLine()
body3_arm2_vis.SetLineGeometry(body3_arm2)
body3.AddVisualShape(body3_arm2_vis)
body3_revolute = chrono.ChLinkLockRevolute()
mframe = chrono.ChFramed(body3_axis_sys.GetPos(), chrono.QUNIT)
body3_revolute.Initialize(body3, ground, mframe)
sys.Add(body3_revolute)
# -------------- Visualization -----------------
vis = chronoirr.ChVisualSystemIrrlicht()
vis.AttachSystem(sys)
vis.SetWindowSize(1024, 768)
vis.SetWindowTitle("Test")
vis.SetBackgroundColor(chrono.ChColor(0.1, 0.2, 0.3))
vis.Initialize()
vis.AddCamera(chrono.ChVector3d(0, 0, 80))
vis.AddTypicalLights()
vis.EnableAbsCoordsysDrawing(True)
vis.EnableBodyFrameDrawing(True)
vis.EnableFullscreen(True)
# Simulation loop
while vis.Run():
vis.BeginScene()
vis.Render()
vis.EndScene()
sys.DoStepDynamics(1e-3)
```