Что означает «В следующей среде нет записи для переменной» в контексте FiniteHorizonLinearQuadraticRegulator - PullRequest
3 голосов
/ 09 мая 2020

Фон

Я использую прямое размещение и загружаю результат в FiniteHorizonLinearQuadraticRegulator для стабилизации траектории, но я столкнулся с ошибкой при построении FHLQR.

Я пытаюсь поймите, что означает следующее:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-40-0a8e3d5cdef4> in <module>
     10 Q = np.diag([10.,10.,1.,1.])
     11 options.Qf = Q
---> 12 tvlqr = MakeFiniteHorizonLinearQuadraticRegulator(
     13                                       plant, context, t0=options.u0.start_time(),
     14                                       tf=options.u0.end_time(), Q=Q, R=np.eye(1),

RuntimeError: The following environment does not have an entry for the variable u(0)
t -> 4.46101
z2 -> 3.18212e-06
z3 -> 0.001
z1 -> 3
z4 -> 2.82268e-05
u1 -> 0

То, что я пробовал

Сначала я подумал, что мне может потребоваться назвать мою входную переменную точно u, но это не помогло. Я думаю, что u(0) означает, что он не может найти место для ввода ввода на первом временном шаге, но я не уверен, как я могу это исправить.

Я попытался исправить входной порт для установки в нулевой момент времени на значение 0, используя это: plant.get_input_port(0).FixValue(context, [0]), но это все равно приводит к той же проблеме.

Я также попытался установить input_port_index вариант примерно так: options.input_port_index = plant.get_input_port(0).get_index() но я получаю ту же ошибку.

Я думаю, что это не проблема с тем, как я настроил FiniteHorizonLinearQuadraticRegulator, потому что я заменил MakeFiniteHorizonLinearQuadraticRegulator на LinearQuadraticRegulator и имеют ту же ошибку.

Я был бы очень признателен за понимание того, что означает эта ошибка и как ее решить.

Скелет кода

t = Variable("t") # time

# state of the robot (in cartesian coordinates)
z1 = Variable("z1") # ball angle (phi)
z2 = Variable("z2") # body angle 
z3 = Variable("z3") # ball angular velocity (nu)
z4 = Variable("z4") # body angular velocity
cartesian_state = [z1, z2, z3, z4]

# control input of the robot
u1 = Variable("u1") # wheel torque
ctrl_input = [u1]

# nonlinear dynamics, the whole state is measured (output = state)
## dynamics equations here ##
qddot = ((B*u-C-G)/M).T[0]

dynamics = np.concatenate(([z3, z4], qddot))

# dynamics = [u1*cos(z3), u1*sin(z3), u2]
robot = SymbolicVectorSystem(
    time=t,
    state=cartesian_state,
    input=ctrl_input,
    output=cartesian_state,
    dynamics=dynamics,
)
options = FiniteHorizonLinearQuadraticRegulatorOptions()
options.x0 = dircol.ReconstructStateTrajectory(result)
options.u0 = dircol.ReconstructInputTrajectory(result)

builder = DiagramBuilder()
plant = builder.AddSystem(robot)
context = plant.CreateDefaultContext()
Q = np.diag([10.,10.,1.,1.])
options.Qf = Q
tvlqr = MakeFiniteHorizonLinearQuadraticRegulator(
                                      plant, context, t0=options.u0.start_time(), 
                                      tf=options.u0.end_time(), Q=Q, R=np.eye(1),
                                      options=options)
regulator = builder.AddSystem(tvlqr)

1 Ответ

0 голосов
/ 10 мая 2020

Я понял, что использовал u в расчетах qddot, когда хотел использовать u1. Далее в своем блокноте я определил u = dircol.input(), откуда и возникла ошибка.

...