Korektné vypočítavanie ZMP je pre stabilitu pri chôdzi esenciálne. V prípade nášho robota bolo ZMP pri chôdzi vypnuté, preto je podstatné zistiť prečo sa nevyužíva a aké hodnoty vracia súčasné riešenie. Taktiež pri prvotnej analýze bolo zistené, že výpočet nie je efektívny. V prípade validných výstupov je preto potrebné opraviť neefektivitu výpočtov.
zmpHistory je typu LinkedList. Do zmpHistory sa pridávajú prvky kým nemá veľkosť väčšiu ako 1000 záznamov, no využíva sa pri prepočte priemerných hodnôt iba posledných 5 prvkov. Na prepočet hodnôt sa používa cyklus for, ktorý je neefektívny pre prehľadávanie zoznamových štruktúr. V ZMP sa pritom nepoužíva priemer za posledných x krokov.
Vzorec na výpočet ZMP je:
kde ()i, ()i označujú zložky časových derivácii momentu hybnosti i-tej súčiastky robota. Označenie s bodkou značí deriváciu, dve bodky značia druhú deriváciu.
Vzorec využitý v metóde na výpočet:
x = -1 * (center.getX() - (center.getZ() * lastAccelerometer.getX()) / (lastMomentum.getZ()));
y = -1 * (center.getY() - (center.getZ() * lastAccelerometer.getY()) / (lastMomentum.getZ()));
zeroMomentPoint = Vector3D.cartesian(x, y, z);
Už na prvý pohľad vidno, že vzorec je veľmi odlišný. Z diplomovej práce Bc. Jána Hudca – Motorika hráča simulovaného robotického futbalu možno použiť vzorec:
Tento vzor výpočtu už je podobný tomu, ktorý je použitý v projekte. V getZ() chýba pripočítanie gravitačného zrýchlenia, no to je zakomponované v Z.
Taktiež vzniká problém s výpočtom stredu, z ktorého sa počíta zrýchlenie – je totižto v strede hrudníka, nie v mieste stredu ťažiska (Center of Mass).
Pri výpočte ZMP nebol využitý správny vzorec, bol zle vypočítaný stred, z ktorého sa počíta momentum a zrýchlenie a boli zle (a zbytočne) využité údajové štruktúry. Z týchto dôvodov navrhujem kompletné prerobenie tejto metódy.