1. Đầu đề thiết kế
Lập trình mô phỏng hoạt động cuả rôbốt Scara 4 bậc tự do.
2 .Các số liệu ban đầu
3 .Nội dung thuyết minh và tính toán
Đồ án gồm các phần chính sau:
A. Mục đích của đồ án tin học ứng dụng
Tìm hiểu
- Tìm hiểu về 1 robot cụ thể sử dụng trong công nghiệp(Robot Scara)
- Tìm hiểu về các cơ cấu hoạt động của Robot - các khâu hoạt động của
Rôbốt.
- Tìm hiểu về động học và mô hình 3D của Robot mô phỏng hoạt động của
Robot
- Tìm hiểu cách xây dựng chương trình điều khiển cho robot
B. Nhiệm vụ của em trong đồ án tin học ứng dụng là xây dựng chương trình mô
phỏng hoạt động của robotScara 4 bậc tự do.
+ Các công cụ để xây dựng bài toán mô phỏng
- Ngôn ngữ lập trình C++(Xây dựng giao diện MFC,xây dựng chương trình dọc file
dữ liệu có dạng .*BDF và .*STL).
- Lập trình đồ họa OPEN GL để xây dựng các khối đồ họa để mô phỏng (Tìm hiểu
kỹ các gói thư viện của OPEN GL).
- Các công cụ cần để xây dựng là Visual C++ 6.0 (tạo Project với Visual C++)
C. Kết quả đạt được qua đồ án
- Hiểu đuợc nguyên lý hoạt động của Robot trong công nghiệp qua chương trình
mô phỏng
- Có 1 chương trình cụ thể để mô phỏng .
- Tìm hiểu và lập trình MÔ PHỎNG với openGL.
- Tìm hiểu về phần mền lập trình Visual C++ 6.0.
- Tìm hiểu về ngôn ngữ lập trình VC++ 
MỤC LỤC
MỤC LỤC . . 4
LỜI NÓI ĐẦU
 .9
GIỚI THIỆU TỔNG QUAN VỀ ROBOT CÔNG NGHỆP VÀ MÔ PHỎNG
HOẠT ĐỘNG
.11
CHƯƠNG I: CÁC C NG C ĐỂ XÂY DỰNG BÀI TOÁN PHỎNG HOẠT
ĐỘNG CỦA ROBOT . . 13
1.1. Giới thiệu về Open GL
 13
1.1.1.Đ c điểm của OpenGL
 .14
1.1.2. Các thư viện hỗ trợ lập trình
OpenGL 20
 1.1.3. Các bước tổng quan khi xây dựng ứng dụng đồ họa với
OpenGL .21
 1.1.4. Xây dựng các đối tượng 3 chiều
 23
 1.1.5. Quan sát các đối tượng 3 chiều
 24
1.2.Giới thiệu về VisualC++ và ứng dụng
MFC .27
1.3. Tìm hiểu phần mềm thiết kế VS 6.0 và AutoCAD ,
SolidWorks .28
 CHƯƠNG II: CÁC BƯỚC XÂY DỰNG BÀI TOÁN PHỎNG 32
2.1. Cách tạo ra một project MFC để mô phỏn 32
2.2. Khởi tạo và thiết lập các gói thư viOpenGL .39
2.3. Thiết kế mô hình Robot trên SolidWork
2007 .58
2.4. Xây dựng module đọc file .*STL và
.*BDF 61
2.4.1. Xây dựng module đọc file .*STL
 61
2.4.2 Xây dựng module đọc file .*BDF
 65
2.5. Mô phỏng chương trình trên OpenGL
 74
CHƯƠNG III: CHẠY CHƯƠNG TRÌNH PHỎNG . 75
KẾT LUẬN . . 81
Tài liệu tham khảo . . 83
                
              
                                            
                                
            
 
            
                 86 trang
86 trang | 
Chia sẻ: lvcdongnoi | Lượt xem: 4488 | Lượt tải: 1 
              
            Bạn đang xem trước 20 trang tài liệu Đồ án Lập trình mô phỏng hoạt động của rô bốt Scara 4 bậc tự do, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
một phần mềm nhỏ hỗ trợ thiết kế 
chuyên dùng nhƣ AutoCAD hay SolidWork, 3D Max.. 
- Sử dụng các lệnh trong các phần mềm đó để xuất đối tƣợng 3 chiều ra các 
dạng tập tin nh phân hay ASCII (American Standard Code for Information 
Interchange) có chứa các thông tin của đối tƣợng dƣới dạng các đ nh và quy t c nối 
các đ nh đó thành đa giác. Ví dụ các tập tin *.BDF, *.SLT,*.NVT 
- Đọc thông tin các đối tƣợng từ các tập tin đó và sử dụng các hàm vẽ đối 
tƣợng cơ bản của OpenGL xây dựng lại đối tƣợng 3 chiều cơ bản ban đầu. 
Vì vậy đây chính là cơ sở cho để xây dựng các bài toán mô phỏng hoạt động của 
ROBOT. 
 Hình 1.10: Các dối tượng 3D được xây dựng lại trên OpenGL. 
 ______________________________________________________________________________________ 
 31 
 ĐỒ ÁN TỐT NGHIỆP 
 Hình 1.11: Quá trình Render màu sắc của vật liệu 
2.3 .Quan sát các đối tượng 3 chiều 
Quan sát các đối tƣợng là một khái niệm cho ph p các đối tƣợng hình học 3 chiều 
hiển th lên màn hình máy tính (hai chiều ) với hiệu ứng không gian ba chiều. Quan 
sát đối tƣợng gồm các thao tác: Xác đinh v trí quan sát, hƣớng quan sát, phạm vi 
quan sát, xác đ nh v trí các đối tƣợng trong không gian ba chiều, chọn các ph p 
chiếu, chọn khung nhìn vv. 
Quá trình chuyển các đối tƣợng ba chiều trong không gian ba chiều thành các điểm 
ảnh trên màn hình máy tính có thể chia làm các bƣớc: 
 ______________________________________________________________________________________ 
 32 
 ĐỒ ÁN TỐT NGHIỆP 
+ Các ph p biến đổi: biến đổi v trí quan sát hay v trí của vật quan sát. Vì OpenGL 
xây dựng vật thể trên mô hình không gian 3 chiều nên các ph p biến đổi sẽ đƣợc 
thực hiện thông qua việc thực hiện các ph p toán trên ma trận. Quá trình thực hiện 
biến đổi sẽ diễn ra nhƣ sau: Sau khi ta khai báo vật thể thông qua các vertex, ta đã 
có đƣợc các điểm trong không gian 3 chiều với tọa độ dƣới dạng vector 4 phần tử. 
Để thực hiện di chuyển, quay, phối cảnh,.. ta cần áp vào các thông số nhƣ góc 
quay, độ di dời... tƣơng ứng với thay đổi muốn thực hiện. OpenGL sẽ dùng các 
thông số biến đổi mà ta nhập vào (đƣợc lƣu trữ dƣới dạng ma trận 4x4) và thực 
hiện các ph p toán biến đổi trên các vector nhập vào. Kết quả là tọa độ các vertex 
mà chúng ta đã nhập sẽ thay đổi tƣơng ứng. 
Để chọn ma trận nào sẽ đƣợc thay đổi (muốn thực hiện ph p biến đổi nào), ta dùng 
hàm : 
void glMatrixMode(GLenum mode) 
Mode có thể là: 
GL_MODELVIEW Các ph p toán ma trận sau đó sẽ tác 
động lên ma trận modelview 
GL_PROJECTION Các ph p toán ma trận sau đó sẽ tác 
động lên ma trận projection 
GL_TEXTURE Các ph p toán ma trận sau đó sẽ tác 
động lên ma trận texture 
Sau khi gọi hàm này và đƣa tham số tƣơng ứng, ma trận đƣợc chọn sẽ trở thành ma 
trận biến đổi hiện hành và mọi hàm biến đổi tƣơng ứng sẽ tác động lên ma trận đó. 
Để đƣa một ma trận biến đổi hiện hành về ma trận đơn v , dùng hàm: 
void glLoadIdentity(void) 
Để đƣa giá tr mới vào cho ma trận biến đổi hiện hành, dùng hàm: 
void glLoadMatrix*() 
Để áp các phép biến đổi trực tiếp khỏi gọi hàm thì ta cung cấp một ma trận và gọi 
glMulMatrix*() với tham số là ma trận biến đổi. Hàm này sẽ nhân ma trận tham số 
vào ma trận biến đổi hiện hành (ví dụ ma trận tham số là và ma trận biến đổi 
 ______________________________________________________________________________________ 
 33 
 ĐỒ ÁN TỐT NGHIỆP 
hiện hành là C thì sau khi nhân, kết quả ma trận hiện hành là C ). Chú ý: khi lập 
trình OpenG trong C, khi khai báo ma trận 4x4 để thực hiện thay đổi ma trận 
biến đổi hiện hành thì M[i][j] chỉ vị trí phần tử cột i hàng j, khác với quan niệm 
thông thƣờng trong C là hàng i cột j, để tránh nhầm lẫn, tốt nhất là khai báo mảng 
16 phần tử 
+ Chọn các ph p chiếu: trực giao hay phối cảnh. 
- Ph p chiếu trực giao : 
Vật thể ở gần ống kính (ở đây là điểm nhìn) thì thấy lớn và ngƣợc lại. OpenGL cho 
ta một hàm để xác đ nh không gian nhìn. 
void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, 
GLdouble near, GLdouble far); 
- Ph p chiếu phối cảnh: 
Các đƣờng thẳng song song trong không gian thì khi thể hiện lên màn hình cũng sẽ 
song song. Nói cách khác, không gian nhìn đƣợc xác đ nh bởi một hình hộp chữ 
nhật. Để thiết lập chế độ quan sát này, ta dùng hàm 
void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,GLdouble top, 
GLdouble near, GLdouble far); 
 Hình 1.12: Phép chiếu trực giao 
 ______________________________________________________________________________________ 
 34 
 ĐỒ ÁN TỐT NGHIỆP 
Các tham số có ý ngh a tƣơng tự nhƣ hàm glFrustum(). 
Khi ch cần chiếu hình 2 chiều, có thể gọi void glOrtho2D(). Hàm này ch nhận 4 
tham số đầu có ý ngh a giống glOrtho(), nhƣng khối hộp không gian nhìn có giá tr 
z dao động trong đoạn [-1.0,1.0]. Tuy nhiên, vì là hình 2 chiều nên giá tr z luôn 
b ng 0 và do đó không b mất hình. 
+ Chọn khung nhìn: (Viewport) 
Viewport là một khung hình chữ nhật trong cửa sổ chƣơng trình vẽ. Nó là nơi mà 
vật thể sẽ đƣợc vẽ vào (có thể có kích thƣớc nhỏ hơn, b ng ho c lớn hơn kích 
thƣớc cửa sổ chƣơng trình). Hàm void glViewport(GLint x, GLint y, GLsizei 
width, GLsizei height) xác đ nh một khung nhìn có tọa độ góc trái dƣới là (x,y) so 
với góc trái dƣới của cửa sổ và đƣợc tính b ng pixel; width và height xác đ nh kích 
thƣớc của khung nhìn. M c đ nh, viewport có kích thƣớc b ng kich thƣớc cửa sổ. 
Tỷ lệ giữa chiều dài và chiều rộng của viewport nên b ng với t lệ tƣơng ứng trong 
không gian nhìn mà ta đã xác đ nh thông qua các hàm glFrustum() ho c glOrtho(), 
nếu không hình ảnh sẽ b biến dạng 
 Hình 1.13: Phép chiếu phối cảnh 
 ______________________________________________________________________________________ 
 35 
 ĐỒ ÁN TỐT NGHIỆP 
+ Sự biến đổi v trí quan sát và v trí vật thể. 
Do sự biến đổi v trí quan sát và v trí vật thể có liên quan tƣơng đối với nhau nên 
trong OpenGL chúng đƣợc gom vào một ma trận biến đổi (ch dành cho vật thể). 
M c đ nh ban đầu là điểm nhìn và vật thể ở chung một chỗ tại gốc hệ trục tọa độ và 
phƣơng nhìn theo hƣớng âm của trục z (hƣớng vào bean trong màn hình). 
OpenGL cung cấp 3 hàm để thay đổi góc nhìn và hƣớng nhìn: glTranslate*() (di 
chuyển), glRotate*() (quay), glScale*() (dùng để k o dãn ho c co nhỏ vật thể). Các 
hàm này tác động lên tọa độ vật thể. 
Các thành phần của hàm glTranslate(): 
void glTranslate{fd} (TYPE x, TYPE y, TYPE z): dời vật thể đi một đoạn x, y, 
và z theo phương các trục tọa độ tương ứng. 
Các thành phần của hàm glRotate() : 
void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z): quay vật thể 1 góc 
angle độ theo chiều ngược chiều kim đồng hồ quanh trục có vector chỉ phương 
xác định từ gốc trục toạ độ (0,0,0) và điểm (x,y,z).Ví dụ: 
glRatated(45,0,0,1); 
Các thành phần của hàm glScale(): 
void glScale{fd}(TYPEx, TYPE y, TYPEz): co dãn vật thể theo các phương Ox, 
Oy, Oz một lượng tương ứng. Nếu x hoặc y hoặc z âm thì vật thể sẽ bị lật lại 
đối xứng theo trục có độ giãn âm.Ví dụ: glScalef(2.0,-0.5,1.0); 
 Hình 1.14: Hệ tọa dộ chuẩn trongOPENGL 
 ______________________________________________________________________________________ 
 36 
 ĐỒ ÁN TỐT NGHIỆP 
 Hình 1.15: Các phép biến đổi trong OpenGL 
- Tạo chuyển động cho các đối tƣợng. 
Nguyên t c chung để tạo các hình ảnhchuyển động là vẽ và xoá liên tục các v 
trí khác nhau của đối tƣợng chuyển động. Việc phân tích, tính toán v trí các 
vật r n thuộc cơ hệ phải đƣợc thực hiện trƣớc khi mô phỏng. Quá trình mô 
phỏng thực hiện vẽ các v trí đã đƣợc tính toán trƣớc. Không nên thực hiện 
song song vừa vẽ, vừa tính toán đối với các chuyển động đòi hỏi tính toán 
phức tạp ho c cấu hình máy tính không đủ cao. Chuyển động của các vật r n 
đƣợc cập nhập theo thời gian vì vậy việc tính toán các v trí cũng phải đƣợc 
cập nhập theo thời gian. 
Theo lý thuyết hệ nhiều vật, v trí của một vật r n trong m t phẳng ho c trong 
không gian có thể xác đ nh b ng các ma trận côsin ch phƣơng so với hệ toạ 
độ cố đ nh. Trong OpenGL v trí của đối tƣợng cũng đƣợc thay đổi b ng ph p 
nhân các toạ độ của đối tƣợng với ma trận hiện hành. Giá tr của các ma trận 
hiện hành đƣợc biến đổi b ng các ph p biến hình nhƣ : t nh tiến, quay. 
3. Giới thiệu về ngôn ngữ lập trình Visual C++ và các ứng dụng của FC. 
 ______________________________________________________________________________________ 
 37 
 ĐỒ ÁN TỐT NGHIỆP 
Visual C
++
 là một trong các ngôn ngữ lập trình thuộc dòng Visual Studio của 
hãng Microsoft, phát triển dựa trên nền tảng là ngôn ngữ lập trình hƣớng đối tƣợng 
C
++
. Visual C
++
 ra đời khoảng những năm 1990 và càng ngày càng đƣợc sử dụng 
rộng rãi nhất là các ứng dụng trong kỹ thuật nhƣ là lập trình nhúng,lập trình điều 
khiển và lập trình mô phỏng. Việc tạo ra các giao diện phức tạp và trình bày đẹp 
đối với Visual C++ khá là đơn giản, và đây chính là thế mạnh của Visual C++ trong 
việc trợ giúp đ c lực cho ngƣời lập trình khi xây dựng những dự án lớn ho c trong 
kỹ thuật lập trình hệ thống. 
MFC là lớp nền tảng của Microsoft (Microsoft Foundation Classes), là một 
công cụ mạnh trong lập trình ứng dụng cho hầu hết các l nh vực vì nó có giao diện 
đáp ứng mọi nhu cầu của ngƣời sử dụng trong việc thiết kế các giao diện của 
chƣơng trình mô phỏng. 
 ______________________________________________________________________________________ 
 38 
 ĐỒ ÁN TỐT NGHIỆP 
 CHƢƠNG 2 
XÂY DỰNG CHƢƠNG TRÌNH PHỎNG 
Các bƣớc xây dựng bài toán mô phỏng gồm có: 
- Cách tạo ra project MFC để thực hiện quá trình mô phỏng. 
- Khởi tạo các gói thƣ viện của OpenGL. 
- Thiết kế mô hình trên Solidworks. 
- Chuyển mô hình sang tệp tin *.STL. 
- Xây dựng Module đọc File *.STL. 
- Xây dựng Module đọc File quỹ đạo đã số hóa trên AutoCAD. 
- Chạy file quỹ đạo đã số hóa trên AutoCAD. 
- Mô phỏng trên OpenGL. 
2.1 Cách tạo ra một Project FC để mô phỏng hoạt động 
+ Nhƣ chƣơng 1 em đã trình bày về phần mềm Visual 6.0 bây giờ ta tạo 1 Project 
MFC nhƣ sau : 
- Chọn File -> New sau đó chọn Tab Projects và sẽ hiện ra các Project đƣợc lập 
trình trên Visual C++ 6.0.Ở đây ta chọn loại MFC AppWizard(exe).Trong Project 
name ta g tên của dự án ở đây là “DoanTinhoc” nhƣ hình vẽ 
 ______________________________________________________________________________________ 
 39 
 ĐỒ ÁN TỐT NGHIỆP 
 Hình 2.1 : Bắt đầu thiết lập project MFC 
