注釈

こんにちは!SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Communityへようこそ!Raspberry Pi、Arduino、ESP32に関心のある仲間とともに、さらに深く学びましょう。

参加する理由

  • 専門家のサポート: 購入後の問題や技術的な課題を、コミュニティやチームのサポートで解決できます。

  • 学びと共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。

  • 特別なプレビュー: 新製品の発表や先行公開に早期アクセスできます。

  • 特別割引: 新製品に対して限定割引を楽しめます。

  • 祝祭プロモーションとプレゼント: プレゼントや祝祭プロモーションに参加できます。

👉 私たちと一緒に探求し、創造する準備はできましたか?[ここ]をクリックして、今すぐ参加しましょう!

2. キーボード操作

このプロジェクトでは、キーボードを使用してPiCrawlerをリモートで制御する方法を学びます。PiCrawlerを前進、後退、左旋回、右旋回させることができます。

コードの実行

cd ~/picrawler/examples
sudo python3 2_keyboard_control.py

プログラムが開始されると、PiCrawler が初期化され、ターミナルにキーボード操作インターフェースが表示されます。

キーボードのキーを押して PiCrawler を操作できます!

  • w:前進

  • a:左に旋回

  • s:後退

  • d:右に旋回

  • Ctrl+C:終了

現在の速度が表示され、以下のキーで調整できます:

    • / ]:速度を上げる

    • / [:速度を下げる

各動作の後には、安定性を保つために短い待機時間が入ります。

Ctrl+C を押すと終了します。 終了前に、PiCrawler は安全に「座る」動作を行います。

コード

from picrawler import Picrawler
from time import sleep
import readchar

crawler = Picrawler()

SPEED_MIN = 20
SPEED_MAX = 70
speed = 60

STEP = 1            # Number of action steps per key press
ACTION_GAP = 0.25   # Delay after each action to reduce current spikes

manual = """
Keyboard Control - PiCrawler

Movement:
W: Forward
A: Turn left
S: Backward
D: Turn right

Speed Control:
+ / ] : Increase speed
- / [ : Decrease speed

Other:
Space  : Stop (no action)
Ctrl+C : Quit (auto sit)
"""

def clamp(value, min_value, max_value):
    """Limit value within a specified range."""
    return max(min_value, min(max_value, value))

def show_info():
    """Clear terminal and display control instructions."""
    print("\033[H\033[J", end="")  # Clear terminal screen
    print(manual)
    print(f"Current speed: {speed}  (range {SPEED_MIN}-{SPEED_MAX})")
    print(f"Action gap: {ACTION_GAP:.2f}s")

def do_move(action_name):
    """Execute movement action with safety delay."""
    crawler.do_action(action_name, STEP, speed)
    sleep(ACTION_GAP)

def safe_sit():
    """Safely sit down before program exit."""
    try:
        crawler.do_step("sit", clamp(speed, 20, 40))
        sleep(1.0)
    except Exception:
        pass

def main():
    show_info()

    try:
        while True:
            key = readchar.readkey()
            k = key.lower()

            if k == "w":
                do_move("forward")
            elif k == "s":
                do_move("backward")
            elif k == "a":
                do_move("turn left")
            elif k == "d":
                do_move("turn right")

            # Speed increase
            elif k in ("+", "]"):
                global speed
                speed = clamp(speed + 5, SPEED_MIN, SPEED_MAX)

            # Speed decrease
            elif k in ("-", "["):
                speed = clamp(speed - 5, SPEED_MIN, SPEED_MAX)

            # Stop (no movement)
            elif k == " ":
                pass

            # Quit using readchar special key
            elif key == readchar.key.CTRL_C:
                print("\nQuit.")
                break

            show_info()
            sleep(0.02)

    except KeyboardInterrupt:
        print("\nQuit (KeyboardInterrupt).")

    finally:
        safe_sit()

if __name__ == "__main__":
    main()

仕組みは?

  1. ロボットオブジェクトの作成

    crawler = Picrawler()
    

    この行では Picrawler オブジェクトを作成します。 これにより、プログラムからロボットの動作を制御できるようになります。

  2. 安全な速度範囲の定義

    SPEED_MIN = 20
    SPEED_MAX = 70
    speed = 60
    

    これらの変数は、許可される速度範囲を定義します。 speed には現在の移動速度が保存されます。 ロボットは最大値を超える速度では動作しません。

  3. clamp() による速度制限

    def clamp(value, min_value, max_value):
        return max(min_value, min(max_value, value))
    

    この関数は、速度が安全な範囲内に収まるようにします。 極端な値による不安定な動作を防ぎます。

  4. 動作の実行

    def do_move(action_name):
        crawler.do_action(action_name, STEP, speed)
        sleep(ACTION_GAP)
    

    この関数は、ロボットに動作コマンドを送ります。 ACTION_GAP は短い待機時間を追加し、動作の安定性を高めます。

  5. キーボード入力の読み取り

    key = readchar.readkey()
    k = key.lower()
    

    プログラムはキー入力を待機します。 キーは統一性を保つため、小文字に変換されます。

  6. 動作制御ロジック

    if k == "w":
        do_move("forward")
    elif k == "s":
        do_move("backward")
    

    キーが押されると、対応する動作がすぐに実行されます。 Enter キーを押す必要はありません。

  7. 安全な終了

    finally:
        safe_sit()
    

    プログラム終了前に、ロボットは安全に「座る」動作を行います。 これにより、不安定な姿勢や突然のシャットダウンを防ぎます。