Mercurial > circuitpython-spiderwing
view crab/ik.py @ 4:48cead9d49b5 draft default tip
Add a license
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sun, 23 Jul 2017 20:25:33 +0200 |
| parents | cf2cd5a35d24 |
| children |
line wrap: on
line source
from micropython import const import math PI2 = math.pi / 2 PI4 = math.pi / 4 COXA = const(12) FEMUR = const(20) TIBIA = const(30) BASE = const(21) HOME = (COXA + FEMUR) / math.sqrt(2) def _solve_triangle(a, b, c): a, b, c = abs(a), abs(b), abs(c) if a + b < c or a + c < b or b + c < a: raise ValueError() cos = (a ** 2 + b ** 2 - c ** 2) / (2 * a * b) return math.acos(cos) def _norm(a, b): return math.sqrt(a ** 2 + b ** 2) def ik(x, y, z): f = _norm(x, y) - COXA d = _norm(f, z) if d > FEMUR + TIBIA: raise ValueError() hip = PI4 - math.atan2(y, x) knee = _solve_triangle(FEMUR, d, TIBIA) - math.atan2(-z, f) ankle = PI2 - _solve_triangle(FEMUR, TIBIA, d) return hip, knee, ankle
