// ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- void ChTrackShoeSinglePin::Connect(std::shared_ptr<ChTrackShoe> next) { ChVector<> loc = m_shoe->TransformPointLocalToParent(ChVector<>(GetPitch() / 2, 0, 0)); if (m_index == 0) { // Create and initialize a point-line joint (sliding line along X) ChQuaternion<> rot = m_shoe->GetRot() * Q_from_AngZ(CH_C_PI_2); auto pointline = std::make_shared<ChLinkLockPointLine>(); pointline->SetNameString(m_name + "_pointline"); pointline->Initialize(m_shoe, next->GetShoeBody(), ChCoordsys<>(loc, rot)); m_shoe->GetSystem()->AddLink(pointline); } else { // Create and initialize the revolute joint (rotation axis along Z) ChQuaternion<> rot = m_shoe->GetRot() * Q_from_AngX(CH_C_PI_2); auto revolute = std::make_shared<ChLinkLockRevolute>(); revolute->SetNameString(m_name + "_revolute"); revolute->Initialize(m_shoe, next->GetShoeBody(), ChCoordsys<>(loc, rot)); m_shoe->GetSystem()->AddLink(revolute); } }
// ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- void ChLinearDamperRWAssembly::Initialize(std::shared_ptr<ChBodyAuxRef> chassis, const ChVector<>& location) { // Express the suspension reference frame in the absolute coordinate system. ChFrame<> susp_to_abs(location); susp_to_abs.ConcatenatePreTransformation(chassis->GetFrame_REF_to_abs()); // Transform all points and directions to absolute frame. std::vector<ChVector<> > points(NUM_POINTS); for (int i = 0; i < NUM_POINTS; i++) { ChVector<> rel_pos = GetLocation(static_cast<PointId>(i)); points[i] = susp_to_abs.TransformPointLocalToParent(rel_pos); } // Create the trailing arm body. The reference frame of the arm body has its // x-axis aligned with the line between the arm-chassis connection point and // the arm-wheel connection point. ChVector<> y_dir = susp_to_abs.GetA().Get_A_Yaxis(); ChVector<> u = susp_to_abs.GetPos() - points[ARM_CHASSIS]; u.Normalize(); ChVector<> w = Vcross(u, y_dir); w.Normalize(); ChVector<> v = Vcross(w, u); ChMatrix33<> rot; rot.Set_A_axis(u, v, w); m_arm = std::shared_ptr<ChBody>(chassis->GetSystem()->NewBody()); m_arm->SetNameString(m_name + "_arm"); m_arm->SetPos(points[ARM]); m_arm->SetRot(rot); m_arm->SetMass(GetArmMass()); m_arm->SetInertiaXX(GetArmInertia()); chassis->GetSystem()->AddBody(m_arm); // Cache points and directions for arm visualization (expressed in the arm frame) m_pO = m_arm->TransformPointParentToLocal(susp_to_abs.GetPos()); m_pA = m_arm->TransformPointParentToLocal(points[ARM]); m_pAW = m_arm->TransformPointParentToLocal(points[ARM_WHEEL]); m_pAC = m_arm->TransformPointParentToLocal(points[ARM_CHASSIS]); m_pAS = m_arm->TransformPointParentToLocal(points[SHOCK_A]); m_dY = m_arm->TransformDirectionParentToLocal(y_dir); // Create and initialize the revolute joint between arm and chassis. // The axis of rotation is the y axis of the suspension reference frame. m_revolute = std::make_shared<ChLinkLockRevolute>(); m_revolute->SetNameString(m_name + "_revolute"); m_revolute->Initialize(chassis, m_arm, ChCoordsys<>(points[ARM_CHASSIS], susp_to_abs.GetRot() * Q_from_AngX(CH_C_PI_2))); chassis->GetSystem()->AddLink(m_revolute); // Create and initialize the rotational spring torque element. m_spring = std::make_shared<ChLinkRotSpringCB>(); m_spring->SetNameString(m_name + "_spring"); m_spring->Initialize(chassis, m_arm, ChCoordsys<>(points[ARM_CHASSIS], susp_to_abs.GetRot() * Q_from_AngX(CH_C_PI_2))); m_spring->RegisterTorqueFunctor(GetSpringTorqueFunctor()); chassis->GetSystem()->AddLink(m_spring); // Create and initialize the translational shock force element. if (m_has_shock) { m_shock = std::make_shared<ChLinkSpringCB>(); m_shock->SetNameString(m_name + "_shock"); m_shock->Initialize(chassis, m_arm, false, points[SHOCK_C], points[SHOCK_A]); m_shock->RegisterForceFunctor(GetShockForceFunctor()); chassis->GetSystem()->AddLink(m_shock); } // Invoke the base class implementation. This initializes the associated road wheel. // Note: we must call this here, after the m_arm body is created. ChRoadWheelAssembly::Initialize(chassis, location); }
// ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- void ChRoadWheel::Initialize(std::shared_ptr<ChBodyAuxRef> chassis, std::shared_ptr<ChBody> carrier, const ChVector<>& location) { // Express the road wheel reference frame in the absolute coordinate system. ChFrame<> wheel_to_abs(location); wheel_to_abs.ConcatenatePreTransformation(chassis->GetFrame_REF_to_abs()); // Create and initialize the wheel body. m_wheel = std::shared_ptr<ChBody>(chassis->GetSystem()->NewBody()); m_wheel->SetNameString(m_name + "_wheel"); m_wheel->SetPos(wheel_to_abs.GetPos()); m_wheel->SetRot(wheel_to_abs.GetRot()); m_wheel->SetMass(GetWheelMass()); m_wheel->SetInertiaXX(GetWheelInertia()); chassis->GetSystem()->AddBody(m_wheel); // Set wheel contact material properties. switch (m_wheel->GetContactMethod()) { case ChMaterialSurface::NSC: m_wheel->GetMaterialSurfaceNSC()->SetFriction(m_friction); m_wheel->GetMaterialSurfaceNSC()->SetRestitution(m_restitution); break; case ChMaterialSurface::SMC: m_wheel->GetMaterialSurfaceSMC()->SetFriction(m_friction); m_wheel->GetMaterialSurfaceSMC()->SetRestitution(m_restitution); m_wheel->GetMaterialSurfaceSMC()->SetYoungModulus(m_young_modulus); m_wheel->GetMaterialSurfaceSMC()->SetPoissonRatio(m_poisson_ratio); m_wheel->GetMaterialSurfaceSMC()->SetKn(m_kn); m_wheel->GetMaterialSurfaceSMC()->SetGn(m_gn); m_wheel->GetMaterialSurfaceSMC()->SetKt(m_kt); m_wheel->GetMaterialSurfaceSMC()->SetGt(m_gt); break; } // Create and initialize the revolute joint between wheel and carrier. // The axis of rotation is the y axis of the road wheel reference frame. m_revolute = std::make_shared<ChLinkLockRevolute>(); m_revolute->SetNameString(m_name + "_revolute"); m_revolute->Initialize(carrier, m_wheel, ChCoordsys<>(wheel_to_abs.GetPos(), wheel_to_abs.GetRot() * Q_from_AngX(CH_C_PI_2))); chassis->GetSystem()->AddLink(m_revolute); }