1

ドレイクツールボックスを使用して、最小時間制御コードを作成しようとしていました。しかし、途中で、エラー情報を理解できません: (この括弧内で起こったことは無視してください。投稿を送信するためにどれだけの詳細が必要かわかりません!)

'''python
from pydrake.all import MathematicalProgram, import numpy as npを解く

def g(x):
    if abs(x)<1e-7:
        return 0.
    else:
        return 1.

mp = MathematicalProgram()

state_initial = np.asarray([1., 0])
position_goal = np.asarray([0,  0])

N=100
dt=0.01
u_over_time=mp.NewContinuousVariables(1,"u_0")
states_over_time = np.asarray([state_initial])
for k in range(1,N):
    u = mp.NewContinuousVariables(1, "u_%d" % k)
    state =mp.NewContinuousVariables(2,"state_%d" % k)
    u_over_time = np.vstack((u_over_time, u))
    states_over_time = np.vstack((states_over_time,state))

print "Number of decision vars", mp.num_vars()
for i in range(N-1):
    state_next0 = states_over_time[i,0]+  dt*states_over_time[i,1]
    state_next1 = states_over_time[i,1]+  dt*u_over_time[i]
    mp.AddLinearConstraint(states_over_time[i+1,0]>=state_next0)
    mp.AddLinearConstraint(states_over_time[i+1,1]>=state_next1)
    mp.AddLinearConstraint(states_over_time[i+1,0]<=state_next0)
    mp.AddLinearConstraint(states_over_time[i+1,1]<=state_next1)
    mp.AddLinearConstraint(u_over_time[i]<=1.)
    mp.AddLinearConstraint(u_over_time[i]>=-1.)

And the error info is :
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-2-be1aa565be42> in <module>()
     29     state_next1 = states_over_time[i,1]+  dt*u_over_time[i]
     30     mp.AddLinearConstraint(states_over_time[i+1,0]>=state_next0)
---> 31     mp.AddLinearConstraint(states_over_time[i+1,1]>=state_next1)
     32     mp.AddLinearConstraint(states_over_time[i+1,0]<=state_next0)
     33     mp.AddLinearConstraint(states_over_time[i+1,1]<=state_next1)

RuntimeError: You should not call `__bool__` / `__nonzero__` on `Formula`. If you are trying to make a map with `Variable`, `Expression`, or `Polynomial` as keys (and then access the map in Python), please use pydrake.common.containers.EqualToDict`.

May I know what's happening here? Thanks

----------------update line-----------------
I modified the code as you told me. Now the code now becomes:

'''python
    from pydrake.all import MathematicalProgram, Solve
    import numpy as np

    def g(x):
        if abs(x)<1e-7:
            return 0.
        else:
            return 1.

    mp = MathematicalProgram()

    state_initial = np.asarray([1., 0])
    position_goal = np.asarray([0,  0])

    N=100
    dt=0.01
    u_over_time=mp.NewContinuousVariables(1,"u_0")
    states_over_time = np.asarray([state_initial])
    for k in range(1,N):
        u = mp.NewContinuousVariables(1, "u_%d" % k)
        state =mp.NewContinuousVariables(2,"state_%d" % k)
        u_over_time = np.vstack((u_over_time, u))
        states_over_time = np.vstack((states_over_time,state))

    print "Number of decision vars", mp.num_vars()
    for i in range(N-1):
        state_next0 = states_over_time[i,0]+  dt*states_over_time[i,1]
        state_next1 = states_over_time[i,1]+  dt*u_over_time[i,0]
        mp.AddLinearConstraint(states_over_time[i+1,0]>=state_next0[0])
        mp.AddLinearConstraint(states_over_time[i+1,1]>=state_next1[0])
        mp.AddLinearConstraint(states_over_time[i+1,0]<=state_next0[0])
        mp.AddLinearConstraint(states_over_time[i+1,1]<=state_next1[0])
        mp.AddLinearConstraint(u_over_time[i,0]<=1.)
        mp.AddLinearConstraint(u_over_time[i,0]>=-1.)
