我正在尝试从头开始为acrobot系统创建LQR:
file_name = "acrobot.sdf" # from drake/multibody/benchmarks/acrobot/acrobot.sdf
acrobot = MultibodyPlant()
parser = Parser(plant=acrobot)
parser.AddModelFromFile(file_name)
acrobot.AddForceElement(UniformGravityFieldElement([0, 0, -9.81]))
acrobot.Finalize()
acrobot_context = acrobot.CreateDefaultContext()
shoulder = acrobot.GetJointByName("ShoulderJoint")
elbow = acrobot.GetJointByName("ElbowJoint")
shoulder.set_angle(context=acrobot_context, angle=0.0)
elbow.set_angle(context=acrobot_context, angle=0.0)
Q = np.identity(4)
R = np.identity(1)
N = np.zeros([4, 4])
controller = LinearQuadraticRegulator(acrobot, acrobot_context, Q, R)
运行此脚本,我在最后一个字符串处收到错误:
RuntimeError: Vector-valued input port acrobot_actuation must be either fixed or connected to the output of another system.
我修复/连接输入端口的方法都没有成功。
P.S。我知道这里有AcrobotPlant
,但想法是在运行时从sdf创建LQR。
P.P.S。为什么acrobot.get_num_input_ports()
返回5而不是1?
答案 0 :(得分:1)
以下是我必须应用的delta,以使其至少通过该错误:
https://github.com/EricCousineau-TRI/drake/commit/e7167fb8a
主要说明:
plant_context.FixInputPort
,要么(b)通过使用DiagramBuilder
+ AddSystem
使用Connect(output_port, input_port
组成系统。plant
,以便您可以直接引用模型实例。这对您有帮助吗?
P.P.S。为什么acrobot.get_num_input_ports()返回5而不是1?
这是因为它是一个MultibodyPlant
实例,它具有多个端口。从plot_system_graphviz
进行预览: