コンテンツにスキップ

Python からモーションを制御する

自分のスクリプトに歩行を組み込むには、 robot.py の Palmimo クラスを使います。公開するメソッドはすべてコアメソッドに記載しています。このページでは、それらの呼び出し方を示します。

手順 参照先
すべてのモーターが応答することを確認する diagnose_servos.py scan
ニュートラル姿勢に戻す Palmimo.stop() が滑らかにニュートラルへ戻します
トルクを無効にする(手で動かす) アプリを終了する / 電源を切る(安全上の注意を参照)

新しいモーションを初めて実行するときは、本体を持ち上げて脚を浮かせてください。

最小限のサンプル(ドライラン)

Section titled “最小限のサンプル(ドライラン)”
from palmimo_sdk import Palmimo
robot = Palmimo(gait_speed=0.012, step_length=30.0, step_height=30.0)
robot.forward()
for _ in range(120): # ~2 seconds @ 60 Hz
positions = robot.step() # dict[str, int]: motor name -> tick (0-4095)
print(positions)
robot.stop()
for _ in range(60): # return to neutral
robot.step()

⚠️ tick の範囲は 0-4095 ですが、モーションは安全範囲 200-3900 内に収めてください。両端の値は機械的な限界です。安全設計を参照してください。

step() の戻り値は、脚のモーター 18 個と neck_yaw、neck_pitch1、neck_pitch2 の計 21 個のモーターの目標 tick を格納する辞書です。 2 つの首のピッチ関節が視線の目標をどう分担するかは、コアメソッドの robot.look() を参照してください。この戻り値は DynamixelDriver.write_positions() が受け取るものなので、そこへ渡すと実機が動きます。具体的なバス初期化手順は、 DynamixelDriver と API リファレンスの周辺機器と接続の節を参照してください。

robot.py の Palmimo.play() は、 (motion name, seconds) のステップを順に再生します。特別なモーション look_around は、首を正弦波状に往復させます。(name, seconds) のタプル形式では motion がデフォルトの Motion.IDLE のままなので、その区間は脚が動かないことに注意してください。歩きながら首を往復させるには、タプルの代わりに RoutineStep(motion=..., neck_sweep=True) を渡します。

routine = [
("forward", 2.0),
("rotate_left", 1.0),
("dance", 3.0),
("look_around", 2.0),
("idle", 0.5),
]
robot = Palmimo()
for positions in robot.play(routine, fps=60):
# send positions to real hardware / a simulator
...

リアルタイム再生(内部で time.sleep を使って実行間隔を調整)には、 play_realtime を使います。

  • シリアルポートが見つからない: ls /dev/tty.usbmodem* (macOS)または ls /dev/ttyACM*(Linux)で実際のデバイス名を調べ、 DynamixelDriver を作成するときにポートを明示的に指定してください
  • モーターが動かない / ガタつく: 電源の容量とケーブルの接続を確認し、 diagnose_servos.py scan で各 ID が応答することを確かめてください
  • 動きが不安定: 必ず本体を持ち上げて脚を浮かせ、実機で実行して動作を確認してから、床や机に置いてください