(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)
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |