I am currently trying to simulate a climbing robot, for this I need to set 
up the arms which are built from actuated joints (with motors) and passive 
actuated joints (spring loaded). When using 4 TSDA-Links (spring coef is 
5000) and a universal joint built by defining a generic joint( allowing two 
rotational dofs),  there is an unexpected movement (in the simulation there 
are translational movements visible). I want to attach moveable grippers to 
the end effector and the main body be movable as well. The TSDA needs to be 
stiff. I am using Solver BB and for the Time stepper 
EULER_IMPLICIT_LINEARIZED. How can avoid this jumping motion, is there an 
solver time stepper setup for most accurate results.

Best regards from LUT

Jakob

-- 
You received this message because you are subscribed to the Google Groups 
"ProjectChrono" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/projectchrono/04aa6e91-a625-475d-aeca-106d288dd019n%40googlegroups.com.
#include "chrono/physics/ChSystemNSC.h"
#include "chrono/physics/ChSystemSMC.h"
#include "chrono/physics/ChBodyEasy.h"
#include "chrono/physics/ChBody.h"
#include "chrono/physics/ChLinkMate.h"
#include "chrono/physics/ChLinkRSDA.h"
#include "chrono/physics/ChLinkMotorRotationSpeed.h"
#include "chrono/physics/ChLinkMotorLinearPosition.h"
#include "chrono/physics/ChLinkMotorRotationAngle.h"
#include "chrono/physics/ChLinkMotorLinearForce.h"
#include <vector>
#include <cstdio>
#include <cmath>
#include <string>
#include "chrono/assets/ChVisualShapeTriangleMesh.h"
#include "chrono_irrlicht/ChVisualSystemIrrlicht.h"
#include "chrono/core/ChRealtimeStep.h"
#include <chrono/solver/ChSolverBB.h>
#include "chrono/geometry/ChTriangleMeshConnected.h"
using namespace chrono;
using namespace chrono::irrlicht;
using namespace irr;
double sphereswept_r = 0.001;
bool draw_coll_shapes = true;
ChVisualSystem::Type vis_type = ChVisualSystem::Type::IRRLICHT;
ChContactMethod contact_method = ChContactMethod::NSC;
ChCollisionSystem::Type collision_type = ChCollisionSystem::Type::BULLET;
void get_body_add(std::shared_ptr<ChBodyAuxRef>& body, std::string name, 
ChFramed frame, ChFramed frame_COM, std::string link_vis, std::string 
link_collision, double mass, chrono::ChVector3d InertiaXX, chrono::ChVector3d 
InertXY, std::shared_ptr<chrono::ChContactMaterialNSC> mat_1, bool colison) {
        std::cout << "2" << " " << "\n";
        std::shared_ptr<chrono::ChVisualShapeModelFile> body_shape;
        chrono::ChMatrix33<> mr;
        body = chrono_types::make_shared<ChBodyAuxRef>();
        body->SetName(name); std::cout << "2" << " " << "\n";
        body->SetPos(frame.GetPos());
        body->SetRot(frame.GetRot());

        body->SetMass(mass);
        body->SetInertiaXX(InertiaXX);
        body->SetInertiaXY(InertXY);
        body->SetFrameCOMToRef(frame_COM);
        std::cout << "2" << " " << "\n";

        body_shape = 
chrono_types::make_shared<chrono::ChVisualShapeModelFile>();
        body_shape->SetFilename(link_vis);
        body->AddVisualShape(body_shape, chrono::ChFramed(chrono::ChVector3d(0, 
0, 0), chrono::ChQuaternion<>(1, 0, 0, 0)));
        std::cout << "2" << " " << "\n";

        // Collision Model
        
body->AddCollisionModel(chrono_types::make_shared<chrono::ChCollisionModel>());

        // Collision material

        // Collision shape
        std::shared_ptr<chrono::ChCollisionShape> collshape_1;

        // Triangle mesh collision shape
        //auto body_1_1_collision_mesh = 
chrono_types::make_shared<chrono::ChTriangleMeshConnected>();
        //body_1_1_collision_mesh->LoadWavefrontMesh(link_vis, false, true);
        auto body_1_1_collision_mesh = 
ChTriangleMeshConnected::CreateFromWavefrontFile(link_collision,
                false, true);
        mr(0, 0) = 1; mr(1, 0) = 0; mr(2, 0) = 0;
        mr(0, 1) = 0; mr(1, 1) = 1; mr(2, 1) = 0;
        mr(0, 2) = 0; mr(1, 2) = 0; mr(2, 2) = 1;
        body_1_1_collision_mesh->Transform(chrono::ChVector3d(0, 0, 0), 
ChMatrix33<>(1));
        collshape_1 = 
chrono_types::make_shared<chrono::ChCollisionShapeTriangleMesh>(mat_1, 
body_1_1_collision_mesh, false, false, sphereswept_r);
        body->GetCollisionModel()->AddShape(collshape_1);
        body->EnableCollision(colison);

        // Visualization shape

}

// Drawer for collision shapes
class DebugDrawer : public ChCollisionSystem::VisualizationCallback {
public:
        explicit DebugDrawer(ChVisualSystemIrrlicht* vis) : m_vis(vis) {}
        ~DebugDrawer() {}

        virtual void DrawLine(const ChVector3d& from, const ChVector3d& to, 
const ChColor& color) override {
                
m_vis->GetVideoDriver()->draw3DLine(irr::core::vector3dfCH(from), 
irr::core::vector3dfCH(to),
                        irr::video::SColor(255, 55, 55, 255));
        }

        virtual double GetNormalScale() const override { return 1.0; }

        void Draw(int flags, bool use_zbuffer = true) {
                m_vis->GetVideoDriver()->setTransform(irr::video::ETS_WORLD, 
irr::core::matrix4());
                irr::video::SMaterial mattransp;
                mattransp.ZBuffer = use_zbuffer;
                mattransp.Lighting = false;
                m_vis->GetVideoDriver()->setMaterial(mattransp);

                m_vis->GetSystem(0).GetCollisionSystem()->Visualize(flags);
        }

private:
        ChVisualSystemIrrlicht* m_vis;
};

void gym() {
    // Create a Chrono system
    ChSystemNSC sys;
    ChCollisionModel::SetDefaultSuggestedEnvelope(0.001);
    ChCollisionModel::SetDefaultSuggestedMargin(0.001);
        sys.SetCollisionSystemType(collision_type);
    auto material = chrono_types::make_shared<ChContactMaterialNSC>();
        auto floor = chrono_types::make_shared<ChBodyEasyBox>(8, 0.3, 8, 1000, 
material);
        floor->SetFixed(true);
        floor->EnableCollision(true);
        sys.Add(floor);
        double l = 2;
        //double l2 = l;
        //_1
        auto pole = chrono_types::make_shared<ChBodyEasyCylinder>(ChAxis::Y, 
0.048 / 2, l, 1000, material);
        pole->EnableCollision(true);
        pole->SetPos(ChVector3d(0, l / 2, 0));
        sys.Add(pole);
        pole->SetFixed(true);
        // defining Parameters:
        double dis = 0.3;
        double l00_z_offset = 0.3;
        double l0_x = 0.1;
        double l0_y = 0.2;
        double l1_1 = 0.2;
        double l1_2 = 0.1;
        double l2 = 0.35;
        double l3 = 0.35;
        double ls = 0.1;
        double l0_rear = 0.25;
        double l1_rear = 0.1;
        double l2_rear = 0.2;
        double l3_rear = 0.3;

        double l4_gripper_rear = ls;
        // defining frames
        auto initial_frame = pole->GetVisualModelFrame();
        auto frame_block_ee_1 = initial_frame * ChFrame(ChVector3d(0, dis, 0));
        auto frame_block_ee_2 = initial_frame * ChFrame(ChVector3d(0, -dis, 0), 
QuatFromAngleY(CH_PI));
        auto frame_base_body=initial_frame* ChFrame(ChVector3d(0, 0, 
l00_z_offset));

        double initial_angle_shl_r = 0;//CH_PI*0.3;// at CH_PI error occurr
        double initial_angle_plane_body_r = CH_PI_2*0.5;//0;//
        double initial_angle_plane_angle_r = 0;//0;//
        //
        double initial_angle_shl_l = 0;// CH_PI * 0.3;//
        double initial_angle_plane_body_l = 0;//CH_PI * -0.1;//
        double initial_angle_plane_angle_l = 0;//CH_PI * 0.2;// right_arm
        // frames
        // right
        auto frame_shr_pos_r= frame_base_body * ChFrame(ChVector3d(l0_x, l0_y, 
0), QuatFromAngleY(CH_PI_4));
        auto frame_shr_r_helper = frame_shr_pos_r * ChFrame(VNULL, 
QuatFromAngleZ(initial_angle_shl_r));
        auto frame_shlr_r = frame_shr_r_helper * ChFrame(VNULL, 
QuatFromAngleY(-CH_PI_2) * QuatFromAngleZ(-CH_PI_2));
        auto frame_joint_plane_body_r = ChFrame(frame_shlr_r * ChVector3d(0, 
l1_1, l1_2), frame_shlr_r.GetRot() * QuatFromAngleY(-CH_PI) * 
QuatFromAngleZ(initial_angle_plane_body_r));
        auto frame_joint_plane_angle_r = ChFrame(frame_joint_plane_body_r * 
ChVector3d(0, l2, 0), frame_joint_plane_body_r.GetRot() * 
QuatFromAngleZ(initial_angle_plane_angle_r));
        auto frame_joint_uni_r = ChFrame(frame_joint_plane_angle_r * 
ChVector3d(0, l3 + 0.025, 0), frame_joint_plane_angle_r.GetRot() * 
Q_ROTATE_Z_TO_Y);
        auto frame_joint_after_u_r = frame_joint_uni_r * ChFrame(ChVector3d(0, 
0, 0.025));
        // left

        // right
        // // bodies
        auto body = chrono_types::make_shared<ChBodyEasyBox>(0.1, 0.4, 0.05, 
1000, material);
        body->SetFixed(true);
        body->SetPos(frame_base_body.GetPos());
        body->EnableCollision(true);
        sys.Add(body);
        bool all_fixed_r = true;
        auto body_conector_r = chrono_types::make_shared<ChBodyEasyBox>(0.05, 
l1_1, 0.05, 1000, material); body_conector_r->SetFixed(all_fixed_r); 
body_conector_r->SetPos(frame_shlr_r * ChVector3d(0, l1_1 / 2, 0)); 
body_conector_r->SetRot(frame_shlr_r.GetRot()); sys.AddBody(body_conector_r); 
body_conector_r->EnableCollision(false);
        auto body_link_arm_2_r = chrono_types::make_shared<ChBodyEasyBox>(0.05, 
l2, 0.05, 1000, material);  body_link_arm_2_r->SetFixed(all_fixed_r);  
body_link_arm_2_r->SetPos(frame_joint_plane_body_r * ChVector3d(0, l2 / 2, 0)); 
 body_link_arm_2_r->SetRot(frame_joint_plane_body_r.GetRot()); sys.AddBody( 
body_link_arm_2_r);  body_link_arm_2_r->EnableCollision(false);
        auto body_link_arm_3_r = chrono_types::make_shared<ChBodyEasyBox>(0.05, 
l3, 0.05, 1000, material);  body_link_arm_3_r->SetFixed(all_fixed_r);  
body_link_arm_3_r->SetPos(frame_joint_plane_angle_r * ChVector3d(0, l2 / 2, 
0));  body_link_arm_3_r->SetRot(frame_joint_plane_angle_r.GetRot()); 
sys.AddBody(body_link_arm_3_r);  body_link_arm_3_r->EnableCollision(false);
        auto  body_arm_r_h_u= 
chrono_types::make_shared<ChBodyEasyCylinder>(ChAxis::Z,0.01, 0.002, 1000, 
material);  body_arm_r_h_u->SetFixed(false); 
body_arm_r_h_u->SetPos(frame_joint_after_u_r * ChVector3d(0, 0, -0.001)); 
body_arm_r_h_u->SetRot(frame_joint_after_u_r.GetRot()); 
sys.AddBody(body_arm_r_h_u);  body_arm_r_h_u->EnableCollision(false);
        //joint
        auto joint_r_1 = chrono_types::make_shared<ChLinkLockRevolute>();
        auto joint_r_2 = chrono_types::make_shared<ChLinkLockRevolute>();
        auto joint_r_3 = chrono_types::make_shared<ChLinkLockRevolute>();
        auto joint_r_u = 
chrono_types::make_shared<ChLinkMateGeneric>(true,true,true,false,false,true);//ChLinkUniversal
        auto joint_r_4 = chrono_types::make_shared<ChLinkLockRevolute>();
        if (!all_fixed_r){
        joint_r_1->Initialize(body, body_conector_r, frame_shr_r_helper); 
sys.AddLink(joint_r_1);
        joint_r_2->Initialize(body_conector_r,body_link_arm_2_r, 
frame_joint_plane_body_r); sys.AddLink(joint_r_2);
        joint_r_3->Initialize(body_link_arm_2_r, body_link_arm_3_r, 
frame_joint_plane_angle_r); sys.AddLink(joint_r_3);}
        joint_r_u->Initialize(body_link_arm_3_r, body_arm_r_h_u, 
frame_joint_uni_r); sys.AddLink(joint_r_u); // muss evtl geƤndert werden
        //motors
        auto set_f_r_1 = 
chrono_types::make_shared<chrono::ChFunctionSetpoint>();
        auto set_f_r_2 = 
chrono_types::make_shared<chrono::ChFunctionSetpoint>();
        auto set_f_r_3 = 
chrono_types::make_shared<chrono::ChFunctionSetpoint>();
        auto set_f_r_4 = 
chrono_types::make_shared<chrono::ChFunctionSetpoint>();
        auto motor_r_1 = chrono_types::make_shared<ChLinkMotorRotationAngle>();
        auto motor_r_2 = chrono_types::make_shared<ChLinkMotorRotationAngle>();
        auto motor_r_3 = chrono_types::make_shared<ChLinkMotorRotationAngle>();
        auto motor_r_4 = chrono_types::make_shared<ChLinkMotorRotationAngle>();
        if (!all_fixed_r) {
                motor_r_1->Initialize(body, body_conector_r, 
frame_shr_r_helper); motor_r_1->SetAngleFunction(set_f_r_1); 
sys.AddLink(motor_r_1); //motor_r_1->SetAngleOffset(-initial_angle_shl_r);
                motor_r_2->Initialize(body_conector_r, body_link_arm_2_r, 
frame_joint_plane_body_r);   sys.AddLink(motor_r_2); 
motor_r_2->SetAngleFunction(set_f_r_2); 
//motor_r_2->SetAngleOffset(-initial_angle_plane_body_r);
                motor_r_3->Initialize(body_link_arm_2_r, body_link_arm_3_r, 
frame_joint_plane_angle_r);   sys.AddLink(motor_r_3); 
motor_r_3->SetAngleFunction(set_f_r_3); 
motor_r_3->SetAngleOffset(-initial_angle_plane_angle_r);
        }
        // springs
        double rest_length = 0.08;
        double spring_coef = 500;// 50;
        double damping_coef = 10;
        auto spring_1_r = chrono_types::make_shared<ChLinkTSDA>();
        spring_1_r->Initialize(body_link_arm_3_r, body_arm_r_h_u, true, 
ChVector3d(0, l3 / 2 - 0.05, -0.02), ChVector3d(0, 0.05, 0));
        spring_1_r->SetRestLength(rest_length);
        spring_1_r->SetSpringCoefficient(spring_coef);
        spring_1_r->SetDampingCoefficient(damping_coef);


        // --- 2. Feder ---
        auto spring2_r = chrono_types::make_shared<ChLinkTSDA>();
        spring2_r->Initialize(body_link_arm_3_r, body_arm_r_h_u, true, 
ChVector3d(0.02, l3 / 2 - 0.05, 0), ChVector3d(0.05, 0, 0));
        spring2_r->SetSpringCoefficient(spring_coef);
        spring2_r->SetDampingCoefficient(damping_coef);
        spring2_r->SetRestLength(rest_length);


        // --- 3. Feder ---
        auto spring3_r = chrono_types::make_shared<ChLinkTSDA>();

        spring3_r->Initialize(body_link_arm_3_r, body_arm_r_h_u, true, 
ChVector3d(-0.02, l3 / 2 - 0.05, 0), ChVector3d(-0.05, 0, 0));
        spring3_r->SetSpringCoefficient(spring_coef);
        spring3_r->SetDampingCoefficient(damping_coef);
        spring3_r->SetRestLength(rest_length);


        // --- 4. Feder ---
        auto spring4_r = chrono_types::make_shared<ChLinkTSDA>();
        spring4_r->Initialize(body_link_arm_3_r, body_arm_r_h_u, true, 
ChVector3d(0, l3 / 2 - 0.05, 0.02), ChVector3d(0, -0.05, 0));
        spring4_r->SetSpringCoefficient(spring_coef);
        spring4_r->SetDampingCoefficient(damping_coef);
        spring4_r->SetRestLength(rest_length);
        sys.AddLink(spring_1_r);
        sys.AddLink(spring2_r);
        sys.AddLink(spring3_r);
        sys.AddLink(spring4_r);
        // Attach a visualization asset.
        
spring_1_r->AddVisualShape(chrono_types::make_shared<ChVisualShapeSpring>(0.01, 
40, 8));
        
spring2_r->AddVisualShape(chrono_types::make_shared<ChVisualShapeSpring>(0.01, 
40, 8));
        
spring3_r->AddVisualShape(chrono_types::make_shared<ChVisualShapeSpring>(0.01, 
40, 8));
        
spring4_r->AddVisualShape(chrono_types::make_shared<ChVisualShapeSpring>(0.01, 
40, 8));
        // grippers
        auto material_friction = 
chrono_types::make_shared<ChContactMaterialNSC>();
        material_friction->SetFriction(0.5);
        material_friction->SetRollingFriction(0.5);
        material_friction->SetSlidingFriction(0.5);
        std::string shapes_dir = 
"C:\\workspace\\climbing_101\\gripper_export_shapes\\";
        std::shared_ptr<ChBodyAuxRef> finger_1_r;
        std::shared_ptr<ChBodyAuxRef> finger_2_r;
        std::shared_ptr<ChBodyAuxRef> base_r;
        auto frame_base_com_to_ref = 
chrono::ChFramed(chrono::ChVector3d(1.88969192858969e-18, 0.0466317534677547, 
4.71445555287807e-19), chrono::ChQuaternion<>(1, 0, 0, 0));
        auto frame_finger_1_com_to_ref = 
chrono::ChFramed(chrono::ChVector3d(0.000953801080669733, -0.021322686682018, 
5.3115175771791e-19), chrono::ChQuaternion<>(1, 0, 0, 0));
        auto frame_finger_2_com_to_ref = 
chrono::ChFramed(chrono::ChVector3d(0.000953801080669733, -0.021322686682018, 
5.3115175771791e-19), chrono::ChQuaternion<>(1, 0, 0, 0));

        auto frame_gripper_r = frame_joint_after_u_r * ChFrame(ChVector3d(0, 0, 
0), QuatFromAngleX(CH_PI_2) * QuatFromAngleY(CH_PI_2));
        auto frame_finger_1_r = frame_gripper_r * 
ChFrame(ChVector3d(0.0366618867860707, -0.003116191915022, 
0.0591554353444595)).GetInverse() * ChFrame(ChVector3d(-0.00148250962951285, 
0.137595735538563, 0.0591554353444594));
        auto frame_finger_2_r = frame_gripper_r * 
ChFrame(ChVector3d(0.0366618867860707, -0.003116191915022, 
0.0591554353444595)).GetInverse() * 
ChFrame(chrono::ChVector3d(0.0743899226468857, 0.137595735538563, 
0.0591554353444595), chrono::ChQuaternion<>(7.85000728502012e-17, 
-1.17368952349279e-16, 1, 2.77555756156289e-17));
        get_body_add(base_r, std::string("base"), frame_gripper_r, 
frame_base_com_to_ref, shapes_dir + "body_3_1.obj", shapes_dir + 
"body_3_1_collision.obj", 0.406216270935814, 
chrono::ChVector3d(0.000352637121668769, 0.000451309361507021, 
0.000370829111668769), chrono::ChVector3d(-1.06257411112441e-20, 
-1.28013920144965e-20, -8.61559598459534e-21), material_friction, true);
        sys.AddBody(base_r);
        /*get_body_add(finger_1_r, std::string("finger_1"), frame_finger_1_r, 
frame_finger_1_com_to_ref, shapes_dir + "body_1_1_collision_mini.obj", 
shapes_dir + "body_1_1_collision_mini.obj", 0.0373760124348794, 
chrono::ChVector3d(4.54111393779954e-05, 5.14947357705548e-06, 
4.11685501697624e-05), chrono::ChVector3d(-3.20274862402208e-07, 
1.8446335448084e-22, -1.03000641621034e-21), material_friction, false);// 
Inertia and COM and position are done by solidworks export
        get_body_add(finger_2_r, std::string("finger_2"), frame_finger_2_r, 
frame_finger_2_com_to_ref, shapes_dir + "body_1_1_collision_mini.obj", 
shapes_dir + "body_1_1_collision_mini.obj", 0.0373760124348794, 
chrono::ChVector3d(4.54111393779954e-05, 5.14947357705548e-06, 
4.11685501697624e-05), ChVector3d(3.20274862402217e-07, -4.816237693587e-22, 
-3.59090401274159e-21), material_friction, false);
        sys.AddBody(finger_1_r); sys.AddBody(finger_2_r); 
finger_1_r->EnableCollision(true); finger_2_r->EnableCollision(true);
        

        double limit_neg = -0.01;
        double limit_pos = 0.03;
        //right
        auto frame_link_1_r = frame_finger_1_r * ChFrame(ChVector3d(0, -0.065, 
0), QuatFromAngleY(CH_PI_2));
        auto frame_link_2_r = frame_finger_2_r * ChFrame(ChVector3d(0, -0.065, 
0), QuatFromAngleY(CH_PI_2));
        auto prismatic_finger_1_r = 
chrono_types::make_shared<ChLinkLockPrismatic>();
        prismatic_finger_1_r->Initialize(finger_1_r, base_r, frame_link_1_r);   
prismatic_finger_1_r->LimitZ().SetActive(true); 
prismatic_finger_1_r->LimitZ().SetMin(limit_neg); 
prismatic_finger_1_r->LimitZ().SetMax(limit_pos);
        sys.AddLink(prismatic_finger_1_r);
        // finger_2 base
        auto prismatic_finger_2_r = 
chrono_types::make_shared<ChLinkLockPrismatic>();   
prismatic_finger_2_r->Initialize(finger_2_r, base_r, frame_link_2_r);   
prismatic_finger_2_r->LimitZ().SetActive(true); 
prismatic_finger_2_r->LimitZ().SetMin(limit_pos);       
prismatic_finger_2_r->LimitZ().SetMax(limit_pos);
        sys.AddLink(prismatic_finger_2_r);
        auto motfun_finger_1_r = 
chrono_types::make_shared<chrono::ChFunctionSetpoint>();
        auto motfun_finger_2_r = 
chrono_types::make_shared<chrono::ChFunctionSetpoint>();
        
        auto motor_finger_1_r = 
chrono_types::make_shared<chrono::ChLinkMotorLinearForce>(); 
motor_finger_1_r->Initialize(finger_1_r, base_r, frame_link_1_r); 
sys.AddLink(motor_finger_1_r); 
motor_finger_1_r->SetMotorFunction(motfun_finger_1_r);
        auto motor_finger_2_r = 
chrono_types::make_shared<chrono::ChLinkMotorLinearForce>(); 
motor_finger_2_r->Initialize(finger_2_r, base_r, frame_link_2_r); 
sys.AddLink(motor_finger_2_r); 
motor_finger_2_r->SetMotorFunction(motfun_finger_2_r);
        
        prismatic_finger_1_r->Lock(true);
        prismatic_finger_2_r->Lock(true);*/
        joint_r_4->Initialize(body_arm_r_h_u, base_r, 
body_arm_r_h_u->GetVisualModelFrame()); sys.AddLink(joint_r_4);
        motor_r_4->Initialize(body_arm_r_h_u, base_r, 
body_arm_r_h_u->GetVisualModelFrame()); motor_r_4->SetAngleFunction(set_f_r_4); 
sys.AddLink(motor_r_4);

        //left
        
        
                auto solver = 
chrono_types::make_shared<ChSolverBB>();//ChSolverMINRES, 
ChSolverPJacobi,ChSolverBB,ADMM

                // Set maximum iterations and tolerance
                //solver->SetMaxIterations(400);           // number of solver 
iterations
                //solver->SetTolerance(1e-10);             // constraint 
tolerance
                //solver->EnableDiagonalPreconditioner(true); // often helps


                // Attach solver to system
                sys.SetSolver(solver);
                
sys.SetTimestepperType(ChTimestepper::Type::EULER_IMPLICIT_LINEARIZED);//EULER_IMPLICIT_LINEARIZED

                // Configure the integrator
                auto stepper = 
std::dynamic_pointer_cast<ChTimestepperHHT>(sys.GetTimestepper());
                if (stepper) {
                        stepper->SetAlpha(-0.2);    // numerical damping 
(-0.3..0 recommended)
                        stepper->SetMaxIters(100);  // iterations per step
                        stepper->SetAbsTolerances(1e-12, 1e-12);  // state & 
constraint tolerance

        }


        double timestep = 0.001;
        ChRealtimeStepTimer realtime_timer;
        auto vis = chrono_types::make_shared<ChVisualSystemIrrlicht>();
        vis->AttachSystem(&sys);
        vis->SetWindowSize(800, 600);
        vis->SetWindowTitle("testing_body_system");
        vis->Initialize();
        vis->AddLogo();
        vis->AddSkyBox();
        vis->AddTypicalLights();
        vis->AddCamera(ChVector3d(0, 4, 4));
        vis->AddLightWithShadow(ChVector3d(20.0, 35.0, -25.0), ChVector3d(0, 0, 
0), 55, 20, 55, 35, 512,
                ChColor(0.6f, 0.8f, 1.0f));
        vis->EnableShadows();
        auto drawer = chrono_types::make_shared<DebugDrawer>(vis.get());
        sys.GetCollisionSystem()->RegisterVisualizationCallback(drawer);
        int mode = ChCollisionSystem::VIS_Shapes;
        bool use_zbuffer = true;

        double start_angle = motor_r_4->GetAngleOffset();
        while (vis->Run()) {
                vis->BeginScene();
                vis->Render();
                if (draw_coll_shapes)
                        drawer->Draw(mode, use_zbuffer);
                tools::drawCoordsys(vis.get(), 
frame_shr_r_helper.GetCoordsys());
                std::cout << spring_1_r->GetLength()<<"\n";
                vis->EndScene();
                double t = sys.GetChTime();
                std::cout << t << "\n";
                if (t > 0.2) {
                        
                        
                }
                else {
double val = start_angle + t * 2;
                set_f_r_4->SetSetpoint(val, t);
                
                }

                sys.DoStepDynamics(timestep);
                realtime_timer.Spin(timestep);
        }

    

}

int main() {
        gym();
        return 0;
}

Reply via email to