Can't save solutions when using path constraint

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
Hojin Song
Posts: 74
Joined: Wed Jul 08, 2020 9:46 am

Can't save solutions when using path constraint

Post by Hojin Song » Wed Aug 24, 2022 6:48 am

Hi All,

I was trying using a MocoFrameDistanceContraints() on my simulation but figured out it blocks not only saving solutions in .sto but also visualising solutions.

Code: Select all

	SimTK::UnitVec3 proj_vec_x(1, 0, 0);
	auto* pathCon_x = problem.addPathConstraint<MocoFrameDistanceConstraint>();
	pathCon_x->setName("foot_to_origin");
	pathCon_x->addFramePair("/ground", "/bodyset/calcn_r", 0, 0);
	pathCon_x->setProjection("vector");
	pathCon_x->setProjectionVector(proj_vec_x);

Code: Select all

	MocoSolution solution = study.solve();
	study.print("osimSquatGoal.xml");
	solution.unseal();
	solution.write("predictionSolution.sto");
	std::cout << "Solution status: " << solution.getStatus() << std::endl;
	study.visualize(solution);
stopped.PNG
stopped.PNG (28.9 KiB) Viewed 1216 times
The image above was taken from force stopping the optimization but same thing happened when the optimization is stopped due to exceeding maximum number of iterations. I unsealed the unconverged solution so I can see it although it did not converged, but when using the path constraints, it returns 2 lines saying "[Info] Set log level to Info" instead show me the result. Is this what it supposed to happen when using a path constraint or did I miss something?

Thank you.
Hojin

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

Re: Can't save solutions when using path constraint

Post by Nicholas Bianco » Wed Aug 24, 2022 7:59 am

Hi Hojin,

I don't think the frame distance constraint is "blocking" saving solutions or visualization. Could you attach the full output file from a problem that fails normally (i.e., don't manually quit).

The executable is "CustomSquat3" -- do you have any custom MocoGoals in this problem?

-Nick

User avatar
Hojin Song
Posts: 74
Joined: Wed Jul 08, 2020 9:46 am

Re: Can't save solutions when using path constraint

Post by Hojin Song » Wed Aug 24, 2022 11:44 am

Hi Nick,

Yes, I have several custom MocoGoals in the problem. Unfortunately, I can't attach the output file for the solution using a frame distant constraint because it did not save anything. Would attaching my source code be helpful instead?

Best,
Hojin

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

Re: Can't save solutions when using path constraint

Post by Nicholas Bianco » Wed Aug 24, 2022 2:19 pm

If you remove the MocoFrameDistanceGoal, does the problem fail in the same way? It's hard to say what is causing the issue given the error message in the screenshot.

Since you're working directly in C++, you could try running a debugger to see exactly where the error occurs.

User avatar
Hojin Song
Posts: 74
Joined: Wed Jul 08, 2020 9:46 am

Re: Can't save solutions when using path constraint

Post by Hojin Song » Thu Aug 25, 2022 3:46 am

Hi Nick,

If I remove the frame distance constraint, it works fine (i.e. it shows and saves results whether or not the solution is found or failed). I have ran a debugger as you suggested and found that error has occurred at where it starts solving a problem. Would there be any chance that existing moco functions can crash with the custom moco goals?
Debug.PNG
Debug.PNG (124.81 KiB) Viewed 1138 times

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

Re: Can't save solutions when using path constraint

Post by Nicholas Bianco » Thu Aug 25, 2022 7:05 am

Based on the metadata in the "solution" variable (bottom left of screen), it seems like the problem is solving. But some sort of exception is occurring after the solution is returned? Not sure.

Are there any other path constraints in the problem?

I see an exception related to the "fmt" library (bottom right of screen). Not sure where that is coming from.

You can use the debugger to "step in" to the solve() function to determine the specific location where the exception is thrown. It might be happening right after the solve() function returns the solution, but often exceptions are thrown in the functions called internally by solve().

