如何使用 pydrake 为 Acrobot 系统创建 LinearQuadraticRegulator
How to create LinearQuadraticRegulator for Acrobot system using pydrake
我正在尝试从头开始为 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.
None 我对 fix/connect 输入端口的方法最终成功了。
P.S。我知道存在 AcrobotPlant
,但我的想法是从 运行.
上的 sdf 创建 LQR
P.P.S。为什么 acrobot.get_num_input_ports()
return 5 而不是 1?
以下是我必须应用的增量,以使其至少通过该错误:
https://github.com/EricCousineau-TRI/drake/commit/e7167fb8a
主要注释:
- 您要么 (a) 在相关端口上使用
plant_context.FixInputPort
,要么 (b) 使用 DiagramBuilder
通过使用 AddSystem
+ Connect(output_port, input_port
组合系统。
- 我建议将 MBP 实例命名为
plant
,这样您就可以直接引用模型实例。
这对一些人有帮助吗?
P.P.S. Why acrobot.get_num_input_ports() return 5 instead of 1?
因为是MultibodyPlant
实例,多了几个端口。来自 plot_system_graphviz
的预览:
我正在尝试从头开始为 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.
None 我对 fix/connect 输入端口的方法最终成功了。
P.S。我知道存在 AcrobotPlant
,但我的想法是从 运行.
P.P.S。为什么 acrobot.get_num_input_ports()
return 5 而不是 1?
以下是我必须应用的增量,以使其至少通过该错误:
https://github.com/EricCousineau-TRI/drake/commit/e7167fb8a
主要注释:
- 您要么 (a) 在相关端口上使用
plant_context.FixInputPort
,要么 (b) 使用DiagramBuilder
通过使用AddSystem
+Connect(output_port, input_port
组合系统。 - 我建议将 MBP 实例命名为
plant
,这样您就可以直接引用模型实例。
这对一些人有帮助吗?
P.P.S. Why acrobot.get_num_input_ports() return 5 instead of 1?
因为是MultibodyPlant
实例,多了几个端口。来自 plot_system_graphviz
的预览: