D ANH MỤC BẢNG BIỂU
4.1 Khái quát công việc mô phỏng
Công việc đầu tiên của quá trình mô phỏng máy xúc là xây dựng và thể hiện mô hình kết cấu của máy xúc trong không gian 3D. Hiện nay với sự phát triển của những phần mềm dùng để thiết kế các chi tiết, mô hình kết cấu có khí như SolidWorks, ProEngineer, Inventor hay Catia thì việc thể hiện được mô hình kết cấu của máy xúc là khá đơn giản. Tuy nhiên các phần mềm trên thường chỉ được dùng cho quá trình vẽ, thiết kế cơ cấu còn để mô phỏng được sự chuyển động của các cơ cấu để xem xét sự chính xác trong quá trình làm việc qua đó kiểm nghiệm kết quả lý thuyết tính được thì ta cần dùng đến phần mềm khác. Ở đây ta sẽ dùng thư viện đồ họa OpenGL trong môi trường làm việc của phần mềm Visual C++. Ta sẽ dùng phần mềm Inventor để thiết kế từng chi tiết cho máy xúc và lắp ghép kết cấu cho máy xúc, sau đó m
Luận án tốt nghiệp
_ Mục Output as : phải để dạng file ASCII, tức là ta sẽ có thể đọc được file này bằng ngôn ngữ của con người, ta có thể xây dựng phương thức đọc file này, còn để dạng file Binary sẽ là dạng ngôn ngữ máy, ta không thể đọc được, và việc xây dựng phương thức đọc file dạng này sẽ rất khó khăn.
_ Mục Unit : Để đơn vị trùng với đơn vị được thiết kế trong bản vẽ chi tiết các khâu của Rôbốt.
_ Mục Resolution Nên để tùy chọn Custom để chỉnh độ mịn của file *.STL. * Chú ý : Nhớ check ô: Do not translate STL output data to positive space, nếu không việc xuất định dạng file sẽ không thực hiện được.
4.2.2 Biên dịch file *.STL sang dạng file lưu trữ tọa độ các đỉnh
Trong file *.STL bên trên sau khi chuyển từ định dạng *.SLDPRT sẽ chứa cả phần tọa độ các đỉnh cấu thành lên một điểm trong hình vẽ chi tiết và cả những phần chữ được biên dịch ra của chương trình SolidWorks, mà những phần chữ đó ta không cần đến cho việc đọc file dữ liệu cần cho việc mô phỏng. Để giảm bớt thời gian tính toán và bộ nhớ cho việc chạy chương trình mô phỏng ta sẽ loại bỏ phần chữ đó bằng một chương trình tiện ích khác nhằm chuyển đổi file *.STL trên sang định dạng file không chứa phần chữ, chỉ chứa các tọa độ cần thiết cho việc lấy dữ liệu. Như trong luận văn này, chương trình tiện ích chuyển đổi có tên là ConvertSTL.exe.
4.3 ĐỌC DỮ LIỆU TÍNH TOÁN
Khi thực hiện việc ghép nối vi điều khiển với máy vi tính cần qua một chương trình giao tiếp máy tính. Chương trình này có thể viết bằng ngôn ngữ VB hay C++, đó là do khả năng cũng như thói quen của người lập trình. Tuy nhiên với ngôn ngữ C ta có thể thực hiện đồng nhất hóa việc mô phỏng chuyển động ảo và hoạt động thực tế của máy xúc. Ngoài ra với thế mạnh là ngôn ngữ lập trình hướng đối tượng, thích ứng với việc làm việc theo nhóm, chúng em đã chọn ngôn ngữ C++ để thực hiện việc giao tiếp vi điều khiển và máy vi tính.
Chương trình thực hiện công việc chính sau:
Đọc dữ liệu về biên dạng cần gia công dưới dạng file text. File dữ liệu là file chứa tọa độ suy rộng của các nút liên tiếp nhau trên biên dạng gia công, file
Luận án tốt nghiệp
này được tạo ra từ chương trình tính toán động học ngược trên Maple. Trong quá trình gia công file được mở liên tục và được đọc từng nút một. Mỗi khi chương trình điều khiển thực hiện điều khiển xong một nút nó sẽ gọi chương trình đọc dữ liệu ở nút tiếp theo. Dữ liệu trả về là tọa độ suy rộng q1, q2, q3 của các khâu máy xúc.
Từ kết quả tính toán động học ngược ta thu được file kết quả chứa các tọa độ suy rộng của các khâu trong không gian. Ta sẽ sử dụng file kết quả này để thực hiện việc mô phỏng chuyển động của máy xúc .
Chương trình sẽ đọc toàn bộ file dữ liệu dạng CString rồi chuyển toàn bộ vào các bộ chứa vector. Có nhiều cách để lưu trữ dữ liệu nhưng việc sử dụng vector trong thư viện chuẩn STL sẽ tối thiểu được thời gian truy cập ngẫu nhiên, các phần tử của vector được lưu trữ trong cùng một vùng nhớ theo trật tự tuyến tính. Tổ chức lưu trữ theo cách này đảm bảo việc truy cập ngẫu nhiên với chi phí thời gian thấp nhất.
void CDlgConTrols::OnBnClickedBtOpendata() {
CMainFrame* pMain = (CMainFrame*)AfxGetApp()->GetMainWnd(); Val.clear();
//pMain->p_View->Stop_();
// TODO: Add your control notification handler code here
//--- CString pathfilename; // pathfilename=""; CStdioFile file; CFileException e; ////////////////////////////////////////////////////////////////////////// CString sFilters;
OFN_ENABLESIZING, sFilters);
dlg.m_ofn.lpstrTitle = _T("Load from file"); if (dlg.DoModal () == IDOK)
{
pathfilename = dlg.GetPathName(); }
if (file.Open (pathfilename, CFile::modeRead, &e)) {
CString cs,str;
double a1 =0.0,a2=0.0,a3=0.0,a4=0.0,a5=0.0, a6=0.0; while (file.ReadString (cs)) { cs.TrimLeft(); cs.TrimRight(); a1 = _tstof(cs); cs.TrimLeft(); cs.Delete(0,(cs.Find(' ',0))+1); a2 = _tstof(cs); cs.TrimLeft(); cs.Delete(0,(cs.Find(' ',0))+1); a3 = _tstof(cs); cs.TrimLeft(); cs.Delete(0,(cs.Find(' ',0))+1); a4 = _tstof(cs); cs.TrimLeft(); cs.Delete(0,(cs.Find(' ',0))+1); a5 = _tstof(cs); cs.TrimLeft(); cs.Delete(0,(cs.Find(' ',0))+1); a6 = _tstof(cs); qa1.push_back(a1*180/PI);
Luận án tốt nghiệp qa2.push_back(a2*180/PI); qa3.push_back(a3*180/PI); qa4.push_back(a4); qa5.push_back(a5*180/PI); qa6.push_back(a6); } file.Close(); str.Format(_T("%f"),qa5[0]); Val.push_back((int*)&qa1); Val.push_back((int*)&qa2); Val.push_back((int*)&qa3); Val.push_back((int*)&qa4); Val.push_back((int*)&qa5); Val.push_back((int*)&qa6);
CMainFrame* pMain = (CMainFrame*)AfxGetApp()- >GetMainWnd(); CSimulationView *pView=(CSimulationView*)pMain- >GetActiveView(); pView->m_bAlready = TRUE; // // pView->Index =0; // AfxMessageBox(str); } else { e.ReportError (); } }
Cần chú ý rằng đầu chương trình mở file ta luôn phải xóa các bộ chứa này để khi mở một file mới sẽ không bị nối tiếp dữ liệu, kích thước bộ chứa tăng lên
qa1.clear();qa2.clear();qa3.clear();qa4.clear();qa5.clear();qa6.clear();tayquay.clea r();
4.4 CẤU TRÚC CHƯƠNG TRÌNH MÁY XÚC
Khi tiến hành mô phỏng máy xúc em đã sử dụng bản Visual Studio 2005.net vì bản này có nhiều ưu điểm hơn so với các bản Visual Studio trước đây (Visual Studio 6.0..), do chương trình mô phỏng phải dùng ứng dụng của chuột giữa, với bản Visual Studio 6.0 không hỗ trợ tính năng Middle move nên không thể thực hiện thao tác này. Ngoài ra bản .net 2005 còn có nhiều ưu điểm khác. Chương trình mô phỏng được thực hiện trong môi trường Visual C++ với ứng dụng của thư viện hàm chuẩn MFC với ứng dụng Single Document Interface – giao diện tài liệu kép (SDI). Ứng dụng SDI là một ứng dụng tài liệu có thể làm việc với một kiểu tài liệu tại một thời điểm. Khi tạo ứng dụng SDI, các lớp được tạo cho ứng dụng SDI gồm 4 lớp cơ bản:
Lớp dẫn xuất CwinApp: Tạo tất cả các thành phần khác trong ứng dung, đây là lớp nhận mọi thông báo sự kiện và sau đó truyền thông báo tới các lớp Cview và CframeView.
Lớp dẫn xuất CframeView: là lớp khung cửa sổ, chứa các thanh công cụ, menu, thanh cuộn và các đối tượng nhìn thấy trong một thời điểm bất kỳ.
Lớp dẫn xuất CDocument: chứa tài liệu, tại đây có thể xây dựng những dữ liệu cơ bản. lớp này nhận tài liệu vào từ Cview và truyền thông tin hiển thị sang CView.
Lớp dẫn xuất Cview trình bày hiển thị của tài liệu.
Dựa vào những lớp cơ sở này ta xây dựng ứng dụng cho bài mô phỏng chuyển động, ta xây dựng các hàm phục vụ những mục đích cụ thể.
void CSimulationView::OnPaint() {
// SetCursor(Cursor);
// Device context for painting CPaintDC dc(this);
Luận án tốt nghiệp
{
CMainFrame*pMain=(CMainFrame*)AfxGetApp()->GetMainWnd(); CDlgConTrols *pCtrl=& pMain->m_Structure1.m_Dialogs;
phi1 = pCtrl->qa1[t];//temp->at(0))->at(pos); phi2 = pCtrl->qa2[t]; phi3 = pCtrl->qa3[t]; d4 = pCtrl->qa4[t]; phi5 = pCtrl->qa5[t]; d6 = pCtrl->qa6[t]; if(phi1 == 1.58*180/PI) { drawOrbit_(); } //else //{ // draw_(); //} } //drawXe(); SwapBuffers(dc.m_hDC); ValidateRect(NULL); }
Một số nút điều khiển trong chương trình
Nút PLAY Chạy chương trình mô phỏng.
Nút PAUSE Dừng máy xúc tại vị trí đang chuyển động. Nút PLAY Khởi động lại quá trình mô phỏng.
Nút ZOOM OUT Phóng to. Thu nhỏ.
Nút OpenData Mở file số liệu chứa các thống số biến khớp .
Luận án tốt nghiệp
PHỤ LỤC 1: XÂY DỰNG PHƯƠNG TRÌNH VI PHÂN CHUYỂN ĐỘNG CỦA MÁY XÚC BẰNG PHẦN MỀM MAPLE
Việc xây dưng phương trình vi phân trên phần mềm Maple đơn giản hơn rất nhiều so với giải bằng tay, đặc biệt với việc sử dụng tích kronecker trong tính toán ma trận Côriôlis và ly tâm C. Giải thuật quá trình xây dựng như hình 1
Bảng tham số Craig TC Tham số ĐLH: mi, Ii, uCi T T T Timi Ti φi i i i φi =∑ +∑ M J J J A I A J ( )( ) 1 ( )( ) 2 T n n d d dt dt = ⊗ − ⊗ C M I q M q I i i m Π =∑ gr ∂ = Π ∂ mg q M, C, mg Kết thúc Bắt đầu Tính các ma trận Craig Ci Ci = i Ci r C u ; T i= i i ⇒ i ω A A ω ( ) Ti Ci ∂ = ∂ J r q ; φi ( )i ∂ = ∂ J ω q Hình 3.5
Mã nguồn chương trình được xây dựng trong phần mềm Maple, với đầu vào có cấu trúc như sau
Craig := Matrix ([ [0, 0, 0, q[1](t)], #Bảng tham số Craig [0, L1, 0, q[2](t)], [0, L2, 0, q[3](t)], [0, L3, 0, q[4](t)], [0, L4, 0, q[5](t)] ]) :
Centre := Matrix ([ [Lc1,0,0], #Vị trí khối tâm [Lc2,0,0],
[Lc3,0,0], [Lc4,0,0], [Lc5,0,0] ]):
# Ixx Iyy Izz Ixy Iyz Izx
Tenxo := Matrix ([ [0, I1y, I1z, 0, 0, 0], #Ma trận quán tính suy rộng [0, I2y, I2z, 0, 0, 0],
[0, I3y, I3z, 0, 0, 0], [0, I4y, I4z, 0, 0, 0], [0, I5y, I5z, 0, 0, 0] ]):
Mã nguồn chương trình tính toán phương trình vi phân chuyển động máy xúc
#---x #thanh lap cac ma tran trong phuong trinh vi phan #---x
DyCre := proc (CTablein, Centre, Tenxo)
Luận án tốt nghiệp
global m:
CTable := simplify(CTablein, {q[1]=q[1](t), q[2]=q[2](t), q[3]=q[3](t), q[4]=q[4](t),
q[5]=q[5](t), q[6]=q[6](t)}):
n := RowDimension(CTable):
#thanh lap cac ma tran Craig va cosin chi huong trung gian
for i ton do
tg := Matrix(i, 4):
for j to i do
tg[j] := CTable[j]:
end do:
T[i] := Craign(tg); #Ma tran Craig
a[i] := Cosin(tg): #Ma tran cosin chi huong
end do:
#Nhap so lieu cac khoi tam
for i from 1 to n do
ra[i]:=Vector([Centre[i,1],Centre[i,2],Centre[i,3],1]):
end do:
#tinh toan toa do trong tam
for i from 1 to n do rtn[i]:=T[i].ra[i]: r[i]:=Vector[3]: for j from 1 to 3 do r[i][j]:=rtn[i][j]: end do:
r[i] := convert(convert(r[i], array), Vector[column])
end do:
#tinh the nang thenang:=0:
for i from 1 to n do
thenang := thenang + m[i]*gg.r[i]:
#tinh van toc goc for i to n do ws[i] := map(diff, a[i], t).Transpose(a[i]); w[i] := Vector(3); w[i][1] := ws[i][3, 2]; w[i][2] := ws[i][1, 3]; w[i][3] := ws[i][2, 1] end do:
#tinh jacobi quay
for i to n do
w[i] := simplify(w[i], {diff(q[1](t), t) = dq[1], diff(q[2](t), t) = dq[2], diff(q[3](t),
t) = dq[3], diff(q[4](t), t) = dq[4], diff(q[5](t), t) = dq[5], diff(q[6](t), t) = dq[6]}):
JR[i] := convert(JRcan(w[i], n), Matrix):
end do:
#tinh jacobi tinh tien
for i to n do
r[i] := simplify(r[i], {q[1](t) = q[1], q[2](t) = q[2], q[3](t) = q[3], q[4](t) = q[4],
q[5](t) = q[5], q[6](t) = q[6]}):
JT[i] := convert(JTcan(r[i], n), Matrix):
end do:
#nhap ma tran momen quan tinh
for i from 1 to n do
mI[i]:=Matrix([[Tenxo[i,1],Tenxo[i,4],Tenxo[i,6]], [Tenxo[i,4],Tenxo[i,2],Tenxo[i,5]], [Tenxo[i,6],Tenxo[i,5],Tenxo[i,3]] ])
end do:
#tinh ma tran khoi luong mm mm := Matrix(n, n):
for i from 1 to n do
Luận án tốt nghiệp
mm:=mm+m[i]*Transpose(JT[i]).JT[i] +
Transpose(JR[i]).a[i].mI[i].Transpose(a[i]).JR[i]:
end do:
#tinh ma tran C In := Matrix(n, shape = identity):
mdq := Matrix(n, 1):
for i to n do
mdq[i] := dq[i]:
end do:
C:=mdiff(mm).KroneckerProduct(In,mdq)-
1/2*Transpose(mdiff(mm).KroneckerProduct(mdq,In)):
return mm,C,mg :
end proc:
#--- #tinh ma tran g
#--- thenangg := proc (input,n)
local mq, i, ttt: mq := array(1 .. n): for i to n do mq[i] := q[i]: end do; ttt := simplify(input, {q[1](t) = q[1], q[2](t) = q[2], q[3](t) = q[3], q[4](t) = q[4], q[5](t) = q[5], q[6](t) = q[6]}): ttt := Vector([ttt]):
return ttt:
end proc:
#--- #tinh ma tran jacobi quay #--- JRcan := proc (input,n)
local mdq, i, ttt: mdq := array(1 .. n): for i to n do mdq[i] := dq[i]: end do: ttt := jacobian(input, mdq): return ttt: end proc: #--- #tinh jacobi tinh tien
#--- JTcan := proc (input,n)
local mq, i, ttt: mq := array(1 .. n): for i to n do mq[i] := q[i]: end do: ttt := jacobian(input, mq): return ttt: end proc:
Luận án tốt nghiệp
TÀI LIỆU THAM KHẢO
[1] Đỗ Sanh: Cơhọc. NXB Giáo dục, 2006.
[2] Nguyễn Văn Khang: Động lực học hệ nhiều vật. NXB Khoa học và Kỹ thuật, Hà Nội 2007.
[3] Phạm Hữu Đỗng (chủ biên): Máy làm đất. NXB Xây dựng, 2004. [4] Đỗ Đăng Khoa, Đỗ Sanh: Khảo sát động học các cơ cấu phẳng.
[5] Đỗ Đăng Khoa, Đỗ Sanh, Đinh Văn Phong, Trần Đức: The Optimal Control for the System of Program Motion.
[6] Đỗ Sanh: Equations of Motion of Mechanical System.
[7] Đỗ Sanh: On the Principle of Compability and the Equations of Motion of Constrained Mechanical Systems.
[8]Phạm Huy Điển: Tính toán, lập trình và giảng dạy toán học trên Maple. NXB Giáo dục Việt Nam, Hà Nội 2011.
[9] Phạm Minh Hoàng: Maple và các bài toán ứng dụng. NXB Khoa học và Kỹ thuật, TP Hồ Chí Minh 2008.
[10] J.J. Craig: Introduction to Robotics. (3rd edition), Prentice Hall, Upper Saddle River, New Jersey 2005.
KẾT LUẬN
Đề tài tính toán động học và động lực học máy xúc gầu nghịch dẫn động thủy lực có ý nghĩa quan trọng trong các lĩnh vực nghiên cứu động học và động lực học của các cơ hệ phẳng nhiều bậc tự do cũng như các loại máy làm đất khác. Nó giúp ích cho việc áp dụng lý thuyết vào thực tế. Qua luận văn này, bằng những kết quả tính toán ta có thể thiết kế được một hệ điều khiển máy đào làm việc tự động với các cảm biến lực được lắp đặt vào răng gầu xúc.
Như vậy qua việc thực hiện luận văn này ta có thể nhận thấy rằng dù quỹ đạo làm việc và hệ ngoại lực có phức tạp đến đâu, miễn là quỹ đạo thỏa mãn điều kiện động học của máy đào thì ta đều có thể tìm được các thông số điều khiển cung cấp cho quá trình điều khiển máy làm việc. Tuy nhiên do một loại máy xúc điều khiển tự động như vậy vẫn chưa tồn tại trong thực tế, nên chắc chắn sẽ có nhiều vấn đề mà tác giả chưa biết được để giải quyết, hoặc thuộc lĩnh vực nằm ngoài chuyên ngành của tác giả.
Hướng phát triển của đề tài:
Do thời gian có hạn, đề tài chưa đưa ra được các yếu tố kỹ thuật chi tiết cho từng khâu, từng khớp của máy xúc. Với từng loại máy xúc khác nhau và với từng điều kiện làm việc khác nhau, hướng ứng dụng đề tài cho từng điều kiện