TOP>2008年09月

2008年09月28日

[Jw_cad] リンク機構4

続きです。(この回の最後)

それでは、角度をいろいろ変えていって、どういう軌道をするのかを表示させてみることにします。開始の角度、終了の角度、何分割するか、を指示して、ループさせます。
レイヤと色を変えてます。線種と線幅も指示しようと思えば簡単に出来ますがここではしていません。
// リンクその4
// リンク1の角度をどんどん変えて作図させます
#VAR
 dmy1 = "---リンク(1)---"  ;dmy1
 px1 = 0    ;*位置X
 py1 = 0    ;*位置Y
 pa1s= 0    ;*開始角度[°]
 pa1e=45    ;*終了角度[°]
 pa1n= 5    ;*角度分割数
 ll1 =50    ;*リンク長さ
 lw1 =10    ;*リンク幅
 dmy2 = "---リンク(2)---"  ;dmy2
 px2      ;位置X
 py2      ;位置Y
 pa2      ;角度[°]
 ll2 =80    ;*リンク長さ
 lw2 =15    ;*リンク幅
 // 作業用
 n
 lay
 col
 pa1
 no
 px
 py
 ll
 lw
 pan
 w1
 w2
 w3
 w4
 w5
 w6
 w7
 w8

#DRAW
 CAL n = 0
 CAL lay = 0
 CAL col = 1
 CAL pa1 = pa1s
 #WHILE ( n <= pa1n )
  LAYER lay
  PEN col,SetLineLtp1,SetLineWid1
  #GOTO *DRAW1
*RET
  CAL lay = lay + 1
  #IF (lay > 15)
    CAL lay = 0
  #END
  CAL col = col + 1
  #IF (col > 8)
    CAL col = 1
  #END
  CAL pa1 = pa1 + (pa1e - pa1s)/pa1n
  CAL n = n + 1
 #END

 #EXIT


// リンク2本を作図
*DRAW1
 CAL no = 1
 CAL pan = pa1/180.0*PI
 CAL px = px1
 CAL py = py1
 CAL ll = ll1
 CAL lw = lw1
 #GOTO *LINKDRAW
*RET1
 CAL w1 = ll1*Sin(pan)
 CAL w2 = ASIN(w1/ll2)
 CAL w3 = -(pan + w2)
 CAL pa2 = w3*180.0/PI

 CAL no = 2
 CAL px2 = px1 + ll1*Cos(pan)
 CAL py2 = py1 + ll1*Sin(pan)
 CAL pan = (pa1+pa2)/180.0*PI
 CAL px = px2
 CAL py = py2
 CAL ll = ll2
 CAL lw = lw2
 #GOTO *LINKDRAW
*RET2
 #GOTO *RET


// リンク1本を作図
//  no = 1、2
*LINKDRAW
 CAL w1 = px
 CAL w2 = py
 CAL w3 = lw/2.0
 CAL w4 = pan + 0.5*PI
 CAL w5 = pan + 1.5*PI
 ARC w1,w2,w3,w4,w5

 CAL w1 = px
 CAL w2 = py + lw/2.0
 CAL w3 = px + ll
 CAL w4 = w2
 GETREV w5,w6, w1,w2,px,py,pan
 GETREV w7,w8, w3,w4,px,py,pan
 LINE w5,w6,w7,w8

 CAL w1 = px
 CAL w2 = py - lw/2.0
 CAL w3 = px + ll
 CAL w4 = w2
 GETREV w5,w6, w1,w2,px,py,pan
 GETREV w7,w8, w3,w4,px,py,pan
 LINE w5,w6,w7,w8

 CAL w3 = px + ll
 CAL w4 = py
 GETREV w1,w2, w3,w4,px,py,pan
 CAL w3 = lw/2.0
 CAL w4 = pan + 1.5*PI
 CAL w5 = pan + 0.5*PI
 ARC w1,w2,w3,w4,w5

 #IF ( no == 1 )
  #GOTO *RET1
 #END
 #GOTO *RET2

20080928d

