BÁO CÁO TIỂU LUẬN MÔN HỌC TRÍ TUỆ NHÂN TẠO ĐỀ TÀI ĐIỀU KHIỂN CÁNH TAY ROBOT GẮP VẬT Ngày nay trong lĩnh vực công nghiệp, tự động hóa quá trình công nghệ đã trở thành một yếu tố quan trọng quyết định sự thành công của một doanh nghiệp. Và quá trình tự động hóa không thể không kể đến những cánh tay robot, vốn được sử dụng rất phổ biến trong những ngành công nghiệp quan trọng như hàn, mạ, vi điện tử, cơ khí chính xác … Việc điều khiển sao cho những cánh tay robot có thể thực thi với năng lượng ít nhất và thời gian nhanh nhất một cách tối ưu, chính xác là nhân tố quan trọng quyết định giá thành sản phẩm. Điều này hoàn toàn có thể được giải quyết được nhờ ứng dụng những tri thức đạt được trong lĩnh vực trí tuệ nhân tạo.
BÁO CÁO TIỂU LUẬN MƠN HỌC TRÍ TUỆ NHÂN TẠO ĐỀ TÀI ĐIỀU KHIỂN CÁNH TAY ROBOT GẮP VẬT GVHD : Ts NGUYỄN THIỆN THÀNH SV : PHẠM TRẦN HUY BẢO 40300162 HUỲNH QUỐC DUY 40300424 VÕ NGỌC TUỆ 40303215 - 2007 A – VẤN ĐỀ Ngày lĩnh vực cơng nghiệp, tự động hóa q trình cơng nghệ trở thành yếu tố quan trọng định thành công doanh nghiệp Và trình tự động hóa khơng thể khơng kể đến cánh tay robot, vốn sử dụng phổ biến ngành công nghiệp quan trọng hàn, mạ, vi điện tử, khí xác … Việc điều khiển cho cánh tay robot thực thi với lượng thời gian nhanh cách tối ưu, xác nhân tố quan trọng định giá thành sản phẩm Điều hồn tồn giải nhờ ứng dụng tri thức đạt lĩnh vực trí tuệ nhân tạo Mục đích tiểu luận viết chương trình đơn giản dựa ngơn ngữ lập trình Prolog để điều khiển cánh tay gắp khối chuyển từ trạng thái đầu sang trạng thái đích định, ứng dụng từ giải thuật tìm kiếm như: tìm theo chiều rộng, theo chiều sâu heuristic B – PHƯƠNG PHÁP LUẬN GIẢI QUYẾT VẤN ĐỀ Cho mơ hình cánh tay robot, trạng thái đầu đích sản phẩm hình vẽ Mục đích tốn điều khiển cánh tay robot di chuyển khối từ trạng thái đầu sang trạng thái đích Các bước thực hiện: Mơ tả trạng thái toán vị từ tổng quát: a location(W, X, Y, Z) : mơ tả vị trí khối W tọa độ X, Y, Z b on(X, Y) : mô tả khối X nằm khối Y c clear(X) : mô tả làm X ( khơng có khối nằm khối X) d holding(X) : mô tả cánh tay robot giữ khối X e handemty() : mô tả cánh tay rỗng f ontable(X): mô tả khối X nằm mặt bàn Mô tả thao tác cánh tay robot vị từ: a b c d e goto(X, Y, Z) : di chuyển cánh tay robot đến vị trí X, Y, Z pickup(X) : thực lệnh X lên khỏi mặt bàn putdown(X) : thực lện đặt X xuống mặt bàn takeoff(X, Y) : thực lệnh lấy khối X từ đỉnh khối Y stack(X, Y) : thực lệnh đặt khối X lên khối Y Mô tả luật suy diễn a Luật xác định làm khối : khơng có khối Y nằm X, X ∀X(clear(X) ← ¬∃Y(on(Y, X))) b Luật xác định khối nằm mặt bàn: Y nằm bàn khơng nằm khối khác ∀X ∀Y (¬ ¬on(Y, X) ↔ ontable(Y)) c Luật xác định cánh tay robot rỗng: cánh tay rỗng khơng giữ khối ∀Y (handemty() ↔ ¬holding(Y)) d Thay đổi trạng thái thực lện pickup _ Trạng thái tại: cánh tay rỗng, X ontables, X _ Trạng thái sau pickup: cánh tay giữ X ∀X(pickup(X)→ →(holding(X)← ← (handemty()∧ ∧ontable(X)∧ ∧clear(X)))) e Thay đổi trạng thái thực lệnh putdown: _ Trạng thái tại: cánh tay giữ X _ Trạng thái sau putdown: cánh tay rỗng, X ontable, X ∀X(putdown(X)→ →(handemty()∧ ∧ontable(X)∧ ∧clear(X)) ← holding(X))) f Thay đổi trạng thái thực lệnh puton: _ Trạng thái tại: Cánh tay giữ X, Y rỗng _ Trạng thái sau puton: cánh tay rỗng, X Y, X ∀X∀ ∀Y(stack(X,Y)→ →((handemty()∧ ∧on(X,Y)∧ ∧clear(X))← ←(holdin g(X)∧ ∧clear(Y)))) g Thay đổi trạng thái thực lệnh takeoff _ Trạng thái tại: cánh tay rỗng, X Y, X _ Trạng thái sau takeoff: Giữ X, Y ∀X∀ ∀Y(takeoff(X,Y)→ → ((holding(X)∧ ∧clear(Y))← ← (handemty()∧ ∧on(X,Y)∧ ∧clear(X)))) h Xử lý ràng buộc thực lệnh takeoff : Nếu X nằm bàn khơng bị ảnh hưởng lệnh takeoff(Y,Z) ∀X∀ ∀Y∀ ∀Z(takeoff(Y,Z)→ → (ontable(X)← ←ontable(X))) i Xử ly ràng buộc thực lệnh puton: Nếu X nằm bàn khơng bị ảnh hưởng lệnh puton(Y,Z) ∀X∀ ∀Y∀ ∀Z(stack(Y,Z)→ → (ontable(X)← ←ontable(X))) Do luật dẫn đến khơng gian trạng thái rộng phức tạp ( lặp lại trạng thái toán) Để xứ lý ta lập ba danh sách P, A, D mô tả kiện điều kiện ràng buộc cho chúng P – danh sách tiền điều kiện A – danh sách bổ sung kiện D – danh sách hủy bỏ kiện Từ danh sách ta xây dựng lại tốn tử vị từ để loại bỏ bớt luật khung tốn, gồm tốn tử vận hành sau: Giới thiệu trạng thái vật handempty( ) : trạng thái cánh tay robot không gắp vật holding(X): trạng thái cánh tay robot gắp vật X clear(X) : trạng thái vật X khơng có vật nằm on(Y,X) : trạng thái vật Y nằm vật X ontable(X) : trạng thái vật X nằm bàn Giới thiệu thao tác cánh tay robot Ký hiệu : P – danh sách tiền đề điều kiện A – danh sách bổ sung kiện D – danh sách hủy bỏ kiện a) pickup(X) : cánh tay robot gắp vật X từ bàn pickup(X) P : handempty( ), clear(X), ontable(X) A : holding(X) D : handempty( ), clear(X), ontable(X) b) putdown(X) : cánh tay robot để vật X lên bàn putdown(X) P : holding(X) A : ontable(X), clear(X), handempty( ) D : holding(X) c) takeoff(Y,X) : cánh tay robot gắp vật Y khỏi vật X takeoff(Y,X) P : clear(Y), on(Y,X), handempty( ) A : holding(Y), clear(X) D : clear(Y), on(Y,X), handempty( ) d) stack(Y,X) : cánh tay robot chồng vật Y lên vật X stack(Y,X) P : holding(Y), clear(X) A : clear(Y), on(Y,X), handempty( ) D : holding(Y), clear(X) Trong cách biểu diễn này, danh sách bổ sung A danh sách hủy bỏ D xác định yếu tố cần thiết để thỏa mãn luật khung Các thành phần mô tả khác không đề cập đến hai danh sách xem không thay đổi trạng thái danh sách thực tốn tử Từ danh sách ta xây dựng giải thuật tìm kiếm theo chiều rộng chiều sâu để đạt đến trạng thái đích tốn _ Trạng thái đầu đích tốn mơ tả thơng qua vị từ sau: Trạng thái đầu Trạng thái đích • Handemty() Handemty() • Clear(B) Clear(B) • Clear(E) Clear(E) • Clear(C) On(B,A) • On(B,A) On(A,C) • On(E,D) On(E,D) • Ontable(C) Ontable(C) • Ontable(A) Ontable(D) • Ontable(D) Phương pháp tìm kiếm theo chiều rộng A C B D A C E B A D E stack (B,A) C B C B A D E stack(B,C) D E A A C A D E C B E D E B D B A C A C Putdown (B) stack(B,E) C B D E B D E A A B C C stack(C,B) Takeoff(B,A) D E B D E A A B A B C B C C D E D E D E A B Pickup(C) D A C E B D E C stack(C,E) A B E C D A B A B C E stack(E,C) stack(E,B) Takeoff(E,D) D C E A B C D E A B C Putdown (E) stack(E,D) D D E Phương pháp tìm kiếm theo chiều sâu B A Takeoff(B,A) B E A C D stack(B,A) stack(B,C) B A E C D A B E C D Takeoff(B,C) Pickup A B A C A E B E D C D Putdown(A) stack(A,B) A A B E B E C D C D Phương pháp tìm kiếm theo heuristic E C D _ Định nghĩa: Heuristic toán định nghĩa số vị từ khác mô tả trạng thái trạng thái đích Trạng thái có số vị từ mơ tả khác trạng thái tốt C – GIẢI THUẬT I Giải thuật tìm kiếm theo chiều rộng : begin open := [Start] closed := [] while open ≠ [] begin Hủy bỏ đỉnh từ danh sách Open, gọi X; if X đích then return(success) gọi hàm in kết thao tác; else begin phát sinh X; đặt X vào đầu danh sách closed; loại bỏ X có mặt open closed; đặt lại vào cuối danh sách open thêm tập trạng thái [con,cha] vào danh sách closed end end; return(failure) end Do giải thuật chiều rộng tìm kiếm tất trường hợp có cấp, mà tìm tới trạng thái đích tập trạng thái tập closed bao gồm tất trạng thái duyệt qua Do để tìm đường từ trạng thái đầu đến trạng thái cuối bước sau xác định trạng thái thêm vào danh sách closed ta thêm dạng [trạng thái con, trạng thái cha] dễ dàng suy đường từ trạng thái đầu đến trạng thái đích tốn Sau dùng hàm tìm thao tác đường dẫn trạng thái vừa tìm để tìm danh sách thao tác tương ứng cho yêu cầu tốn Chương trình giải tốn cánh tay Robot gắp vật theo giải thuật tìm kiếm theo chiều rộng: domains action = takeoff(Symbol,Symbol); pickup(Symbol); putdown(Symbol); stack(Symbol,Symbol) laction = action* process = del(state); add(state) lprocess = process* state = handempty();clear(Symbol);on(Symbol,Symbol);ontable(Symbol);holding(Symbol) lstate = state* list_lstate = lstate* list_list_lstate = list_lstate* predicates nondeterm del_queue(List_lstate,List_list_lstate,List_list_lstate) nondeterm dequeue(List_lstate,List_list_lstate,List_list_lstate) nondeterm empty_queue(List_list_lstate) nondeterm subset(lstate,lstate) nondeterm member(state,lstate) nondeterm member_set(state,lstate) nondeterm member_queue(List_lstate,List_list_lstate) nondeterm member_queue1(List_lstate,List_list_lstate) nondeterm member_queue2(List_lstate,List_list_lstate) nondeterm equal_set(lstate,lstate) nondeterm moves(Lstate,List_list_lstate,List_list_lstate,List_lstate) nondeterm get_children(Lstate,List_list_lstate,List_list_lstate,List_list_lstate) nondeterm move(Action,Lstate,Lprocess) nondeterm add_list_to_queue(List_list_lstate,List_list_lstate,List_list_lstate) nondeterm add_list(List_lstate,List_list_lstate,List_list_lstate) nondeterm add_if_not_in_set(state,lstate,lstate) nondeterm delete_if_in_set(state,lstate,lstate) nondeterm change_state(lstate,lprocess,lstate) nondeterm path(List_list_lstate,List_list_lstate,Lstate) nondeterm go(Lstate,Lstate) nondeterm printsolution(List_lstate,List_list_lstate,List_list_lstate) nondeterm find_action(List_list_lstate) clauses % Cac thao tac cua canh tay robot move(takeoff(X,Y),[handempty(),clear(X),on(X,Y)],[del(handempty()),del(clear(X)), del(on(X,Y)),add(clear(Y)),add(holding(X))]) move(putdown(X),[holding(X)],[del(holding(X)),add(ontable(X)),add(clear(X)), add(handempty())]) move(pickup(X),[handempty(),clear(X),ontable(X)],[del(handempty()),del(clear(X)), del(ontable(X)),add(holding(X))]) move(stack(X,Y),[holding(X),clear(Y)],[del(holding(X)),del(clear(Y)),add(handempty()), add(on(X,Y)),add(clear(X))]) % Tim kiem cac trang thai tu trang thai hien tai get_children(State,Rest_open_queue,Closed_set,Children):findall(Child,moves(State,Rest_open_queue,Closed_set,Child),Children) moves(State,Res_open_queue,Closed_set,[Child_state,State]):move(_,Preconditions,Actions), subset(Preconditions,State), change_state(State,Actions,Child_state), not(member_queue2([Child_state,_],Res_open_queue)), not(member_queue([Child_state,State],Res_open_queue)), not(member_queue([Child_state,State],Closed_set)) % Tim kiem duong di tu trang thai dau toi trang thai dich tu tap cac trang thai trung gian printsolution([_,[]],_,A):-nl,nl,find_action(A),nl,nl printsolution([State,Parent],Closed_set,Been_queue):member_queue1([Parent,Grandparent],Closed_set), add_list([Parent,State],Been_queue,New_been_queue), del_queue([Parent,Grandparent],Closed_set,New_closed_set), printsolution([Parent,Grandparent],New_closed_set,New_been_queue) % Tim kiem cac trang thai trung gian cua cac khoi vat de thoa yeu cau bai toan path(Open_queue,_,_):empty_queue(Open_queue),!, write("Graph searched, no solution found") path(Open_queue,Closed_set,Goal_state):dequeue([State,Parent],Open_queue,_), equal_set(State,Goal_state),write("Solution path is : "), empty_queue(Been_queue), printsolution([State,Parent],Closed_set,Been_queue),! path(Open_queue,Closed_set,Goal_state):dequeue([State,Parent],Open_queue,Rest_open_queue), get_children(State,Rest_open_queue,Closed_set,Children), add_list_to_queue(Children,Rest_open_queue,New_open_queue), add_list([State,Parent],Closed_set,New_closed_set), path(New_open_queue,New_closed_set,Goal_state) go(Start_state,Goal_state):empty_queue(Empty_open_queue), add_list([Start_state,[]],Empty_open_queue,Open_queue), empty_queue(Closed_set), path(Open_queue,Closed_set,Goal_state) % Tim kiem thao tac phu hop tuong ung voi tap cac trang thai trung gian find_action([]) find_action([[A,B]|Tail]):move(Name,Preconditions,Actions), subset(Preconditions,A), change_state(A,Actions,C), equal_set(B,C),write(" ",Name),nl, find_action(Tail) %Cac ham xu ly danh sach empty_queue([]) subset([],_) subset([H|T],S):- member_set(H,S),subset(T,S) member_set(H,S):-member(H,S) member(X,[X|_]) member(X,[_|T]):-member(X,T) equal_set(S1,S2):- subset(S1,S2),subset(S2,S1) member_queue2([A1,_],[[B1,_]|_]):-equal_set(A1,B1) member_queue2([A1,B1],[[_,_]|Tail]):-member_queue2([A1,B1],Tail) member_queue1([A1,A2],[[A1,A2]|_]) member_queue1([A1,A2],[[_,_]|Tail]):-member_queue1([A1,A2],Tail) member_queue([A1,A2],[[B1,B2]|_]):-equal_set(A1,A2),equal_set(B1,B2) member_queue([A1,A2],[[_,_]|Tail]):-member_queue([A1,A2],Tail) dequeue([A1,A2],[[A1,A2]|Tail],Tail) del_queue([A1,A2],[[A1,A2]|Tail],Tail) del_queue([A1,A2],[[_,_]|Tail],New_tail):-del_queue([A1,A2],Tail,New_tail) change_state(S,[],S) change_state(S,[add(P)|T],S_new):- change_state(S,T,S2),add_if_not_in_set(P,S2,S_new),! change_state(S,[del(P)|T],S_new):- change_state(S,T,S2), delete_if_in_set(P,S2,S_new),! delete_if_in_set(_,[],[]) delete_if_in_set(E,[E|T],T):-! delete_if_in_set(E,[H|T],[H|T_new]):-delete_if_in_set(E,T,T_new),! add_if_not_in_set(X,S,S):- member(X,S),! add_if_not_in_set(X,S,[X|S]) add_list_to_queue(E,[],E) add_list_to_queue(E,[H|T],[H|Tnew]):-add_list_to_queue(E,T,Tnew) add_list(E,T,[E|T]) Goal go([handempty(),ontable(b),on(a,b),clear(a),ontable(c),on(d,c),clear(d)], [handempty(),ontable(a),on(b,a),on(d,b),on(c,d),clear(c)]) Kết chạy thử nghiệm : a Trạng thái đầu : handempty( ), ontable(b),on(a,b), clear(a), ontable(c), on(d,c), clear(d) Trạng thái đích: handempty( ), ontable(a), on(b,a), on(d,b), on(c,d), clear(c) Kết thu từ chương trình : takeoff("a","b") putdown("a") pickup("b") stack("b","a") takeoff("d","c") stack("d","b") pickup("c") stack("c","d") b Trạng thái đầu : handempty(), ontable(a), on(b,a), clear(e), on(e,b), ontable(c), on(d,c), clear(d) Trạng thái đích: handempty(), ontable(d), on(c,d), on(b,c), on(a,b), clear(a), ontable(e), clear(e) Kết thu từ chương trình : takeoff("e","b") putdown("e") takeoff("d","c") putdown("d") pickup("c") stack("c","d") takeoff("b","a") stack("b","c") pickup("a") stack("a","b") II Giải thuật tìm kiếm theo chiều sâu Giải thuật tìm kiếm theo chiều sâu : begin open:=[Start]; closed := []; while open ≠ []; begin Loại bỏ đỉnh danh sách open, gọi X; If X đích then return(success) in danh sách thao tác else begin Từ trạng thái X tìm kiếm trạng thái từ thao tác Đưa X vào closed; Loại bỏ X có mặt open closed; Đặt lại đầu danh sách open Thêm thao tác vừa sử dụng vào danh sách thao tác end end; return(failure) end Chương trình giải toán cánh tay Robot gắp vật theo giải thuật tìm kiếm theo chiều sâu: domains action = takeoff(Symbol,Symbol);pickup(Symbol);putdown(Symbol);stack(Symbol,Symbol) laction = action* process = del(state); add(state) lprocess = process* state = handempty();clear(Symbol);on(Symbol,Symbol);ontable(Symbol);holding(Symbol) lstate = state* list_lstate = lstate* %sua predicates nondeterm move(action,lstate,lprocess) nondeterm plan(lstate,lstate,list_lstate,laction) nondeterm subset(lstate,lstate) nondeterm subset_stack(lstate,list_lstate) %sua nondeterm equal_set(lstate,lstate) nondeterm member(state,lstate) nondeterm member_set(state,lstate) reverse_print_stack(laction) change_state(lstate,lprocess,lstate) add_if_not_in_set(state,lstate,lstate) delete_if_in_set(state,lstate,lstate) stack(lstate,list_lstate,list_lstate) stack1(action,laction,laction) empty_stack(list_lstate) empty_stack1(laction) go(lstate,lstate)-nondeterm(i,i) clauses % Cac thao tac cua canh tay robot move(takeoff(X,Y),[handempty(),clear(X),on(X,Y)],[del(handempty()),del(clear(X)), del(on(X,Y)),add(clear(Y)),add(holding(X))]) move(putdown(X),[holding(X)],[del(holding(X)),add(ontable(X)),add(clear(X)), add(handempty())]) move(pickup(X),[handempty(),clear(X),ontable(X)],[del(handempty()),del(clear(X)), del(ontable(X)),add(holding(X))]) move(stack(X,Y),[holding(X),clear(Y)],[del(holding(X)),del(clear(Y)),add(handempty()), add(on(X,Y)),add(clear(X))]) % Tim kiem cac thao tac de di tu trang thai dau den trang thai dich plan(Start_state,Goal_state,_,Move_stack):equal_set(Start_state,Goal_state), write("move are :"),nl, reverse_print_stack(Move_stack) plan(Start_state,Goal_state,Been_stack,Move_stack):move(Name,Preconditions,Actions), subset(Preconditions,Start_state), change_state(Start_state,Actions,Child_state), not(subset_stack(Child_state,Been_stack)), stack(Child_state,Been_stack,New_been_stack), stack1(Name,Move_stack,New_move_stack), plan(Child_state,Goal_state,New_been_stack,New_move_stack),! % Cac ham xu ly danh sach equal_set(S1,S2):- subset(S1,S2),subset(S2,S1) subset([],_) subset([H|T],S):- member_set(H,S),subset(T,S) member_set(E,S):-member(E,S) member(X,[X|_]) member(X,[_|T]):-member(X,T) reverse_print_stack([]) reverse_print_stack([E|Rest]):-reverse_print_stack(Rest),write(E),nl subset_stack(_,[]):-fail,! subset_stack(H,[H1|_]):-equal_set(H,H1) subset_stack(H,[H1|Tail]):- not(equal_set(H,H1)),subset_stack(H,Tail) change_state(S,[],S) change_state(S,[add(P)|T],S_new):change_state(S,T,S2),add_if_not_in_set(P,S2,S_new),! change_state(S,[del(P)|T],S_new):- change_state(S,T,S2), delete_if_in_set(P,S2,S_new),! delete_if_in_set(_,[],[]) delete_if_in_set(E,[E|T],T):-! delete_if_in_set(E,[H|T],[H|T_new]):-delete_if_in_set(E,T,T_new),! add_if_not_in_set(X,S,S):- member(X,S),! add_if_not_in_set(X,S,[X|S]) stack(Top,Stack,[Top|Stack]) stack1(Top,Stack,[Top|Stack]) go(Start_state,Goal_state):empty_stack1(Move_Stack),empty_stack(Been_stack), stack(Start_state,Been_stack,New_been_stack), plan(Start_state,Goal_state,New_been_stack,Move_stack) empty_stack([]) empty_stack1([]) goal go([handempty(),ontable(c),on(b,c),on(a,b),clear(a)], [handempty(),clear(a),ontable(b),on(c,b),on(a,c)]) Kết chạy thử nghiệm : a Trạng thái đầu : handempty(),ontable(a),on(b,a),on(c,b),clear(c) Trạng thái đích: handempty(),ontable(b),on(a,b),on(c,a),clear(c) Kết thu từ chương trình : takeoff("c","b") putdown("c") takeoff("b","a") putdown("b") pickup("a") stack("a","b") pickup("c") stack("c","a") b Trạng thái đầu : handempty( ), ontable(b),on(a,b), clear(a), ontable(c), on(d,c), clear(d) Trạng thái đích: handempty( ), ontable(a), on(b,a), on(d,b), on(c,d), clear(c) Kết thu từ chương trình : takeoff("a","b") putdown("a") takeoff("d","c") putdown("d") pickup("c") stack("c","d") pickup("a") stack("a","b") takeoff("c","d") putdown("c") takeoff("a","b") stack("a","c") pickup("b") stack("b","d") takeoff("a","c") putdown("a") takeoff("b","d") stack("b","a") pickup("d") stack("d","b") pickup("c") stack("c","d") III Kết luận nhận xét : Nhận xét : - Giải thuật tìm kiếm theo chiều sâu có giải thuật đơn giản tìm kiếm theo chiều rộng nên dể lập trình - Đối với tốn có số lượng vật nhỏ ( ≤ 3) giải thuật chiều sâu chiều rộng cho kết nhau.Tuy nhiên tốn có số lượng vật nhiều giải thuật tìm kiếm theo chiều sâu cho kết khơng tối ưu có thời gian chạy chương trình lâu so với giải thuật tìm kiếm theo chiều rộng Kết luận : Với toán cánh tay robot gắp vật giải thuật tìm kiếm theo chiều rộng viết chương trình phức tạp cho kết tối ưu số thao tác cánh tay robot Đồng thời chương trình tìm kiếm theo chiều rộng gặp lỗi tràn nhớ so với tìm kiếm theo chiều sâu