Pythonで作るモーター駆動パターングラフ作成ツールにS字駆動追加

Share on:

以前作成したモーター駆動パターンのグラフ作成ツールにS字駆動の描画機能を追加しました。

加速パターン

台形駆動のように等加速度運動を行う場合、t=0からいきなり加速度が最大になるため加速時や減速時に衝撃が発生したりします。それを抑えるためには加速度を徐々に変化させるのが常套手段で、S字駆動なんて呼ばれているようです。たぶん加速時の速度がS字カーブの形をしているからそう呼ばれているのでしょう。

加速度を徐々に変化させるパターンはいろいろあるようですが、今回は加速度を直線的に変化させるグラフを描くことにしました。時刻tの時の加速度をa、加速時間をt1とした場合、下記のような条件とします。

  • t < t1/2のとき、a = a1 * t
  • t >= t1/2のとき、a = -a1 * t

PythonでS字駆動のグラフ計算

計算はtriangle_accelerated_motionという関数で計算していて、下記のようなコードにしました。

加速度は、上述のa = a1 * tとして計算しています。

速度は、時刻の差分dtと加速度aで微小区間ごとに面積を計算してからnumpy.cumsumで要素番号までの和の配列を計算しています。

距離は、速度と同じ計算をdtとvを使って計算しています。

 1def triangle_accelerated_motion(v0, t0, t1, x0, acceleration, steps, decimals=4):
 2    t = np.round( np.linspace(t0, t1, steps), decimals)
 3    t_shifted = np.insert(t[:-1], 0, t[0])
 4    dt = t - t_shifted
 5
 6    split_index = int( len(dt) / 2 )
 7    if not len(dt) % 2 == 0:
 8        split_index += 1
 9    
10    # calculate acceleration
11    t_splited = t[ : split_index ] - t[0]
12    a1 = t_splited * acceleration / t_splited[-1]
13    a = np.round( np.concatenate( [ a1, a1[ ::-1 ][ split_index-int( len(dt) / 2 ): ] ] ), decimals)
14
15    # calculate velocity
16    a_shifted = np.insert(a[:-1], 0, a[0])
17    v = dt * (a + a_shifted) / 2.0
18    v = np.round( np.cumsum(v) + v0, decimals)
19
20    # calculate distance
21    v_shifted = np.insert(v[:-1], 0, v[0])
22    x = dt * (v + v_shifted) / 2.0
23    x = np.round( np.cumsum(x) + x0, decimals)
24
25    return t, a, v, x

ソースコード

githubにアップロードしました

関連記事