こういうのを書いてみると、ついつい、大学生時代を思い出してしまいます。研究室はメカ的、ロボット的なことをするトコロでした。私はファジィの勉強をしたかったのですが研究室に入れずに別のところを探していると、クラブの先輩がいた研究室に半ば強制的に?入ったんですが、そこが、そういうトコロでした。そこでは、Z80CPUを8個とか16個とかを並列に接続(ハイパーキューブ)して画像処理をするような研究もしてましたが、もうネタ切れなので、という事で、「Occam」というプログラミング言語を使った並列処理プログラムを作りましょうという事になり。で、何のプログラム?って事で、ロボットアームの、みたいな話になりました。まぁ、動かす実際のモノが無かったのでパソコン内だけでの話だったんですが~
各ノード単位で並列計算させて同期させて最終位置計算、みたいな。6軸想定しているとなんだか混乱~ ラグランジュ式も解けないんで1つ制限入れて。まぁ、このロボット制御をファジィ制御させる、というネタがある事は分ってましたが、敢えて無視しちゃったりして。

2008年09月28日

[Jw_cad] リンク機構3

続きです。

リンクが自由に動ける状態ですので、リンク1の始点とリンク2の終点が水平線上にある、と考えます。動きに制限をつけるわけですね。メカ的には、リンク1がクランク、リンク2がコンロッドで、リンク2の終点位置がスライダーになっているという感じですね。

// リンクその3
// リンク2の終点に制限を入れる事を考えます
// リンク1の位置Yと同じになるようにします
//  =リンク2の角度を算出
#VAR
 dmy1 = "---リンク(1)---"  ;dmy1
 px1 = 0    ;*位置X
 py1 = 0    ;*位置Y
 pa1 = 0    ;*角度[°]
 ll1 =50    ;*リンク長さ
 lw1 =10    ;*リンク幅
 dmy2 = "---リンク(2)---"  ;dmy2
 px2      ;位置X
 py2      ;位置Y
 pa2      ;角度[°]
 ll2 =80    ;*リンク長さ
 lw2 =15    ;*リンク幅
 // 作業用
 no
 px
 py
 ll
 lw
 pan
 w1
 w2
 w3
 w4
 w5
 w6
 w7
 w8

#DRAW
 LAYER SetLineLay1  // 外形線
 PEN SetLineCol1,SetLineLtp1,SetLineWid1

 CAL no = 1
 CAL pan = pa1/180.0*PI
 CAL px = px1
 CAL py = py1
 CAL ll = ll1
 CAL lw = lw1
 #GOTO *LINKDRAW
*RET1
 CAL w1 = ll1*Sin(pan)
 CAL w2 = ASIN(w1/ll2)
 CAL w3 = -(pan + w2)
 CAL pa2 = w3*180.0/PI

 CAL no = 2
 CAL px2 = px1 + ll1*Cos(pan)
 CAL py2 = py1 + ll1*Sin(pan)
 CAL pan = (pa1+pa2)/180.0*PI
 CAL px = px2
 CAL py = py2
 CAL ll = ll2
 CAL lw = lw2
 #GOTO *LINKDRAW
*RET2
 #EXIT


// リンク1本を作図
//  no = 1、2
*LINKDRAW
 CAL w1 = px
 CAL w2 = py
 CAL w3 = lw/2.0
 CAL w4 = pan + 0.5*PI
 CAL w5 = pan + 1.5*PI
 ARC w1,w2,w3,w4,w5

 CAL w1 = px
 CAL w2 = py + lw/2.0
 CAL w3 = px + ll
 CAL w4 = w2
 GETREV w5,w6, w1,w2,px,py,pan
 GETREV w7,w8, w3,w4,px,py,pan
 LINE w5,w6,w7,w8

 CAL w1 = px
 CAL w2 = py - lw/2.0
 CAL w3 = px + ll
 CAL w4 = w2
 GETREV w5,w6, w1,w2,px,py,pan
 GETREV w7,w8, w3,w4,px,py,pan
 LINE w5,w6,w7,w8

 CAL w3 = px + ll
 CAL w4 = py
 GETREV w1,w2, w3,w4,px,py,pan
 CAL w3 = lw/2.0
 CAL w4 = pan + 1.5*PI
 CAL w5 = pan + 0.5*PI
 ARC w1,w2,w3,w4,w5

 #IF ( no == 1 )
  #GOTO *RET1
 #END
 #GOTO *RET2

20080928c