Hi, 

with commit ca81537edc33c128af3dbfb820b9039aac42e00f I obtained the results 
below. The slight differences between the implementations could perhaps be 
avoided with different solver settings.
It seems that the corrected implementation also resolves this issue: 
https://groups.google.com/g/projectchrono/c/m2tswtNze2Q

Thank you very much!
Simon


*Output using ChLinkMotorRotationSpeed:*
...
Time: 0.950 *** Body Angle: 0.950 *** Force Angle: 0.940 *** Torque Angle: 
-0.631 *** Angle Difference: 1.571
Time: 0.960 *** Body Angle: 0.960 *** Force Angle: 0.950 *** Torque Angle: 
-0.621 *** Angle Difference: 1.571
Time: 0.970 *** Body Angle: 0.970 *** Force Angle: 0.960 *** Torque Angle: 
-0.611 *** Angle Difference: 1.571
Time: 0.980 *** Body Angle: 0.980 *** Force Angle: 0.970 *** Torque Angle: 
-0.601 *** Angle Difference: 1.571
Time: 0.990 *** Body Angle: 0.990 *** Force Angle: 0.980 *** Torque Angle: 
-0.591 *** Angle Difference: 1.571


*Output using ChLinkLockLock:*
...
Time: 0.950 *** Body Angle: 0.950 *** Force Angle: 0.940 *** Torque Angle: 
-0.621 *** Angle Difference: 1.561
Time: 0.960 *** Body Angle: 0.960 *** Force Angle: 0.950 *** Torque Angle: 
-0.611 *** Angle Difference: 1.561
Time: 0.970 *** Body Angle: 0.970 *** Force Angle: 0.960 *** Torque Angle: 
-0.601 *** Angle Difference: 1.561
Time: 0.980 *** Body Angle: 0.980 *** Force Angle: 0.970 *** Torque Angle: 
-0.591 *** Angle Difference: 1.561
Time: 0.990 *** Body Angle: 0.990 *** Force Angle: 0.980 *** Torque Angle: 
-0.581 *** Angle Difference: 1.561


On Monday, May 1, 2023 at 8:14:18 PM UTC+2 [email protected] wrote:

> Dear users,
>
> The explanation for the bug and the previous commit ([fb7d16c], on 27th 
> April) are wrong. The bug of ChLinkLockLock() is not related to the 
> projection matrix P.
>
> Today I pushed another commit to fix the bug:
> Commit: ca81537edc33c128af3dbfb820b9039aac42e00f [ca81537]
>
> The reaction torque is simply computed as Cqw2.T*lambda which is expressed 
> in the local frame of Body2, then it is rotated back to the master frame 
> (marker2, or frame2, F2) of the joint by left-multiplying R_F2_B2.T.
>
> Best regards,
> Chao PENG.
>
> 在2023年4月27日星期四 UTC+2 11:00:26<chao peng> 写道:
>
>> Hello Simon,
>>
>> Thank you for your test and feedback. I didn't realize there is a same 
>> bug as in ChLinkMateGeneric().
>> When we use quaternion to parameterize the finite rotation and derive the 
>> constraint equation (C) and its Jacobian matrix (Cq), we will have a 
>> projection matrix P to convert the Lagrange multiplier (only for rotational 
>> DOFs) to the reaction torque. This projection matrix P = 
>> 0.5(s*I33+\tilde(v)) where \pho_{F1_F2}=(s,v) is the quaternion of the 
>> slave frame F1 to master frame F2. When F1, F2 are coincident, P=0.5*I33, 
>> thus we can find a coefficient 0.5 in the code to convert Lagrange 
>> multipler to reaction torque. But in case there is a relative rotation 
>> between F1 and F2, the projection matrix P changes, and the Lagrange 
>> multiplier is expressed in an obscure ghost frame FX (let's denote it as FX 
>> here). The rotation of FX is a half of the relative rotation in 
>> \pho_{F1_F2}. Besides this point, it also includes a component which scales 
>> the Lagrange multiplier by the scalar part 's'. This is why you obtain the 
>> above result in you test.
>>
>> We fixed this bug in below commit:
>> Commit: fb7d16caa653d837c9220cf96db5aebeb2df8231 [fb7d16c], on 27th April.
>>
>> Try to pull it and test again.
>>
>> I would like to remind here, the tangent stiffness matrix (Kc) of 
>> ChLinkLockLock() is not implemented, although the analytical expression 
>> should be same as ChLinkMateGeneric(), or at least quite similar. Thus you 
>> cannot perform the static and eigenvalue analysis for a pendulum using 
>> ChLinkLockLock().
>>
>> Best regards,
>> Chao PENG.
>>
>> 在2023年4月26日星期三 UTC+2 15:32:03<Simon> 写道:
>>
>>> Hi, 
>>>
>>> thank you for the updated implementation. I re-ran my test case with 
>>> chrono at commit 841781d6e0e4b09c68cd431e1f7381b402f17ad1.
>>>
>>> The reaction torque vector does now rotate as expected with 
>>> ChLinkMotorRotationSpeed. As shown in my example below there is now a 
>>> constant angle difference of 90° between force and torque in the x-y plane.
>>>
>>> However, with the ChLinkLockLock implementation I noticed that the angle 
>>> of the torque vector seems to change only at half the speed of the body 
>>> rotation. This leads to a constantly changing difference between force and 
>>> torque direction in the x-y plane.
>>> So perhaps there is also something wrong with the ChLinkLockLock's 
>>> reaction torque direction (see example with output below).
>>>
>>> Sorry for being naggy, your support is highly appreciated!
>>>
>>> Best regards, 
>>> Simon
>>>
>>>
>>> *Code:* 
>>> ChSystemNSC system{};
>>>
>>> auto fixed_body{chrono_types::make_shared<ChBody>()};
>>> fixed_body->SetBodyFixed(true);
>>> auto rotating_body{chrono_types::make_shared<ChBody>()};
>>> rotating_body->SetPos({1.0, 0.0, 0.0});
>>>
>>> // Option 1: ChLinkMotorRotationSpeed
>>>
>>> auto 
>>> rotation_link{chrono_types::make_shared<ChLinkMotorRotationSpeed>()};
>>> rotation_link->Initialize(rotating_body, fixed_body, ChFrame{});
>>>
>>> rotation_link->SetSpeedFunction(chrono_types::make_shared<ChFunction_Const>(1.0));
>>>
>>>
>>> // Option 2: ChLinkLockLock
>>> //        auto 
>>> rotation_link{chrono_types::make_shared<ChLinkLockLock>()};
>>> //        rotation_link->Initialize(rotating_body, fixed_body, {});
>>> //        rotation_link->Set_angleset(chrono::AngleSet::ANGLE_AXIS);
>>> //        rotation_link->SetMotion_axis({0.0, 0.0, 1.0});
>>> //       
>>>  
>>> rotation_link->SetMotion_ang(chrono_types::make_shared<ChFunction_Ramp>(0.0,
>>>  
>>> 1.0));
>>>
>>>
>>> system.Add(fixed_body);
>>> system.Add(rotating_body);
>>> system.Add(rotation_link);
>>>
>>> system.Set_G_acc({0.0, 0.0, 10.0});
>>>
>>> for (double time{}; time < 1.0; time += 0.01)
>>> {
>>>     system.DoFrameDynamics(time);
>>>
>>>     const auto body_position{rotating_body->GetPos()};
>>>     const double body_angle{std::atan2(body_position[1], 
>>> body_position[0])};
>>>
>>>     const auto reaction_force{rotation_link->Get_react_force()};
>>>     const double force_angle{std::atan2(reaction_force[1], 
>>> reaction_force[0])};
>>>
>>>     const auto reaction_torque{rotation_link->Get_react_torque()};
>>>     const double torque_angle{std::atan2(reaction_torque[1], 
>>> reaction_torque[0])};
>>>
>>>
>>>     std::cout << std::fixed << std::setprecision(3) << "Time: " << 
>>> system.GetChTime()
>>>               << " *** Body Angle: " << body_angle << " *** Force Angle: 
>>> " << force_angle
>>>               << " *** Torque Angle: " << torque_angle
>>>               << " *** Angle Difference: " << force_angle - torque_angle 
>>> << "\n";
>>> }
>>>
>>> *Output using ChLinkMotorRotationSpeed:*
>>> ...
>>> Time: 0.950 *** Body Angle: 0.950 *** Force Angle: 0.940 *** Torque 
>>> Angle: -0.631 *** Angle Difference: 1.571
>>> Time: 0.960 *** Body Angle: 0.960 *** Force Angle: 0.950 *** Torque 
>>> Angle: -0.621 *** Angle Difference: 1.571
>>> Time: 0.970 *** Body Angle: 0.970 *** Force Angle: 0.960 *** Torque 
>>> Angle: -0.611 *** Angle Difference: 1.571
>>> Time: 0.980 *** Body Angle: 0.980 *** Force Angle: 0.970 *** Torque 
>>> Angle: -0.601 *** Angle Difference: 1.571
>>> Time: 0.990 *** Body Angle: 0.990 *** Force Angle: 0.980 *** Torque 
>>> Angle: -0.591 *** Angle Difference: 1.571
>>>
>>>
>>> *Output using ChLinkLockLock:*
>>> ...
>>> Time: 0.950 *** Body Angle: 0.950 *** Force Angle: 0.940 *** Torque 
>>> Angle: -1.096 *** Angle Difference: 2.036
>>> Time: 0.960 *** Body Angle: 0.960 *** Force Angle: 0.950 *** Torque 
>>> Angle: -1.091 *** Angle Difference: 2.041
>>> Time: 0.970 *** Body Angle: 0.970 *** Force Angle: 0.960 *** Torque 
>>> Angle: -1.086 *** Angle Difference: 2.046
>>> Time: 0.980 *** Body Angle: 0.980 *** Force Angle: 0.970 *** Torque 
>>> Angle: -1.081 *** Angle Difference: 2.051
>>> Time: 0.990 *** Body Angle: 0.990 *** Force Angle: 0.980 *** Torque 
>>> Angle: -1.076 *** Angle Difference: 2.056
>>> On Monday, April 17, 2023 at 4:48:39 PM UTC+2 [email protected] wrote:
>>>
>>>> Dear everyone,
>>>>
>>>> We corrected the bugs reported here.
>>>>
>>>> Please refer to the commit [d7193ef] on 17th April.
>>>>
>>>> Welcome to feedback your test result.
>>>>
>>>> 在2023年3月13日星期一 UTC+1 09:14:49<Simon> 写道:
>>>>
>>>>> Hi Luning, 
>>>>>
>>>>> thanks for your reply. I agree on the cause of the force and torque 
>>>>> components, but to my understanding the constant torque vector 
>>>>> [0.000, -10.000, -0.000] would be correct only in the rotating frame, 
>>>>> not in the link frame (which is fixed here). 
>>>>>
>>>>> I modified my example, now using ChLinkLockLock to create the same 
>>>>> rotating body setup (see below). The torque vector seems to rotate 
>>>>> correctly when using ChLinkLockLock, in contrast to the 
>>>>> ChLinkMotorRotationSpeed case.
>>>>>
>>>>> Thank you, 
>>>>> Simon
>>>>>
>>>>> *Code:*
>>>>> ChSystemNSC system{};
>>>>>
>>>>> auto fixed_body{chrono_types::make_shared<ChBody>()};
>>>>> fixed_body->SetBodyFixed(true);
>>>>> auto rotating_body{chrono_types::make_shared<ChBody>()};
>>>>> rotating_body->SetPos({1.0, 0.0, 0.0});
>>>>>
>>>>> // Option 1: ChLinkMotorRotationSpeed
>>>>> //        auto 
>>>>> rotation_link{chrono_types::make_shared<ChLinkMotorRotationSpeed>()};
>>>>> //        rotation_link->Initialize(rotating_body, fixed_body, 
>>>>> ChFrame{});
>>>>> //       
>>>>>  
>>>>> rotation_link->SetSpeedFunction(chrono_types::make_shared<ChFunction_Const>(1.0));
>>>>>
>>>>> // Option 2: ChLinkLockLock
>>>>> auto rotation_link{chrono_types::make_shared<ChLinkLockLock>()};
>>>>> rotation_link->Initialize(rotating_body, fixed_body, {});
>>>>> rotation_link->Set_angleset(chrono::AngleSet::ANGLE_AXIS);
>>>>> rotation_link->SetMotion_axis({0.0, 0.0, 1.0});
>>>>> rotation_link->SetMotion_ang(chrono_types::make_shared<ChFunction_Ramp>(0.0,
>>>>>  
>>>>> 1.0));
>>>>>
>>>>>
>>>>> system.Add(fixed_body);
>>>>> system.Add(rotating_body);
>>>>> system.Add(rotation_link);
>>>>>
>>>>> system.Set_G_acc({0.0, 0.0, 10.0});
>>>>>
>>>>> for (double time{}; time < 1.0; time += 0.01)
>>>>> {
>>>>>     system.DoFrameDynamics(time);
>>>>>
>>>>>     std::cout << std::fixed << std::setprecision(3) << "Time: " << 
>>>>> system.GetChTime()
>>>>>               << " *** Force: " << rotation_link->Get_react_force()
>>>>>               << " *** Torque: " << rotation_link->Get_react_torque()
>>>>>               << " *** Link Absolute Coords: " << 
>>>>> rotation_link->GetLinkAbsoluteCoords() << "\n";
>>>>> }
>>>>>
>>>>> *Output using ChLinkMotorRotationSpeed:*
>>>>> ...
>>>>> Time: 0.970 *** Force: 0.574  0.819  10.000 *** Torque: 0.000  -10.000 
>>>>>  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000  0.000  
>>>>> 0.000 
>>>>>  0.000
>>>>> Time: 0.980 *** Force: 0.565  0.825  10.000 *** Torque: 0.000  -10.000 
>>>>>  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000  0.000  
>>>>> 0.000 
>>>>>  0.000
>>>>> Time: 0.990 *** Force: 0.557  0.831  10.000 *** Torque: 0.000  -10.000 
>>>>>  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000  0.000  
>>>>> 0.000 
>>>>>  0.000
>>>>>
>>>>> *Output using ChLinkLockLock:*
>>>>> ...
>>>>> Time: 0.970 *** Force: 0.574  0.819  10.000 *** Torque: 4.662  -8.847 
>>>>>  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000  0.000  
>>>>> 0.000 
>>>>>  0.000
>>>>> Time: 0.980 *** Force: 0.565  0.825  10.000 *** Torque: 4.707  -8.824 
>>>>>  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000  0.000  
>>>>> 0.000 
>>>>>  0.000
>>>>> Time: 0.990 *** Force: 0.557  0.831  10.000 *** Torque: 4.751  -8.800 
>>>>>  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000  0.000  
>>>>> 0.000 
>>>>>  0.000
>>>>>
>>>>> On Friday, March 10, 2023 at 6:27:12 PM UTC+1 [email protected] wrote:
>>>>>
>>>>>> The object is traveling in a circular motion at a constant angular 
>>>>>> velocity, 1, with respect to the global z coordinate, gravity pointing 
>>>>>> downward z. Therefore, link force in xy plane is a centrifugal force, F 
>>>>>> = 
>>>>>> mw^2R, pointing towards origin, z component balance out gravitational 
>>>>>> force. With zero angular acceleration, z-component of link torque is 
>>>>>> zero, 
>>>>>> y-component balance out the torque from gravity, since rotation around y 
>>>>>> and z axis are constrained.
>>>>>>
>>>>>> Thank you,
>>>>>> Luning
>>>>>>
>>>>>> On Friday, March 10, 2023 at 12:10:53 AM UTC-6 Simon wrote:
>>>>>>
>>>>>>> Hi Luning,
>>>>>>>
>>>>>>> thanks for the clarification about the link coordinate system.
>>>>>>> In my example I added the link coordinate system output to verify 
>>>>>>> that it is indeed fixed to the global reference frame (see below).
>>>>>>>
>>>>>>> Unfortunately my question remains: Why does the link force vector 
>>>>>>> rotate and the torque vector does not ?  
>>>>>>>
>>>>>>> Thank you, 
>>>>>>> Simon
>>>>>>>
>>>>>>>
>>>>>>> *Code:*
>>>>>>> ChSystemNSC system{};
>>>>>>>
>>>>>>> auto fixed_body{chrono_types::make_shared<ChBody>()};
>>>>>>> fixed_body->SetBodyFixed(true);
>>>>>>> auto rotating_body{chrono_types::make_shared<ChBody>()};
>>>>>>> rotating_body->SetPos({1.0, 0.0, 0.0});
>>>>>>>
>>>>>>> auto 
>>>>>>> rotation_link{chrono_types::make_shared<ChLinkMotorRotationSpeed>()};
>>>>>>> rotation_link->Initialize(rotating_body, fixed_body, ChFrame{});
>>>>>>>
>>>>>>> rotation_link->SetSpeedFunction(chrono_types::make_shared<ChFunction_Const>(1.0));
>>>>>>>
>>>>>>> system.Add(fixed_body);
>>>>>>> system.Add(rotating_body);
>>>>>>> system.Add(rotation_link);
>>>>>>>
>>>>>>> system.Set_G_acc({0.0, 0.0, 10.0});
>>>>>>>
>>>>>>> for (double time{}; time < 1.0; time += 0.01)
>>>>>>> {
>>>>>>>     system.DoFrameDynamics(time);
>>>>>>>
>>>>>>>     std::cout << std::fixed << std::setprecision(3) << "Time: " << 
>>>>>>> system.GetChTime()
>>>>>>>               << " *** Force: " << rotation_link->Get_react_force()
>>>>>>>               << " *** Torque: " << rotation_link->Get_react_torque()
>>>>>>>               << " *** Link Absolute Coords: " << 
>>>>>>> rotation_link->GetLinkAbsoluteCoords() << "\n";
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> *Output:*
>>>>>>> ...
>>>>>>> Time: 0.830 *** Force: 0.682  0.731  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.840 *** Force: 0.675  0.738  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.850 *** Force: 0.667  0.745  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.860 *** Force: 0.660  0.751  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.870 *** Force: 0.652  0.758  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.880 *** Force: 0.645  0.764  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.890 *** Force: 0.637  0.771  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.900 *** Force: 0.629  0.777  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.910 *** Force: 0.622  0.783  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.920 *** Force: 0.614  0.790  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.930 *** Force: 0.606  0.796  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.940 *** Force: 0.598  0.802  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.950 *** Force: 0.590  0.808  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.960 *** Force: 0.582  0.813  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.970 *** Force: 0.574  0.819  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.980 *** Force: 0.565  0.825  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>> Time: 0.990 *** Force: 0.557  0.831  10.000 *** Torque: 0.000 
>>>>>>>  -10.000  -0.000 *** Link Absolute Coords: 0.000  0.000  0.000  1.000 
>>>>>>>  0.000  0.000  0.000
>>>>>>>
>>>>>>>
>>>>>>> On Thursday, March 9, 2023 at 4:59:13 PM UTC+1 [email protected] 
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Hello Simon,
>>>>>>>>
>>>>>>>> "As I understand, the link coordinate system is the 'master' body 
>>>>>>>> system (Body2)."
>>>>>>>> This is not correct. Your link coordinate system is defined here,
>>>>>>>>
>>>>>>>> rotation_link->Initialize(rotating_body, fixed_body, ChFrame{});
>>>>>>>>
>>>>>>>> ChFrame{} initialize a reference frame coincide with the global 
>>>>>>>> reference frame. Because your Body2 (fixed_body) has the same 
>>>>>>>> orientation 
>>>>>>>> as the GRF, and it is fixed, it just so happens that your link 
>>>>>>>> coordinate 
>>>>>>>> system is the same as the 'master' body system. 
>>>>>>>>
>>>>>>>> You can check the orientation of the  link coordinate system using 
>>>>>>>> this: 
>>>>>>>> auto quat = rotation_link->GetLinkAbsoluteCoords().rot
>>>>>>>>
>>>>>>>> Thank you,
>>>>>>>> Luning
>>>>>>>>
>>>>>>>> On Tuesday, March 7, 2023 at 9:45:38 AM UTC-6 Simon wrote:
>>>>>>>>
>>>>>>>> Hi, 
>>>>>>>>
>>>>>>>> as per the documentation 
>>>>>>>> <https://api.projectchrono.org/classchrono_1_1_ch_link_motor_rotation_speed.html>,
>>>>>>>>  
>>>>>>>> ChLinkMotorRotationSpeed's member functions Get_react_force() and 
>>>>>>>> Get_react_torque() return the respective values in link coordinates.
>>>>>>>> As I understand, the link coordinate system is the 'master' body 
>>>>>>>> system (Body2).
>>>>>>>>
>>>>>>>> In the example below a body rotates around the absolute z axis 
>>>>>>>> using ChLinkMotorRotationSpeed (the 'master' body is fixed here). As 
>>>>>>>> expected, the link reaction force consists of a the constant body 
>>>>>>>> weight in 
>>>>>>>> z direction and the rotating centrifugal load in the x-y plane. 
>>>>>>>> However, 
>>>>>>>> the reaction torque (due to gravity) is constant despite the link's 
>>>>>>>> rotation. Shouldn't the torque vector also rotate or do I 
>>>>>>>> misunderstand 
>>>>>>>> something?
>>>>>>>>
>>>>>>>> Thanks in advance!
>>>>>>>> Simon
>>>>>>>>
>>>>>>>>
>>>>>>>> *Code: *
>>>>>>>> ChSystemNSC system{};
>>>>>>>>
>>>>>>>> auto fixed_body{chrono_types::make_shared<ChBody>()};
>>>>>>>> fixed_body->SetBodyFixed(true);
>>>>>>>> auto rotating_body{chrono_types::make_shared<ChBody>()};
>>>>>>>> rotating_body->SetPos({1.0, 0.0, 0.0});
>>>>>>>>
>>>>>>>> auto 
>>>>>>>> rotation_link{chrono_types::make_shared<ChLinkMotorRotationSpeed>()};
>>>>>>>> rotation_link->Initialize(rotating_body, fixed_body, ChFrame{});
>>>>>>>>
>>>>>>>> rotation_link->SetSpeedFunction(chrono_types::make_shared<ChFunction_Const>(1.0));
>>>>>>>>
>>>>>>>> system.Add(fixed_body);
>>>>>>>> system.Add(rotating_body);
>>>>>>>> system.Add(rotation_link);
>>>>>>>>
>>>>>>>> system.Set_G_acc({0.0, 0.0, 10.0});
>>>>>>>>
>>>>>>>> for (double time{}; time < 1.0; time += 0.01)
>>>>>>>> {
>>>>>>>>     system.DoFrameDynamics(time);
>>>>>>>>
>>>>>>>>     std::cout << std::fixed << std::setprecision(3) << "Time: " << 
>>>>>>>> system.GetChTime()
>>>>>>>>               << " *** Force: " << rotation_link->Get_react_force()
>>>>>>>>               << " *** Moment: " << 
>>>>>>>> rotation_link->Get_react_torque() << "\n";
>>>>>>>> }
>>>>>>>>
>>>>>>>>
>>>>>>>> *Output: ...*
>>>>>>>> Time: 0.810 *** Force: 0.697  0.717  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.820 *** Force: 0.690  0.724  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.830 *** Force: 0.682  0.731  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.840 *** Force: 0.675  0.738  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.850 *** Force: 0.667  0.745  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.860 *** Force: 0.660  0.751  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.870 *** Force: 0.652  0.758  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.880 *** Force: 0.645  0.764  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.890 *** Force: 0.637  0.771  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.900 *** Force: 0.629  0.777  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.910 *** Force: 0.622  0.783  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.920 *** Force: 0.614  0.790  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.930 *** Force: 0.606  0.796  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.940 *** Force: 0.598  0.802  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.950 *** Force: 0.590  0.808  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.960 *** Force: 0.582  0.813  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.970 *** Force: 0.574  0.819  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.980 *** Force: 0.565  0.825  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>> Time: 0.990 *** Force: 0.557  0.831  10.000 *** Moment: 0.000 
>>>>>>>>  -10.000  -0.000
>>>>>>>>
>>>>>>>>

-- 
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 on the web visit 
https://groups.google.com/d/msgid/projectchrono/c3a37bd3-a725-4a92-b8a3-33bd166f7935n%40googlegroups.com.

Reply via email to