Sub Project 1 1 Robo Kick S. Lê guyên Khôi rường Đại học Công nghệ, ĐHQGH Chạy RoboKick và hiểu nội dung: nhấ chuột trái và chuột hải bấm hím lên, xuống, trái, hải Mini roject 1: Cho hé các hình vuông di chuyển sang một bên Mini roject : việc quả bóng lăn trên sàn (Chú ý: không trượt điểm mặt đất) Mini roject 3: ạo hai bức tường trên sàn và mô hỏng điểm dừng và chuyển động theo hướng ngược lại khi bóng chạm vào tường Sub Project Sub Project 3 3 và hiển thị (các) quả bóng nảy trên mặt đất và tường nảy giữa hai bức tường và mặt đất và hiển thị chân đá bóng 1
Sub Project 4 4 Sub Project 5 5 và hiển thị hành động đá bóng và điều khiển chân Cải thiện tính năng động Cải thiện mô hình tiế xúc/va chạm Mở rộng sang 3D Sub Project 6 6 Robo Kick ộ Bài 7 Dự đoán quỹ đạo bay của quả bóng Xây dựng AI-Robot biết đá bóng Ý tưởng Báo cáo Mã nguồn huyết trình Demo
hiết Kế/Xây Dựng Chương rình Định nghĩa kiểu dữ liệu cho quả bóng và chân robot Sử dụng hàm để mô tả chuyển động cho mỗi vật hực hiện: khởi tạo, mô hỏng, đồ họa, xử lý ngoại lệ hiết kế giao diện thân thiện, đồ họa đẹ 8 Dữ Liệu struct Ball struct Ball int id; double r; /* radius - bán kính */ double m; /* mass - khối lượng */ double x, y, tht; double dx, dy, dtht; double ddx, ddy, ddtht; ; Ball b1; b1.id, b1.x, b1.y Ball aball[1]; aball[].x aball[i].x 9 1 Quản Lý Point Sử Dụng struct struct Leg int id; double joint_x, joint_y, leg_tht; Ball foot; double leg_len; ; x, y, q Cấu rúc Chương rình Chính 11 Leg r_leg, l_leg leg_len foot 3
Hàm ự Định ghĩa 1 Phạm i Biến Số 13 a b b m m c KiểuDữLiệu ênhàm (KiểuDữLiệu1 hamsố1 double a, b; /* toàn cục */ KiểuDữLiệu1 hamsố1 KiểuDữLiệu1 hamsố1) khai báo biến sử dụng trong hàm chức năng của hàm return (giá trị hàm) double f1(int x) /* hàm f1 */ int b; /* dịa hương */ double m; /* dịa hương */ main() /* hàm main */ int m, c; /* địa hương */ f1(m); ính oán Chuyển Động 14 Cấu rúc Chương rình Chính 15 static double ang =.; /* khởi tạo */ void simu(void) ang = ang + 1.; /* tăng thêm 1 */ if (ang > 36.) ang = ang - 36.; /* hiển thị */ render(); 4
ính oán Chuyển Động 16 Mô Phỏng í Dụ 17 x f / m, x q / I z z q q x x x dt, x x y y q q q dt y y f / m y x dt dt q dt y y x dt q dt y dt y dt = = 1 h gt static double angle Khởi = tạo.; void simu(void) angle = angle + 1.; render(); void dislay() ính oán ích Phân 18 ính oán Chuyển Động 19 x x x x dt x x n x n x 1 n1 t b1.ddx = f_x / b1.m; b1.ddy = f_y / b1.m; b1.ddtht =??? ; b1.x = b1.x + b1.dx * dt + b1.ddx * dt*dt/.; b1.y = b1.y + b1.dy * dt + b1.ddy * dt*dt/.; b1.tht = b1.tht + b1.dtht * dt + b1.ddtht * dt*dt/.; x n1 b1.dx = b1.dx + b1.ddx * dt; b1.dy = b1.dy + b1.ddy * dt; b1.dtht = b1.dtht + b1.ddtht * dt; ; = = = = t t t roll : rolling friction coefficient f = roll 5
Mô Phỏng Góc Quay 1 Mô Phỏng a Chạm static double Khởi angle = tạo.; static double tạo ang Khởi =.; double dx = 1.; double dt =.1; double dangle = 1.; void dislay() void simu(void) angle = angle + 1; if ( ) dangle = render(); angle ính += dangle; vị trí bóng void simu(void) x = x + 1; if ( )Mô dx = -dx; render();hỏng x = ính x + vị dx*dt; trí bóng Mô Phỏng Chuyển Động a Chạm = f= roll - if (C_mode == 1 && x < x_wall ) C_mode = ; m + = r m - - -1 - -1 = = + -1 +1 +1 m + = r m - mbb_+ + mll_+ = r (mbb_- + mll_- ) + +1 =- r a chạm +1 + Chuyển động tự do C_mode = -1 =- r + -1 =- - -1-3 if (C_mode == && x >= x_wall ) Cl_mode = 1; v_x = -.9 * v_x; roll : rolling friction coefficient Chuyển Động Bóng & Chân = = void dislay() ếu va chạm +1 Lậrình âng Cao + C_mode = 1 +1 6
Cấu rúc Chương rình Chính 4 Cấu rúc Chương rình Chính 5 initdis() checkmodeye() đồ họa initenv() môi trường mô hỏng: tường, sân, (kích cỡ, ma sát, ) initball() initleg() t vật = t thể + dtmô hỏng: bóng & chân (kích cỡ, khối lượng, vị trí, vận tốc Kiểm tra loại chuyển động của bóng và chân simuenv() ính toán thay đổi của môi trường trọng lực, ma sát, va chạm, simukick() ính toán va chạm của bóng và chân simuball(), simuleg() ính toán chuyển động của bóng và chân oán ử & 6 oán ử * 7 oán tử & trả về địa chỉ của biến int *, v1, v; v1 = 1; v = ; = &v1; = &v; x44ab1 xff3 Dòng 4: đặt biến con trỏ chỉ tới biến v1 bằng địa chỉ của v1 Dòng 5: đặt biến con trỏ chỉ tới biến v chỉ tới v v1 1 x44ab1 v xff3 oán tử * truy xuất giá trị của vùng nhớ được quản lý (lưu) bởi con trỏ int *, v1, v; v1 = 1; = &v1; cout << *; v = ; = &v; cout << *; xff3 Dòng 4: in ra 1 (giá trị biến v1, mà chỉ tới) Dòng 6: in ra (giá trị biến v, mà chỉ tới) x44ab1 v1 1 x44ab1 v xff3 7
oán ử = 8 oán ử = 9 Gán giá trị int v1 = 1, v = ; int * = &v1; int *q = &v; * = *q; x44ab1 xff3 Dòng 3, 4: chỉ tới v1, q chỉ tới v Dòng 5: sử dụng toán tử * truy cậ vùng tới nhớ con trỏ quản lý * là v1, *q là v, dòng 5 tương đương v1 = v; q 1 x44ab1 v v1 xff3 Gán con trỏ int v1 = 1, v = ; int * = &v1; int *q = &v; = q; Dòng 3, 4: chỉ tới v1, q chỉ tới v Dòng 5: gán bằng q không quản lý v1 và q cùng quản lý v xff3 v1 x44ab1 q xff3 1 x44ab1 v xff3 Building Block 3 Building Block 31 struct RigidBody double x, y, theta; double dx, dy, dtheta; double ddx, ddy, ddtheta; ; int main() RigidBody foot; foot.x = 1.; foot.y =.; foot.theta = 9.; foot.x =.5; foot.y = 1.; foot.theta = -5.; x O z y struct RigidBody double x, y, theta; double dx, dy, dtheta; double ddx, ddy, ddtheta; struct RigidBody *next; ; int main() RigidBody body, leg, foot; body.next = ⋚ leg.next = &foot; foot.next = ULL x O z y 8