Các bƣớc tiếp theo để thiết lập project nhƣ sau : 
Bước 1 : Chọn Single Document Interface : đây là loại giao diên đơn tài liệu tại 
một thời điểm, ch có 1 tài liệu đƣợc mở và hiện hành, để cho ngƣời dùng thao tác 
trên nó.Trong đồ án tin học này chủ yếu là mô phỏng hoạt động của Rôbốt nên ta 
sử dụng kiểu đơn tài liệu. 
 ______________________________________________________________________________________ 
 40 
 ĐỒ ÁN TỐT NGHIỆP 
 Hình 2.2 : Thiết lập 1 
Bước 2 : Ta chọn nhƣ hình vẽ ở dƣới và do ứng dụng không sử lý Dữ liệu nên ở 
Database Support ta chọn None. 
 ______________________________________________________________________________________ 
 41 
 ĐỒ ÁN TỐT NGHIỆP 
Hình 2.3 : Thiết lập 2 
Bước 3 : Ta chọn nhƣ hình vẽ dƣới đây - Chọn None vì trong ứng dụng không sử 
dụng tài liệu phức hợp. 
Hình 2.3 : Thiết lập 2 
H 2.4 : T ế 3 
Bước 4 : Đến bƣớc số 4 ta chọn các thiết lập sau : 
- Docking Toolbar : Yes - Chọn thanh công cụ có g n vào cửa sổ . 
- Initial Status Bar : Yes - Chọn thanh trạng thái có g n vào ứng dụng 
- Printing and Printer Preview : No – Không in ấn gì 
- 3D controls : Yes – Có điều khiển nổi 
 ______________________________________________________________________________________ 
 42 
 ĐỒ ÁN TỐT NGHIỆP 
- Toolbars look : Normal – Dạng thanh công cụ bình thƣờng. 
Hình 2.3 : Thiết lập 4 
Bước 5 : Chọn các thiết lập nhƣ sau : 
- MFC Standard : dạng chuẩn của MFC 
- MFC Library : As a shared DLL – Thƣ viện của MFC – có chia sẻ thƣ viện 
liên kết động. 
 ______________________________________________________________________________________ 
 43 
 ĐỒ ÁN TỐT NGHIỆP 
Hình 2.6 : Thiết lập 5 
Bước 6 : Finish – Hoàn tất việc thiết lập. 
 ______________________________________________________________________________________ 
 44 
 ĐỒ ÁN TỐT NGHIỆP 
Hình 2.7 : Hoàn thành thiết lập Project MFC 
Sau khi khởi tạo xong ta chạy thử chƣơng trình thì thu đƣợc giao diện của 1 project 
MFC cơ bản nhƣ hình vẽ dƣới đây. 
 ______________________________________________________________________________________ 
 45 
 ĐỒ ÁN TỐT NGHIỆP 
Hình 2.8 : Chạy thử Project MFC 
Nhƣ vậy có thể thấy r MFC đã làm gì cho ta .M c dù chƣa xây dựng code chƣơng 
trình nhƣng MFC đã cung cấp sẵn giao diện của một ứng dụng chuẩn trong môi 
trƣờng Windows.Mà Visual C++ là một ngôn ngữ lập trình hƣớng đối tƣợng, cho 
nên mọi ứng dụng đều đƣợc xây dựng trên cơ sở của các lớp.Khi một ứng dụng 
đƣợc tạo ra nó có các lớp cơ sở sau : 
 Hình 2.9 : Các lớp ứng dụng trong MFC 
Chức năng của các lớp cơ sở của ứng dụng MFC nhƣ sau : 
- CApp : là lớp ứng dụng (Applicatiton Class) có nhiệm vụ là khởi tạo và chạy ứng 
dụng. 
- CDoc : là lớp tài liệu (Document Class) của ứng dụng, có nhiệm vụ nạp và duy trì 
1 tài liệu. Một tài liệu có thể là bất cứ cái gì,từ một bản thảo cho đến các việc cài 
đ t của một thiết b mạng Tuy nhiên, mục đích sử dụng của chƣơng trình là mô 
phỏng nên không cần quan tâm nhiều đến lớp này. 
 ______________________________________________________________________________________ 
 46 
 ĐỒ ÁN TỐT NGHIỆP 
- CView: là lớp hiển th của ứng dụng (View Class),có nhiệm vụ cung cấp một hay 
nhiều View (khung) cho tài liệu.Trong chƣơng trình mô phỏng ta sẽ cần sử dụng 
rất nhiều trong lớp này để khởi tạo cho OpenGL và các thao tác vẽ lại trên lớp này. 
- CmainFrame: là lớp khung (Frame Class) của ứng dụng và có nhiệm vụ hiển th 
và truyền lệnh của ngƣời dùng. 
2.2- Khởi tạo và Thiết lập các gói thƣ viện của OpenGL 
Mục đích chính của chƣơng trình là mô phỏng quá trình hoạt động của Robot, vì 
vậy cần thiết phải có một môi trƣờng đồ họa.Khi mới tạo ra một dự án MFC thì 
ứng dụng ch cung cấp cho ta khung giao diện chuẩn dạng cửa sổ,và môi trƣờng 
làm việc chủ yếu là thao tác với CSDL.Do đó chúng ta cần phải tiến hành khởi tạo 
một môi trƣờng đồ họa, cụ thể trong đồ án này em dùng OpenGL. Cũng giốn nhƣ 
GDI cần một ngữ cảnh thiết b (Device Context – DC )để vẽ, OpenGL cũng cần có 
một ngữ cảnh biểu diễn (Rendering Context – RC) .Tuy nhiên, không giống nhƣ 
GDI là mỗi lệnh GDI yêu cầu một DC để vẽ, thì OpenGL lại dùng khái niệm một 
RC hiện hành. Khi một ngữ cảnh biểu diễn đƣợc hiện hành trong một thread 
(luồng), mọi lời gọi OpenGL trong thread sẽ sử dụng cùng một ngữ cảnh biểu diễn 
hiện hành.Trong khi rất nhiều ngữ cảnh biểu diễn có thể, đƣợc sử dụng để vẽ vào 
trong một cửa sổ đơn, thì ch có một ngữ cảnh duy nhất đƣợc hiện hành tại một 
thời điểm trong thread đơn. 
Để tạo ra và hiện hành một ngữ cảnh biểu diễn OpenGL có 3 bƣớc cơ bản nhƣ sau : 
Bước 1 : Ta phải đ nh dạng điểm ảnh . 
Bước 2 : Ta phải tạo ngữ cảnh biểu diễn . 
Bước 3 : Làm cho ngữ cảnh biểu diễn hiện hành. 
 ______________________________________________________________________________________ 
 47 
 ĐỒ ÁN TỐT NGHIỆP 
Qua 6 bƣớc cơ bản trên ta đã tạo ra đƣợc 1 Project MFC, để mô phỏng đƣợc các 
hoạt động của Rôbốt thì ta phải thiết lập môi trƣờng đồ họa. 
Hình 2.10 : Thiết lập các gói thư viện OpenGL 
Để tạo đƣợc ngữ cảnh biểu diễn của OpenGL thì trƣớc tiên ta phải include(bao 
gồm) tất cả các tập thƣ viện của OpenGL vào trong Project này. Từ thanh Menu 
chính của chƣơng trình Visual C++ 6.0 ta chọn Project -> Settings sau đó chọn Tab 
là Link , chọn category là “General” và nhập vào hộp thoại Object/library modules 
là : “opengl32.lib glu32.lib glaux.lib” nhƣ hình vẽ trên và chọn nút OK. 
Sau đó ta mở tệp “stdafx.h” ra và thêm vào các dòng code sau : 
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers 
#include // MFC core and standard components 
#include // MFC extensions 
//------------------------------------------------------------------------ 
// Các đọa mã thêm vào ở đây . 
#include //OpenGL Main Library Header 
#include //OpenGL Utility Library Header 
#include 
//----------------------------------------------------------------------- 
 ______________________________________________________________________________________ 
 48 
 ĐỒ ÁN TỐT NGHIỆP 
#include // MFC Automation classes 
#include // MFC support for Internet Explorer 4 Common 
Controls 
#ifndef _AFX_NO_AFXCMN_SUPPORT 
#include // MFC support for Windows Common Controls 
#endif // _AFX_NO_AFXCMN_SUPPORT 
Open GL yêu cầu cửa sổ phải có kiểu WS_CLIPCHILDREN và 
WS_CLIPSIBLINGS vì vậy cần phải thêm vào hàm 
PreCreateWindow(CREATESTRUCT& cs) của lớp CDoanTinhocView nhƣ sau : 
BOOL CDoanTinhocView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
// TODO: Modify the Window class or styles here by modifying 
 // the CREATESTRUCT cs 
cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS); 
return CView::PreCreateWindow(cs); 
} 
Bây giờ chúng ta sẽ thực hiện bƣớc thứ nhất, tạo đ nh dạng điểm ảnh.Đ nh dạng 
điểm ảnh sẽ miêu tả cách lƣu trữ trong bộ nhớ các phần tử đồ họa mà Windows 
hiển th .Thông số đƣợc điều khiển bởi đ nh dạng điểm ảnh bao gồm độ sâu màu, 
phƣơng pháp bộ đệm và giao diện đồ họa đƣợc hỗ trợ. Đầu tiên tạo một protected 
member function trong lớp CDoanTinhocView có tên là BOOL 
CDoanTinhocView::SetWindowPixelFormat(HDC hDC) có nội dung nhƣ sau : 
//------------------------------------------- Code here ----------------------
--------// 
BOOL CDoanTinhocView::SetWindowPixelFormat(HDC hDC) 
{ 
 PIXELFORMATDESCRIPTOR pixelDesc; 
 pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR); 
 pixelDesc.nVersion = 1; 
 pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | 
 PFD_DOUBLEBUFFER; 
 pixelDesc.iPixelType = PFD_TYPE_RGBA; 
 pixelDesc.cColorBits = 32; 
 pixelDesc.cRedBits = 0; 
 pixelDesc.cRedShift = 0; 
 pixelDesc.cGreenBits = 0; 
 pixelDesc.cGreenShift = 0; 
 pixelDesc.cBlueBits=0; 
 pixelDesc.cBlueShift=0; 
 pixelDesc.cAlphaBits=0; 
 pixelDesc.cAlphaShift=0; 
 pixelDesc.cAccumBits=0; 
 pixelDesc.cAccumRedBits=0; 
 pixelDesc.cAccumGreenBits=0; 
 pixelDesc.cAccumBlueBits=0; 
 pixelDesc.cAccumAlphaBits=0; 
 ______________________________________________________________________________________ 
 49 
 ĐỒ ÁN TỐT NGHIỆP 
 pixelDesc.cDepthBits=32; 
 pixelDesc.cStencilBits=0; 
pixelDesc.cAuxBuffers=0; 
 pixelDesc.iLayerType= PFD_MAIN_PLANE; 
 pixelDesc.bReserved=0; 
pixelDesc.dwLayerMask=0; 
 pixelDesc.dwVisibleMask=0; 
 pixelDesc.dwDamageMask=0; 
m_GLPixelIndex = ChoosePixelFormat( hDC,&pixelDesc); 
 if (m_GLPixelIndex==0) 
 { 
 m_GLPixelIndex = 1; 
 if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR), 
&pixelDesc)==0) 
 { 
 return FALSE; 
 } 
 } 
 if (SetPixelFormat( hDC,m_GLPixelIndex,&pixelDesc)==FALSE) 
 { 
 return FALSE; 
 } 
 return TRUE; 
// glCullFace(GL_BACK); 
} 
Tiếp theo chúng ta thêm vào protected member variable trong lớp 
CDoanTinhocView: 
int m_GLPixelIndex; // protected variable 
Sau đó, mở ClassWizard, thêm vào hàm OnCreate đáp ứng thông báo 
VM_CREATE nhƣ sau: 
 ______________________________________________________________________________________ 
 50 
 ĐỒ ÁN TỐT NGHIỆP 
 Hình 2.11 : Chọn hàm Oncreate() để thiết lập OpenGL 
Sau khi các đ nh dạng điểm đƣợc thiết lập, tất cả những gì chúng ta cần làm bây 
giờ là tạo ra một ngữ cảnh biểu diễn và làm cho nó hiện hành. B t đầu thêm vào 
một protected member function vào lớp CDoanTinhocView có tên là : 
//----------------------------------------------------------------------// 
BOOL CDoanTinhocView::CreateViewGLContext(HDC hDC) 
{ 
m_hGLContext= wglCreateContext(hDC); 
if(m_hGLContext == NULL) 
return FALSE; 
if (wglMakeCurrent(hDC,m_hGLContext)== FALSE) 
return FALSE; 
 return TRUE; 
} 
//------------------------------------------------------------------------// 
và ta thêm biến thành viên protected member variable vào trong lớp 
CDoanTinhocView nhƣ sau : 
protected: 
 HGLRC m_hGLContext; 
 ______________________________________________________________________________________ 
 51 
 ĐỒ ÁN TỐT NGHIỆP 
Và sau đó sửa lại mã lệnh trong hàm OnCreate nhƣ sau : 
int CDoanTinhocView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
 if (CView::OnCreate(lpCreateStruct) == -1) 
 return -1; 
 // TODO: Add your specialized creation code here 
 HWND hWnd = GetSafeHwnd(); 
HDC hDC = ::GetDC(hWnd); 
if (SetWindowPixelFormat(hDC)==FALSE) 
return 0; 
 // new code 
 if(CreateViewGLContext(hDC) == FALSE) 
 return 0; 
 // 
return 0; 
} 
Tiếp theo ta thêm vào hàm OnDestroy đáp ứng thông báo WM_DESTROY để hủy 
bỏ ngữ cảnh biểu diễn khi chƣơng trình kết thúc nhƣ sau : 
 Hình 2.12 : Chọn hàm OnDestroy() để hủy OpenGL 
Và mã lệnh của nó nhƣ sau : 
 ______________________________________________________________________________________ 
 52 
 ĐỒ ÁN TỐT NGHIỆP 
//------------------------------------------------------------------------// 
void CDoanTinhocView::OnDestroy() 
{ 
 if(wglGetCurrentContext()!=NULL) 
wglMakeCurrent(NULL,NULL); 
if( m_hGLContext!=NULL) 
 { 
wglDeleteContext(m_hGLContext); 
m_hGLContext=NULL; 
 } 
 CView::OnDestroy(); 
} 
//----------------------------------------------------------------------------
--// 
Sau đó ta ch nh lại mã lệnh của cấu tử CDoanTinhocView() nhƣ sau : 
CDoanTinhocView::CDoanTinhocView() 
{ // TODO: add construction code here 
 m_hGLContext = NULL; 
 m_GLPixelIndex = 0; 
} 
Nhƣ vậy ta đã tiến hành xong quá trình khởi tạo, tại ra môi trƣờng đồ họa để có thể 
thực hiện các thao tác mô phỏng.Bƣớc tiếp theo,chúng ta sẽ tìm hiểu làm thế nào 
để thực hiện đƣợc một chƣơng trình mô phỏng đơn giản.Sau khi thực hiện các thao 
tác trên thì nếu chạy chuơng trình thì v n chƣa có gì, m c dù OpenGL đã đƣợc 
khởi tạo.Đó là do chúng ta chƣa tạo ra Viewport và thiết lập các Matrix Mode.Để 
thực hiện điều này, ta sử dụng ClassWizard, thêm vào hàm OnSize, đáp ứng thông 
báo WM_SIZE 
 ______________________________________________________________________________________ 
 53 
 ĐỒ ÁN TỐT NGHIỆP 
 Hình 2.13 : Chọn hàm OnSize() để thiết lập các ứng dụng OpenGL 
và sửa lại mã lệnh nhƣ sau : 
//----------------------------------------------------------------------------
-// 
void CDoanTinhocView::OnSize(UINT nType, int cx, int cy) 
{ 
 CView::OnSize(nType, cx, cy); 
 GLsizei width,height; 
 GLdouble aspect; 
width = cx; 
 height =cy; 
if (cy==0) 
 aspect=(GLdouble)width; 
 else 
 aspect=(GLdouble)width/(GLdouble)height; 
glViewport(0,0,width,height); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(45,aspect,1.0f,1000.0f); // Phep chieu truc giao phoi canh 
// gluOrtho2D(0.0,500.0*aspect,0.0,500.0); 
glMatrixMode(GL_MODELVIEW); // Ma tran chieu de mo phong hoat dong cua ROBOT 
glLoadIdentity(); 
glEnable(GL_DEPTH_TEST); // Enable Depth Testing 
} 
//----------------------------------------------------------------------------
-------// 
 ______________________________________________________________________________________ 
 54 
 ĐỒ ÁN TỐT NGHIỆP 
Hàm glViewport (0,0,width,height) tạo ra một khung nhìn hình chữ nhật có tạo độ 
đ nh trái dƣới là (0,0) và tọa độ của đ nh phải trên là (width,height).Hàm 
glMatrixMode(GL_PROJECTION) chọn kiểu ma trận là GL_PROJECTION(ma 
trận chiếu). Sau đó glLoadIndentity() nạp lại ma trận đơn v m c đ nh cho ma trận 
hiện hành (ma trận chiếu vừa đƣợc chọn bởi hàm 
glMatrixMode(GL_PROJECTION)). Hàm gluOrtho2D đ nh ngh a một ma trận 
chiếu ph p chiếu trực giao 2D, với kích thƣớc là các tham số truyền vào.Tƣơng tự, 
hai hàm còn lại là chọn và thiết lập cho ma trận quan sát mô hình. 
Sau đó lại sử dụng ClassWizard thêm vào hàm OnPaint đáp ứng lại thông báo 
WM_PAINT nhƣ sau : 
 Hình 2.14 : Chọn hàm OnPaint() để vẽ các đối tượng OpenGL 
 ______________________________________________________________________________________ 
 55 
 ĐỒ ÁN TỐT NGHIỆP 
