.. note:: こんにちは!SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Communityへようこそ!Raspberry Pi、Arduino、ESP32に関心のある仲間とともに、さらに深く学びましょう。 **参加する理由** - **専門家のサポート**: 購入後の問題や技術的な課題を、コミュニティやチームのサポートで解決できます。 - **学びと共有**: ヒントやチュートリアルを交換して、スキルを向上させましょう。 - **特別なプレビュー**: 新製品の発表や先行公開に早期アクセスできます。 - **特別割引**: 新製品に対して限定割引を楽しめます。 - **祝祭プロモーションとプレゼント**: プレゼントや祝祭プロモーションに参加できます。 👉 私たちと一緒に探求し、創造する準備はできましたか?[|link_sf_facebook|]をクリックして、今すぐ参加しましょう! .. _py_record: 11. 新しいステップの記録 ============================= このプロジェクトでは、キーボードを使ってPiCrawlerを操作し、いくつかのポーズを順番に実行し、それらのポーズを記録します。その後、記録したポーズを再生できます。 **コードの実行** .. raw:: html .. code-block:: cd ~/picrawler/examples sudo python3 11_record_new_step.py コードを実行した後、ターミナルに表示されるプロンプトに従って操作してください。 * ``1234`` キーを押して足を個別に選択します。 ``1`` : 右前足、 ``2`` : 左前足、 ``3`` : 左後足、 ``4`` : 右後足 * ``w`` 、 ``a`` 、 ``s`` 、 ``d`` 、 ``r`` 、 ``f`` を押して、PiCrawlerの座標値をゆっくりと制御します。 * ``space`` キーを押すと、すべての座標値が表示され、現在のステップが保存されます。 * ``p`` キーを押すと、記録されたアクションを再生します。 * ``esc`` キーを押すと、終了します。 **コード** .. code-block:: python from picrawler import Picrawler from time import sleep import sys import tty import termios import copy crawler = Picrawler() speed = 80 def readchar(): fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: tty.setraw(sys.stdin.fileno()) ch = sys.stdin.read(1) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) return ch manual = ''' Press keys on keyboard to control! w: Y++ a: X-- s: Y-- d: X++ r: Z++ f: Z-- 1: Select right front leg 2: Select left front leg 3: Select left rear leg 4: Select right rear leg Space: Print all leg coodinate & Save this step p: Play all saved step esc: Quit ''' new_step=[] def save_new_step(): new_step.append(copy.deepcopy(crawler.current_step_all_leg_value())) print(new_step) def play_all_new_step(): for step in new_step: crawler.do_step(step,speed) sleep(0.6) def main(): speed = 80 print(manual) crawler.do_step('sit',speed) leg = 0 coodinate=crawler.current_step_leg_value(leg) while True: key = readchar() key = key.lower() # print(key) if 'w' == key: coodinate[1]=coodinate[1]+2 elif 's' == key: coodinate[1]=coodinate[1]-2 elif 'a' == key: coodinate[0]=coodinate[0]-2 elif 'd' == key: coodinate[0]=coodinate[0]+2 elif 'r' == key: coodinate[2]=coodinate[2]+2 elif 'f' == key: coodinate[2]=coodinate[2]-2 elif '1' == key: leg=0 coodinate=crawler.current_step_leg_value(leg) elif '2' == key: leg=1 coodinate=crawler.current_step_leg_value(leg) elif '3' == key: leg=2 coodinate=crawler.current_step_leg_value(leg) elif '4' == key: leg=3 coodinate=crawler.current_step_leg_value(leg) elif chr(32) == key: print("[[right front],[left front],[left rear],[right rear]]") print("saved new step") print(crawler.current_step_all_leg_value()) save_new_step() elif 'p' == key: play_all_new_step() elif chr(27) == key:# 27はESCキー break sleep(0.05) crawler.do_single_leg(leg,coodinate,speed) print("\n q Quit") if __name__ == "__main__": main() **仕組みは?** このプロジェクトは、:ref:`py_posture` から生まれました。録音と再生機能が追加されています。 録音機能は以下のコードで実現されています。 .. code-block:: python new_step=[] def save_new_step(): new_step.append(copy.deepcopy(crawler.current_step_all_leg_value())) print(new_step) .. note:: ここでの代入には、 `Deep Copy `_ 関数を使用する必要があります。さもなければ、 ``new_step`` に新しい配列オブジェクトが追加されません。 再生機能は以下のコードで実現されています。 .. code-block:: python def play_all_new_step(): for step in new_step: crawler.do_step(step,speed) sleep(0.6)