I'm trying to add dynamics constraints to my mathematical program. However, I get TypeError as pasted below indicating MBP is unhappy with a continuous variable being an input.
Do I need to convert the symbolic variable to numerical values somehow or is there another type of variable I should use?
Here's relevant code:
def add_decision_variables(prog, n_steps):
# dimensions of x and u
dim_x = 6
dim_u = 2
x = prog.NewContinuousVariables(rows=n_steps+1, cols=dim_x) # states, x[t] = [q1, q2, q3, q1_dot, q2_dot, q3_dot]
u = prog.NewContinuousVariables(rows=n_steps+1, cols=dim_u) # input u[t] = [tau1, tau2]
# ... other variables...
return x, u
def add_dynamics_contstraint(prog, n_steps, decision_variables, time_step=0.0001):
# build plant in diagram
builder = DiagramBuilder()
plant, scene_graph = AddMultibodyPlantSceneGraph(builder, time_step=time_step)
file_name = FindResource("models/robot.urdf")
model = Parser(plant).AddModelFromFile(file_name)
plant.Finalize()
diagram = builder.Build()
x = decision_variables[0] # states, x[t] = [q1, q2, q3, q1_dot, q2_dot, q3_dot]
u = decision_variables[1] # [q1, q2] because q3 is not controllable
for t in range(n_steps-1):
prog.AddLinearConstraint(eq(x[t,0:3] - x[t+1,0:3] - time_step*x[t+1,3::], 0))
Here's the error message:
---------------------------------------------------------------------------
TypeError
Traceback (most recent call last) <ipython-input-22-f2bd5b25729d> in <module>
10 set_initial_and_goal_position(prog, decision_variables)
11 add_contact_constraint(prog, n_steps, decision_variables)
---> 12 add_dynamics_contstraint(prog, n_steps, decision_variables)
13
14
<ipython-input-21-ff72bdc2eedf> in add_dynamics_contstraint(prog, n_steps, decision_variables, time_step)
30
31 # Set plant dynamics to current state
---> 32 plant.SetPositionsAndVelocities(plant_context, x[t+1, :])
33
34 # Use the plant for dynamics parameters
TypeError: SetPositionsAndVelocities(): incompatible function arguments. The following argument types are supported:
1. (self: pydrake.multibody.plant.MultibodyPlant_[float], context: pydrake.systems.framework.Context_[float], q_v: numpy.ndarray[float64[m, 1]]) -> None
2. (self: pydrake.multibody.plant.MultibodyPlant_[float], context: pydrake.systems.framework.Context_[float], model_instance: pydrake.multibody.tree.ModelInstanceIndex, q_v: numpy.ndarray[float64[m, 1]]) -> None
Invoked with: <pydrake.multibody.plant.MultibodyPlant_[float] object at 0x133f885b0>, <pydrake.systems.framework.LeafContext_[float] object at 0x133fa5a30>, array([Variable('x(1,0)', Continuous), Variable('x(1,1)', Continuous),
Variable('x(1,2)', Continuous), Variable('x(1,3)', Continuous),
Variable('x(1,4)', Continuous), Variable('x(1,5)', Continuous)],
dtype=object)