Và mã lệnh nhƣ sau : 
//----------------------------------------------------------------------------
-------// 
void CDoanTinhocView::OnPaint() 
{ 
CPaintDC dc(this); // device context for painting 
//----------------------------------------------------------------------------
---// 
 glLoadIdentity(); 
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
 glTranslatef(0.0f,0.0f,-6.0f); 
 glRotatef(-45.0f,0.0f,1.0f,0.0f); 
 glRotatef(30.0f,1.0f,0.0f,-1.0f); 
 glBegin(GL_QUADS); 
// mat thu nhat 
 glColor3f(0.0f,1.0f,0.0f); 
 glVertex3f(1.0f,1.0f,-1.0f); 
 glVertex3f(-1.0f,1.0f,-1.0f); 
 glVertex3f(-1.0f,1.0f,1.0f); 
 glVertex3f(1.0f,1.0f,1.0f); 
// mat thu hai 
 glColor3f(1.0f,0.5f,0.0f); 
 glVertex3f(1.0f,-1.0f,1.0f); 
 glVertex3f(-1.0f,-1.0f,1.0f); 
 glVertex3f(-1.0f,-1.0f,-1.0f); 
 glVertex3f(1.0f,-1.0f,-1.0f); 
// mat thu ba 
 glColor3f(1.0f,0.0f,0.0f); 
 glVertex3f(1.0f,1.0f,1.0f); 
 glVertex3f(-1.0f,1.0f,1.0f); 
 glVertex3f(-1.0f,-1.0f,1.0f); 
 glVertex3f(1.0f,-1.0f,1.0f); 
// mat thu tu 
 glColor3f(1.0f,1.0f,0.0f); 
 glVertex3f(1.0f,-1.0f,-1.0f); 
 glVertex3f(-1.0f,-1.0f,-1.0f); 
 glVertex3f(-1.0f,1.0f,-1.0f); 
 glVertex3f(1.0f,1.0f,-1.0f); 
// mat thu nam 
 glColor3f(0.0f,0.0f,1.0f); 
 glVertex3f(-1.0f,1.0f,1.0f); 
 glVertex3f(-1.0f,1.0f,-1.0f); 
 glVertex3f(-1.0f,-1.0f,-1.0f); 
 glVertex3f(-1.0f,-1.0f,1.0f); 
// mat thu sau 
 glColor3f(1.0f,0.0f,1.0f); 
 glVertex3f(1.0f,1.0f,-1.0f); 
 glVertex3f(1.0f,1.0f,1.0f); 
 glVertex3f(1.0f,-1.0f,1.0f); 
 glVertex3f(1.0f,-1.0f,-1.0f); 
// glBegin(GL_POLYGON); 
/* 
glColor4f(1.0f,0.0f,0.0f,1.0f); 
 glVertex2f(100.0f,50.0f); 
glColor4f(0.0f,1.0f,0.0f,1.0f); 
 ______________________________________________________________________________________ 
 56 
 ĐỒ ÁN TỐT NGHIỆP 
 glVertex2f(450.0f,400.0f); 
 glColor4f(0.0f,0.0f,1.0f,1.0f); 
 glVertex2f(450.0f,50.0f); 
*/ 
 glEnd(); 
// glFlush(); 
SwapBuffers(dc.m_ps.hdc); 
} 
//----------------------------------------------------------------------------
-------// 
Bây giờ nếu chạy chƣơng trình ta sẽ thấy có 1 sự thay đổi.Tức là tòan bộ vùng 
WorkSpace đã chuyển sang màu đen, nó chính là màu m c đ nh của OpenGL. 
 Hình 2.15 : Chạy thử project OpenGL 
 ______________________________________________________________________________________ 
 57 
 ĐỒ ÁN TỐT NGHIỆP 
Sau khi đã tạo đƣợc 1 project OpenGL rồi, ta tiến hành xây dụng một khối lập 
phuơng và có thể chuyển động đƣợc trong hệ trục tạo độ OXYZ mà cụ thể ở đây là 
có thể quay quanh trục Z (trục thẳng đứng). 
Bài toán đƣợc đ t ra là khối lập phƣơng quay quanh trục Z với 1 góc có thể thay 
đổi đƣợc và ta gọi góc này là alpha, và góc này sẽ thay đổi liên tục theo thời gian 
và hình lập phƣơng sẽ đƣợc vẽ xóa liên tục.Với tốc độ sử lý nhanh của OpenGL 
thì ngƣời dùng sẽ cảm nhận đƣợc hình lập phƣơng đang quay quanh trục Z của 
nó.Vấn đề là cái gì sẽ làm thay đổi alpha một cách đều đ n ? Không giống nhƣ 
trong lập trình Pascal hay C/C++, môi trƣờng mà các ứng dụng lập trình b ng 
Visual C
++ 
 hoạt động là Windows, với cơ chế xử lý và hoạt động theo các thông 
báo (Message).Do vậy dùng các vòng l p for hay while nó rất dễ phát sinh ra lỗi và 
làm treo chƣơng trình. Trong Visual C++ có hỗ trợ Timer nên ta dùng nó để thay 
đổi giá tr của alpha theo một khoảng thời gian đ nh sẵn.Đầu tiên ta thêm vào một 
biến alpha, nhấp chuột phải vào lớp CDoanTinhocView,chọn Add Member 
Variable.Sẽ có 1 cửa sổ hiện ra nhƣ sau : 
Sau đó ta nhập vào Variable Type có kiểu là float, Variable Name là alpha, chọn 
kiểu truy cập là Protected, rồi nhấn OK .Biến alpha sẽ đƣợc thêm vào . 
float alpha; // Them vao bien alpha 
 Hình 2.16 : Thêm biến vào Project MFC 
 ______________________________________________________________________________________ 
 58 
 ĐỒ ÁN TỐT NGHIỆP 
Trong cấu tử CDoanTinhocView::CDoanTinhocView() ta gán giá tr khởi đầu cho 
biến alpha nhƣ sau : 
CDoanTinhocView::CDoanTinhocView() 
{ 
 // TODO: add construction code here 
 m_hGLContext = NULL; 
 m_GLPixelIndex = 0; 
 alpha = 0.0f; 
} 
Dùng ClassWizard thêm vào OnTimer để đáp ứng thông báo WM_TIMER : 
Và sau đó ta sửa lại mã lệnh nhƣ sau: 
void CDoanTinhocView ::OnTimer(UINT nIDEvent) 
{ 
Hình 2.17 : Chọn hàm OnTimer() để thiết lập thời gian chạy OpenGL 
 ______________________________________________________________________________________ 
 59 
 ĐỒ ÁN TỐT NGHIỆP 
 alpha +=0.5f; 
SendMessage(WM_PAINT,0,0); 
 CView::OnTimer(nIDEvent); 
} 
Và sau đó trong hàm OnPaint() thêm vào lệnh . 
glRotatef(alpha,0.0f,1.0f,0.0f); 
Cuối cùng, trong hàm OnCreate, thêm lệnh khởi tạo Timer , với thời gian l p là 
1ms. 
 SetTimer(ID_TIMER,1,NULL); 
Vì ID_TIMER chƣa đƣợc khai báo, nên ta vào View\Resource Symbol nhƣ sau : 
 Hình 2.18 : Thiết lập cho hàm OnTimer() 
 ______________________________________________________________________________________ 
 60 
 ĐỒ ÁN TỐT NGHIỆP 
Bấm vào New và có 1 cửa sổ hiện ta ta nhập vào ID_TIMER ở trong ô Name rồi 
bấm OK.Sau đó bấm vào Close để kết thúc chƣơng trình. 
Trong quá trình kết thúc hoạt động, Timer cần phải hủy do đó trong hàm 
OnDestroy ta thêm vào dòng lệnh sau : 
//------------------------------------------------------------------------// 
void CDoanTinhocView::OnDestroy() 
{ 
if(wglGetCurrentContext()!=NULL) 
wglMakeCurrent(NULL,NULL); 
if( m_hGLContext!=NULL) 
 { 
wglDeleteContext(m_hGLContext); 
m_hGLContext=NULL; 
 } 
KillTimer(ID_TIMER); 
 // CView::OnDestroy(); 
} 
//------------------------------------------------------------------------------// 
Bây giờ ta chạy chƣơng trình, ta sẽ thấy hình lập phƣơng chuyển động theo các 
phƣơng nhƣ hình vẽ ở dƣới đây. 
Hình 2.19 : Thiết lập New Symbol 
 ______________________________________________________________________________________ 
 61 
 ĐỒ ÁN TỐT NGHIỆP 
 Hình 2.20 : Chạy thử 1 chương trình OpenGL 
 ______________________________________________________________________________________ 
 62 
 ĐỒ ÁN TỐT NGHIỆP 
Nhƣ vậy, sau khi đã chạy thử thành công 1 project đƣợc tạo trên MFC và OpenGL 
thì bƣớc tiếp theo là chúng ta phải đi vào xây dựng chƣơng trình mô phỏng của 
Robot sau khi đã thiết kế mô hình trên Solidworks và vẽ lại trên OpenGL theo quỹ 
đạo đã đƣợc tính toán và số hóa. 
2.3 .Thiết kế mô hình Robot trên SolidWorks 2007. 
Khi thiết kế mô hình của Robot trên Solidwork thì một điều rất quan trọng là việc 
thiết lập các hệ tọa độ cho mô hình ban đầu để khi vẽ lại các chi tiết trên OpenGL 
thì các chi tiết ko b nhảy lung tung. Ở đây em chọn hệ tọa độ khi vẽ trên 
Solidwork trùng với các gốc tọa độ khi tính toán động học.Các chi tiết đƣợc thiết 
kế trên Solidworks nhƣ sau : 
 ______________________________________________________________________________________ 
 63 
 ĐỒ ÁN TỐT NGHIỆP 
Hình 2.21.Mô hình phần đề của Robot được thiết kế trên Solidwork 
Hình 2.22.Mô hình Khâu 1của Robot được thiết kế trên Solidwork 
 ______________________________________________________________________________________ 
 64 
 ĐỒ ÁN TỐT NGHIỆP 
Hình 2.32.Mô hình Khâu 2 của Robot được thiết kế trên Solidwork 
 ______________________________________________________________________________________ 
 65 
 ĐỒ ÁN TỐT NGHIỆP 
Hình 2.32.Mô hình Khâu 3 của Robot được thiết kế trên Solidwork 
 ______________________________________________________________________________________ 
 66 
 ĐỒ ÁN TỐT NGHIỆP 
Hình 2.32.Mô hình Khâu 4 của Robot được thiết kế trên Solidwork 
 ______________________________________________________________________________________ 
 67 
 ĐỒ ÁN TỐT NGHIỆP 
 Hình 2.19 : Bản lắp ghép đầy đủ của mô hình. 
 ______________________________________________________________________________________ 
 68 
 ĐỒ ÁN TỐT NGHIỆP 
2.4 Xây dựng odule đọc File .*ST 
2.4.1. Chuyển sang File .*STL 
+ Sau khi ta thiết kế mô hình của Robốt trên Solidworks thì công việc tiếp theo là 
ta sẽ chuyển nó sang file có đuôi là .*STL và xây dựng 1 chƣơng trình để đọc cấu 
trúc của File *.STL và vẽ lại nó trên OpenGL. 
+ Cách chuyển sang file STL theo các bƣớc nhƣ sau : 
Bƣớc 1 : Ta mở mô hình đã đƣợc thiết kế b ng Solidworks sau đó từ mục File -> 
Save As 
 Hình 2.19 : Chuyển sang File *.STL 
 ______________________________________________________________________________________ 
 69 
 ĐỒ ÁN TỐT NGHIỆP 
Sau đó sẽ hiện ra các lựa chọn nhƣ sau : 
- Save in : là tên của Folder để chứa file .*STL sau khi đã chuyển từ Solidwork 
sang. 
File name : là tên của File 
Save type : ở đây ta chọn save lại là file dạng .*STL . 1 điều đáng chú ý ở đây là ta 
chọn nút Options để ta đ nh dạng file .*STL có dạng là mã ASCII nhƣ hình ở dƣới. 
Bƣớc 2 : Lựa chọn thƣ mục và kiểu file mà ta muốn chuyển . 
H 2.27 : C yể ầ ế R s .*STL 
 ______________________________________________________________________________________ 
 70 
 ĐỒ ÁN TỐT NGHIỆP 
Bƣớc 3 : Chọn file STL sau khi đã chuyển sang có dạng mã ASCII . 
Khi thực hiện bƣớc này thì một điều rất quan trong là ta phải chọn vào : “Do not 
translate STL output data to positive space ” để cho hệ tọa độ khi vẽ trong 
Solidworks và khi chuyển sang file .*STL không b d ch chuyển. 
H 2.28 : C ọ ị d f .* STL ASCII 
 ______________________________________________________________________________________ 
 71 
 ĐỒ ÁN TỐT NGHIỆP 
Bước 4 : Hoàn tất việc chuyển sang file .*STL. 
Nhƣ vậy qua 4 bƣớc ta đã chuyển 1 file từ Solidworks sang file .*STL và với cách 
làm tƣơng tự ta sẽ chuyển tất cả các khâu của Robot sang file .*STL. 
H 2.29 : C yể ế v â s f .*STL 
 ______________________________________________________________________________________ 
 72 
 ĐỒ ÁN TỐT NGHIỆP 
2.4.2.Cấu trúc File *.STL 
+ Phân tích cấu trúc của File .*STL. 
solid CT1 
 facet normal 0.000000e+000 0.000000e+000 1.000000e+000 
 outer loop 
 vertex 2.000000e+001 7.347881e-015 5.200000e+002 
 vertex 6.657395e+001 2.163119e+001 5.200000e+002 
 vertex 1.732051e+001 1.000000e+001 5.200000e+002 
 endloop 
 endfacet 
 facet normal 0.000000e+000 0.000000e+000 1.000000e+000 
 outer loop 
 vertex 1.732051e+001 1.000000e+001 5.200000e+002 
 vertex 6.657395e+001 2.163119e+001 5.200000e+002 
 vertex 5.663119e+001 4.114497e+001 5.200000e+002 
 endloop 
 endfacet 
 facet normal 0.000000e+000 0.000000e+000 1.000000e+000 
 outer loop 
 vertex 1.732051e+001 1.000000e+001 5.200000e+002 
 vertex 5.663119e+001 4.114497e+001 5.200000e+002 
H 2.29 : C yể ế v â s f .*STL 
 ______________________________________________________________________________________ 
 73 
 ĐỒ ÁN TỐT NGHIỆP 
 vertex 1.000000e+001 1.732051e+001 5.200000e+002 
 endloop 
 endfacet 
 facet normal 0.000000e+000 0.000000e+000 1.000000e+000 
 outer loop 
 vertex 1.732051e+001 -1.000000e+001 5.200000e+002 
 vertex 6.657395e+001 -2.163119e+001 5.200000e+002 
 vertex 2.000000e+001 7.347881e-015 5.200000e+002 
 endloop 
 endfacet 
File *.STL có cấu trúc nhƣ sau : Cứ sau 7 dòng thì File lại có cấu trúc lại l p lại từ 
đầu. Dòng đầu tiên trong File *.STL bao giờ cũng là tên của chi tiết mà khi vẽ ta 
đ t trên Solidworks.Sau đó đến các Vector pháp tuyến của bề m t cần vẽ và tọa độ 
của 3 đ nh.Nhƣ vậy File *.STL đã số hóa các chi tiết thành rất nhiều bề m t nhỏ 
hơn và các đ nh tƣơng ứng với nó.Từ đây ta có cơ sở để xây dựng Module đọc File 
*.STL phục vụ quá trình mô phỏng. 
2.4.3.Xây dựng hàm đọc file *.ST 
+ Chƣơng trình đọc File *.STL 
Trong Module này em xin trình bày 2 cách để đọc File *.STL và vẽ lại trên môi 
trƣờng đồ họa OpenGL. 
Cách 1: Trong cách này thì hàm ReadModel(GLint &model, string filename) sẽ 
lƣu toàn bộ các thông tin về các vector pháp tuyến và các đ nh vào glGenLists(1) 
và vẽ lại với chu trình là cứ 3 điểm sẽ vẽ thành 1 bề m t và chu trình vẽ đã đƣợc 
đ t trong 1 vòng l p while cho đến khi đọc hết File *.STL và vẽ hoàn ch nh các bề 
m t của chi tiết thì mới thôi.Tuy nhiên,cách này với số lƣợng file *.STL nhiều thì 
sẽ làm cho chƣơng trình b đơ nên em xin giới thiệu cách thứ hai. 
#ifndef _READ_FILE_STL_H_ 
#define _READ_FILE_STL_H_ 
//#include "stdlib.h" 
#include "string" 
#include "fstream" 
using namespace std; 
 ______________________________________________________________________________________ 
 74 
 ĐỒ ÁN TỐT NGHIỆP 
void ReadModel(GLint &model, string filename) 
{ 
 model = glGenLists(1); 
 if(model !=0) 
 { 
 GLdouble n[3], v[3][3]; 
 ifstream ifs(filename.c_str()); 
 // ifs.setmode(filebuf::binary); 
 string str1, str2; 
 //Start READ STL FILE 
 getline(ifs, str1);//"solid ..." 
 glNewList(model, GL_COMPILE); 
 glBegin(GL_TRIANGLES); 
 while(1) 
 { 
 //'face' OR 'endsolid' 
 ifs>>str1; 
 if(str1 == "endsolid") 
 break; 
 //n[0] n[1] n[2] 
 ifs>>str1>>n[0]>>n[1]>>n[2]; 
 getline(ifs, str1); 
 //outer loop 
 getline(ifs, str1); 
 //Vertex1, Vertex2, Vertex3 
 for(int i=0; i<3; ++i) 
 { 
 ifs>>str1>>v[i][0]>>v[i][1]>>v[i][2]; 
 getline(ifs, str1); 
 } 
 //Draw a triangle 
 glNormal3dv(n); 
 glVertex3dv(v[0]); 
 glVertex3dv(v[1]); 
 glVertex3dv(v[2]); 
 //end loop 
 getline(ifs, str1); 
 //end face 
 getline(ifs, str1); 
 } 
 glEnd(); 
 glEndList(); 
 ifs.close(); 
 } 
} 
#endif _READ_FILE_STL_H_ 
Cách 2 : Trong cách này thì ta viết 1 hàm để đọc file *.STL .Đoạn đầu của hàm 
ReadFileSTL() là các khai báo các biến cục bộ, tiếp sau đó là đến dòng lệnh : 
f=fopen("ROBOT.txt","rt"); 
 ______________________________________________________________________________________ 
 75 
 ĐỒ ÁN TỐT NGHIỆP 
