
塩谷和紀くんの作例その2です。
〔ジャイロのプログラム〕
from hub import port,motion_sensor
import motor_pair,motor,color_sensor,math,runloop,time
# ------------------------------
# 初期化(ポート等は環境に合わせてください)
motor_pair.pair(motor_pair.PAIR_1,port.A,port.E)
# ------------------------------
# 定数・設定パラメータ
# ------------------------------
TARGET_REFLECTION = 40.0# 目標反射率(環境に合わせて調整)#(黒の反射-白の反射光)/2
ANGLE = 1
KP = 0.2 #Pの定数
KI = 0.005 #Iの定数
KD = 0.01 #Dの定数
MIN_SPEED = 300# 最低速度
MAX_SPEED = 700# 最高速度
ACC_DISTANCE = 3# 加速区間(cm)
DEC_DISTANCE = 5# 減速区間(cm)
TOTAL_DISTANCE = 100.0# 今回は100cm走行
TURN_THRESHOLD = 1 # ±1°以内ならターン完了とする
TURN_KP = 8 # ターン用比例ゲイン
MIN_TURN_SPEED = 150 # ターン時の最低速度(絶対値)
TARGET_PERIOD = 0.01 # 制御ループ周期(秒)
DRIVE_SPEED = 60
WHEEL_CIRCUMFERENCE = 19.5# ホイールの円周(cm)
speed=500
async def turn_angle(turn_angle,min_turn_speed=MIN_TURN_SPEED):
"""
turn_angle(turn_angle):
- turn_angle が正の場合は右旋回、負の場合は左旋回する関数です。
- ジャイロセンサ(hub.motion_sensor)の符号付き角度を利用して、目標角度に到達するまで旋回します。
例:
turn_angle(90)→ 右90°旋回
turn_angle(-90) → 左90°旋回
"""
# 旋回開始前にジャイロセンサの角度をリセット
runloop.sleep_ms(5)# センサ安定のため短時間待つ
# ここで目標角度はそのまま符号付きで保持する
target = turn_angle
while True:
loop_start = time.ticks_ms()
# 現在の角度は符号付きで取得
current_angle = motion_sensor.tilt_angles()[0]*-0.1
error = target - current_angle# error は符号付き
#correct_drift(current_angle, target)
# 目標に近づいているか判定(± TURN_THRESHOLD 内なら完了)
if abs(error) <= TURN_THRESHOLD:
break
# 比例制御:誤差の絶対値に比例したスピードを計算
turn_speed = TURN_KP * abs(error)
if turn_speed < min_turn_speed:
turn_speed = min_turn_speed
turn_speed = int(turn_speed)
# エラーが正なら(ターゲット > 現在値)右旋回、負なら左旋回
if error > 0:
drive_speed = turn_speed # 右旋回のため正の値
steering_value = 100 # 右旋回:steering 正
else:
drive_speed = turn_speed # 左旋回のため正の値を使用(モーター指令は、steering で方向決定)
steering_value = -100 # 左旋回:steering 負
motor_pair.move(motor_pair.PAIR_1,int(steering_value),velocity=drive_speed)
print(drive_speed)
# 一定周期となるようにループ周期を調整
loop_elapsed = time.ticks_ms() - loop_start
sleep_time = TARGET_PERIOD - loop_elapsed
if sleep_time > 0:
time.sleep(sleep_time)
motor_pair.stop(motor_pair.PAIR_1)
async def main():
motion_sensor.reset_yaw(0)
await turn_angle(86)
runloop.run(main())
このプログラムはジャイロセンサーのヨー角を使って曲がり、かつ比例制御で減速しながら90度回転します。ジャイロセンサーを使って回転させることで、値を入れた場所に向けて、正確に回転することができるため、その後の動きのズレが少なくなります。
<使い方>
曲がりたい角度のヨー角の値を変えることで、回転の度数を変えることができます。
turn_angle(曲がりたい角度のヨー角の値 ,最低速度。
数値を色々変えてみて、試してみてください。
分からないことがあれば、何でも聞いてください。
