Bài giảng Lập trình mô phỏng robot và hệ cơ điện tử ME4291 - Bài 5: Kết nối C/C++ với Maple/Matlab và tối ưu hoá chương trình mô phỏng

Tóm tắt

• Việc sử dụng các hàm tính toán của Maple,

Matlab hay các gói phần mềm tính toán khác

trong chương trình C/C++ có rất nhiều lợi ích.

Bài này sẽ giới thiệu những khả năng này.

• Phần thứ hai sẽ bàn về một số cách để tối ưu

hoá chương trình mô phỏng

pdf 50 trang phuongnguyen 3280
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình mô phỏng robot và hệ cơ điện tử ME4291 - Bài 5: Kết nối C/C++ với Maple/Matlab và tối ưu hoá chương trình mô phỏng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình mô phỏng robot và hệ cơ điện tử ME4291 - Bài 5: Kết nối C/C++ với Maple/Matlab và tối ưu hoá chương trình mô phỏng

Bài giảng Lập trình mô phỏng robot và hệ cơ điện tử ME4291 - Bài 5: Kết nối C/C++ với Maple/Matlab và tối ưu hoá chương trình mô phỏng
KẾT NỐI C/C++ VỚI MAPLE/MATLAB 
VÀ 
TỐI ƯU HOÁ CHƯƠNG TRÌNH MÔ PHỎNG 
BÀI 5 
1 
Tóm tắt 
• Việc sử dụng các hàm tính toán của Maple, 
Matlab hay các gói phần mềm tính toán khác 
trong chương trình C/C++ có rất nhiều lợi ích. 
Bài này sẽ giới thiệu những khả năng này. 
• Phần thứ hai sẽ bàn về một số cách để tối ưu 
hoá chương trình mô phỏng. 
2 
Nội dung 
Kết nối C/C++ với Maple/Matlab 
• Những lợi ích của việc kết nối 
• Kết nối với Maple 
• Kết nối với Matlab 
Tối ưu hoá chương trình mô phỏng 
• Tối ưu hoá tính toán 
• Tối ưu hoá mô hình hiển thị 
• Tối ưu hoá đồ hoạ 
3 
NHỮNG LỢI ÍCH CỦA VIỆC KẾT NỐI 
4 
Những lợi ích của việc kết nối 
• Các hệ chương trình tính toán như Maple, Matlab 
được sử dụng rộng rãi trong tính toán kỹ thuật 
• Các công cụ này có thư viện các hàm tính toán rất 
mạnh, chưa kể có rất nhiều các thư viện chương 
trình được viết trên các môi trường này 
(SpaceLib, Robotics Toolbox) 
• Các hệ chương trình này đều cho phép kết nối 
giữa chương trình viết bằng C/C++ (hoặc Fortran, 
Java) kết nối, tương tác với chúng 
5 
Những cách khác nhau để kết nối 
• Có một số kịch bản kết nối giữa C/C++ và 
Maple/Matlab 
1. Một chương trình C/C++ độc lập (standalone) gọi 
các hàm tính toán của Maple/Matlab 
2. Người dùng Maple/Matlab xuất đoạn mã tính toán 
của mình thành mã C/C++ để có thể được sử dụng 
trong một chương trình C/C++ độc lập 
3. Người dùng Maple/Matlab gọi các hàm tính toán 
được viết bằng C/C++ trong một thư viện liên kết 
động (các file dll trong Windows) 
• Bài giảng này tập trung chủ yếu vào kịch bản 
thứ nhất: Gọi hàm Maple/Matlab trong C/C++ 
6 
KẾT NỐI VỚI MAPLE 
7 
Kết nối với Maple 
• Chương trình cài đặt Maple copy các tệp tin cần thiết để 
cho phép lập trình kết nối với một chương trình C/C++ 
• Các tệp tin cần thiết là 
\extern\include\maplec.h 
\bin.win\maplec.lib 
Trong đó là thư mục cài đặt Maple (ví dụ 
C:\Program Files\Maple 13). 
Một số ví dụ có ở thư mục \samples\OpenMaple\ 
• Trên Windows có thể sử dụng Visual C++ để lập trình kết 
nối. Khi chạy chương trình, máy tính cần có Maple cài 
đặt sẵn 
8 
Các bước kết nối với Maple: 
Chuẩn bị 
• Chuẩn bị 
– Để có thể sử dụng các hàm cần cho kết nối, chương trình 
C/C++ cần có dòng 
 #include “maplec.h” 
– Và để kết nối thư viện cần thiết cần có dòng 
#pragma comment(lib, "maplec.lib") 
• Chú ý: Để Visual C++ tìm được hai tệp maplec.h và maplec.lib 
ở trên, cần đặt các đường dẫn tương ứng vào trong môi 
trường phát triển 
– Trong Visual C++ chọn menu Tools/Options 
– Trong cửa sổ hiện ra chọn Projects and Solutions, VC++ Directories 
– Cần thay đổi Include files và Library files 
9 
Các bước kết nối với Maple 
• Một chương trình C/C++ cần thực hiện 3 bước 
sau để có thể gọi hàm của Maple 
1. Gọi hàm StartMaple() để khởi tạo bộ máy tính 
toán của Maple 
2. Gọi hàm EvalMapleStatement() để thực hiện 
một lệnh trong Maple. Ngoài ra có thể sử dụng 
các hàm khác trong maplec.h 
3. Gọi hàm StopMaple() sau khi kết thúc tính toán 
10 
Ví dụ 
#include 
#include 
#include "maplec.h“ 
#pragma comment(lib, "maplec.lib") 
/* callback used for directing result output */ 
static void M_DECL textCallBack( void *data, 
int tag, char *output ) 
{ 
 printf("%s\n",output); 
} 
int main( int argc, char *argv[] ) 
{ 
 char err[2048]; 
 MKernelVector kv; /* Maple kernel handle 
*/ 
 MCallBackVectorDesc cb = { textCallBack, 
0, 0, 0, 0, 0, 0, 0 }; 
 ALGEB r, l; /* Maple data-structures */ 
 /* initialize Maple */ 
 if( (kv=StartMaple 
(argc,argv,&cb,NULL,NULL,err)) == NULL ) { 
 printf("Fatal error, %s\n",err); 
 return( 1 ); 
 } 
 char s[] = "int(x^2+1,x);"; 
 printf("Evaluate an integral: %s\n\t", s); 
 r = EvalMapleStatement (kv, s); 
 StopMaple(kv); 
 return( 0 ); 
} 
11 
Kết quả 
12 
Minh hoạ 
13 
KẾT NỐI VỚI MATLAB 
14 
Kết nối với Matlab 
• Chương trình cài đặt Matlab copy các tệp tin cần thiết để cho 
phép lập trình kết nối với một chương trình C/C++ 
• Các tệp tin cần thiết là 
\extern\include\engine.h 
\extern\lib\win32\microsoft\libeng.lib 
\extern\lib\win32\microsoft\libmx.lib 
Trong đó là thư mục cài đặt Matlab (ví dụ 
C:\Program Files\MATLAB\R2010b). 
Một số ví dụ lập trình có ở đây \extern\examples\ 
• Trên Windows có thể sử dụng Visual C++ để lập trình 
kết nối. Khi chạy chương trình trên một máy tính, cần 
cài đặt Matlab Compiler Runtime trước. Bộ cài có tại 
\toolbox\compiler\deploy\win32\MCRInstaller.exe 
15 
Các bước kết nối với Matlab: 
Chuẩn bị 
• Chuẩn bị 
– Để có thể sử dụng các hàm cần cho kết nối, chương trình 
C/C++ cần có dòng 
 #include “engine.h” 
– Và để kết nối thư viện cần thiết cần có dòng 
 #pragma comment(lib, "libeng.lib”) 
 #pragma comment(lib, "libmx.lib") 