Đây chính là 1 file *.txt chứa ở trong thƣ mục của chƣơng trình và nội dung của 
file là chứa danh sách các chi tiết đã vẽ trên Solidwork và đã chuyển sang file 
*.STL để trong quá trình mô phỏng nó sẽ vẽ lại mô hình của Robot. 
Tiếp theo là các câu lệnh if else while để tiến hành kiểm tra file và đọc file 
*.STL. Nếu việc mở File thành công thì chƣơng trình sẽ tiến hành đọc đọc tên của 
các tệp số liệu và và lƣu vào mảng filechitiet[]. Kết thúc việc đọc trong File 
ROBOT.txt thì biến số chi tiết sẽ đƣợc gán giá tr cho tổng số file cần nạp. 
Tiếp theo là lệnh lisct = glGenLists(SOCHITIET) là lệnh khởi tạo môt danh sách 
list gồm có số phần tử b ng số chi tiết.Mục đích là tạo ra một list để thực hiện các 
thao tác vẽ rồi lƣu vào mảng danh sách.Trong quá trình mô phỏng,ch cần gọi ra 
mà không cần tiến hành vẽ lại.Nhƣ vậy sẽ tối ƣu cho quá trình mô phỏng,sau đó 
H 2.29 : C yể ế v â s f .*STL 
 ______________________________________________________________________________________ 
 76 
 ĐỒ ÁN TỐT NGHIỆP 
chƣơng trình sẽ thực hiện mở từng file số liệu đã đƣợc lƣu trong mảng 
filechitiet[].Nếu quá trình mở file thành công,quá trình tiếp theo là việc nạp và vẽ 
lại chi tiết đƣợc thực hiện theo lệnh sau : 
 glNewList(listct+loop,GL_COMPILE) 
