Высокое использование памяти при прямой транскрипции с уравнениями симпти - PullRequest
0 голосов
/ 27 сентября 2019

Я использовал sympy, чтобы вывести через Лагранжа уравнения движения моего трехзвенного робота.Результирующее уравнение движения в форме (theta_dot_dot = f(theta, theta_dot)) оказалось очень сложным с большим количеством cos и sin.Затем я lambdified функций, используемых с drake, заменяя все sympy.sin и sympy.cos на drake.sin, drake.cos.

Окончательная функция может бытьоцениваемый численно (то есть с учетом theta, theta_dot, найти theta_dot_dot) несколько эффективнее в диапазоне миллисекунд.

Затем я попытался использовать прямую транскрипцию для оптимизации траектории.Примечание. Я не использовал библиотеку DirectTranscription, вместо этого вручную добавил необходимые ограничения.

Ограничения добавляются примерно следующим образом:

for i in range(NUM_TIME_STEPS-1):
    print("Adding constraints for t = " + str(i))
    tau = mp.NewContinuousVariables(3, "tau_%d" % i)

    next_state = mp.NewContinuousVariables(8, "state_%d" % (i+1))

    for j in range(8):
        mp.AddConstraint(next_state[j] <= (state_over_time[i] + TIME_INTERVAL*derivs(state_over_time[i], tau))[j])
        mp.AddConstraint(next_state[j] >= (state_over_time[i] + TIME_INTERVAL*derivs(state_over_time[i], tau))[j])

    state_over_time[i+1] = next_state
    tau_over_time[i] = tau

Проблема, с которой я сейчас сталкиваюсь, заключается вчто на каждой итерации добавления ограничений я замечаю, что использование моей памяти увеличивается примерно на 70-100 МБ.Это означает, что мое количество временных шагов не может превышать 50, прежде чем программа выйдет из строя из-за нехватки памяти.

Мне интересно, что я могу сделать, чтобы оптимизация траектории работала для моего робота.Очевидно, что я могу попытаться упростить (вручную или иным образом) уравнения движений ... но могу ли я попробовать что-нибудь еще?Даже нормально, что ограничения занимают так много памяти?Я что-то здесь не так делаю?

1 Ответ

1 голос
/ 28 сентября 2019

Вы продвигаете символ Дрейка через ваши сложные уравнения.Сделать это лучше - хорошая цель, но, вероятно, вы хотите избежать этого, используя другую перегрузку для AddConstraint:

AddConstraint(your_method, lb, ub, vars)

https://drake.mit.edu/pydrake/pydrake.solvers.mathematicalprogram.html?highlight=addconstraint#pydrake.solvers.mathematicalprogram.MathematicalProgram.AddConstraint

Это будет использовать ваш код Python как функциюуказатель, и вместо символического следует использовать авторазличие.

...