• Chú ý: Để Visual C++ tìm được các tệp tin trên, cần đặt các 
đường dẫn tương ứng vào trong môi trường phát triển 
– Trong Visual C++ chọn menu Tools/Options 
– Trong cửa sổ hiện ra chọn Projects and Solutions, VC++ Directories 
– Cần thay đổi Include files và Library files 
16 
Các bước kết nối với Matlab 
• Một chương trình C/C++ cần thực hiện 3 bước 
sau để có thể gọi hàm của Matlab 
1. Gọi hàm engOpen() để khởi tạo bộ máy tính 
toán của Matlab 
2. Gọi hàm engEvalString() để thực hiện một lệnh 
trong Matlab. 
3. Gọi hàm engClose() sau khi kết thúc tính toán 
17 
Ví dụ 
#include 
#include 
#include 
#include "engine.h" 
#define BUFSIZE 256 
#pragma comment(lib, "libeng.lib") 
#pragma comment(lib, "libmx.lib") 
int main() 
{ 
 Engine *ep; 
 mxArray *T = NULL, *result = NULL; 
 char buffer[BUFSIZE+1]; 
 if (!(ep = engOpen("\0"))) { 
 fprintf(stderr, "\nCan't start MATLAB 
engine\n"); 
 return EXIT_FAILURE; 
 } 
 buffer[BUFSIZE] = '\0'; 
 engOutputBuffer(ep, buffer, BUFSIZE); 
 char s[] = "X = 1:5"; 
 printf("Evaluating: %s!\n", s); 
 engEvalString(ep, s); 
 printf("%s", buffer); 
 printf("Done!\n"); 
 engClose(ep); 
 return EXIT_SUCCESS; 
} 
18 
Kết quả 
19 
Minh hoạ 
20 
Nội dung 
Kết nối C/C++ với Maple/Matlab 
• Những lợi ích của việc kết nối 
• Kết nối với Maple 
• Kết nối với Matlab 
Tối ưu hoá chương trình mô phỏng 
• Tối ưu hoá tính toán 
• Tối ưu hoá mô hình hiển thị 
• Tối ưu hoá đồ hoạ 
21 
Tóm tắt 
• Các chương trình mô phỏng thường là những 
chương trình có yêu cầu rất lớn về tài nguyên 
tính toán: bộ nhớ, CPU, GPU, đĩa cứng 
• Nếu chương trình không đạt hiệu suất cần 
thiết, cần phải tối ưu hoá 
• Có thể tối ưu trên các mặt 
– Tối ưu hoá tính toán (thuật toán) 
– Tối ưu hoá mô hình hiển thị (thể hiện đối tượng) 
– Tối ưu hoá đồ hoạ (hiển thị bằng OpenGL) 
22 
TỐI ƯU HOÁ TÍNH TOÁN 
23 
CẤU TRÚC + DỮ LIỆU = 
CHƯƠNG TRÌNH [HIỆU QUẢ] 
24 
TỐI ƯU HOÁ MÔ HÌNH HIỂN THỊ 
25 
Tối ưu hoá mô hình hiển thị 
• Sử dụng mô hình càng phức tạp thì hiển thị càng 
chậm 
• Có thể sử dụng các kỹ thuật để thay đổi mức độ 
chi tiết của mô hình tuỳ theo yêu cầu lúc chạy 
(LOD: Level of Detail) 
• Có một số giải pháp 
– Xuất thêm véc-tơ pháp của bề mặt tại các đỉnh tam 
giác (Dùng file AMF) 
– Xuất dữ liệu bề mặt dưới dạng file SAT (ACIS) 
– Xuất dữ liệu bề mặt dưới dạng mặt các NURBS 
26 
DÙNG FILE AMF 
27 
Dùng file AMF 
• AMF là một cải tiến của dạng thức file STL do 
ASTM định nghĩa1 
• Được dùng chủ yếu cho các máy in 3D (in ra mô 
hình 3 chiều) 
• Đọc mô hình trong AutoCAD, xuất ra file dạng 
AMF trong đó có thêm véc-tơ pháp tại mỗi 
đỉnh2, 3 
• Khi cần có thể nội suy ra thêm các tam giác để 
tăng chi tiết 
28 
1 AMF File Format  
2 Current wiki page  
3 AMF at Cornell University  
Tam giác cong 
(Sử dụng véc-tơ pháp ở đỉnh) 
Tam giác phẳng 
Sử dụng véc-tơ pháp hoặc tiếp để tăng độ chính xác biểu diễn 
Tam giác cong 
(sử dụng véc-tơ tiếp ở cạnh) 
Tam giác cong 
 ... 
 0 
 0.707 
 0.707 
 ... 
 0 
 0.577 
 0.577 
 0.577 
 1 
 0.707 
 0 
 0.707 
 ... 
 ... 
 ... 
Chỉ cần cho mặt 
cong 
Chỉ cần cho cạnh 
cong (hiếm gặp) 
Chia tam giác một cách đệ quy 
Importer temporarily subdivides each curved triangle into a set of 4n planar triangles 
then uses those to calculate slice 
Icosahedrons (20 Triangles) 
Icosahedrons (20 Triangles) 
Flat triangles, error = 10.26% of diameter 
Error 
Icosahedrons (still 20 triangles) 
One subdivision, error = 3.81% 
Icosahedrons (still 20 triangles) 
Two-fold subdivisions, error = 1.49% 
Icosahedrons (20 Triangles) 
Three-fold subdivisions, error = 0.84% 
Icosahedrons (still 20 triangles) 
Four-fold subdivisions, error = 0.67% 
Hình cầu: Sai số giảm đi theo số lần 
chia nhỏ 
0
0.02
0.04
0.06
0.08
0.1
0.12
0 1 2 3 4 5 6
Số lần chia 
S
a
i 
s
ố
Cách thực hiện 
1. Nếu các véc-tơ tiếp t0 hay t1 không xác định, tính từ các véc-tơ pháp 
𝑡 0 = 𝑑 
𝑛0×𝑑 ×𝑛0
𝑛0×𝑑 ×𝑛0
, 𝑡 1 = 𝑑 
𝑛1×𝑑 ×𝑛1
𝑛1×𝑑 ×𝑛1
2. Tính toạ độ trung điểm v01=h(0.5) và véc-tơ tiếp tại đó t01 sử dụng đường cong 
Hermite 
ℎ(𝑠) = (2𝑠3 − 3𝑠2 + 1)𝑣0 + (𝑠
3 − 2𝑠2 + 𝑠)𝑡0 + (−2𝑠
3 + 3𝑠2)𝑣1 + (𝑠
3 − 𝑠2)𝑡1 
2. Lặp lại cho các cạnh của tam giác, rồi chia tam giác thành 4 
3. Đệ quy cho đến khi thoả mãn (sau khoảng 4 lần sẽ không khác biệt mấy) 
v0 
v1 
d 
n0 
t0 
t1 
n1 
n01 
v01 
t01 
Xuất dữ liệu bề mặt dưới dạng 
file SAT (ACIS) 
42 
Xuất dữ liệu bề mặt dưới dạng 
file SAT (ACIS) 
• SAT là dạng file mô tả mô hình vật thể 3 chiều 
của ACIS1 
• SAT có cấu trúc mở, bất kỳ chương trình nào 
cũng có thể sử dụng để đọc/ghi các file này2 
• Các phần mêm CAD 3D phổ biến đều hỗ trợ 
việc xuất và nhập file SAT 
• Phần mềm mô phỏng có thể đọc các file này 
và thể hiện trực tiếp mô hình 3D trong đó 
43 
1 ACIS  
2 SAT File Format  
Xuất dữ liệu bề mặt dưới dạng 
các mặt NURBS 
44 
Xuất dữ liệu bề mặt dưới dạng 
các mặt NURBS 
• Thư viện lập trình ObjectARX của AutoCAD 
cho phép truy cập thông tin biểu diễn bề mặt 
vật thể 
• Ta có thể đọc thông tin bề mặt và xuất ra dưới 
dạng các tham số biểu diễn mặt cong NURBS1 
• OpenGL cung cấp các hàm để hiển thị các bề 
mặt NURBS2 
45 
1 NURBS on Wikipedia  
2 An Introduction to NURBS and OpenGL  
Câu hỏi? 
TỐI ƯU HOÁ ĐỒ HOẠ 
47 
Tối ưu hoá đồ hoạ 
• Tính hiệu quả của chương trình mô phỏng 
OpenGL có thể được cải thiện bằng phần cứng 
(card đồ hoạ) và phần mềm 
• Hầu hết card đồ hoạ cao cấp đều hỗ trợ 
OpenGL 
• Phần mềm OpenGL có thể được viết để tăng 
tốc độ sử dụng nhiều kỹ thuật như dưới đây 
48 
Một số kỹ thuật tối ưu hoá 
chương trình OpenGL 
• Đa xử lý: Dùng nhiều CPU (lập trình song song) 
• Thay đổi chất lượng hình ảnh (như nói ở trên) 
• Tổ chức dữ liệu chương trình hợp lý 
– Ví dụ các hàm cần đến thông số toạ độ sẽ chạy nhanh hơn nếu dùng 
các toạ độ dưới dạng mảng (glVertex3fv(v) nhanh hơn 
glVertex3f(x,y,z)) 
• Giảm thiểu số lần gửi thông tin đồ hoạ xuống card đồ hoạ: 
– Ví dụ: Dùng lệnh glVertexPointerEXT() để gửi danh sách tất cả các 
điểm xuống card đồ hoạ một lần rồi dùng glDrawArraysEXT() để vẽ 
tam giác 
• Dùng các display list để đưa các hình ảnh vào bộ đệm đồ hoạ 
• Giảm số nguồn sáng nếu có thể, nhất là các nguồn sáng điểm 
49 
Câu hỏi? 

File đính kèm:

  • pdfbai_giang_lap_trinh_mo_phong_robot_va_he_co_dien_tu_me4291_b.pdf