Linear Velocity Constraint or Goal

OpenSim Moco is a software toolkit to solve optimal control problems with musculoskeletal models defined in OpenSim using the direct collocation method.
POST REPLY
User avatar
cedric attias
Posts: 4
Joined: Tue Jan 10, 2023 8:22 am

Linear Velocity Constraint or Goal

Post by cedric attias » Tue Aug 20, 2024 10:39 am

I am attempting to constrain the motion of my model so that the final velocity of the hand is a certain linear speed as such:

problem.setStateInfo('/bodyset/hand/speed', [0,50], 0, 10);

I am realizing that the setStatInfo does not recognize a body, and requires a joint speed to constrain. The problem is that I am interested in segment velocity, not joint velocity.

How can I go about constraining a segment in my model to start and end at a certain linear velocity? Is this better achieved through a cost function? If so, which cost?

Thank you in advance!

User avatar
Nicholas Bianco
Posts: 999
Joined: Thu Oct 04, 2012 8:09 pm

Re: Linear Velocity Constraint or Goal

Post by Nicholas Bianco » Wed Aug 21, 2024 3:38 pm

Hi Cedric,

You can use MocoFinalOutputGoal in endpoint constraint mode to achieve what you're looking for:

Code: Select all

finalHandVelocity = MocoFinalOutputGoal('final_hand_velocity);
finalHandVelocity.setOutputPath('/bodyset/hand|linear_velocity');
finalHandVelocity.setMode('endpoint_constraint');
finalHandVelocity.setEndpointConstraintBounds(MocoBounds(10));
problem.addGoal(finalHandVelocity);
Best,
Nick

User avatar
cedric attias
Posts: 4
Joined: Tue Jan 10, 2023 8:22 am

Re: Linear Velocity Constraint or Goal

Post by cedric attias » Fri Aug 23, 2024 8:35 am

Thank you Nick!

I am having an issue with the following line:

setEndpointConstraintBounds(MocoBounds(10));

Where it says;
Incorrect number or types of inputs or outputs for function setEndpointConstraintBounds.

From my understanding, setEndpointConstraintBounds requires a vector with the length equal to the number of outputs for this goal. This goal only has one output (linear velocity), so I am unsure why MocoBounds(10) is insufficient.

User avatar
Nicholas Bianco
Posts: 999
Joined: Thu Oct 04, 2012 8:09 pm

Re: Linear Velocity Constraint or Goal

Post by Nicholas Bianco » Fri Aug 23, 2024 9:07 am

Ah yes, apologies.

Here is the correct snippet:

Code: Select all

finalHandVelocity = MocoFinalOutputGoal('final_hand_velocity);
finalHandVelocity.setOutputPath('/bodyset/hand|linear_velocity');
finalHandVelocity.setMode('endpoint_constraint');
bounds = StdVectorMocoBounds();
bounds.append(MocoBounds(10)); 
finalHandVelocity.setEndpointConstraintBounds(bounds);
problem.addGoal(finalHandVelocity);

User avatar
cedric attias
Posts: 4
Joined: Tue Jan 10, 2023 8:22 am

Re: Linear Velocity Constraint or Goal

Post by cedric attias » Fri Aug 23, 2024 9:13 am

Nick, you are a lifesaver!

But unfortunately, append seems to require a text input. I used add instead of append and that seemed to work, but wanted to check and confirm if that was a viable solution.

Thanks again,

Cedric
Last edited by cedric attias on Fri Aug 23, 2024 9:16 am, edited 1 time in total.

User avatar
Nicholas Bianco
Posts: 999
Joined: Thu Oct 04, 2012 8:09 pm

Re: Linear Velocity Constraint or Goal

Post by Nicholas Bianco » Fri Aug 23, 2024 9:15 am

Try ".add()" instead.

(Appending to a std::vector in Matlab and Python works differently and I can never remember which one to use.)

POST REPLY