Kinematic Motion ์ฝ๋ ์ค๋ช
class TrottingGait
gait๋ ๊ฑธ์๊ฑธ์ด๋ฅผ ๋ปํฉ๋๋ค. ๊ณง, ์ด ํด๋์ค๋ ๋ก๋ด์ ๊ฑท๊ฒ ํ๊ธฐ ์ํ ๊ตฌํ์ ๋๋ค.
def __init__(self):
self.step_gain = 0.8
self.maxSl=2
self.bodyPos=(0,100,0)
self.bodyRot=(0,0,0)
self.t0=300 #0 #300 # senseless i guess
self.t1=1200 #1200
self.t2=300 #0 #300
self.t3=350 #200
self.Sl=0
self.Sw=0
self.Sh=70 #100
self.Sa=0
self.Spf=87
self.Spr=77
self.Fo=120
self.Ro=50
self.Rc=[-50,0,0,1] # rotation center
๊ฐ ๋งค๊ฐ๋ณ์์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Sl
: ํ๊ฑธ์์ ๊ฑธ์๋ ์ ํ ๋ฐฉํฅ์ผ๋ก ๋ด๋๋ ๊ธธ์ด
Sw
: ํ๊ฑธ์์ ๊ฑธ์๋ ์ข์ฐ๋ฐฉํฅ ๋ด๋๋ ๊ธธ์ด
Sh
: ํ๊ฑธ์์ ๊ฑธ์๋ ๋ฐ์ ๋ค์ด์ฌ๋ฆฌ๋ ๋์ด
Sa
: ๋๊ฐ์ ์ผ๋ก ๊ฑธ์๋ ์ง์์ผ๋ก๋ถํฐ ์์งํ ์ถ์ ๊ธฐ์ค์ผ๋ก ํ์ ํ๋ ๊ฐ๋(Pitch)
- ์ ์ง์ํ์ผ๋ ๊ฐ ๋ค๋ฆฌ์ ์์น์ค์ ๊ณผ ๊ด๋ จ๋ ๋ณ์๋ค⇒ ๊ฐ ๋ค๋ฆฌ์ ๋์ (x, y, z) ์ขํ๋ฅผ ๋ํ๋
๋๋ค.2๋ฒ ๋ค๋ฆฌ: (
Fo
, -100, -Spf
)4๋ฒ ๋ค๋ฆฌ: (Ro
, -100, -Spr
) - 3๋ฒ ๋ค๋ฆฌ: (
Ro
, -100,Spr
) - 1๋ฒ ๋ค๋ฆฌ: (
Fo
, -100,Spf
)
๐๋ค์์ผ๋ก ์ฃผ์ ์ธ์คํด์ค ํจ์๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
calcLeg
ํ์ฌ์ leg point (x, y, z)์ ์ฃผ์ด์ง ์๊ฐ t๋ฅผ ํตํด ์ด๋์ํฌ leg point๋ฅผ ๊ณ์ฐํด์ฃผ๋ ํจ์์ ๋๋ค.
def calcLeg(self,t,x,y,z):
startLp=np.array([x-self.Sl/2.0,y,z-self.Sw,1])
endY=0 #-0.8 # delta y to jump a bit before lifting legs
endLp=np.array([x+self.Sl/2,y+endY,z+self.Sw,1])
if(t<self.t0): # TODO: remove t0 and t2 - not practical
return startLp
elif(t<self.t0+self.t1): # drag foot over ground
td=t-self.t0
tp=1/(self.t1/td)
diffLp=endLp-startLp
curLp=startLp+diffLp*tp
psi=-((math.pi/180*self.Sa)/2)+(math.pi/180*self.Sa)*tp
Ry = np.array([[np.cos(psi),0,np.sin(psi),0],
[0,1,0,0],
[-np.sin(psi),0,np.cos(psi),0],[0,0,0,1]])
#Tlm = np.array([[0,0,0,-self.Rc[0]],[0,0,0,-self.Rc[1]],[0,0,0,-self.Rc[2]],[0,0,0,0]])
curLp=Ry.dot(curLp)
return curLp
elif(t<self.t0+self.t1+self.t2):
return endLp
elif(t<self.t0+self.t1+self.t2+self.t3): # Lift foot
td=t-(self.t0+self.t1+self.t2)
tp=1/(self.t3/td)
diffLp=startLp-endLp
curLp=endLp+diffLp*tp
curLp[1]+=self.Sh*math.sin(math.pi*tp)
return curLp
psi
์Ry
๊ฐ ๋ฑ์ฅํ ์ด์ ๋, ๊ตฌ์ฒด์ ์ธ ๊ณ์ฐ์์ ํฐ ์๋ฏธ๋ ์๊ณ , ๋ก๋ด์ด ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์์ง์ด๊ธฐ ์ํด pitch ๋ฐฉํฅ์ ์ ํ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๋ก๋ด์ด ๊ฑธ์ด๊ฐ๊ธฐ ์ํด์๋ ๋ฐ๋ณต์ ์ธ ์์ง์๋ค์ด ์ฐ์๋ฉ๋๋ค. ์ด ๋ฐ๋ณต๋๋ ๋ฉ์ปค๋์ฆ์ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋๋๊ณ , ์ด์ ๋ฐ๋ผ Leg point๋ฅผ ์ ์ดํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ ํ ์ ์์ต๋๋ค.
positions
ํค๋ณด๋ ์ ๋ ฅ์ ๋ฐ์ ๋ก๋ด์ ์ด๋์ํฌ ์ ์๋๋ก ๊ตฌํ๋ ์ธํฐํ์ด์ค์ ๋๋ค.
def positions(self,t,kb_offset={}):
spf=self.Spf
spr=self.Spr
# self.Sh=60.0
if list(kb_offset.values()) == [0.0, 0.0, 0.0]:
self.Sl=0.0
self.Sw=0.0
self.Sa=0.0
else:
self.Sl=kb_offset['IDstepLength']
self.Sw=kb_offset['IDstepWidth']
self.Sa=kb_offset['IDstepAlpha']
Tt=(self.t0+self.t1+self.t2+self.t3)
Tt2=Tt/2
rd=0 # rear delta - unused - maybe stupid
td=(t*1000)%Tt
t2=(t*1000-Tt2)%Tt
rtd=(t*1000-rd)%Tt # rear time delta
rt2=(t*1000-Tt2-rd)%Tt
Fx=self.Fo
Rx=-1*self.Ro
Fy=-100
Ry=-100
r=np.array([self.calcLeg(td,Fx,Fy,spf),self.calcLeg(t2,Fx,Fy,-spf),self.calcLeg(rt2,Rx,Ry,spr),self.calcLeg(rtd,Rx,Ry,-spr)])
#print(r)
return r
- ํค๋ณด๋ ์
๋ ฅ์ ๋ฐ๋ผ
Sl
,Sw
,Sa
๊ฐ์ ๋ณ๊ฒฝํจ์ผ๋ก ๋ก๋ด์ ์ ํ์ข์ฐ, ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก์ ์งํ ์ ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.