Files
JackBot/RobotState/walking.py
T
JackM323 1e660fcdb6 Add copy methods, fix state imports, pass lock
Add copy() to PosArray, DegArray and RadArray to allow easy shallow copies. Change RobotState imports in idle.py and walking.py to use explicit 'from RobotState.RobotState import RobotState' to avoid import issues. In main.py create a threading.Lock and pass it into the controller thread args to prepare for synchronized access in controller_loop.
2026-07-29 22:17:28 +02:00

71 lines
2.4 KiB
Python

# RobotState/walking.py
import time
import numpy as np
import config as cfg
import kinematics as kin
import DataTypes as dt
from RobotState.RobotState import RobotState
class WalkingState(RobotState):
def on_enter(self, ctx):
self.t = 0.0
self.tick_duration = 1 / cfg.standard_tickpersec
self.ticks = cfg.standard_duration * cfg.standard_tickpersec
self.current_pos_copy = ctx.current_pos.copy()
self.dirmov = [0.0, 0.0]
def update(self, ctx, intent, dt):
# 🛑 Transition check
if not intent.walk:
return "idle"
self.dirmov = [intent.move_x, intent.move_y]
t = self.t / self.ticks
tick_pos_temp = []
for leg_id in range(6):
if ctx.leg_state[leg_id] == "drag":
tick_pos_temp.append(
self.current_pos_copy[leg_id]
+ (ctx.center_points[leg_id] - self.current_pos_copy[leg_id]) * t
)
elif ctx.leg_state[leg_id] == "step":
mid = [
(self.current_pos_copy[leg_id][0] + ctx.center_points[leg_id][0]) / 2,
(self.current_pos_copy[leg_id][1] + ctx.center_points[leg_id][1]) / 2,
ctx.center_points[leg_id][2] + cfg.step_height,
]
def bez(a, b, c):
return (1 - t)**2 * a + 2*(1 - t)*t*b + t*t*c
x = bez(self.current_pos_copy[leg_id][0], mid[0], ctx.center_points[leg_id][0])
y = bez(self.current_pos_copy[leg_id][1], mid[1], ctx.center_points[leg_id][1])
z = bez(self.current_pos_copy[leg_id][2], mid[2], ctx.center_points[leg_id][2])
tick_pos_temp.append([x, y, z])
tick_pos = dt.PosArray(tick_pos_temp)
target_rad = kin.ikpyInverse(tick_pos)
ctx.current_pos = tick_pos
ctx.current_rad = target_rad
if ctx.robotCommunication:
ctx.robotCommunication.send_command(target_rad)
self.t += 1
if self.t >= self.ticks:
self.t = 0
ctx.leg_state = (
np.array(["drag","step","drag","step","drag","step"])
if ctx.leg_state[0] == "step"
else np.array(["step","drag","step","drag","step","drag"])
)
return None