(load "hanoimanipulation.l")
(load "hanoi.l")
(setq table-a (hanoi-table :pos #f(300 200 0)))
(setq table-b (hanoi-table :pos #f(300 0 0)))
(setq table-c (hanoi-table :pos #f(300 -200 0)))
(setq *tables* (list table-a table-b table-c))
(setq *hanoi-draw-number* 0)
(setq *hanoi-kdraw-file* "sarm")
(hanoi-init 3 table-a)
(setq *robot* sarm)
(setq *worlds* (append (list *robot*) *disks* *tables*))
(defun sarm-eps nil
(bdraw "sarm-separated-links.eps")
(bdraw "sarm-separated-links-axis.eps" t)
(worlds :p "sarm-park.eps")
(worlds :p :larm 4 80 "sarm-park-link-axis.eps")
(worlds :s "sarm-special.eps")
(worlds :p :larm :l0 :l7 :l8 "sarm-park-all-axis.eps")
(worlds :s :larm :l0 :l7 :l8 "sarm-special-all-axis.eps")
)
(defun bdraw (&optional kdraw axis)
(let* ((bb (copy-object (append sarm-links
(list sarm7 sarm8 sarm0))))
(ll bb))
(cls)
(send (pop ll) :translate #f(-50 0 300) :world)
(send (pop ll) :translate #f(200 0 -250) :world)
(send (pop ll) :translate #f(150 0 0) :world)
(send (pop ll) :translate #f(-50 0 -200) :world)
(send (pop ll) :translate #f(-150 100 -150) :world)
(send (pop ll) :translate #f(-150 100 -150) :world)
(send (pop ll) :translate #f(50 0 0) :world)
(send (pop ll) :translate #f(50 0 0) :world)
(send-all bb :worldcoords)
(send *viewer* :viewsurface :line-width 2)
(hid *viewer* bb)
(send *viewer* :viewsurface :line-width 4)
(if axis (dolist (b bb) (draw-axis 50 b)))
(send *viewer* :viewsurface :line-width 1)
(when (stringp kdraw)
(kdraw kdraw
(send *viewer* :viewsurface :line-width 2)
(hid *viewer* bb)
(send *viewer* :viewsurface :line-width 4)
(if axis (dolist (b bb) (draw-axis 50 b)))
(send *viewer* :viewsurface :line-width 1)
(send *viewer* :pane)
))
))
;(hanoi-show)
;(sarm-eps)
;(hanoi-eps)
物体操作の手順を記述する方法として,ハノイの塔の例を取り上げる.ハノイ
の塔の問題は,何枚かの円板を移動する際に,円板の上にはそれより大きい円
板を積み重ねることができず,退避するための場所が一箇所だけ利用できると
いうものである.
この問題をロボットが解く場合に,
これらのルールも与えて手順を生成させる
方法と,人間の側でルールを租借して手順を生成する方法を与える場合が
考えられる.後者の方法の場合には,人間の方で再帰的な手続きとして
円板が何枚あろうとも成り立つプログラムを与える方法や,現在の円板の枚数に
だけ対応できるプログラムを与える方法がありうる.
前者の再帰的な手続きというのは,
n枚の円板があるとして,一番下の円板以外の
n-1枚の円板を退避場所へ全部移動してから,一番下の円板を目標位置へ
移動し,退避場所にあるn-1枚の円板をその一番下の円板の上へ移すという
手順になる.n-1枚の円板を移動する時にn枚の移動を行うプログラムを
再帰的に利用することができるからである.
生成される各段階の動作は,どの対象物をつかみ(grasp),
どの台の上に積み重ねるか(pile-on)という記述になる.
pile-onには台が指定されるが,その台の上には円板が載っている場合も
あり,その台の一番上にある円板が何であり,その円板の上の面上へ
すでに把握している円板の下の面を置くという移動動作が生成
される必要がある.
3枚の円板での例を図12にそのシーケンスを示す.
|
(move (park)) (grasp (disk 1)) (pile-on table-b)
(grasp (disk 2)) (pile-on table-c) (grasp (disk 1))
(pile-on table-c) (grasp (disk 3)) (pile-on table-b)
(grasp (disk 1)) (pile-on table-a) (grasp (disk 2))
(pile-on table-b) (grasp (disk 1)) (move (park))
|