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