This example predicts the trajectory to swing a double pendulum from horizontal to vertical, and then tracks the resulting trajectory.
21 import opensim
as osim
24 This file performs the following problems using a
25 double pendulum model:
27 1. predict an optimal trajectory (and controls),
28 2. track the states from the optimal trajectory, and
29 3. track the marker trajectories from the optimal trajectory.
34 if os.getenv(
'OPENSIM_USE_VISUALIZER') ==
'0':
39 def createDoublePendulumModel():
41 model.setName(
"double_pendulum")
45 b0 = osim.Body(
"b0", 1, osim.Vec3(0), osim.Inertia(1))
47 b1 = osim.Body(
"b1", 1, osim.Vec3(0), osim.Inertia(1))
51 m0 = osim.Marker(
"m0", b0, osim.Vec3(0))
52 m1 = osim.Marker(
"m1", b1, osim.Vec3(0))
57 j0 = osim.PinJoint(
"j0", model.getGround(), osim.Vec3(0), osim.Vec3(0),
58 b0, osim.Vec3(-1, 0, 0), osim.Vec3(0))
59 q0 = j0.updCoordinate()
61 j1 = osim.PinJoint(
"j1",
62 b0, osim.Vec3(0), osim.Vec3(0), b1, osim.Vec3(-1, 0, 0), osim.Vec3(0))
63 q1 = j1.updCoordinate()
68 tau0 = osim.CoordinateActuator()
69 tau0.setCoordinate(j0.updCoordinate())
71 tau0.setOptimalForce(1)
72 model.addComponent(tau0)
74 tau1 = osim.CoordinateActuator()
75 tau1.setCoordinate(j1.updCoordinate())
77 tau1.setOptimalForce(1)
78 model.addComponent(tau1)
81 bodyGeometry = osim.Ellipsoid(0.5, 0.1, 0.1)
82 transform = osim.Transform(osim.Vec3(-0.5, 0, 0))
83 b0Center = osim.PhysicalOffsetFrame(
"b0_center", b0, transform)
84 b0.addComponent(b0Center)
85 b0Center.attachGeometry(bodyGeometry.clone())
86 b1Center = osim.PhysicalOffsetFrame(
"b1_center", b1, transform)
87 b1.addComponent(b1Center)
88 b1Center.attachGeometry(bodyGeometry.clone())
90 model.finalizeConnections()
91 model.printToXML(
"double_pendulum.osim")
95 def solvePrediction():
106 study = osim.MocoStudy()
107 study.setName(
"double_pendulum_predict")
109 problem = study.updProblem()
112 problem.setModel(createDoublePendulumModel())
115 problem.setTimeBounds(0, [0, 5])
119 problem.setStateInfo(
"/jointset/j0/q0/value", [-10, 10], 0)
120 problem.setStateInfo(
"/jointset/j0/q0/speed", [-50, 50], 0, 0)
121 problem.setStateInfo(
"/jointset/j1/q1/value", [-10, 10], 0)
122 problem.setStateInfo(
"/jointset/j1/q1/speed", [-50, 50], 0, 0)
123 problem.setControlInfo(
"/tau0", [-100, 100])
124 problem.setControlInfo(
"/tau1", [-100, 100])
128 ftCost = osim.MocoFinalTimeGoal()
129 ftCost.setWeight(0.001)
130 problem.addGoal(ftCost)
132 finalCost = osim.MocoMarkerFinalGoal()
133 finalCost.setName(
"final")
134 finalCost.setWeight(1000.0)
135 finalCost.setPointName(
"/markerset/m1")
136 finalCost.setReferenceLocation(osim.Vec3(0, 2, 0))
137 problem.addGoal(finalCost)
141 solver = study.initTropterSolver()
142 solver.set_num_mesh_intervals(100)
143 solver.set_verbosity(2)
144 solver.set_optim_solver(
"ipopt")
146 guess = solver.createGuess()
148 guess.setTime([0, 1])
149 guess.setState(
"/jointset/j0/q0/value", [0, -math.pi])
150 guess.setState(
"/jointset/j1/q1/value", [0, 2*math.pi])
151 guess.setState(
"/jointset/j0/q0/speed", [0, 0])
152 guess.setState(
"/jointset/j1/q1/speed", [0, 0])
153 guess.setControl(
"/tau0", [0, 0])
154 guess.setControl(
"/tau1", [0, 0])
155 guess.resampleWithNumTimes(10)
156 solver.setGuess(guess)
159 study.printToXML(
"examplePredictAndTrack_predict.omoco")
162 solution = study.solve();
163 solution.write(
"examplePredictAndTrack_predict_solution.sto");
166 study.visualize(solution);
170 def computeMarkersReference(predictedSolution):
171 model = createDoublePendulumModel()
173 states = predictedSolution.exportToStatesStorage()
176 columnLabels = model.getStateVariableNames()
177 columnLabels.insert(0,
"time")
178 states.setColumnLabels(columnLabels)
180 statesTraj = osim.StatesTrajectory.createFromStatesStorage(model, states)
182 markerTrajectories = osim.TimeSeriesTableVec3()
183 markerTrajectories.setColumnLabels([
"/markerset/m0",
"/markerset/m1"])
185 for state
in statesTraj:
186 model.realizePosition(state)
187 m0 = model.getComponent(
"markerset/m0")
188 m1 = model.getComponent(
"markerset/m1")
189 markerTrajectories.appendRow(state.getTime(),
190 osim.RowVectorVec3([m0.getLocationInGround(state),
191 m1.getLocationInGround(state)]))
194 markerWeights = osim.SetMarkerWeights()
195 markerWeights.cloneAndAppend(osim.MarkerWeight(
"/markerset/m0", 1))
196 markerWeights.cloneAndAppend(osim.MarkerWeight(
"/markerset/m1", 5))
198 return osim.MarkersReference(markerTrajectories, markerWeights)
201 def solveStateTracking(stateRef):
203 study = osim.MocoStudy()
204 study.setName(
"double_pendulum_track")
206 problem = study.updProblem()
209 problem.setModel(createDoublePendulumModel())
215 finalTime = markersRef.getMarkerTable().getIndependentColumn()[-1]
216 problem.setTimeBounds(0, finalTime)
217 problem.setStateInfo(
"/jointset/j0/q0/value", [-10, 10], 0)
218 problem.setStateInfo(
"/jointset/j0/q0/speed", [-50, 50], 0)
219 problem.setStateInfo(
"/jointset/j1/q1/value", [-10, 10], 0)
220 problem.setStateInfo(
"/jointset/j1/q1/speed", [-50, 50], 0)
221 problem.setControlInfo(
"/tau0", [-150, 150])
222 problem.setControlInfo(
"/tau1", [-150, 150])
225 stateTracking = osim.MocoStateTrackingGoal()
226 stateTracking.setReference(osim.TableProcessor(stateRef))
227 problem.addGoal(stateTracking)
229 effort = osim.MocoControlGoal()
230 effort.setName(
"effort")
231 effort.setWeight(0.001)
235 solver = study.initTropterSolver()
236 solver.set_num_mesh_intervals(50)
237 solver.set_verbosity(2)
238 solver.set_optim_solver(
"ipopt")
239 solver.set_optim_jacobian_approximation(
"exact")
240 solver.set_optim_hessian_approximation(
"exact")
241 solver.set_exact_hessian_block_sparsity_mode(
"dense")
244 study.printToXML(
"examplePredictAndTrack_track_states.omoco")
247 solution = study.solve()
249 solution.write(
"examplePredictAndTrack_track_states_solution.sto")
252 study.visualize(solution)
256 def solveMarkerTracking(markersRef, guess):
258 study = osim.MocoStudy()
259 study.setName(
"double_pendulum_track")
261 problem = study.updProblem()
264 problem.setModel(createDoublePendulumModel())
270 finalTime = markersRef.getMarkerTable().getIndependentColumn()[-1]
271 problem.setTimeBounds(0, finalTime)
272 problem.setStateInfo(
"/jointset/j0/q0/value", [-10, 10], 0)
273 problem.setStateInfo(
"/jointset/j0/q0/speed", [-50, 50], 0)
274 problem.setStateInfo(
"/jointset/j1/q1/value", [-10, 10], 0)
275 problem.setStateInfo(
"/jointset/j1/q1/speed", [-50, 50], 0)
276 problem.setControlInfo(
"/tau0", [-100, 100])
277 problem.setControlInfo(
"/tau1", [-100, 100])
280 markerTracking = osim.MocoMarkerTrackingGoal()
281 markerTracking.setMarkersReference(markersRef)
282 problem.addGoal(markerTracking)
284 effort = osim.MocoControlGoal()
285 effort.setName(
"effort")
286 effort.setWeight(0.0001)
290 solver = study.initTropterSolver()
291 solver.set_num_mesh_intervals(50)
292 solver.set_verbosity(2)
293 solver.set_optim_solver(
"ipopt")
294 solver.set_optim_jacobian_approximation(
"exact")
295 solver.set_optim_hessian_approximation(
"exact")
296 solver.set_exact_hessian_block_sparsity_mode(
"dense")
298 solver.setGuess(guess)
301 study.printToXML(
"examplePredictAndTrack_track_markers.omoco")
304 solution = study.solve()
306 solution.write(
"examplePredictAndTrack_track_markers_solution.sto")
309 study.visualize(solution)
315 optimalTrajectory = solvePrediction()
317 markersRef = computeMarkersReference(optimalTrajectory)
319 trackedSolution = solveStateTracking(optimalTrajectory.exportToStatesTable())
321 trackedSolution = solveMarkerTracking(markersRef, trackedSolution)