'''

And the error info is:
TypeError                                 Traceback (most recent call last)
<ipython-input-7-82e68c2ebfaa> in <module>()
     27     state_next0 = states_over_time[i,0]+  dt*states_over_time[i,1]
     28     state_next1 = states_over_time[i,1]+  dt*u_over_time[i,0]
---> 29     mp.AddLinearConstraint(states_over_time[i+1,0]>=state_next0[0])
     30     mp.AddLinearConstraint(states_over_time[i+1,1]>=state_next1[0])
     31     mp.AddLinearConstraint(states_over_time[i+1,0]<=state_next0[0])

TypeError: 'float' object has no attribute '__getitem__'

What's the problem this time? Thanks.

(Btw, one of my complain is that, the error info always not that effective to give the hint of where the problem is...)

-----------------update 2nd time line--------------------
Now a similar problem happened to the g(x), the code:
'''
    from pydrake.all import MathematicalProgram, Solve
    import numpy as np

    def g(x):
        print 'x=',x
        print 'x[0]=',x[0]
        if x[0]*x[0]+x[1]*x[1]<1e-7: # x.dot(x)
            return 0.
        else:
            return 1.

    mp = MathematicalProgram()

    state_initial = np.asarray([1., 0])
    #position_goal = np.asarray([0,  0]) # already in g(x)

    N=100
    dt=0.01
    u_over_time=mp.NewContinuousVariables(1,"u_0")
    states_over_time = np.asarray([state_initial])
    for k in range(1,N):
        u = mp.NewContinuousVariables(1, "u_%d" % k)
        state =mp.NewContinuousVariables(2,"state_%d" % k)
        u_over_time = np.vstack((u_over_time, u))
        states_over_time = np.vstack((states_over_time,state))

    print "Number of decision vars", mp.num_vars()
    for i in range(N-1):
        state_next0 = states_over_time[i,0]+  dt*states_over_time[i,1]
        state_next1 = states_over_time[i,1]+  dt*u_over_time[i,0]
        mp.AddLinearConstraint(states_over_time[i+1,0]>=state_next0)
        mp.AddLinearConstraint(states_over_time[i+1,1]>=state_next1)
        mp.AddLinearConstraint(states_over_time[i+1,0]<=state_next0)
        mp.AddLinearConstraint(states_over_time[i+1,1]<=state_next1)
        mp.AddLinearConstraint(u_over_time[i,0]<=1.)
        mp.AddLinearConstraint(u_over_time[i,0]>=-1.)
    reward=np.zeros((N,1))
    for i in range(N):
        reward[i]=g(states_over_time[i,:])

    mp.AddQuadraticCost(reward.dot(reward))
    result=Solve(mp)
'''
This time neither x or x[0] could solve the problem. the output info is :

Number of decision vars 298
x= [1.0 0.0]
x[0]= 1.0
x= [Variable('state_1(0)', Continuous) Variable('state_1(1)', Continuous)]
x[0]= state_1(0)

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-8-08d1cd75397e> in <module>()
     37 reward=np.zeros((N,1))
     38 for i in range(N):
---> 39     reward[i]=g(states_over_time[i,:])
     40 
     41 mp.AddQuadraticCost(reward.dot(reward))

<ipython-input-8-08d1cd75397e> in g(x)
      5     print 'x=',x
      6     print 'x[0]=',x[0]
----> 7     if x[0]*x[0]+x[1]*x[1]<1e-7: # x.dot(x)
      8         return 0.
      9     else:

RuntimeError: You should not call `__bool__` / `__nonzero__` on `Formula`. If you are trying to make a map with `Variable`, `Expression`, or `Polynomial` as keys (and then access the map in Python), please use pydrake.common.containers.EqualToDict`.

What can I do this time? Thanks
Btw, you see in the code i print x or x[0] only once, but i got two different answer? funny, isn't it? why is this?

4

4 に答える 4

0

これは、構文エラーをスローしないコードの一部です

    from pydrake.all import MathematicalProgram, Solve
    import numpy as np

    def g(x):
        x_squared_norm = np.power(x.reshape((2, -1)), 2)
        return np.sum(x_squared_norm > 1e-7)

    mp = MathematicalProgram()

    state_initial = np.asarray([1., 0])
    #position_goal = np.asarray([0,  0]) # already in g(x)

    N=100
    dt=0.01
    u_over_time=mp.NewContinuousVariables(1,"u_0")
    states_over_time = np.asarray([state_initial])
    for k in range(1,N):
        u = mp.NewContinuousVariables(1, "u_%d" % k)
        state =mp.NewContinuousVariables(2,"state_%d" % k)
        u_over_time = np.vstack((u_over_time, u))
        states_over_time = np.vstack((states_over_time,state))

    print "Number of decision vars", mp.num_vars()
    for i in range(N-1):
        state_next0 = states_over_time[i,0]+  dt*states_over_time[i,1]
        state_next1 = states_over_time[i,1]+  dt*u_over_time[i,0]
        mp.AddLinearConstraint(states_over_time[i+1,0]>=state_next0)
        mp.AddLinearConstraint(states_over_time[i+1,1]>=state_next1)
        mp.AddLinearConstraint(states_over_time[i+1,0]<=state_next0)
        mp.AddLinearConstraint(states_over_time[i+1,1]<=state_next1)
        mp.AddLinearConstraint(u_over_time[i,0]<=1.)
        mp.AddLinearConstraint(u_over_time[i,0]>=-1.)
    mp.AddCost(g, vars=states_over_time[1:,:].reshape((1, -1)).squeeze())
    result=Solve(mp)

の定義を変更し、 の代わりにg呼び出したことに注意してください。二次記号式が必要です。コード内の式は 2 次ではありません (コストにステートメントがあり、2 次コストはステートメントを許可しません)。mp.AddCostmp.AddQuadraticCostmp.AddQuadraticCostifif

このコードはエラーなしで実行されるはずですが、解決策が見つかるかどうかはわかりません。繰り返しになりますが、このコストは微分可能ではないため、勾配ベースの非線形ソルバーには問題があります。

問題を非線形最適化問題として本当に解決したくない場合は、問題を混合整数プログラムとして再定式化することを検討できます。つまり、コストは一連のバイナリ変数b[i]、つまりの合計であり、b[i] = 1 if |x[i, 0]| > epsilon or |x[i, 1]| > epsilon; otherwise b[i] = 0これを混合整数線形制約として定式化できます。

于 2019-12-19T17:39:50.023 に答える