助言頂きたく思います

 投稿者:lark12_long  投稿日:2014年 4月13日(日)00時59分45秒
  nアーム回動リンクを、2014年 4月 5日(土)09時28分17秒に、
投稿した、lark12_longと申します

逆行列を求める、mat invj=inv(ja)は、jaが正方行列でなければ
ならず、正方行列とする為に、思いつきで、
ja(3,1)~ja(3,n)、ja(n,1)~ja(n,n)にrndを設定しました

最初は、1を設定したら、引数が特異行列エラーとなり
試しに、ja(3,1)~ja(3,n)、ja(n,1)~ja(n,n)にrndを設定
したら、エラーになりません

この手法が、正しいのか誤りなのか、理解出来ていません

どなたか、助言頂ければと思います
 

Re: 助言頂きたく思います

 投稿者:島村1243  投稿日:2014年 4月14日(月)08時45分54秒
  > No.3358[元記事へ]

lark12_longさんへのお返事です。

> 逆行列を求める、mat invj=inv(ja)は、jaが正方行列でなければ
> ならず、正方行列とする為に、思いつきで、
> ja(3,1)~ja(3,n)、ja(n,1)~ja(n,n)にrndを設定しました

「非正方行列の逆行列」でネット検索したら、数学手法として「擬似行列」という方法が有る様です。それをご覧になっては如何ですか。
 

Re: 助言頂きたく思います

 投稿者:山中和義  投稿日:2014年 4月14日(月)15時34分14秒
  > No.3358[元記事へ]

lark12_longさんへのお返事です。

> nアーム回動リンク

擬似逆行列で求めることができるようです。

FULL BASIC仕様のコーディングにしてあります。


!平面nリンクマニピュレー タのヤコビアンを求めよ。

SET WINDOW -16,16,-16,16 !表示領域 ※ワールド座標系

LET N=4 !nリンク

DIM L(N) !各腕の長さ
DATA 8,5,5,3
MAT READ L

DIM Q(N) !各関節の角度 ※単位は度、ワールド座標系
DATA 30,30,30,30
MAT READ Q

CALL PrintOut(N,L,Q, PX,PY,QQ)

DO
   mouse poll mx,my,left,right !目標の位置(x,y)
   IF right=1 THEN STOP !右ボタンが押下されるまで

   !逆運動学

   DIM J(2,N) !ヤコビアン
   LET J(1,N)=-L(N)*SIN(RAD(QQ))
   LET J(2,N)= L(N)*COS(RAD(QQ))
   FOR i=N-1 TO 1 STEP -1
      LET QQ=QQ-Q(i+1)
      LET J(1,i)=J(1,i+1)-L(i)*SIN(RAD(QQ))
      LET J(2,i)=J(2,i+1)+L(i)*COS(RAD(QQ))
   NEXT i

   DIM JT(N,2),W(2,2),JJ(N,2)
   MAT JT=TRN(J)
   MAT W=J*JT
   MAT W=INV(W)
   MAT JJ=JT*W !擬似逆行列A^+=A^t*(A*A^t)^(-1)

   DIM r(2) !位置誤差
   LET r(1)=mx-PX
   LET r(2)=my-PY

   DIM dQ(N) !⊿θ=kJ^(-1)⊿x
   MAT dQ=JJ*r
   FOR i=1 TO N !θ←θ+⊿θ
      LET Q(i)=MOD(Q(i)+5*dQ(i),360)
   NEXT i

   CALL PrintOut(N,L,Q, PX,PY,QQ) !手先位置
LOOP

END


EXTERNAL SUB PrintOut(N,L(),Q(), PX,PY,QQ) !順運動学で手先位置を算出する。表示する
SET DRAW mode hidden !ちらつき防止の開始
CLEAR
DRAW grid(2,2) !座標

LET PX=0 !原点(0,0)
LET PY=0
LET QQ=0 !Σθ
FOR i=1 TO N !n個の関節
   LET QQ=QQ+Q(i)
   LET X=PX+L(i)*COS(RAD(QQ)) !x=L[1]cos(Q[1])+L[2]cos(Q[1]+Q[2])+ …
   LET Y=PY+L(i)*SIN(RAD(QQ)) !y=L[1]sin(Q[1])+L[2]sin(Q[1]+Q[2])+ …
   PLOT LINES: PX,PY; X,Y
   PLOT TEXT ,AT PX,PY: USING$("####.##",Q(i))&"°"

   LET PX=X !次へ
   LET PY=Y
NEXT i

SET DRAW mode explicit !ちらつき防止の終了
END SUB

 

戻る