■歩行の改善
リスト 8-1 の歩行は結果的に歩かせることには成功しましたが、簡易的なものでした。 歩行途中にイニシャル姿勢が挟まっていることも不自然で改善の余地があります。 ここでは筆者が作成した歩行アルゴリズムを示しておきます。基本的にはリスト 8-1 で のイニシャル姿勢を、両脚を前後に開いて直立している姿勢(左右で 2 パターン)として います。(リスト 9-1) 図 9-1 はフレームごとの脚の動きを示したものですので参考にしてください。数字は動作配列(リスト)の行に相当します。なお関節角度は実際より 2倍程度に拡大しています。
また現状フレーム間の経過時間が devide×30 ミリ秒で固定となっているので、これをそれぞれのフレームに固有の値に設定できるように変更しています。動作配列のフレー ム行の最後尾に「devide数」の列を追加しています。値が大きいほどその姿勢になるまでに多くの時間を要することになります。設定した値は、両脚着地での体重移動はゆっくり、片脚での遊脚移動は素早く、という動きになるように決めました。
フレーム数(行数)に関しても、「rows = len(angle)」という変数を追加して行数が変わった場合にも自動で対応できるように変更しています。
リスト9-1 walk.py(部分)
angle = [
[75, 95, 90,110,110, 90, 90,110,110, 90, 95, 95, 8],
[80, 90, 90,110,110, 80, 80,100,100, 90, 90,100, 8],#左体重
[85, 85, 90, 90, 90, 90, 80, 90, 90, 90, 85,105, 4],
[90, 80, 90, 70, 70, 90, 80, 80, 80, 90, 80,110, 4],#右足前
[85, 85, 90, 70, 70, 90, 90, 70, 70, 90, 85,105, 8],
[80, 90, 90, 80, 80,100, 100, 70, 70, 90, 90,100, 8],#右体重
[75, 95, 90, 90, 90,100, 90, 90, 90, 90, 95, 95, 4],
[70,100, 90,100,100,100, 90,110,110, 90, 100, 90, 4] #左足前
]
rows = len(angle)
・・・
while True: # 繰り返し
# キーフレームを更新
div_counter += 1
if div_counter >= angle[next_key_frame][12]:
div_counter = 0
key_frame = next_key_frame
next_key_frame += 1
if next_key_frame > rows - 1:
next_key_frame = 0 #angle 0行に戻る
# 角度計算
for i in range(12):
temp_angle[i] = angle[key_frame][i] +\
(angle[next_key_frame][i] - angle[key_frame][i])\
* div_counter / angle[next_key_frame][12]
# サーボ駆動
for i in range(12):
servo[i].duty_u16(get_pulse_width(int(temp_angle[i]) + correction[i]))
time.sleep(0.03) # 0.03秒待ち
コメント