next up previous
Next: 5 三次元形状モデラ Up: ソフトウェア特論 講義資料 ロボットのソフトウェア Previous: 3.5 シミュレーションの例(2)

4 座標系モデル

ロボットや機械CADなどの幾何学計算では,斉次行列によって位置や方向ベク トルを表現し,座標変換を計算する手法がよく使われます. その座標変換には前節のベクトルや行列の計算関数を用いることができますが, 座標系を考慮すると座標系間の親子関係を意識する必要があるため, 座標系データ間の関係を表す附属情報を表現する手段が必要になります. そこで,座標系をクラスで表現し,親子関係を表す属性値(インスタンス変数) を持たせ,その座標系にまつわる基本手続きをそのクラスのメソッドとして用 意するという方法が考えられます.euslispでは,そのようなクラスとして cascaded-coordsというクラスがあります.cascaded-coordsの親クラスとして coordinatesというクラスがあります. たとえば,
eus$ setq c1 (instance coordinates :init)
#<coordinates #X339d9c  0.0 0.0 0.0 / 0.0 0.0 0.0>
eus$ describe c1
plist=nil
rot=#2f((1.0 0.0 0.0)
        (0.0 1.0 0.0)
        (0.0 0.0 1.0))
pos=#f(0.0 0.0 0.0)
nil
eus$ (send c1 :pos)
#f(0.0 0.0 0.0)
eus$ (send c1 :rot)
#2f((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
というように,instanceという手続きでインスタンスを作り, 位置や方向の値をメソッドでとり出すことが可能です. posやrotを変更する手続きとしては,移動(locate)や回転手続き(rotate)があ ります.
eus$ (send c1 :locate #f(1 2 3))
#<coordinates #X339d9c  1.0 2.0 3.0 / 0.0 0.0 0.0>
eus$ (send c1 :pos)
#f(1.0 2.0 3.0)
eus$ (send c1 :rotate (deg2rad 45) :x)
#<coordinates #X339d9c  1.0 2.0 3.0 / 0.0 0.0 0.785>
eus$ (describe c1)
plist=nil
rot=#2f((1.0 0.0 0.0)
        (0.0 0.707107 -0.707107)
        (0.0 0.707107 0.707107))
pos=#f(1.0 2.0 3.0)
nil
同様に,

eus$ (setq c2 (instance cascaded-coords :init))
#<cascaded-coords #X3394cc  0.0 0.0 0.0 / 0.0 0.0 0.0>
eus$ (setq c3 (instance cascaded-coords :init))
#<cascaded-coords #X339118  0.0 0.0 0.0 / 0.0 0.0 0.0>
eus$ (send c3 :locate #f(100 0 0))
#<cascaded-coords #X339118  100.0 0.0 0.0 / 0.0 0.0 0.0>
eus$ (describe c2)
plist=nil
rot=#2f((1.0 0.0 0.0)
        (0.0 1.0 0.0)
        (0.0 0.0 1.0))
pos=#f(0.0 0.0 0.0)
parent=nil
descendants=nil
worldcoords=#<coordinates #X3393ac
         0.0 0.0 0.0 / 0.0 0.0 0.0>
manager=#<cascaded-coords #X3394cc
         0.0 0.0 0.0 / 0.0 0.0 0.0>
changed=nil
nil
eus$ (describe c3)
plist=nil
rot=#2f((1.0 0.0 0.0)
        (0.0 1.0 0.0)
        (0.0 0.0 1.0))
pos=#f(100.0 0.0 0.0)
parent=nil
descendants=nil
worldcoords=#<coordinates #X33907c
        100.0 0.0 0.0 / 0.0 0.0 0.0>
manager=#<cascaded-coords #X339118
        100.0 0.0 0.0 / 0.0 0.0 0.0>
changed=nil
nil
という具合に,親子関係をもつ座標系も定義でき,:locateや:rotateメソッド が使えます. 親子関係を持たせる手続きとして,:assocがあります. c2が親で,c3が子供という親子関係をもつと,c2を回転するとc3の場所と向き もいっしょに変更されます.親子関係をはずすメソッドが:dissocです. 親を回転した場合に,親子関係の末端がどのように移動するかの計算には, :worldcoordsメソッドを末端のインスタンスに送る必要があります. (毎回計算して計算時間の無駄が起こるのを防ぐため)

eus$ (send c2 :assoc c3)
#<cascaded-coords #X339118  100.0 0.0 0.0 / 0.0 0.0 0.0>
eus$ (send c2 :rotate (deg2rad 45) :z)
#<cascaded-coords #X3394cc
          0.0 0.0 0.0 / 0.785 0.0 0.0>
eus$ (send c3 :worldcoords)
#<coordinates #X33907c
          70.711 70.711 0.0 / 0.785 0.0 0.0>
eus$ (describe c3)
plist=nil
rot=#2f((1.0 0.0 0.0)
        (0.0 1.0 0.0)
        (0.0 0.0 1.0))
pos=#f(100.0 0.0 0.0)
parent=#<cascaded-coords #X3394cc
         0.0 0.0 0.0 / 0.785 0.0 0.0>
descendants=nil
worldcoords=#<coordinates #X33907c
         70.711 70.711 0.0 / 0.785 0.0 0.0>
manager=#<cascaded-coords #X339118
         70.711 70.711 0.0 / 0.785 0.0 0.0>
changed=nil
nil
eus$ (describe (send c3 :worldcoords))
plist=nil
rot=#2f((0.707107 -0.707107 0.0)
        (0.707107 0.707107 0.0)
        (0.0 0.0 1.0))
pos=#f(70.7107 70.7107 0.0)
nil
:worldcoordsで返されるデータはcoordinatesのインスタンスです.

generated through LaTeX2HTML. M.Inaba 平成18年5月6日