ロボットアームのアニメーション

>    restart;

はじめに

Maple の plottools を使って簡単にロボットアームのアニメーションができます。

ビジュアリゼーションによりロボットの動きが簡単に視覚化でき、理解を助けてくれます。

ここでは具体的にロボットアームを動かしてMapleVでいかに簡単にアニメーションができるか

をごらんいただきます。ロボットの研究や教育にお役だてください。

最初に必要なパッケージを用意しておきます。

>    with(plots):
with(plottools):

Warning, the name changecoords has been redefined

Warning, the assigned name arrow now has a global binding

オブジェクトの設定

最初にロボットアームの部品を用意します。plottools には直方体のオブジェクトを cuboid で指定します。対角の2頂点の座標を

与えるだけで設定できます。それぞれの部品のサイズを設定しておきます。

>    w[1]:=4:l[1]:=5:

>    obj[1]:=cuboid([-w[1],-w[1],0],[w[1],w[1],l[1]]):

>    w[2]:=2.5:l[2]:=3:

>    obj[2]:=cuboid([-w[2],-w[2],0],[w[2],w[2],l[2]]):

>    w[3]:=2:l[3]:=10:

>    obj[3]:=cuboid([-w[3],-w[3],0],[w[3],w[3],l[3]]):

>    w[4]:=1.5:l[4]:=15:

>    obj[4]:=cuboid([-w[4],-w[4],0],[w[4],w[4],l[4]]):

表示

表示は display コマンドでできます。このとき translate でオブジェクトを任意の位置に移動させることができます。

>    display([obj[1],translate(obj[2],0,6,0),translate(obj[3],0,11,0),translate(obj[4],0,15,0)],scaling=constrained,axes=boxed);

[Maple Plot]

回転と移動

移動を行う translate と回転を行う rotate を組み合わせればオブジェクトは任意の位置で任意の方向に向かせることができます。

rotate は x, y, z 軸それぞれを中心にした回転角になります。ここでは常に一つの回転以下のプログラムはロボットのそれぞれの部品をその結合の状況に従って回転と移動を繰り返すことで実際の位置に動かしています。

それぞれの軸を中心として回転をアニメーションでみてみましょう。

X軸周りの回転

>    n:=21:p:=NULL:

>    for k to n do
  theta:=90/180*Pi*(k-1)/n:
  p:=p,display(rotate(obj[1],theta,0,0)):
end do:

>    display(p,insequence=true,scaling=constrained,axes=boxed);

[Maple Plot]

Y軸周りの回転

>    p:=NULL:

>    for k to n do
  theta:=90/180*Pi*(k-1)/n:
  p:=p,display(rotate(obj[1],0,theta,0)):
end do:

>    display(p,insequence=true,scaling=constrained,axes=boxed);

[Maple Plot]

Z軸まわりの回転

>    p:=NULL:

>    for k to n do
  theta:=90/180*Pi*(k-1)/n:
  p:=p,display(rotate(obj[1],0,0,theta)):
end do:

>    display(p,insequence=true,scaling=constrained,axes=boxed);

[Maple Plot]

リンク結合のプログラム

以下のプログラムは各部品のリンク結合状況に従って、各部品の実際の位置と方向を計算するプログラムです。

回転と移動を組み合わせることで簡単に実現できます。

theta は部品間のリンクでの回転角を表しています。部品1と2はz軸の回転で、部品2と3および3と4はy軸の回転で結合されています。

r は各リンクでの回転、t はリンク間の相対座標になります。

m は部品の数です。

>    DO:=Pi/180:

>    theta[2]:=40*DO:

>    theta[3]:=10*DO:

>    theta[4]:=20*DO:

>    r[1]:=0,0,0:
t[1]:=0,0,l[1]:

>    r[2]:=0,0,theta[2]:
t[2]:=0,0,l[2]:

>    r[3]:=0,theta[3],0:
t[3]:=0,0,l[3]:

>    r[4]:=0,theta[4],0:
t[4]:=0,0,l[4]:

>    m:=4:

>    for k to m do
  o[k]:=obj[k]:
end do:

>    for k to m-1 do
  for j from m-k+1 to m do  
    o[j]:=translate(rotate(o[j],r[m-k+1]),t[m-k]):
  end do;
end do;

これを表示してみましょう。部品 1 と 2 は 40 度、2 と 3 は 10 度、同じく 3 と 4 は 20 度回転しています。

>    display([o[1],o[2],o[3],o[4]],scaling=constrained);

[Maple Plot]

アニメーション

あとは時間によってこれらの回転角を変化させることでアニメーションが作成されます。

HTML にイクスポートするとアニメーション GIF に変換されますのでホームページ化できます。

>    n:=21:
p:=NULL:
dt:=1/(n-1):
tt:=0:

>    for i to n do
  theta[2]:=tt:
  theta[3]:=tt:
  theta[4]:=tt:
  r[2]:=0,0,theta[2]:  
  r[3]:=0,theta[3],0:  
  r[4]:=0,theta[4],0:  
  for k to m do
    o[k]:=obj[k]:
  end do:
  for k to m-1 do
    for j from m-k+1 to m do  
      o[j]:=translate(rotate(o[j],r[m-k+1]),t[m-k]):
    end do;
  end do:
  p:=p,display([o[1],o[2],o[3],o[4]]):
  tt:=tt+dt:
end do:

>    display(p,insequence=true,scaling=constrained);

[Maple Plot]

少し複雑な動きにしてみましょう。

>    n:=21:
p:=NULL:
dt:=1/(n-1):
tt:=0:

>    for i to n do
  theta[2]:=40*DO+sin(5*tt):
  theta[3]:=30*DO+sin( 10*tt):
  theta[4]:=30*DO+sin(-10*tt):
  r[2]:=0,0,theta[2]:  
  r[3]:=0,theta[3],0:  
  r[4]:=0,theta[4],0:  
  for k to m do
    o[k]:=obj[k]:
  end do:
  for k to m-1 do
    for j from m-k+1 to m do  
      o[j]:=translate(rotate(o[j],r[m-k+1]),t[m-k]):
    end do;
  end do:
  p:=p,display([o[1],o[2],o[3],o[4]]):
  tt:=tt+dt:
end do:

>    display(p,insequence=true,scaling=constrained);

[Maple Plot]

先端の軌跡

先端の位置の軌跡も同時に表示できます。

>    n:=21:
p:=NULL:
dt:=1/(n-1):
tt:=0:
ball:=cuboid([-0.1,-0.1,-0.1],[0.1,0.1,0.1]):
bb:=NULL:

>    for i to n do
  theta[2]:=40*DO+sin(5*tt):
  theta[3]:=30*DO+sin( 10*tt):
  theta[4]:=30*DO+sin(-10*tt):
  r[2]:=0,0,theta[2]:  
  r[3]:=0,theta[3],0:  
  r[4]:=0,theta[4],0:  
  for k to m do
    o[k]:=obj[k]:
  end do:
  b:=translate(ball,0,0,l[4]):
  for k to m-1 do
    for j from m-k+1 to m do  
      o[j]:=translate(rotate(o[j],r[m-k+1]),t[m-k]):
    end do;
    b:=translate(rotate(b,r[m-k+1]),t[m-k]):
  end do:
  bb:=bb,b:
  p:=p,display([o[1],o[2],o[3],o[4],bb]):
  tt:=tt+dt:
end do:

>    display(p,insequence=true,scaling=constrained);

[Maple Plot]

軌跡だけのプロットをしてみましょう。

>    display(bb,scaling=constrained,axes=boxed);

[Maple Plot]