python - 使用 sympy 方程进行直接转录时内存使用率高
问题描述
我曾经sympy
通过拉格朗日推导我的 3 连杆机器人的运动方程。以 ( ) 形式得到的运动方程theta_dot_dot = f(theta, theta_dot)
结果非常复杂,有很多cos
和sin
。然后我lambdified
使用 with 的函数drake
,将所有的sympy.sin
andsympy.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 而不是符号。
推荐阅读
- postgresql - 表“产品”缺少 FROM 子句条目
- svn - 本地删除 SVN 分支,但不从远程删除
- javascript - 我们如何在通过控制器附加到 html 页面的 html 中使用 angularjs 范围变量?
- flutter - 如何解决 Flutter 上未使用 import 的问题?
- jquery - 在 mouseleave 上隐藏元素(仅在快速移动时?)
- java - 当子字符串包含某些字符时更改整个字符串
- local-storage - 第一次在 SwiftUI 中未保存和更新 UserDefaults
- python - Youtube API v 3 中的布尔 OR(Python 代码)
- r - 如何确定层次聚类中的聚类数量
- python - 用下一个递增数字填充空值 | PySpark | Python