lệnh này tạo ra 1 list mới để lƣu quá trình vẽ của chi tiết đang cần nạp.Chƣơng 
trình đọc số liệu theo cấu trúc tệp số liệu đã phân tích ở trên.Tiếp theo đó, lệnh 
Vemat() là một hàm thực hiện chức năng vẽ một m t, với các tham số đầu vào là 3 
vector chứa tọa độ của 3 đ nh.Các lệnh của hàm Vemat() nhƣ sau: 
void CMophongView::Vemat(float *p1, float *p2, float *p3) 
{ 
 glVertex3f(p1[0],p1[1],p1[2]); 
 glVertex3f(p2[0],p2[1],p2[2]); 
 glVertex3f(p3[0],p3[1],p3[2]); 
} 
Tất cả mã lệnh của hàm đọc File *.STL nhƣ dƣới đây. 
void CMophongView::ReadFileSTL() //Ham nay co chuc nang la doc File .*STL 
{ 
 unsigned int SOCHITIET; 
 FILE *f; 
 char st[216]=""; 
 char filechitiet[100][256]; 
 char xaudoc[216]=""; 
 float dinh[1000][3]; 
 float d1,d2,d3; //Toa do cac dinh cua moi facet 
 float i1,i2,i3; //Vecto phap tuyen tuong ung 
 unsigned int i,j; 
 unsigned int loop; 
 char catbo[20]=""; 
 f=fopen("ROBOT.txt","rt"); 
 if(f==NULL) 
 { 
 MessageBox("Khong tim thay file chua danh sach cac chi 
tiet!\n","Thong bao"); 
 ExitThread(0); 
 } 
 else 
 { 
 loop=0; 
 while(!feof(f)) 
 { 
 fscanf(f,"%s",st); 
 sprintf(filechitiet[loop],"%s.STL",st); 
 loop++; 
 ______________________________________________________________________________________ 
 77 
 ĐỒ ÁN TỐT NGHIỆP 
 } 
 fclose(f); 
 srand((unsigned) time(NULL)); 
 SOCHITIET=loop; 
 for (i=0;i<SOCHITIET;i++) 
 for (j=0;j<3;j++) 
 mauchitiet[i][j]=(float)rand()/RAND_MAX; 
} 
 listct=glGenLists(SOCHITIET); 
for(loop=0;loop<SOCHITIET;loop++) 
 { 
 fopen(filechitiet[loop],"rt"); 
 glNewList(listct+loop,GL_COMPILE); 
 glBegin(GL_TRIANGLES); 
 fgets(xaudoc,256,f); 
 while(!feof(f)) 
 { 
fgets(xaudoc,256,f); 
 sscanf(xaudoc,"%16c%f%f%f",&catbo,&i1,&i2,&i3); 
 if (!feof(f)) 
 { 
 fgets(xaudoc,256,f); 
 for (i=1;i<4;i++) 
 { 
 fgets(xaudoc,256,f); 
 sscanf(xaudoc,"%16c%f%f%f",&catbo,&d1,&d2,&d3); 
 dinh[i][0]= d1; 
 dinh[i][1]= d2; 
 dinh[i][2]= d3; 
 } 
 glNormal3f(i1,i2,i3); 
 Vemat(dinh[1],dinh[2],dinh[3]); 
 fgets(xaudoc,256,f); 
 fgets(xaudoc,256,f); 
 } 
 } 
 fclose(f); 
 glEnd(); 
 glEndList(); 
 } 
Hàm CalcNormal(float *p1, float *p2, float *p3) 
Là hàm xác đ nh pháp tuyến của bề m t cần vẽ. Nhờ có pháp tuyến này nên khi 
thực hiện gán vật liệu và chiếu sáng cho vật thể cần mô phỏng, OpenGL mới nhận 
ra và xử lý đúng đƣợc. Các đoạn mã trong hàm này đƣợc viết nhƣ ở dƣới đây. 
void CMophongView::CalcNormal(float *p1, float *p2, float *p3) 
{ 
 ______________________________________________________________________________________ 
 78 
 ĐỒ ÁN TỐT NGHIỆP 
 float a[3],b[3]; 
 a[0]=p2[0]-p1[0]; 
 a[1]=p2[1]-p1[1]; 
 a[2]=p2[2]-p1[2]; 
 b[0]=p3[0]-p1[0]; 
 b[1]=p3[1]-p1[1]; 
 b[2]=p3[2]-p1[2]; 
 n[0]=(a[1]*b[2])-(a[2]*b[1]); 
 n[1]=(a[2]*b[0])-(a[0]*b[2]); 
 n[2]=(a[0]*b[1])-(a[1]*b[0]); 
 float length = sqrtf(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]); 
 if(length!=0) 
 { 
 n[0]=n[0]/length; 
 n[1]=n[1]/length; 
 n[2]=n[2]/length; 
 } 
} 
2.4.4. Số hóa quỹ đạo chuyển động của ROBOT. 
Sau các bƣớc nhƣ trên, thì ta đã có mô hình của Robot nhƣng chƣa thể mô phỏng 
hoạt động của chúng đƣợc vì chƣa xây dựng quy luật chuyển động cho cơ các cơ 
cấu. Trong phần tính toán động học cho ROBOT,nhóm đã viết 1 chƣơng trình tính 
toán động học cho Robot trên ngôn ngữ lập trình Visual C++ và vẽ quỹ đạo cần gia 
công trên AutoCAD sau đó số hóa ra 1 file *.txt với các số liệu đầy đủ phục vụ cho 
quá trình mô phỏng với các thông số nhƣ sau: 
+ q1 – góc quay của khâu 1 quanh trục OZ1. 
+ q2 – góc quay của khâu 2 quanh trục OZ2. 
+ q3 – chuyển động t nh tiến của Xilanh trong Pistong thủy lực. 
+ q4 – Góc quay của khâu 4 quanh trục OZ4. 
+ X – Y – Z : là toạ độ của bàn kẹp của cánh tay Robot. 
+ deltaq1 : goc sau trừ góc trƣớc. 
 ______________________________________________________________________________________ 
 79 
 ĐỒ ÁN TỐT NGHIỆP 
+ deltaq2 
+ deltaq3 
+ detaq4 
File Số hóa quỹ đạo chuyển động sau khi xuất ra có cấu trúc nhƣ sau : 
+ Dòng đầu tiên : Tọa độ X-Y-Z. 
+ Dòng thứ hai : q1- q2 - q3- q4 
+ Dòng thứ ba :deltaq1-deltaq2-deltaq3-deltaq4. 
Cứ sau 3 dòng thì chu trình của File quỹ đạo lại quay trở về lúc đầu tức là trở về 
các tọa độ X-Y-Z . 
234.868 195.568 162 
1.3672 -1.88065 258 1.44725 
-0.000332801 -0.00128424 -6.28014e-006 0.00063094 
234.807 195.266 162 
1.36687 -1.88193 258 1.44788 
-0.000337478 -0.00127908 -6.28014e-006 0.00063388 
234.747 194.964 162 
1.36653 -1.88321 258 1.44851 
-0.000342079 -0.00127421 2.27443e-005 0.000636818 
234.687 194.663 162 
1.36619 -1.88448 258 1.44915 
-0.000346807 -0.00126877 -6.33672e-006 0.000639754 
234.629 194.361 162 
1.36584 -1.88575 258 1.44979 
-0.000351456 -0.00126362 -6.11041e-006 0.000642686 
234.571 194.059 162 
1.36549 -1.88702 258 1.45043 
-0.000356098 -0.00125849 -6.33672e-006 0.000645617 
234.515 193.758 162 
1.36514 -1.88828 258 1.45108 
-0.000360663 -0.00125365 2.26311e-005 0.000648545 
234.459 193.456 162 
1.36478 -1.88953 258 1.45172 
-0.000365352 -0.00124823 -6.33672e-006 0.00065147 
234.405 193.154 162 
1.36441 -1.89078 258 1.45238 
-0.000369964 -0.00124312 -5.8841e-006 0.000654391 
234.351 192.853 162 
1.36404 -1.89202 258 1.45303 
-0.000374569 -0.00123801 -6.33672e-006 0.000657312 
 ______________________________________________________________________________________ 
 80 
 ĐỒ ÁN TỐT NGHIỆP 
2.4.5. Xây dựng module đọc File quỹ đạo đã đƣợc số hóa. 
Với cấu trúc File quỹ đạo nhƣ trên, Module để đọc file quỹ đạo có dạng nhƣ sau : 
void CMophongView::Docsolieuquydao() // Quy dao duoc tinh toan va so hoa tren 
CAD. 
{ 
 // Thuc hien qua trinh doc File so lieu cua quy dao chuyen dong. 
 // Doc vao cac thong so X-Y-Z de ve quy dao 
 // Doc vao cac thong so q1 - q2 - q3 - q4. 
 FILE *f; 
 char st[256]=""; // Xau can doc . 
 float temp0,temp1,temp2; // Luu tru cac bien X-Y-Z. 
 float k1,k2,k3,k4; // Luu tru cac bien q1 - q2 - q3 - q4. 
 bool ngungnap = FALSE; 
 int i,j; 
 float X,Y,Z; 
 f=fopen("DiscreteSpline.txt","rt"); // Doc vao File so lieu cua quy dao. 
 // Kiem tra xem File co ton tai hay khong. 
 if (f == NULL) 
 { 
 sprintf(st,"Khong thay file chua thong so quy dao!"); 
 MessageBox(st); 
 ExitThread(0); 
 } 
 // Bat dau doc File. 
 while(!feof(f)) 
 { 
 // dong thu nhat. 
 fgets(st,256,f); // Doc vao 1 xau 
 sscanf(st,"%f%f%f",&temp0,&temp1,&temp2); 
 t[vitri][0] = temp0; // X. 
 t[vitri][1] = temp1; // Y. 
 t[vitri][2] = temp2; // Z. 
 //dong thu 2 
 fgets(st,256,f); 
 sscanf(st,"%f%f%f%f",&k1,&k2,&k3,&k4); 
 q[vitri][0] = k1; 
 q[vitri][1] = k2; 
 q[vitri][2] = k3; 
 q[vitri][3] = k4; 
 //dong thu 3 
 fgets(st,256,f); 
 vitri++; 
 } 
 fclose(f); 
} 
 ______________________________________________________________________________________ 
 81 
 ĐỒ ÁN TỐT NGHIỆP 
Các dòng đầu tiên là khai báo các biến cục bộ và khi đến dòng này thì b t đầu mở 
file quỹ đạo. 
f=fopen("DiscreteSpline.txt","rt"); // Doc vao File so lieu cua quy dao. 
Sau đó kiểm tra quá trình đọc file, nếu thành công thì mở file và b t đầu đọc file và 
lƣu vào xâu st[256]. 
2.5. ô phỏng chƣơng trình trên OpenG . 
Sau khi thực hiện xong các bƣớc ở trên nhƣ khởi tạo 1 Project MFC và include các 
gói thƣ viện của OpenGL em đã xây dựng đƣợc 1 khung giao diện tổng quát cho 
bài toán mô phỏng hoạt động của Robot nhƣ sau : 
 ______________________________________________________________________________________ 
 82 
 ĐỒ ÁN TỐT NGHIỆP 
H 2.38 : M R S ã ợ vẽ ên OpenGL 
 ______________________________________________________________________________________ 
 83 
 ĐỒ ÁN TỐT NGHIỆP 
CHƢƠNG 3 
CHẠY CHƢƠNG TRÌNH PHỎNG 
KẾT UẬN 
 ______________________________________________________________________________________ 
 84 
 ĐỒ ÁN TỐT NGHIỆP 
Nhƣ vậy, trong Đồ án tin học ứng dụng này em đã tìm hiểu và trình bày 
xong cách xây dựng một chƣơng trình mô phỏng hoạt động của Robot Công nghiệp 
với sự hỗ trợ của các phần mềm nhƣ SolidWorks,AutoCAD,VisualC++, OpenGL. 
Trong toàn bộ đồ án này em đã hoàn thành đƣợc các vấn đề sau : 
+ Về m t lý thuyết: 
- N m vững đƣợc và biết cách áp dụng cơ sở lý thuyết để xây dựng 
các chƣơng trình mô phỏng chuyển động cho robot. 
- N m vững đƣợc quy trình giải quyết các bài toán tính toán, thiết kế, 
mô phỏng và điều khiển. 
- Hiểu và biết cách sử dụng các chƣơng trình phần mềm nhƣ AutoCad, 
OpenGL, DirectX,MFC, Maple, ObjectARX để lập trình mô phỏng. 
+ Về m t thực hành 
- Xây dựng đƣợc 1 chƣơng trình để mô phỏng hoạt động của Robot 
với các chức năng cơ bản nhƣ chạy chƣơng trình, dừng chƣơng trình 
và k o thả chuột khi tƣơng tác với mô hình họat động của Robot. 
- Xây dựng đƣợc các module về các phần trong chƣơng trình mô 
phỏng nhƣ đọc các file .*STL và .*BDF để tiến hành mô phỏng các 
chuyển động của RobotScara 4 bậc tự do. 
Tuy nhiên, còn có một số vấn đề em chƣa giải quyết đƣợc đó là : 
- Chƣa tìm hiểu đƣợc nhiều và sâu về ObjectARX để số hóa đƣờng 
thẳng và đƣờng cong mà em mới ch áp dụng module ff2k.arx có sẵn 
để số hóa thực hiện cho quá trình mô phỏng. 
 ______________________________________________________________________________________ 
 85 
 ĐỒ ÁN TỐT NGHIỆP 
- Chƣơng trình mô phỏng mới ch áp dụng đƣợc cho một loại Robot, 
chƣa áp dụng đƣợc cho nhiều cơ cấu hay nhiều loại Robot và ch đọc 
đƣợc một loại file là .*BDF trong quá trình mô phỏng. 
- Chƣơng trình mô phỏng sử dụng gói thƣ viện đồ họa OpenGL để 
mô phỏng. Tuy nhiên, nếu xây dựng trên DirectX thì đạt đƣợc một 
số hiệu quả cao hơn nhƣ tốc độ xử lý và hiển th hình ảnh, chất 
lƣợng hình ảnh. 
+ Về phƣơng hƣớng phát triển: 
- Xây dựng một chƣơng trình (Project) hoàn thiện để mô phỏng tất cả 
các lại Robot và các cơ cấu động học khác nhau. 
- Xây dựng chƣơng trình với tốc độ sử lý Đồ họa nhanh hơn,đọc các 
File dữ liệu nhanh hơn mà không b đơ chƣơng trình. 
- Phát triển chƣơng trình có thể đọc đƣợc 2 loại file là .*STL và 
.*BDF cùng trong 1 chƣơng trình. 
- Qua đồ án tin học ứng dụng này em đã có cơ sở để xây dựng các bài 
toàn mô phỏng hoạt động của Robot và là nền tảng vững ch c để em 
thực hiện đồ án tốt nghiệp sau này. 
 ______________________________________________________________________________________ 
 86 
 ĐỒ ÁN TỐT NGHIỆP 
TÀI IỆU THA KHẢO 
1. GS.TSKH.Nguyễn Văn Khang, Độ ọ ề v , NXB Khoa học và 
Kỹ thuật, Hà Nội 2007, 335 tr. 
1 GS.TSKH.Nguyễn Thiện Phúc, R , NXB Khoa học và Kỹ 
thuật, Hà Nội 2006, 342 tr. 
2 GS.Phạm Văn Ất, C++ & ố ợ , NXB Khoa học và Kỹ 
Thuật, Hà Nội 2000, 636 tr. 
3 Phạm Công Ngô, V s C++6.0, NXB T ố Kê, Hà Nội 2002, 700 tr. 
4 Neon Helium Productions, OpenGL Tutorial. 
5 Addison Wesley Publishing Company, OpenGL Programming Guide. 
1 – Cách tạo ra File .*STL 
- cấu trúc của File .*STL. 
- Modun đọc File .*STL --- và vẽ lại nó trên OpenGL. 
Các Modun chính trong chƣơng trình Mô phỏng hoạt động của Robot Công 
nghiệp. 
            Các file đính kèm theo tài liệu này:
 74574641-Do-an-Tot-Nghiep-31-05-2009.pdf 74574641-Do-an-Tot-Nghiep-31-05-2009.pdf