Lastly, make sure you are using the "RelWithDebInfo" build type and not "Debug". "RelWithDebInfo" will still let you use the debugger. "Debug" requires all the dependencies to have "Debug" builds as well, which we usually don't have by default.

User avatar
Hojin Song
Posts: 74
Joined: Wed Jul 08, 2020 9:46 am

Re: Can't save solutions when using path constraint

Post by Hojin Song » Wed Sep 07, 2022 2:01 am

Hi Nick,

Unfortunately, I couldn't manage to fix the problem. The debugger says a .dll file is missing, but it's working fine when a path constraint is not present, so I'm still clueless. In the meantime, I've found an alternative way to use kinematic constraints from OpenSim (either constant-distant-constraint or point-on-line constraint). And regarding your checklists, yes I'm always using RelWithDebInfo, and there was no other path constraint given in the problem. I have a feeling that I need to come back to this problem in the near future, but for now, I'll try to use kinematic constraints.

Thank you
Hojin

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

Re: Can't save solutions when using path constraint

Post by Nicholas Bianco » Wed Sep 07, 2022 10:23 am

Which DLL is missing? If it's a dependency issue, or an issue with Moco not finding the library files for your new goal it should be relatively easy to resolve.

Moco already supports kinematic constraints, so if that's what you're trying to accomplish, it might be easier to just add a new kinematic constraint to OpenSim, rather than creating a new goal.

-Nick

User avatar
Hojin Song
Posts: 74
Joined: Wed Jul 08, 2020 9:46 am

Re: Can't save solutions when using path constraint

Post by Hojin Song » Thu Sep 08, 2022 1:40 pm

Hi Nick,

The debugger says osimSimulation.DLL is missing. But I'm not sure if that's the real issue because so far (until I began using path constraints), the moco problem was solved well, and dependencies were copied to the build file when I generated the problem with CMake.

On the other hand, I didn't build my customs goal in separate files; instead, I built them directly in the source code (as written below). Would this be a not good practice that might cause such an error?

I'm considering creating a custom path constraint that prevents contact forces on spheres from being greater than 0 (i.e. foot not leaving the ground). Would there be any function in Moco (or OpenSim) that can achieve this? For now, I'm trying to minimize the body accelerations of the feet but the toes are leaving the ground :(

Code: Select all

class MocoCOMGoal : public MocoGoal {
	OpenSim_DECLARE_CONCRETE_OBJECT(MocoCOMGoal, MocoGoal);

public:
	MocoCOMGoal() {}
	MocoCOMGoal(std::string name) : MocoGoal(std::move(name)) {}
	MocoCOMGoal(std::string name, double weight) : MocoGoal(std::move(name), weight) {}

protected:
	Mode getDefaultModeImpl() const override { return Mode::Cost; }
	bool getSupportsEndpointConstraintImpl() const override { return true; }
	void initializeOnModelImpl(const Model&) const override { setRequirements(1, 1); }
	void calcIntegrandImpl(
		const IntegrandInput& input, double& integrand) const override {
		getModel().realizeAcceleration(input.state);

		//COM
		const auto& CoM = getModel().getMatterSubsystem().calcSystemMassCenterLocationInGround(input.state);
		integrand = CoM[1];
	}
	void calcGoalImpl(
		const GoalInput& input, SimTK::Vector& cost) const override {
		cost[0] = input.integral;
	}
};

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

Re: Can't save solutions when using path constraint

Post by Nicholas Bianco » Thu Sep 08, 2022 2:49 pm

Hi Hojin,

If you add a class directly to the API, you need to update the CMakeLists file to include the .h/.cpp files for your goal, register the type with the API (here), and include the header for your new goal here.

You also need make sure you add the macro "OSIMMOCO_API" in front of the class definition (as in here).
I'm considering creating a custom path constraint that prevents contact forces on spheres from being greater than 0 (i.e. foot not leaving the ground). Would there be any function in Moco (or OpenSim) that can achieve this?
No, this would be a new addition!

Best,
Nick

POST REPLY