4. Thư viện đồ họa mở OpenGL 65 4.2. Vấn đề cơ bản của OpenGL 4.2.3. Khởi tạo và sử dụng cấu trúc định dạng điểm ảnh Lựa chọn sử dụng một định dạng điểm ảnh: CClientDC clientDC(this); int pixelFormat = ChoosePixelFormat(clientDC.m_hDC,pfd); BOOL success = SetPixelFormat(clientDC.m_hDC,pixelFormat,pfd); 4.2.4. Tạo lập ngữ cảnh diễn tả (Rendering context) Phải tạo lập và làm hiện hành một ngữ cảnh mô tả trước khi có thể vẽ trên cửa sổ với các hàm OpenGL Tạo lập và làm hiện hành nó thường đặt trong lời đáp thông điệp WM_CREATE, tức là đặt trong hàm OnCreate() ... Khởi tạo và lựa chọn cấu trúc dữ liệu điểm ảnh ở đây HGLRC m_hRC = wglCreateContext(clientDC.m_hDC); Hủy bỏ ngữ cảnh diễn tả thường đặt trong lời đáp thông điệp WM_ DESTROY, tức là đặt trong hàm OnDestroy() wglDeleteContext(m_hRC);
Trang 1Kỹ thuật lập trình mô phỏng Rô bốt
và các hệ cơ điện tử
Giảng viên: TS Vũ Lê Huy
Đơn vị công tác: Bộ môn cơ sở thiết kế máy và Rôbốt, Viện Cơ khí
Trang 3Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
Trang 5 Bài toán vị trí: Tìm các giá trị góc của các khâu 2 và 3 tùy
theo vị trí của khâu 1 với giá trị 1 giải hệ phương trình phi
sin(
) sin(
) sin(
.
0 )
cos(
) cos(
) cos(
.
2 3 3 2 2 1 1
1 3 3 2 2 1 1
d l
l l
d l
l l
Trang 6 2.1 Động học Cơ cấu 4 khâu
n
n n
x
x
f x
f x f
x
f x
f x f
x
f x
f x f
2 2
2 1 2
1 2
1 1 1
Đặt : x(k)= –Fx-1(x(k)).f(x(k))
Fx(x(k)).x(k)= –f(x(k))Giải hệ tìmx(k), sẽ thu được giá trị của ẩn sau bước lặp thứ k :
x(k+1)= x(k)+ x(k)
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
Bài toán vận tốc: lấy đạo hàm theo thời gian đối với phương trình
).
cos(
).
cos(
.
) sin(
).
sin(
).
sin(
.
1 1 1 3 3 3 2 2 2
1 1 1 3 3 3 2 2 2
l
l l
.a
-l
) ( w w )-l ( w w l ) ( w w l ) (
.a
l
a
a ) ( ) (
.
) ( ) (
.
3 sin 3 3 3 2 sin 2 2 2 1 sin 1 1 1 1 cos
1
1
3 cos 3 3 3 2 cos 2 2 2 1 cos 1 1 1 1 sin
1
1
3
2 2
3 2
3 3 2
3 2
cos cos
sin sin
Trang 7 2.2 Động học Rô bốt
Thiết lập bộ thông số Denavit-Hartenbeg :
Dao phay
• Trục znđược liên kết với trục của khớp
thứ n+1 Chiều của znđược chọn tuỳ ý.
•Trục xn được xác định là đường vuông
góc chung giữa trục khớp n và khớp n+1 , hướng từ điểm trục của khớp tới
khớp n+1.
•Trục yn được xác định theo xn và zn
theo quy tắc bàn tay phải.
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
Thiết lập bộ thông số Denavit-Hartenbeg :
Dao phay
Trang 8cossin
0
sincos
sincoscossin
cossin
sinsincoscos
1
n n
n
n n n n i
n n
n n n n n n n
n n
d a a A
Trang 910
0
001
0
000
1
1 1
0
d A
0000
00cossin
0sincos
2 2
2 2 2
0000
00cossin
0sincos
3 3
3 3 3
0 0
0 0
0
) cos(
sin 0 ) cos(
) sin(
) cos(
cos 0 ) sin(
) cos(
.
1
3 2 3 2 2 3
2 3
2
3 2 3 2 2 3
2 3
2
4
0
3 2 2
a a
A
A A
Phương trình điểm tác động cuối: E(xE,yE,zE) = 0A4 E4(x4,y4,z4)
Giải hệ phương trình phi tuyến Thu được các biến khớp
Giải bài toán vận tốc, gia tốc, …
Trang 10 2.3 Bài tập 1: lập ma trận chuyển cho các mô hình
+ Khởi động chương trình : hàm WinMain() thực hiện mọi khởi tạo và thiết
lập các cửa sổ giao diện
+ Xử lý thông điệp : hàm WinProc() được Window gọi tới để xử lý toàn bộ
các thông điệp đang xếp hàng trong hàng đợi của hệ thống được gửi đến chương
trình => thực hiện vòng lặp xử lý các thông điệp (đây là một vòng lặp rất lớn)
Trang 11 3.1 Khái niệm
Nguyên lý cơ bản của lập trình Window là cơ sở xử lý thông điệp.
Tuy nhiên để lập chương trình bằng các hàm API là vô cùng phức tạp và rất khó
quản lý
MFC = Microsoft Foundation Class (lớp nền tảng của Microsoft) : là tập hợp
các lớp định nghĩa sẵn, đóng gói các hàm API của Window theo một hệ thống
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
Trang 12 3.2 Tạo đề án MFC trên Visual Studio
Bước 1 :
Single Document (SDI : Single Document Interface): cho phép tạo ứng
dụng đơn tài liệu, tại mỗi thời điểm chương trình chỉ có thể mở một tài liệu
Multi Documents (MDI : Multi Documents Interface): cho phép tạo ứng
dụng đa tài liệu, tại mỗi thời điểm chương trình có thể mở đồng thời nhiều tài liệu, mỗi
tài liệu được quản lý bởi một cửa sổ riêng nằm gọn trong cửa sổ chính của chương trình
Dialog Based: tạo ứng dụng là một hộp thoại Đây là loại ứng dụng đơn giản nhất
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
3.2 Tạo đề án MFC trên Visual Studio
a/ Tạo đề án giao diện của chương trình kiểu Dialog Based
Bước 2
Bước 3
Trang 13 3.2 Tạo đề án MFC trên Visual Studio
a/ Tạo đề án giao diện của chương trình kiểu Dialog Based
Bước 4
Bước 5: soạn thảo mã nguồn cho chương trình
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
3.2 Tạo đề án MFC trên Visual Studio
b/ Tạo đề án giao diện của chương trình kiểu Single Document
và Multi Document
Bước 2
Bước 3
Trang 14 3.2 Tạo đề án MFC trên Visual Studio
b/ Tạo đề án giao diện của chương trình kiểu Single Document
3.2 Tạo đề án MFC trên Visual Studio
b/ Tạo đề án giao diện của chương trình kiểu Single Document
và Multi Document
Bước 5
Bước 6
Trang 15 3.2 Tạo đề án MFC trên Visual Studio
b/ Tạo đề án giao diện của chương trình kiểu Single Document
và Multi Document
Danh sách các lớp sẽ được tạo ra:
CxxxView được kế thừa từ lớp quan sát, có thể là CView (mặc định), CEditView,
CFormView, đảm nhận công việc thể hiện tài liệu trong chương trình Được đặt
trong file “xxxView.h" và "xxxView.cpp".
CxxxApp được kế thừa từ lớp CWndApp, đảm nhận công việc khởi tạo và quản lý
ứng dụng Được đặt trong file "xxx.h" và "xxx.cpp".
CMainFrame được kế thừa từ lớp CFrameWnd nếu chương trình dạng Single
Document, còn nếu là Multi Document thì kế thừa từ lớp CMDIFrameWnd, là lớp quản
lý cửa sổ chính của chương trình Được đặt trong file "MainFrm.h" và "MainFrm.cpp".
CxxxDocđược kế thừa từ lớp CDocument, quản lý tài liệu của chương trình Được
đặt trong file "xxxDoc.h" và "xxxDoc.cpp".
Nếu chương trình là dạng MultiDocumentthì sẽ có thêm lớp CChildFrame kế
thừa từ lớp CMDIChildWnd, là lớp quản lý cửa sổ con ứng với mỗi tài liệu đang có.
Được đặt trong file "ChildFrm.h" và "ChildFrm.cpp".
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
3.3 Làm việc với Menu, ToolBar, Status
a/ Sửa đổi Menu và ToolBar có sẵn
Mặc định ban đầu của MFC sẽ tạo ra cho bạn một menu và một thanh công cụ với ID
là IDR_MAINFRAME, đây sẽ là menu và thanh công cụ mặc định của chương trình và
gắn với cửa sổ ứng dụng chính và được khởi tạo bởi CMainFrame Menu và thanh công
cụ này mới chỉ có một số chức năng cơ bản có ở đa số các ứng dụng.
Để bổ xung thêm chức năng mới của menu và thanh công cụ trên bạn nên dùng trình
soạn thảo Resource của Microsoft Visual Studio.
Để tạo công việc xử lý sự kiện bạn cần tạo ra một hàm xử lý sự kiện và tạo ra ánh xạ
thông điệp để quy chiếu sự kiện tới hàm đó, công việc này có thể được thực hiện
nhanh chóng nhờ ClassWizard hoặc có thể kích chuột phải lên tên lớp (ở vùng
WorkSpace) rồi chọn "Add Windows Message Handler …"
Trang 16 3.3 Làm việc với Menu, ToolBar
a/ Sửa đổi Menu và ToolBar có sẵn
Trong file tiêu đề (.h) được bổ xung thêm dòng khai báo hàm thành
viên có dạng :
afx_msg ReVal memberFxn(ListParam);
ReVallà giá trị trả về của hàm
ListParamlà danh sách tham số, afx_msgchỉ rằng hàm này là một hàm xử lý
thông điệp.
Trong file nguồn (.cpp) :
Bổ xung thêm ánh xạ thông điệp vào giữa khu vực :
BEGIN_MESSAGE_MAP()
……
……
END_MESSAGE_MAP()
Bổ xung triển khai của hàm thành viên đã được thêm khai báo trong
file tiêu đề (thường được đặt vào cuối cùng của file cpp).
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
b/ Thêm ToolBar mới
Khai báo một thanh công cụ mới :
CToolBar m_wndToolBar;
Trong hàm :
intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)
Thêm các dòng lệnh sau để khởi tạo và gán biến trên với một thanh
công cụ đã tạo trong tài nguyên thông qua ID của nó:
if(!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|
WS_VISIBLE| CBRS_TOP | CBRS_GRIPPER| CBRS_TOOLTIPS|
CBRS_FLYBY| CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
TRACE0("Failed to create toolbar\n");
return-1; // fail to create
ID của thanh công cụ là IDR_MAINFRAME , có thể thay ID khác.
Trang 17 3.4 Vẽ trên Windows
Để thực hiện công việc vẽ bạn cần có biến quản lý công việc vẽ
thuộc kiểu CDC hoặc CPaintDC, CClientDC, (đều kế thừa từ CDC),
lớp này cần được nhận được con trỏ của lớp điều khiển sẽ được vẽ
lên đó.
CDC : Class of Device-Context, lớp ngữ cảnh thiết bị, để vẽ tất cả các
thứ đều thông qua các hàm thành viên của lớp này CDC cung cấp
các chức năng thao tác ngữ cảnh thiết bị, làm việc với các công cụ
vẽ, lựa chọn các đối tượng giao diện thiết bị đồ hoạ (GDI : Graphics
Device Interface), làm việc với mầu và bảng mầu.
Vẽ trong cửa sổ của chương trình Dialog thông qua hàm OnPaint(),
còn với khung View thì thông qua hàm OnDraw(CDC *pDC).
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
Một số hàm vẽ của CDC :
CPen quản lý các nét vẽ với kiểu đường, độ rộng và mầu vẽ.
CBrush quản lý vùng tô với kiểu tô, mầu tô
CFont quản lý kiểu chữ.
Để chọn một kiểu bút và chổi tô mới cho CDC sử dụng hàm :
Trang 18 3.4 Vẽ trên Windows
Nếu sử dụng các đối tượng bút, chổi tô và font chữ được định nghĩa
sẵn trong Window:
với nIndex là một trong những giá trị:
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
dc DrawText ( "Draw Text : My HelloWorld program." ,- 1 , clientRect ,
DT_SINGLELINE | DT_CENTER | DT_VCENTER );
dc MoveTo ( 5 , 5 );
dc LineTo ( 100 , 100 );
}
Trang 19 Phương pháp thứ hai là xây dựng đối tượng bút chưa truyền tham số rồi
gọi hàm thành phần CreatePen để khởi tạo bút :
Chổi tô có 3 loại cơ bản: đồng nhất (solid), sọc (hatch) và mẫu (pattern)
Chổi đồng mầu được lập chỉ với tham số giá trị mầu COLORREF :
CBrush brush(RGB(255,0,0));
hoặc có thể thực hiện khai báo không truyền tham số và khởi tạo chổi tô
đồng mầu với hàm CreateSolidBrush :
CBrush brush;
brush.CreateSolidBrush(RGB(255,0,0));
Chổi sọc được khởi tạo ngoài tham số giá trị mầu còn cần thêm tham số
xác định kiểu sọc :
CBrush brush(HS_BDIAGONAL,RGB(255,0,0));
hoặc khởi tạo với hàm CreateSolidBrush :
Trang 20 3.5 Tạo một chương trình vẽ đồ thị với thư viện sẵn có
Tạo một project mới với kiểu Dialog Based.
Copy thư mục “ToolInter” vào thư mục của project đã tạo.
Đưa file “ToolInter\bin\ToolInter.lib” hoặc “…\ToolInterd.lib” (tùy theo
chế độ biên dịch của đề án) vào đề án bằng chức năng “Add Files to
Project …”
Trong file “stdafx.h” thêm dòng sau
#include "ToolInter/ToolInter.h“
(đặt sau dòng: #endif // _AFX_NO_AFXCMN_SUPPORT)
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
3.5 Tạo một chương trình vẽ đồ thị với thư viện sẵn có
A) Với khung giao diện CView:
Trong file “xxxView.h” thêm biến cho lớp CxxxView
Trang 21 3.5 Tạo một chương trình vẽ đồ thị với thư viện sẵn có
B) Với hộp thoại:
Trên giao diện chỉnh sửa hộp thoại, thêm Static Text (kéo kích thước
của nó theo vùng muốn thể hiện đồ thị) và đổi ID của nó.
Thêm khai báo biến cho đối tượng Static Text vừa tạo bằng chức
m_graph.DrawTable();//vẽ bảng lưới của đồ thị
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
3.5 Tạo một chương trình vẽ đồ thị với thư viện sẵn có
Thực hiện vẽ đồ thị:
m_graph.DrawBackGround(RGB(255,255,255));//đặt mầu nền
m_graph.DrawTable();//vẽ bảng lưới của đồ thị
m_graph.SetScaleXY(1.0);//đặt tỉ lệ của trục Y theo trục X
m_graph.SetScaleYX(1.0);//đặt tỉ lệ của trục X theo trục Y
m_graph.SetGridStyle(PS_DOT); //đặt kiểu vẽ đường lưới
m_graph.SetGridWidth(2); //đặt độ rộng đường lưới
m_graph.SetGraphStyle(PS_DOT);//đặt kiểu vẽ đường đồ thị
m_graph.SetGraphWidth(2); //đặt độ rộng đường đồ thị
Trang 22 3.5 Tạo một chương trình vẽ đồ thị với thư viện sẵn có
Thực hiện vẽ đồ thị:
m_graph.SetColorGraph(RGB(255,0,255));//đặt mầu vẽ của đường
//vẽ 1 đường cong theo tọa độ x và y
const int n=10; double x[n],y[n];
for (int i=0;i<n;i++) { x[i]=i/2.0;y[i]=1.0/(i+1.0);}
Copy thư mục “PpsTools” vào thư mục của project đã tạo ở trên.
Đưa file “PpsTools\bin\PpsTools.lib” hoặc “…\ PpsToolsd.lib” (tùy theo
chế độ biên dịch của đề án) vào đề án bằng chức năng “Add Files to
Project …”
Trong file “stdafx.h” thêm dòng sau
#include " PpsTools / PpsTools.h“
Trang 23 }
Trang 26 3.7 Giải hệ phương trình bằng phương pháp số
Giải hệ phương trình đại số tuyến tính:
a.x = b
int Gauss_Jordan(const smatrix & a, const vector & b, vector & x);
int linear(const smatrix & a, const vector & b, vector & x);
int Jacobi(const smatrix& a, const vector & b, vector & x, const double &
eps=1e-10, const int & Max=100);
int Gauss_Seidel(const smatrix & a, const vector & b,vector & x, const
double & eps=1e-10, const int & Max=100);
a : ma trận hệ số
b : véc tơ vế phải
x : chứa xấp sỉ đầu, đồng thời chứa kết quả giải bài toán
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
Giải hệ phương trình phi tuyến:
int Newton_Raphson(vector & x, functionNR & func, const
double & eps=1e-10, const int& Max=100);
x là véc tơ chứa xấp xỉ đầu, đồng thời chứa kết quả bài toán
func là tên hàm được định nghĩa theo cú pháp
void func(smatrix & a, vector & c, const vector & x)
Hàm này có nhiệm vụ định nghĩa ma trận Jacobi Fx(x(k)) (chứa trong a)
và véc tơ –f(x(k)) (chứa trong b) ở bước lặp thứ k với giá trị x = x(k)
Fx(x(k)).x(k)= –f(x(k)) (*)
x(k+1)= x(k)+ x(k)
Trang 27 3.7 Giải hệ phương trình bằng phương pháp số
Ví dụ giải hệ phương trình phi tuyến:
void Func(smatrix & a,
vector & c,const vector & x)
sin(
) sin(
)
sin(
.
0 )
cos(
) cos(
)
cos(
.
2 3 3 2 2 1
1
1 3 3 2 2 1
1
d l
l l
d l
l l
Ví dụ giải hệ phương trình phi tuyến:
double eps=0.001;
int maxloop=300;
int n=2;
vector x(2);
m_phi1 = …; //giá trị góc khâu 1
x[0]=m_phi2; x[1]=m_phi3; //lấy xấp xỉ đầu=giá trị vị trí trước đó
sin(
) sin(
)
sin(
.
0 )
cos(
) cos(
)
cos(
.
2 3 3 2 2 1
1
1 3 3 2 2 1
1
d l
l l
d l
l l
Trang 28 4.1 OpenGL là gì?
OpenGL = Open Graphic Library
Được phát triển đầu tiên bởi Silicon Graphic, Inc., là một giao
diện phần phần mềm hướng thủ tục theo chuẩn công nghiệp hỗ
trợ đồ họa 3 chiều.
Cung cấp khoảng 120 tác vụ để vẽ các primitive trong nhiều
mode khác nhau.
Là một giao diện phần mềm độc lập với phần cứng (hardware –
independent software interface) hộ trợ cho lập trình đồ họa.
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
OpenGL = Open Graphic Library
Trang 29 4.1 OpenGL là gì?
OpenGL = Open Graphic Library
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
OpenGL = Open Graphic Library
Trang 30 4.1 OpenGL là gì?
Để sử dụng các nội dung trên của OpenGL trong đề án chương
trình, thêm các dòng sau vào header file (nên đưa vào stdafx.h):
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
4.2.1 Các kiểu dữ liệu
OpenGL định nghĩa một số kiểu dữ liệu tương đương với các các kiểu
truyền thống của C
Kiểu dữ liệu Kiểu tương đương Kiểu dữ liệu Kiểu tương đương
Trang 31 4.2 Vấn đề cơ bản của OpenGL
4.2.2 Ngữ cảnh diễn tả
Có 5 hàm "WGL" được cung cấp trong triển khai OpenGL trong
WindowNT chịu trách nhiệm quản lý các ngữ cảnh diễn tả
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
4.2.2 Định dạng điểm ảnh
Trước khi chương trình có thể tạo lập một ngữ cảnh diễn tả, nó phải
đặt định dạng điểm ảnh của thiết bị
Các thuộc tính này được gộp vào trong bề mặt vẽ sử dụng chế độ
mầu RGBA hoặc chỉ số, hoặc vùng đệm điểm và các thông tin đồ hoạ
khác của OpenGL
Trang 32 4.2 Vấn đề cơ bản của OpenGL
Thuộc tính của một định dạng điểm ảnh được mô tả chi tiết bởi cấu
trúc PIXELFORMATDESCRIPTOR, nó có 26 trường thông tin
typedef struct tagPIXELFORMATDESCRIPTOR
{
DWORD dwLayerMask; DWORD dwVisibleMask; DWORD dwDamageMask;
} PIXELFORMATDESCRIPTOR, * PIXELFORMATDESCRIPTOR, FAR * LPPIXELFORMATDESCRIPTOR;
Kỹ thuật lập trình mô phỏng Rô bốt và các hệ cơ điện tử
4.2.3 Khởi tạo và sử dụng cấu trúc định dạng điểm ảnh
Giá trị mặc định để làm việc tốt trên tất cả các hệ thống như sau: