Rizeni krokoveho motorku
Petr Krc
pekr
Středa Březen 17 11:53:28 CET 2004
Libor Kavan wrote:
> >Ani ne, 2051 zvladne linearni interpolaci ve 3 osach s 32-bitovym
> >rozlisenim vcelku bez problemu.
>
> Mas s tim nejake zkusenosti ?
Ano.
> Nebyly by nejake zdrojacky
Ne.
> ( to jsem asi hodne drzej, ze)?
Ano. ;-)
> Ja jsem pouzil controllery z microconu a ty sikme cary resim tak,
> ze na krokacich nastavim hodne nizkou rychlost a nepouzivam akceleraci.
> Do obou kontroleru poslu rychlost a vzdalenost( predem zpocitanou v PC)
> a pak oba motory najednou zpustim. Reseni to sice je, ale ne idealni ...
I tak se da.
Ja na to pouzil modifikovany algoritmus od pana, jehoz jmeno jiste
doplni nekdo jiny, kdo nema takovou sklerozu, jako ja.
Ten algoritmus je velmi jednoduchy, vystaci s operacemi scitani,
odcitani a celociselnem deleni dvema.
Zjednodusene (v pseudokodu) se to da popsat takto:
--- cut ---
Line3D:
=======
> Vstupni promenne
X1,Y1,Z1 - startovni souradnice
X2,Y2,Z2 - cilove souradnice
KX,KY,KZ - rozdil mezi cilovymi a startovnimy souradnicemi
K0 [KX] - nejdelsi osa
K1 [KY] - stredne dlouha osa
K2 [KZ] - nejkratsi osa
E0 - mezihodnota nejdelsi osy
E1 - mezihodnota stredne dlouhe osy
E2 - mezihodnota nejkratsi osy
S0 - oznaceni a smer nejdelsi osy (x,y,z)
S1 - oznaceni a smer stredne dlouhe osy (x,y,z)
S2 - oznaceni a smer nejkratsi osy (x,y,z)
> Vypocet rozdilu delky v dane ose
KX=X2-X1
KY=Y2-Y1
KZ=Z2-Z1
> Setrideni os od nejdelsi po nejkratsi (v absolutnich hodnotach)
K0=max_abs(KX,KY,KZ)
K1=mid_abs(KX,KY,KZ)
K2=min_abs(KX,KY,KZ)
> Naplneni bitovych masek pro krokovani podle delky os
S0=dir_max(KX,KY,KZ)
S1=dir_mid(KX,KY,KZ)
S2=dir_min(KX,KY,KZ)
> Korekce symetricnosti
E0=K0/2
E1=E0+K1
E2=E0+K2
E0=K0
> Vlastni vypocet drahy
while (E0>0)
step(S0)
if E1>K0
step(S1)
E1=E1-K0
endif
if E2>K0
step(S2)
E2=E2-K0
endif
E0=E0-1
E1=E1+K1
E2=E2+K2
end
--- cut ---
Snad jsem to nepopletl, uz je to nejaky patek.
--
Regards
Petr Krc
Další informace o konferenci Hw-list