Tham gia trễ hơn 15phút đến 30 phútTham gia trễhơn 30 phútkhông có lý doThái độ tham gia tích cực tốt Kết nốikhá tốtkhác Có kết nối nhưngđôi khi còn lơ là,phải nhắc nhỡ Hũu ích Tương đối
GIỚI THIỆU
Định nghĩa
Kỹ thuật robot là một ngành kỹ thuật liên quan đến việc thiết kế, chế tạo, vận hành và ứng dụng robot Robot là một hệ thống tự đọng có thể thực hiện một số nhiệm vụ được chỉ định, chúng thường được ứng dụng trong các ngành sản xuất, dịch vụ và quân sự Ngành kỹ thuật robot là một ngành có tính liên ngành cao, kết hợp các kiến thức của nhiều lĩnh vực như: cơ khí, điện tử, điều khiển tự động, trí tuệ nhân tạo,… Dưới đây là 1 số xu hướng chính trong ngành kỹ thuật robot:
- Tự động hóa: Robot đang được sử dụng ngày càng nhiều trong các ngành sàn xuất để tự động hóa các nhiệm vụ nguy hiểm hoặc lặp đi lặp lại.
- Trí tuệ nhân tạo: trí tuệ nhân tạo đang được sử dụng để nâng cao khả năng của robot cho phép chúng thực hiện các nhiệm vụ phức tạp hơn.
- Robot di dộng: Robot di động đang trở nên phổ biến hơn, cho phép chúng được sử dụng trong nhiều môi trường khác nhau.
- Robot cộng tác: robot cộng tác (cobots) được thiết kế để lam việc an toàn cùng con người
Lịch sử hình thành
Giai đoạn này được đánh dấu bởi sự ra đời của thuật ngữ “robot” trong vở kịch
“Các robot toàn năng của Rossum” của nhà văn Séc Karel Capek vào năm 1920 Tuy nhiên, những robot đầu tiên thực sự tạo ra trong giai đoạn này vẫn còn đơn giản và ko có nhiều khả năng.
Một trong những robot nổi tiếng nhất của giai đoạn này là robot Unimate, được phát triển bởi Joseph F Engberger vào năm 1954 Unimate là robot công nghiệp đầu tiên được sử dụng trong sản xuất, nó đã mở đường cho sự phát triển của robot công nghiệp trong những thập kỷ tiếp theo.
Giai đoạn này chứng kiến sự phát triển nhanh trong của kỹ thuật robot Các công nghệ mới như máy tính và trí tuệ nhân tạo đã được áp dụng vào robot, giúp chúng trở nên phức tạp và linh hoạt hơn.
Một trong những thành tựu nổi bật nhất của giai đoạn này là sự phát triển của robot tự hành, robot tự hành đầu tiên là robot shakey, được phát triển bởi viện nghiên cứu trí thông minh nhân tạo thuộc đại học Stanford vào năm 1969 Shakey có thể di chuyển trong môi trường phức tạp và thực hiện các nhiệm vụ như mở của, lấy đồ vật và tránh chướng ngại vật
Chứng kiến sự phát triển mạnh mẽ của kỹ thuật robot, Robot được sử dụng ngày càng nhiều Hơn thế nữa robot hiện nay đang được phát triển để hoạt động trong môi trường khắc nghiệt: dưới nước, trong lòng đất hoặc ngoài không gian Lịch sử hoàn thiện của kỹ thuật robot đang tiếp tục được viết, với sự phát triển của công nghệ,robot sẽ tiếp tục được cải tiến và ứng dụng trong nhiều lĩnh vực hơn nữa trong tương lai.
Phân loại
Có thể phân loại theo:
Mục đích sử dụng: robot công nghiệp, robot dịch vụ, robot quân sự, y tế, giải trí, nghiên cứu,….
Dựa trên cấu trúc: robot cánh ta, robot di động, cộng tác, robot humanoid, dưới nước, trên không, vũ trụ,….
Dựa trên mức độ tự động hóa: robot tự động hoàn toàn, robot bán tự động và robot không tự động.
Dựa trên khả năng cảm nhận: Robot thụ động, robot chủ động và robot thông minh
CƠ SỞ LÝ THUYẾT
Véc-tơ mô tả vị trí và tọa độ thuần nhất
Trong hình học, một vị trí hoặc vector vị trí, còn được gọi là tọa độ vector hoặc bán kính vector, là một vectơ đại diện cho vị trí của một điểm P trong không gian liên quan đến một hệ quy chiếu gốc O tùy ý.
Trong hệ tọa độ Oxyz, điểm M được xác định bằng véc- tơ ri: xi i yi zy r r r r
Hình 1 Biểu diễn 1 điểm trong không gian
Ký hiệu (…) T là phép chuyển vị (Transportation) véc-tơ hàng thành véc-tơ cột. Để biểu diễn véc-tơ trong không gian tọa độ có thực, véc-tơ mở rộng có thể viết lại như sau:
Thông thường lấy w = 1, nếu lấy w ≠ 1 thì tọa độ biểu diễn gấp w lần tọa độ thực,nên có thể gọi w là hệ số tỷ lệ.
Véc-tơ mô tả phép quay
Trước hết thiết lập quan hệ giữa 2 hệ toạ độ XYZ và UVW chuyển động quay tương dối với nhau khi gốc O của 2 hệ vần trùng nhau Gọi ( ix, iy, iz) và (iu, iv, iw) là các vectơ đơn vị chỉ phương các trục OXYZ và OUWW tương ứng:
Hình 2 Các hệ tọa độ
Một điểm M nào đó được biểu diễn trong hệ toạ độ OXYZ bằng vectơ:
Còn trong hệ toạ độ OUVW bằng vectơ:
Viết dưới dạng ma trận: x u x v x w y u y v y w z u z v z w i i i j i k rx ry j i j j j j rz k i k j j j
Gọi R là ma trận quay (rotation) 3x3 với các phần tứ là tích vô hướng 2 vectơ chỉ phương các trục tương ứng của 2 hệ toạ độ OXYZ và OUVW Có thể biểu diễn các phần tử ma trận R và R 1 như sau: cos( , ) cos( , ) cos( , ) cos( , ) cos( , ) cos( , ) cos( , ) cos( , ) cos( , ) y x u x v x w
1 cos( , ) cos( , ) cos( , ) cos( , ) cos( , ) cos( , ) cos( , ) cos( , ) cos( , ) y u x u y u z
Ma trận thuần nhất
Trong không gian, vị trí của điểm mới cần được xác định sau khi thực hiện động tác, cần phải có thông tin cả về phép quay và vị trị của điểm Do đó, ma trận 4x4 được gọi là ma trận thuần nhất được biểu diễn dưới dạng 4 khối sau: x x x x y 0 z n s a p n s a p n s a p
R - ma trận quay 3x3 p - ma trận 3x1 biểu thị 3 toạ độ cùa điểm gốc hệ toạ độ of trong hệ tọa độ OXYZ1x3 - ma trận không1x1- ma trận đơn vị
Các tham số động học Denavit – Hartenberg
Đối với robot công nghiệp, Denavit – Hartenberg (1995) đã đưa ra cách chọn trục tọa độ như sau:
1 Chọn trục zi-1 được chọn dọc theo hướng của trục khớp động thứ i
2 Trục xi-1 được chọn dọc theo đường vuông góc chung của hai trục zi-2 và zi-1, hướng đi từ trục zi-2 sang trục zi-1 Nếu trục zi-1 cắt trục zi-2 thì hướng của trục xi-1 được chọn tùy ý.
3 Các góc tọa độ Oi-1 được chọn tại điểm giao của trục xi-1 và zi-1.
4 Trục yi-1 được chọn sao cho hệ (Oxyz)i-1 là hệ quy chiếu thuận.
Với cách chọn hệ tọa độ như trên, đôi khi các hệ tọa độ khâu (Oxyz)i-1 không xác định được một cách duy nhất Vì vậy ta cần có một số bổ sung thích hợp như sau:
5 Đối với hệ trục tọa độ (Oxyz)0 theo quy ước trên ta mới chỉ chọn được trục z0 còn trục x0 chưa có trong quy ước trên Ta có thể chọn trục x0 một cách tùy ý.
6 Đối với hệ trục tọa độ (Oxyz)n do không có khớp n+1, nên theo quy ước trên không xác định được trục zn Trục zn không được xác định duy nhất, trong khi trục xn lại được chọn theo pháp tuyến của trục zn-1 Trong trường hợp này, nếu khớp n là khớp quy ta có thể chọn trục zn song song với trục zn-1 Ngoài ra, có thể chọn tùy ý sao cho hợp lý.
7 Khi hai trục zi-2 và zi-1 song song với nhau, giữa hai trục này có nhiều đường pháp tuyến chung, có thể chọn trục xi-1 hướng theo pháp tuyến chung nào cũng được.
8 Khi khớp thứ I là khớp tịnh tiến, về nguyên tắc có thẻ chọn trục zi-1 một cách tùy ý Tuy nhiên trong nhiều trường hợp người ta thường chọn trục zi-1 dọc theo trục của khớp tịnh tiến này.
Vị trí của hệ tọa độ khaia (Oxyz), đối với hệ tọa độ khâu (Oxyz)i-1 được xác định bởi 4 tham số Denavit – Hartenberg θ i , d i , a i , α i như sau:
- θ i : góc quanh quanh trục zi-1 để trục xi-1 chuyển đến trục x’1 (x’i // xi)
- d i : dịch chuyển tịnh tiến dọc theo trục zi-1 để góc tọa độ Oi-1 chuyển đến O’i giao điểm của trục xi và trục zi-1.
- a i : dịch chuyển tịnh tiến dọc theo trục xi để điểm O’i chuyển đến O’i.
- α i : góc quay quanh trục xi sao cho trục z’i-1 chuyển đến trục zi.
Trong bốn tham số trên, các tham số a i và α i luôn luôn là hằng số, độ lớn của chúng phụ thuộc vào hình dáng và sự ghép nối các khâu thứ i – 1 và thứ i Hai tham số còn lại θi và di, một là hằng số, một là biến số phụ thuộc vào khớp i là khớp quay hay khớp tịnh tiến Khi khớp i là khớp quay thì θi là biến, còn di là hằng số Khi khớp i là khớp tịnh tiến thì θi là hằng số, còn di là biến.
Ma trận Denavit – Hartenberg
Có thể dịch chuyển tọa độ các khâu (Oxyz)i-1 sang hệ tọa độ các khâu (Oxyz)i, bằng bốn phép biến đổi cơ bản như sau:
- Quay quanh trục zi-1 một góc θ i
- Dịch chuyển tịnh tiến dọc trục z i-1 một đoạn d i
- Dịch chuyển tịnh tiến dọc trục x i một đoạn a i
- Quanh quanh trục x i một góc α i
Ma trận của phép biến đổi, ký hiệu Hi, là tích của bốn ma trận biến đổi cơ bản và có dạng như sau:
0 i cos - sin cos sin sin cos sin cos cos - cos sin sin
TÍNH TOÁN ĐỘNG LỰC HỌC
Động học thuận
Động học thuận trong kỹ thuật robot là xác định các góc khớp cần thiết để đạt được một vị trí và hướng mong muốn của cánh tay robot Nó là một vấn đề ngược, nghĩa là các khớp là các biến độc lập, vị trí và hướng của tay robot là các biến phụ thuộc.
Hình 3 Hệ trục tọa độ trên cánh tay robot
Số bậc tự do của robot: 3
Trong đó: ai: αi: Góc giữa trục Zi-1 và Zi quay xung quanh trục Xi di: Khoảng cách tử trục Xi-1 đến trục Xi dọc theo trục Zi-1
Bảng 1 Bảng thông số động học cánh tay robot 4 bậc tự do θi: Góc giữa trục Xi-1 và Xi quay xung quanh trục Zi-1
Ma trận chuyển đổi từ hệ n-1 sang n:
2 2 2 2 1 2 cos - sin 0 l cos sin cos 0 l sin 0 0 1 0
Ma trận biến đổi thuần nhất x x x x
Trong đó: nx = cos(t1)*cos(t2) 77\*
MERGEFORMAT (3.) ny = cos(t2)*sin(t1) 88\*MERGEFORMAT (3.) nz = sin(t2) 99\*
MERGEFORMAT (3.) pz = a1 + a2*sin(t2) + a3*sin(t2) 1818\* MERGEFORMAT (3.)
3.2 Động học nghịch Động học nghịch trong kỹ thuật robot là xác định vị trí và hướng tay robot khi đã biết các góc khớp Nó là một vấn đề thuận, nghĩa là các góc khớp là các biến phụ thuộc, vị trí và hướng của tay robot là các biến độc lập.
Hình 4 Tính toán động học nghịch
Xét tam giác vuông OP1A có: tan(theta1) = AP1/OA = x/y
Do đó, theta1 = arctan(x/y) command matlab: atan(x/y);
Xét tam giác vuông DCP có:
DP DC CP OA AP DO PP x y l z
Xét tam giác thường DEP có:
Command matlab: op1 = sqrt(x^2+y^2); dp = sqrt(op1^2+(l1-z)^2; t21 = acosd((l2^2+DP^2-l3^2)/(2*l2*DP));
Xét tam giác vuông DFP có:
Xét tam giác thường DEP có:
Kiểm tra tính đúng của động học
Hình 5 Bản vẽ lắp 3D tổng thể4.1.1 Phần đế
BẢN VẼ
Bản vẽ 3D
Hình 5 Bản vẽ lắp 3D tổng thể4.1.1 Phần đế
Hình 6 Bản vẽ chi tiết phần đế 3D 4.1.2 Khớp nối thứ nhất
Hình 7 Bản vẽ chi tiết khớp nối phần đế 3D4.1.3 Tay thứ nhất
Hình 8 Bản vẽ chi tiết 3D tay thứ hai 4.1.4 Khớp 3 và cơ cấu tác động cuối
Hình 9 Bản vẽ chi tiết 3D khớp 3 và cơ cấu tác động cuối
Bản vẽ 2D
Hình 10 Sơ đồ khối điều khiển trong Matlab Simmulink
CHƯƠNG TRÌNH ĐIỀU KHIỂN
Sơ đồ khối Simmulink
Hình 10 Sơ đồ khối điều khiển trong Matlab Simmulink
Hình 11 Kết quả chạy trong Matlab Simmulink
Màn hình giao diện GUI
Hình 12 Màn hình giao diện GUI trong Matlab 5.3 Code đổ chương trình function varargout = control(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename,
'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end function control_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); function varargout = control_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; function slider1_Callback(hObject, eventdata, handles) ModelName = 'robotAssem3'; a1 = 496; a2 = 500; a3 = 451.38; a4 = 175.20; theta1=get(handles.slider1,'value'); set(handles.edit1,'string',num2str(theta1)); theta2=get(handles.slider2,'value'); set(handles.edit2,'string',num2str(theta2)); theta3=get(handles.slider3,'value'); set(handles.edit3,'string',num2str(theta3)); theta4=get(handles.slider4,'value'); set(handles.edit4,'string',num2str(theta4)); set_param([ModelName '/Slider Gain'],'Gain',num2str(theta1)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta2)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta3)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta4));
T1 = [ cosd(theta1) 0 sind(theta1) 0; sind(theta1) 0 -cosd(theta1) 0;
T2 = [ cosd(theta2) -sind(theta2) 0 a2*cosd(theta2); sind(theta2) cosd(theta2) 0 a2*sind(theta2);
T3 = [ cosd(theta3) -sind(theta3) 0 a3*cosd(theta3); sind(theta3) cosd(theta3) 0 a3*sind(theta3);
T4 = [ cosd(theta4) -sind(theta4) 0 a4*cosd(theta4); sind(theta4) cosd(theta4) 0 a4*sind(theta4);
T = T1*T2*T3*T4; px=T(1,4); py=T(2,4); pz=T(3,4); set(handles.edit5,'string',num2str(px)); set(handles.edit6,'string',num2str(py)); set(handles.edit7,'string',num2str(pz)); function slider1_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9 9]); end function slider2_Callback(hObject, eventdata, handles) ModelName = 'robotAssem3'; a1 = 496; a2 = 500; a3 = 451.38; a4 = 175.20; theta1=get(handles.slider1,'value'); set(handles.edit1,'string',num2str(theta1)); theta2=get(handles.slider2,'value'); set(handles.edit2,'string',num2str(theta2)); theta3=get(handles.slider3,'value'); set(handles.edit3,'string',num2str(theta3)); theta4=get(handles.slider4,'value'); set_param([ModelName '/Slider Gain'],'Gain',num2str(theta1)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta2)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta3)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta4));
T1 = [ cosd(theta1) 0 sind(theta1) 0; sind(theta1) 0 -cosd(theta1) 0;
T2 = [ cosd(theta2) -sind(theta2) 0 a2*cosd(theta2); sind(theta2) cosd(theta2) 0 a2*sind(theta2);
T3 = [ cosd(theta3) -sind(theta3) 0 a3*cosd(theta3); sind(theta3) cosd(theta3) 0 a3*sind(theta3);
T4 = [ cosd(theta4) -sind(theta4) 0 a4*cosd(theta4); sind(theta4) cosd(theta4) 0 a4*sind(theta4);
T = T1*T2*T3*T4; px=T(1,4); py=T(2,4); pz=T(3,4); set(handles.edit5,'string',num2str(px)); set(handles.edit6,'string',num2str(py)); set(handles.edit7,'string',num2str(pz)); function slider2_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9 9]); end function slider3_Callback(hObject, eventdata, handles) ModelName = 'robotAssem3'; a1 = 496; a2 = 500; a3 = 451.38; a4 = 175.20; theta1=get(handles.slider1,'value'); set(handles.edit1,'string',num2str(theta1)); theta2=get(handles.slider2,'value'); set(handles.edit2,'string',num2str(theta2)); theta3=get(handles.slider3,'value'); set(handles.edit3,'string',num2str(theta3)); theta4=get(handles.slider4,'value'); set(handles.edit4,'string',num2str(theta4)); set_param([ModelName '/Slider Gain'],'Gain',num2str(theta1)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta2)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta3)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta4));
T1 = [ cosd(theta1) 0 sind(theta1) 0; sind(theta1) 0 -cosd(theta1) 0;
T2 = [ cosd(theta2) -sind(theta2) 0 a2*cosd(theta2); sind(theta2) cosd(theta2) 0 a2*sind(theta2);
T3 = [ cosd(theta3) -sind(theta3) 0 a3*cosd(theta3); sind(theta3) cosd(theta3) 0 a3*sind(theta3);
T4 = [ cosd(theta4) -sind(theta4) 0 a4*cosd(theta4); sind(theta4) cosd(theta4) 0 a4*sind(theta4);
T = T1*T2*T3*T4; px=T(1,4); py=T(2,4); pz=T(3,4); set(handles.edit5,'string',num2str(px)); set(handles.edit6,'string',num2str(py)); set(handles.edit7,'string',num2str(pz)); function slider3_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9 9]); end function slider4_Callback(hObject, eventdata, handles) ModelName = 'robotAssem3'; a1 = 496; a2 = 500; a3 = 451.38; a4 = 175.20; theta1=get(handles.slider1,'value'); set(handles.edit1,'string',num2str(theta1)); theta2=get(handles.slider2,'value'); set(handles.edit2,'string',num2str(theta2)); theta3=get(handles.slider3,'value'); set(handles.edit3,'string',num2str(theta3)); theta4=get(handles.slider4,'value'); set(handles.edit4,'string',num2str(theta4)); set_param([ModelName '/Slider Gain'],'Gain',num2str(theta1)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta2)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta3)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta4));
T1 = [ cosd(theta1) 0 sind(theta1) 0; sind(theta1) 0 -cosd(theta1) 0;
T2 = [ cosd(theta2) -sind(theta2) 0 a2*cosd(theta2); sind(theta2) cosd(theta2) 0 a2*sind(theta2);
T3 = [ cosd(theta3) -sind(theta3) 0 a3*cosd(theta3); sind(theta3) cosd(theta3) 0 a3*sind(theta3);
T4 = [ cosd(theta4) -sind(theta4) 0 a4*cosd(theta4); sind(theta4) cosd(theta4) 0 a4*sind(theta4);
T = T1*T2*T3*T4; px=T(1,4); py=T(2,4); pz=T(3,4); set(handles.edit5,'string',num2str(px)); set(handles.edit6,'string',num2str(py)); set(handles.edit7,'string',num2str(pz)); function slider4_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9 9]); end function edit8_Callback(hObject, eventdata, handles) function edit8_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit9_Callback(hObject, eventdata, handles) py = get(handles.edit9,'string'); set(handles.slider6,'value',str2num(py)); function edit9_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit10_Callback(hObject, eventdata, handles) pz = get(handles.edit10,'string'); set(handles.slider7,'value',str2num(pz)); function edit10_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function slider6_Callback(hObject, eventdata, handles) py = get(handles.slider6,'value'); set(handles.edit9,'string',num2str(py)); function slider6_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9 9]); end function slider7_Callback(hObject, eventdata, handles) pz = get(handles.slider7,'value'); set(handles.edit10,'string',num2str(pz)); function slider7_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9 9]); end function edit1_Callback(hObject, eventdata, handles) ModelName = 'robotAssem3'; a1 = 496; a2 = 500; a3 = 451.38; a4 = 175.20; thate1=get(handles.edit1,'string'); thate2=get(handles.edit2,'string'); thate3=get(handles.edit3,'string'); thate4=get(handles.edit4,'string'); theta1= str2num(thate1); theta2= str2num(thate2); theta3= str2num(thate3); theta4= str2num(thate4); set(handles.slider1,'value',theta1); set(handles.slider2,'value',theta2); set(handles.slider3,'value',theta3); set(handles.slider4,'value',theta4); set_param([ModelName '/Slider Gain'],'Gain',num2str(theta1)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta2)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta3)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta4));
T1 = [ cosd(theta1) 0 sind(theta1) 0; sind(theta1) 0 -cosd(theta1) 0;
T2 = [ cosd(theta2) -sind(theta2) 0 a2*cosd(theta2); sind(theta2) cosd(theta2) 0 a2*sind(theta2);
T3 = [ cosd(theta3) -sind(theta3) 0 a3*cosd(theta3); sind(theta3) cosd(theta3) 0 a3*sind(theta3);
T4 = [ cosd(theta4) -sind(theta4) 0 a4*cosd(theta4); sind(theta4) cosd(theta4) 0 a4*sind(theta4);
T = T1*T2*T3*T4; px=T(1,4); py=T(2,4); pz=T(3,4); set(handles.edit5,'string',num2str(px)); set(handles.edit6,'string',num2str(py)); set(handles.edit7,'string',num2str(pz)); function edit1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit2_Callback(hObject, eventdata, handles) ModelName = 'robotAssem3'; a1 = 496; a2 = 500; a3 = 451.38; a4 = 175.20; thate2=get(handles.edit2,'string'); thate3=get(handles.edit3,'string'); thate4=get(handles.edit4,'string'); theta1= str2num(thate1); theta2= str2num(thate2); theta3= str2num(thate3); theta4= str2num(thate4); set(handles.slider1,'value',theta1); set(handles.slider2,'value',theta2); set(handles.slider3,'value',theta3); set(handles.slider4,'value',theta4); set_param([ModelName '/Slider Gain'],'Gain',num2str(theta1)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta2)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta3)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta4));
T1 = [ cosd(theta1) 0 sind(theta1) 0; sind(theta1) 0 -cosd(theta1) 0;
T2 = [ cosd(theta2) -sind(theta2) 0 a2*cosd(theta2); sind(theta2) cosd(theta2) 0 a2*sind(theta2);
T3 = [ cosd(theta3) -sind(theta3) 0 a3*cosd(theta3); sind(theta3) cosd(theta3) 0 a3*sind(theta3);
T4 = [ cosd(theta4) -sind(theta4) 0 a4*cosd(theta4); sind(theta4) cosd(theta4) 0 a4*sind(theta4);
T = T1*T2*T3*T4; px=T(1,4); py=T(2,4); pz=T(3,4); set(handles.edit5,'string',num2str(px)); set(handles.edit6,'string',num2str(py)); set(handles.edit7,'string',num2str(pz)); function edit2_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit3_Callback(hObject, eventdata, handles) ModelName = 'robotAssem3'; a1 = 496; a2 = 500; a3 = 451.38; a4 = 175.20; thate1=get(handles.edit1,'string'); thate2=get(handles.edit2,'string'); thate3=get(handles.edit3,'string'); thate4=get(handles.edit4,'string'); theta1= str2num(thate1); theta2= str2num(thate2); theta3= str2num(thate3); theta4= str2num(thate4); set(handles.slider1,'value',theta1); set(handles.slider2,'value',theta2); set(handles.slider3,'value',theta3); set(handles.slider4,'value',theta4); set_param([ModelName '/Slider Gain'],'Gain',num2str(theta1)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta2)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta3)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta4));
T1 = [ cosd(theta1) 0 sind(theta1) 0; sind(theta1) 0 -cosd(theta1) 0;
T2 = [ cosd(theta2) -sind(theta2) 0 a2*cosd(theta2); sind(theta2) cosd(theta2) 0 a2*sind(theta2);
T3 = [ cosd(theta3) -sind(theta3) 0 a3*cosd(theta3); sind(theta3) cosd(theta3) 0 a3*sind(theta3);
T4 = [ cosd(theta4) -sind(theta4) 0 a4*cosd(theta4); sind(theta4) cosd(theta4) 0 a4*sind(theta4);
T = T1*T2*T3*T4; px=T(1,4); py=T(2,4); pz=T(3,4); set(handles.edit5,'string',num2str(px)); set(handles.edit6,'string',num2str(py)); set(handles.edit7,'string',num2str(pz)); function edit3_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit4_Callback(hObject, eventdata, handles) ModelName = 'robotAssem3'; a1 = 496; a2 = 500; a3 = 451.38; a4 = 175.20; thate1=get(handles.edit1,'string'); thate2=get(handles.edit2,'string'); thate3=get(handles.edit3,'string'); thate4=get(handles.edit4,'string'); theta1= str2num(thate1); theta2= str2num(thate2); theta3= str2num(thate3); theta4= str2num(thate4); set(handles.slider2,'value',theta2); set(handles.slider3,'value',theta3); set(handles.slider4,'value',theta4); set_param([ModelName '/Slider Gain'],'Gain',num2str(theta1)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta2)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta3)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta4));
T1 = [ cosd(theta1) 0 sind(theta1) 0; sind(theta1) 0 -cosd(theta1) 0;
T2 = [ cosd(theta2) -sind(theta2) 0 a2*cosd(theta2); sind(theta2) cosd(theta2) 0 a2*sind(theta2);
T3 = [ cosd(theta3) -sind(theta3) 0 a3*cosd(theta3); sind(theta3) cosd(theta3) 0 a3*sind(theta3);
T4 = [ cosd(theta4) -sind(theta4) 0 a4*cosd(theta4); sind(theta4) cosd(theta4) 0 a4*sind(theta4);
T = T1*T2*T3*T4; px=T(1,4); py=T(2,4); pz=T(3,4); set(handles.edit5,'string',num2str(px)); set(handles.edit6,'string',num2str(py)); set(handles.edit7,'string',num2str(pz)); function edit4_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit5_Callback(hObject, eventdata, handles) function edit5_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit6_Callback(hObject, eventdata, handles) function edit6_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit7_Callback(hObject, eventdata, handles) function edit7_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function pushbutton1_Callback(hObject, eventdata, handles)
ModelName = 'robotAssem3'; open_system(ModelName); set_param(ModelName,'BlockReduction','off'); set_param(ModelName,'StopTime','inf'); set_param(ModelName,'simulationMode','normal'); set_param(ModelName,'StartFcn','1'); set_param(ModelName, 'SimulationCommand', 'start'); function pushbutton2_Callback(hObject, eventdata, handles) ModelName = 'robotAssem3'; a1 = 496; a2 = 500; a3 = 451.38; a4 = 175.20; theta1 = 0; theta2 = 0; theta3 = 0; theta4 = 0; set_param([ModelName '/Slider Gain'],'Gain',num2str(theta1)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta2)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta3)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta4));
T1 = [ cosd(theta1) 0 sind(theta1) 0; sind(theta1) 0 -cosd(theta1) 0;
T2 = [ cosd(theta2) -sind(theta2) 0 a2*cosd(theta2); sind(theta2) cosd(theta2) 0 a2*sind(theta2);
T3 = [ cosd(theta3) -sind(theta3) 0 a3*cosd(theta3); sind(theta3) cosd(theta3) 0 a3*sind(theta3);
T4 = [ cosd(theta4) -sind(theta4) 0 a4*cosd(theta4); sind(theta4) cosd(theta4) 0 a4*sind(theta4);
T = T1*T2*T3*T4; px=T(1,4); py=T(2,4); pz=T(3,4); set(handles.slider1,'value',theta1); set(handles.slider2,'value',theta2); set(handles.slider3,'value',theta3); set(handles.slider4,'value',theta4); set(handles.edit1,'string',num2str(0)); set(handles.edit2,'string',num2str(0)); set(handles.edit3,'string',num2str(0)); set(handles.edit4,'string',num2str(0)); set(handles.edit5,'string',num2str(px)); set(handles.edit6,'string',num2str(py)); close; function pushbutton4_Callback(hObject, eventdata, handles) ModelName = 'robotAssem3'; global var; px=get(handles.slider10,'value'); set(handles.edit20,'string',num2str(px)); py=get(handles.slider6,'value'); set(handles.edit9,'string',num2str(py)); pz=get(handles.slider7,'value'); set(handles.edit10,'string',num2str(pz)); set(handles.edit5,'string',num2str(px)); set(handles.edit6,'string',num2str(py)); set(handles.edit7,'string',num2str(pz)); a1 = 496; a2 = 500; a3 = 451.38; a4 = 175.20; theta1=atan2d(py,px); theta234= 0; nx = px*cosd(theta1)+py*sind(theta1)-a4*cosd(theta234); ny = -a1 + pz-a4*sind(theta234); c3 = ((nx^2)+(ny^2)-(a3^2)-(a2^2))/(2*a3*a2); s3 = sqrt(1-c3^2); theta3 = atan2d(s3,c3); c2 = (nx*(a3*c3+a2)+a3*s3*ny)/((a3*c3+a2)^2+a3^2*s3^2); s2 = (ny*(a3*c3+a2)-a3*s3*nx)/((a3*c3+a2)^2+a3^2*s3^2); theta2 = atan2d(s2,c2); theta4=theta234-theta2-theta3; set_param([ModelName '/Slider Gain'],'Gain',num2str(theta1)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(theta2)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(theta3)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(theta4)); set(handles.edit1,'string',num2str(theta1)); set(handles.edit2,'string',num2str(theta2)); set(handles.edit3,'string',num2str(theta3)) set(handles.edit4,'string',num2str(theta4)); function slider10_Callback(hObject, eventdata, handles) px = get(handles.slider10,'value'); set(handles.edit20,'string',num2str(px)); function slider10_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 9 9]); end function edit20_Callback(hObject, eventdata, handles) px = get(handles.edit20,'string'); set(handles.slider10,'value',str2num(px)); function edit20_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function axes1_CreateFcn(hObject, eventdata, handles) imshow('D:\Ca nhan\Dao tao dai hoc\Nam4\HKI\Kythuatrobot\Final\Picture\LOGO.jpg');
6.1 Kết quả mô phỏng động học thuận
Hình 13 Robot ban đầu có giá trị các góc theta bằng không
Hình 14 Mô phỏng động học thuận cánh tay robot
6.2 Kết quả mô phỏng động học nghịch
Hình 15 Mô phỏng động lực học cánh tay robot