Tải bản đầy đủ
7 Robot vẽ theo quỹ đạo đường thằng

7 Robot vẽ theo quỹ đạo đường thằng

Tải bản đầy đủ

Hình 3.7: Robot vẽ đường thằng

57

KẾT LUẬN
 Những kết quả đạt được

Sau thời gian thực hiện đồ án, quá trình nghiên cứu và tìm hiểu đã đạt
được một số kết quả sau:


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 chương trình phần mềm OpenGL để lập
trình mô phỏng.



Xây dựng được một 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.
 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 độ xử lý đồ họa nhanh hơn, đọc các File
dữ liệu nhanh hơn mà không bị đơ chương trình.

58

TÀI LIỆU THAM KHẢO
[1]

Lê Phong (2009), Hướng dẫn lập trình OpenGL căn bản.

[2]

Mason Woo, Jackie Neider, Tom Davis (January 1997), Opengl
Programming Guide: The Official Guide to Learning Opengl (The Red
book), Version 1.1, Addison-Wesley Pub (Sd).

[3]

Phạm Hồng Thái (2008), Bài giảng Ngôn ngữ lập trình C/C++, Đại học
Quốc Gia Hà Nội.

[4]

TS Phạm Đăng Phước (2007), Robot công nghiệp, NXB Đại học Đà Nẵng.

[5]

PGS.TS Đào Văn Hiệp (2003), Kỹ thuật robot công nghiệp, NXB Khoa
học và kỹ thuật.

[6]

Diễn đàn, website liên quan:
http://www.opengl.org/
http://www.opengl.org/sdk/docs/man/xhtml/
http://www.opengl.org/wiki/Code_Resources
http://code.google.com/p/mophongrobot/wiki/Baigiang
http://svbk.vn/threads/24401-Su-dung-VC-ket-hop-voi-OpenGl-de-mophong-dong-hoc-robot?s=6cd724ce7c068c0f97f256ad31abad45

59

PHỤ LỤC
1. Mã nguồn chương trình

MainFrm.cpp
#include "stdafx.h"
#include "RobotKUKA.h"
#include "MainFrm.h"
#include "RobotKUKAView.h"
#include "CTRPANEL.h"
void CMainFrame::Run(double a, double b, double c, double d)
{ ((CRobotKUKAView*)m_Splitter.GetPane(0,1))-> NhapGiaTriTheta (a,b,c,d);
}
void CMainFrame::QDao(double _xE, double _yE, double _zE)
{((CRobotKUKAView*)m_Splitter.GetPane(0,1))->ToaDoQDao(_xE,_yE, _zE);
}
void CMainFrame::_CLear()
{ ((CRobotKUKAView*)m_Splitter.GetPane(0,1))->F_Clear();
}
RobotKUKAView.cpp
#include "stdafx.h"
#include "RobotKUKA.h"
#include "RobotKUKADoc.h"
#include "RobotKUKAView.h"
#define Pi 3.1415926535897932384626433832795
CRobotKUKAView::CRobotKUKAView()
{
m_pInitGL = new CInitOpenGL(this);//con tro khoi toa thu vien OPENGL
m_pInitGL->SetScale(1.3); //ty le 1,3
m_pInitGL->m_TranslateX = -500;
m_pInitGL->m_TranslateZ = -100;
m_pInitGL->m_RotateY = 20;

60

d1 = 85, a1=40, a3 = 67.5, a2 = 100;//do dai cac khau cua Robot
t= 0, a=12, b=20, c=10;//khoi tao gia tri cac bien trung gian
theta1 = 0.321750554396642;
theta2 = -0.561525972720257;
theta3 = 1.60659052346729;
}
void CRobotKUKAView::ToaDoQDao(double _xp, double _yp, double _zp)
{

//nhap quy dao
xp = _xp;

yp = _yp;

zp = _zp;

m_QuyDao.addPoint(CPoint4D(xp, yp, zp));//ve quy dao
}
void CRobotKUKAView::NhapGiaTriTheta(double _a, double _b, double _c, double
_d)
{
theta1= _a; //dat gia tri cho goc quay theta 1
theta2 = _b, theta3= _c,

d = _d;

Paint();//ve robot o vi tri moi
}
void CRobotKUKAView::Paint()
{
m_pInitGL->BeforeDrawing();//bat dau ve
glPushMatrix();//bat dau he toa do tuyet doi xyz
m_nen.setMaterial(storageMaterial[11]);//Mau den
m_dem.setMaterial(storageMaterial[12]);// Mau xanh nuoc bien

// Mau m_de1.setMaterial(storageMaterial[12]);// Mau xanh nuoc bien
m_de.setMaterial(storageMaterial[3]);// Mau do
m_Khau1.setMaterial(storageMaterial[5]);// Mau vang

61

m_Khau2.setMaterial(storageMaterial[0]);// Mau xanh la cay
m_Khau3.setMaterial(storageMaterial[6]);// Mau nau
//cac lenh hieu chinh he toa do
m_pInitGL->UseUCS();//su dung he toa do
m_pInitGL->TranslateGL();
m_pInitGL->MouseMoveGL();
m_pInitGL->ScaleGL();
glPushMatrix();//bat dau he toa do tuong doi uvw
// ve de robot
m_de.drawObject(); //ve de
glTranslated(0, 0, -2); //dich xuong truc z 2
m_dem.drawObject();//ve dem
m_nen.drawObject();//ve mieng nen
glTranslated(0, 0, 2); //tro lai vi tri goc (dang su dung he toa do tuong doi)
//ve he truc toa do xyz
//truc z
glColor3f(55,0,134);
glRasterPos3d(0,5,100);
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'Z');
glBegin(GL_LINES); //ve duong thang
glVertex3d(0,0,0);
glVertex3d(0,0,100);
glVertex3d(0,0,100);
glVertex3d(0,4,93);
glVertex3d(0,0,100);
glVertex3d(0,-4,93);
glEnd();
//truc y
glColor3f(0,0,134);

62

glRasterPos3d(0,80,0);
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'Y');
glBegin(GL_LINES);
glVertex3d(0,0,0);
glVertex3d(0,80,0);
glVertex3d(0,80,0);
glVertex3d(0,73,4);
glVertex3d(0,80,0);
glVertex3d(0,73,-4);
glEnd();
//truc x
glColor3f(5,155,0);
glRasterPos3d(80,5,0);
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'X');
glBegin(GL_LINES);
glVertex3d(0,0,0);
glVertex3d(80,0,0);
glVertex3d(80,0,0);
glVertex3d(73,04,0);
glVertex3d(80,0,0);
glVertex3d(73,0-4,0);
glEnd();
//khau1
glTranslated(0, 0, 50);//di chuyen theo truc z 50 (chieu cao de robot)
glRotated(theta1*180/Pi, 0, 0, 1);//xoay he toa do di goc theta1
m_Khau1.drawObject();//va ve khau 1
//khau2
glTranslated(a1, 5, 35);
glRotated(theta2*180/Pi, 0, 1, 0);
m_Khau2.drawObject();

63

// khau3
glTranslated(a2, 0, 0);
glRotated(theta3*180/Pi, 0, 1, 0);
m_Khau3.drawObject();
//ve truc toa do x1y1z1(uvw)
//truc z1
glColor3f(55,0,134);
glRasterPos3d(a3,-33,0);
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'W');
glBegin(GL_LINES);
glVertex3d(a3,-5,0);
glVertex3d(a3,-30,0);
glVertex3d(a3,-30,0);
glVertex3d(a3,-23,4);
glVertex3d(a3,-30,0);
glVertex3d(a3,-23,-4);
glEnd();
//truc y1
glColor3f(0,0,134);
glRasterPos3d(a3,5,33);
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'V');
glBegin(GL_LINES);
glVertex3d(a3,-5,0);
glVertex3d(a3,0,30);
glVertex3d(a3,0,30);
glVertex3d(a3,4,23);
glVertex3d(a3,0,30);
glVertex3d(a3,-4,23);
glEnd();
//truc x1

64

glColor3f(5,155,0);
glRasterPos3d(a3+33,0,3);
glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'U');
glBegin(GL_LINES);
glVertex3d(a3,-5,0);
glVertex3d(a3+30,0,0);
glVertex3d(a3+30,0,0);
glVertex3d(a3+23,0,4);
glVertex3d(a3+30,0,0);
glVertex3d(a3+23,0,-4);
glEnd();
glPopMatrix();//ket thuc he toa do tuong doi uvw
m_QuyDao.drawPoints();//ve quy dao
glPopMatrix();//ket thuc he xyz
m_pInitGL->AfterDrawing();//ket thuc ve voi GL
}
void CRobotKUKAView::F_Clear()
{

m_QuyDao.clear();//xoa quy dao

}
CTRPANEL.cpp
#include "stdafx.h"
#include "RobotKUKA.h"
#include "CTRPANEL.h"
#include "RobotKUKAView.h"
#include "MainFrm.h"
#define Pi 3.1415926535897932384626433832795
IMPLEMENT_DYNCREATE(CCTRPANEL, CFormView)
CCTRPANEL::CCTRPANEL()
: CFormView(CCTRPANEL::IDD)
{

//{{AFX_DATA_INIT(CCTRPANEL)

65

m_ax = 12, m_by = 20, m_cz = 10;
m_IndextHAMBD = 0;
m_Xp = _T("xp = 160+a*cos(t);");
m_Yp = _T("yp = 50+b*sin(t);");
m_Zp = _T("zp = 90+c*sin(4*t);");
m_theta1 = xp;//0.0;
m_theta2 = yp;//0.0;
m_theta3 = zp;//0.0;
//}}AFX_DATA_INIT
d1 = 85, a1 = 40 , a2 = 100, a3 = 67.5;
j=0;
xp = 160+ m_ax*cos(t);
yp = 50 + m_by*sin(t);
zp = 90 + m_cz*sin(4*t);
}
void CCTRPANEL::OnRun()
{
CLear();
UpdateData(TRUE);
KillTimer(2);
SetTimer(1, 1, NULL);//khoi dong bo dinh thoi 1 tan so khoang 1ms
}
void CCTRPANEL::OnStop()
{
CLear();
UpdateData(TRUE);
KillTimer(1), KillTimer(2);
GetDlgItem (IDC_LIST_HAM_DB)->EnableWindow(TRUE);
GetDlgItem (IDC_AX)->EnableWindow(TRUE);
GetDlgItem (IDC_BY)->EnableWindow(TRUE);

66

GetDlgItem (IDC_CZ)->EnableWindow(TRUE);
}
void CCTRPANEL::OnBack()
{
CLear();
UpdateData(TRUE);
KillTimer(1);
SetTimer(2, 1, NULL);//khoi dong bo dinh thoi 2 tan so khoang 1ms
}
void CCTRPANEL::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case 0:
t+=0.03, t2+= 0.01;
Cul2();
GetDlgItem (IDC_LIST_HAM_DB)->EnableWindow(FALSE);
GetDlgItem (IDC_AX)->EnableWindow(FALSE);
GetDlgItem (IDC_BY)->EnableWindow(FALSE);
GetDlgItem (IDC_CZ)->EnableWindow(FALSE);
((CMainFrame*)AfxGetMainWnd())-> Run(theta1,theta2,theta3,0);
((CMainFrame*)AfxGetMainWnd())-> QDao(xp,yp,zp);
UpdateData(FALSE);
InvalidateRect(NULL, FALSE);
break;
case 1:
t+=0.03;
Calculater();
GetDlgItem (IDC_LIST_HAM_DB)->EnableWindow(FALSE);
GetDlgItem (IDC_AX)->EnableWindow(FALSE);

67