Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Symphy方程进行直接转录时内存使用率高_Python_Drake - Fatal编程技术网

Python 使用Symphy方程进行直接转录时内存使用率高

Python 使用Symphy方程进行直接转录时内存使用率高,python,drake,Python,Drake,我使用sympy通过拉格朗日推导出我的三连杆机器人的运动方程。形式为(theta\u dot\u dot=f(theta,theta\u dot))的合成运动方程变得非常复杂,有许多cos和sin。然后,我选择要与drake一起使用的函数,将所有sympy.sin和sympy.cos替换为drake.sin,drake.cos 最后的函数可以在毫秒范围内进行数值计算(即给定θ,θ点,查找θ点) 然后我尝试使用直接转录来进行轨迹优化。注意:我没有使用DirectTranscription库,而是手

我使用sympy通过拉格朗日推导出我的三连杆机器人的运动方程。形式为(
theta\u dot\u dot=f(theta,theta\u dot)
)的合成运动方程变得非常复杂,有许多
cos
sin
。然后,我选择要与
drake
一起使用的函数,将所有
sympy.sin
sympy.cos
替换为
drake.sin
drake.cos

最后的函数可以在毫秒范围内进行数值计算(即给定
θ,θ点
,查找
θ点

然后我尝试使用直接转录来进行轨迹优化。注意:我没有使用
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
范围内i的
(NUM\u TIME\u STEPS-1):
打印(“为t=“+str(i)”添加约束)
tau=mp.NewContinuousVariables(3,“tau_u%d”%i)
next_state=mp.NewContinuousVariables(8,“state_%d”%(i+1))
对于范围(8)内的j:
mp.AddConstraint(下一个状态[j]=(状态[i]随时间变化+时间间隔*derivs(状态[u]随时间变化[i],tau))[j])
状态随时间变化[i+1]=下一个状态
tau随时间的变化[i]=tau
我现在面临的问题是,在每次添加约束的迭代中,我发现我的内存使用量增加了70-100MB左右。这意味着在程序因内存不足而崩溃之前,我的时间步数不能超过50


我想知道我能做些什么来让我的机器人实现轨迹优化。显然,我可以尝试简化(用手或其他方式)运动方程。。。但是还有什么我可以试试的吗?约束占用了这么多内存,这是否正常?我是不是做错了什么?

你把德雷克的符号推过了你的复杂方程。使其更好是一个很好的目标,但您可能希望通过使用AddConstraint的另一个重载来避免它:

AddConstraint(your_method, lb, ub, vars)


这将使用python代码作为函数指针,并且应该使用autodiff而不是symbol。

您正在通过复杂的方程来推进drake的symbol。使其更好是一个很好的目标,但您可能希望通过使用AddConstraint的另一个重载来避免它:

AddConstraint(your_method, lb, ub, vars)


这将使用python代码作为函数指针,并应使用autodiff而不是符号。

对于
AddCost(func,vars)
,func应将决策变量的numpy向量作为唯一参数,并输出一个双精度值,即成本。输入向量的大小将与变量的大小相同。对于
AddConstraint(func,lb,ub,vars)
,func应该将相同的决策变量向量作为唯一的输入,但输出应该是与lb和ub大小相同的数组/向量(可转换为numpy向量)——每个约束的值在决策变量值处有一个元素。可以看到一个简单的示例[此处]()。对于
AddCost(func,vars)
,func应将决策变量的numpy向量作为唯一参数,并输出一个双精度值,即成本。输入向量的大小将与vars相同。对于
AddConstraint(func,lb,ub,vars)
,func应该将相同的决策变量向量作为唯一的输入,但输出应该是与lb和ub大小相同的数组/向量(可转换为numpy向量),每个约束的值在决策变量值处有一个元素。可以看到一个简单的示例[此处]()。