I wang to use LQR to control a quadrotor in the MultibodyPlant, but I dont know how to control a part of the MultibodyPlant.
For example, the MakeMultipleQuadrotors() includes a sdf model which has a quadrotor and a payload. I just want to control the first twelve state and collect the other state.But in the code it will control all the state. I wonder how to modify my code or some examples for it. Thank you!
def MultipleQuadrotorDemo():
builder = DiagramBuilder()
robot_diagram = builder.AddSystem(MakeMultipleQuadrotors())
plant = robot_diagram.plant()
# Create the LQR controller
robot_diagram_context = robot_diagram.CreateDefaultContext()
mass = plant.CalcTotalMass(
plant.GetMyContextFromRoot(robot_diagram_context),
[plant.GetModelInstanceByName("quad")])
gravity = plant.gravity_field().gravity_vector()[2]
nominal_input = [-mass * gravity / 4] * 4
robot_diagram.get_input_port().FixValue(robot_diagram_context,
nominal_input)
Q = np.diag((([10] * 12)))
R = np.eye(4)
print(robot_diagram)
print(robot_diagram_context)
controller = builder.AddSystem(LinearQuadraticRegulator(robot_diagram, robot_diagram_context, Q, R))
builder.Connect(controller.get_output_port(),
robot_diagram.get_input_port())
builder.Connect(robot_diagram.GetOutputPort("x"),
controller.get_input_port())
MeshcatVisualizer.AddToBuilder(builder,
robot_diagram.GetOutputPort("query"),
meshcat)
diagram = builder.Build()
simulator = Simulator(diagram)
simulator.set_target_realtime_rate(1.0 if running_as_notebook else 0.0)
context = simulator.get_mutable_context()