使用 sympy 方程进行直接转录时内存使用率高
High memory usage when doing direct transcription with sympy equations
我使用 sympy
通过拉格朗日推导了我的 3 link 机器人的运动方程。结果得到的形式为 (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-100MB。这意味着在程序因内存不足而崩溃之前,我的时间步数不能超过 50 个左右。
我想知道我可以做些什么来让我的机器人进行轨迹优化。显然,我可以尝试(手动或以其他方式)简化运动方程……但是还有什么我可以尝试的吗?约束占用这么多内存是否正常?我在这里做错了什么吗?
您正在通过复杂的方程式推动德雷克的符号。让它变得更好是一个很好的目标,但您可能想通过对 AddConstraint 使用其他重载来避免它:
AddConstraint(your_method, lb, ub, vars)
这将使用您的 python 代码作为函数指针,并且应该使用 autodiff 而不是符号。
我使用 sympy
通过拉格朗日推导了我的 3 link 机器人的运动方程。结果得到的形式为 (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-100MB。这意味着在程序因内存不足而崩溃之前,我的时间步数不能超过 50 个左右。
我想知道我可以做些什么来让我的机器人进行轨迹优化。显然,我可以尝试(手动或以其他方式)简化运动方程……但是还有什么我可以尝试的吗?约束占用这么多内存是否正常?我在这里做错了什么吗?
您正在通过复杂的方程式推动德雷克的符号。让它变得更好是一个很好的目标,但您可能想通过对 AddConstraint 使用其他重载来避免它:
AddConstraint(your_method, lb, ub, vars)
这将使用您的 python 代码作为函数指针,并且应该使用 autodiff 而不是符号。