PDA

View Full Version : Dự án Robotics PICVietnam


falleaf
15-02-2008, 01:26 PM
Mọi vấn đề về robotics đều xuất phát từ việc giải quyết các bài toán với ma trận. Khi thao tác tốt với các ma trận rồi, thì không còn vấn đề khó khăn nữa đối với việc phát triển các công thức tính toán kinh điển của robotics.

Hôm qua ngồi một buổi để làm riêng ra một cái Project gọi là R&P Robotic Project, trong đó tạo ra một cái lớp CRPMatrix dùng cho việc khởi tạo và sử dụng các ma trận.

Hầu hết các phần source code này đều đã có đầy đủ trên mạng, và vì F làm cũng không được bài bản cho lắm, cho nên giờ đúng thật là không thể nhớ nó nằm ở đâu, có thể là nó trong cuốn Receipt C thì phải.

Ngoài ra, còn một bộ source về Matrix nữa tại đây (http://www.robertnz.net/index.html). Đây là phần core để phát triển nên ROBOOP (http://www.cours.polymtl.ca/roboop/) (dự án rất nổi tiếng về robotics và đã từ đó phát triển cả toolbox robotics cho Matlab (http://www.petercorke.com/Home.html) - đồng chí này đẹp trai đấy chứ).

Nhưng làm việc với NewMat và Roboop có thể gây choáng cho một số bạn sinh viên mới bắt đầu làm quen với robotics và lập trình robotics, cho nên F chọn một giải pháp "vui vẻ" theo tinh thần của picvietnam, đó là lập ra một cái dự án mới hoàn toàn, bằng VC++ 6.0 bình thường, MFC Application bình thường, mọi thứ đều bình thường.

Việc F làm chỉ là tạo nên một cái CRPMatrix (R&P Matrix Class - tiện thể branding cho R&P kaka), đồng thời đưa vào cái nút nhấn OK một cái đoạn code ngắn, kèm với một hàm ShowMatrix(). F cũng đã để sẵn cái WorkSpace trong đó có hướng dẫn cách viết tạo mới một ma trận, nạp giá trị vào cho ma trận, thực hiện Inverse ma trận và view kết quả bằng ShowMatrix trong quá trình debug.

Như vậy công việc của các bạn là bấm F5 để chạy debug và xem kết quả tính toán. Sau đó, các bạn nên quay lại tìm hiểu file RPMatrix.h bằng View Class CRPMatrix, các bạn có thể đọc và tìm hiểu file RPMatrix.cpp để hiểu các hàm của nó được viết như thế nào.

Vì chưa có nhiều thời gian, nên thực sự F làm rất sơ sài. Tạm thời nó là cái CRPMatrix như vậy, sau này cần thêm cái gì, thì ta lại code thêm vào. Trong đó có hầu hết các công thức toán cần thiết với ma trận mà các bạn có thể sử dụng. Nếu các bạn viết trên Matlab như thế nào (không dùng Robotics Toolbox) thì chỉ cần sử dụng CRPMatrix, các bạn hoàn toàn có thể chuyển nó sang VC++ một cách dễ dàng.

Về việc support dự án này, F đã có một kế hoạch dài hạn, nhưng hiện đang rất thiếu người nghiên cứu và phát triển dự án, vậy nên bạn nào muốn tham gia dự án này thì liên hệ với F qua mail@falleaf.net nhé.

Lưu ý rằng ngành robotics ở Việt Nam hoàn toàn chưa phát triển gì, chưa kiếm tiền được, làm robotics vào thời điểm này có thể nói chỉ là làm chơi thôi. Cho nên F sẽ rất thích các bạn tham gia với tinh thần open 101%.

Ngoài ra, F cũng muốn phát triển nó trên nền Ubuntu, nhưng F thì cũng không có năng khiếu về thiết kế lắm, nên đụng vào mấy của nợ như kiểu QT hay GUI của VC++ F hơi nản lòng.

Rất mong được sự ủng hộ và hỗ trợ của các bạn. Hy vọng từ đây sẽ có một sự mở mang thoải mái hơn, đặc biệt F hướng tới những đối tượng mới học, mới tiếp cận. Những ai đã là "chuyên gia" xin miễn bình luận về những hoạt động "cò con" này, bởi có thể các bạn khi nhìn vào cái CRPMatrix sẽ thấy nó chỉ đúng như hạt cát so với cái ROBOOP vậy, nhưng tư tưởng của F luôn hướng tới cái gì đơn giản và dễ dàng, tutorial chứ không ebook, đọc thì được ít mà suy nghĩ phải nhiều. Tốt hơn là nên đọc tutorial đọc thì được nhiều (sướng, nhiều chữ), mà lại đỡ phải suy nghĩ :D.

Chúc vui

falleaf
15-02-2008, 01:48 PM
Đây là file RPMatrix.h, ngoài ra còn có các hình ảnh mà F đính kèm để cho các bạn chưa quen thuộc với VC++ xem. Các bạn bấm F5 để bắt đầu debug. Nhấn OK. Sau đó nhấn F5 để nhảy từng bước. Sau khi nhảy đến dòng int a =1 (dòng này vô nghĩa, chỉ viết đại đó để debug thôi), các bạn quan sát ở ô bên tay trái như trong hình. sau đó các bạn thay ShowMatrix(M1) bằng ShowMatrix(M2) thì các bạn sẽ nhìn thấy rõ kết quả của biến showMatrix.

Biến showMatrix là một mảng [100][100], vì vậy ma trận Mi sẽ được lưu vào 3 cột 0, 1, 2 của showMatrix.

Các bạn theo dõi loạt hình bên dưới đây.

Còn dưới đây là file RPMatrix.h để các bạn biết có các hàm nào trong đó.


class CRPMatrix
{
public:
// Cac phep toan ma tran
bool SVD(CRPMatrix& U, CRPMatrix& D, CRPMatrix& V);
double NormF(const CRPMatrix& A);
double Trace(const CRPMatrix& A);
double Cross(const CRPMatrix& A, const CRPMatrix& B);
double Dot(const CRPMatrix& A, const CRPMatrix& B) const;
CRPMatrix& Zero(void);
CRPMatrix& Inv(void);
friend CRPMatrix Inv(const CRPMatrix& A);
CRPMatrix& Tr(void);
friend CRPMatrix Tr(const CRPMatrix& A);
bool Eigen(CRPMatrix& EigenValue, CRPMatrix& EigenVector) const;
CRPMatrix& Copy(const CRPMatrix& A);

// Dinh nghia lai cac phep toan giua so thuc va ma tran
CRPMatrix operator/ (const double a);
CRPMatrix operator* (const CRPMatrix& A);
CRPMatrix operator* (const double a);
friend CRPMatrix operator* (double a, const CRPMatrix& A);
CRPMatrix operator- (const CRPMatrix& A);
CRPMatrix operator+ (const CRPMatrix& A);
CRPMatrix& operator= (const CRPMatrix& A);

// Cac thong tin ve kich thuoc ma tran
double GetLength(void);
int GetSize(void) const;
void GetSize(int* row, int* col);
int GetColSize(void) const;
int GetRowSize(void) const;
CRPMatrix GetColumn(const int col);
friend CRPMatrix GetColumn(const CRPMatrix& A, const int col);
CRPMatrix GetRow(const int row);
friend CRPMatrix GetRow(const CRPMatrix& A, const int row);
CRPMatrix GetMatrix(int row, int col);
bool SetRow(const int row, const CRPMatrix& A, const int Arow);
bool SetColumn(const int col, const CRPMatrix& A, const int Acol);

// Khoi tao va gan/dat cac gia tri ma tran
double GetAt(const int row, const int col) const;
double GetAt(const int i) const;
bool SetAt(const int i, const double value);
bool SetAt(const int row, const int col, const double value);
void New(const int rowsize, const int colsize);
void New(const int rowsize);
CRPMatrix& Eye(void);
CRPMatrix(const int rowsize, const int colsize);
CRPMatrix(const int rowsize);
CRPMatrix(CRPMatrix& A);
CRPMatrix(void);
virtual ~CRPMatrix();

protected:
// dung cho SVD
double pythag(const double a, const double b);

// cac bien toan cuc cua CRPMatrix
int m_iError;
int m_iCSize;
int m_iRSize;
bool m_bAlloc;
double **m_pElement;
};

svn
16-02-2008, 01:31 AM
Em làm 1 cái, nhưng mà bằng C# dc ko :D (nhìn code của VC ko thích tí nào, chỉ riêng VC mới ko thích thôi :( )
Hiện giờ thì mới chỉ có các phép tính cơ bản cho ma trận, phép xoay ma trận và giải hệ phi tuyến bằng Newton Raphson, giải hệ tuyến tính bằng nhân tử LU.
Đây là toàn bộ source và file dll đã biên dịch sẵn http://haminhtranhanh.googlepages.com/HaMTHaMathTools.zip
Em làm cái này cùng với lv, nhưng cảm thấy lv chưa hoàn chỉnh nên đưa cái này lên thôi vậy :D
Đoạn code ví dụ sử dụng:

using HaMTHaMathTools;
Matrix R, PB1, y;

...
PB1 = Matrix.Normalize(ParallelRobot.B1 - ParallelRobot.P); //B1 và P của lớp ParallelRobot //cũng là các ma trận
PB1[2, 0] = 0; //truy xuất từng phần tử của ma trận
y = Matrix.Normalize(PB1 & ParallelRobot.N); //& là phép tính hữu hướng 2 vectơ (xem vectơ //là ma trận có số hàng hoặc số cột = 1
R = Transform.Rotation(u,PB1) * Transform.Rotation(v,y); //Tìm ma trận quay quanh vectơ //PB1 một góc u và quanh vectơ y 1 góc v
...
X = new Matrix(6, 1); //tạo mới một ma trận có 6 hàng và 1 cột
X[0, 0] = ParallelRobot.B1[0, 0]; X[1, 0] = ParallelRobot.B1[1, 0];
X[2, 0] = ParallelRobot.B2[0, 0]; X[3, 0] = ParallelRobot.B2[1, 0];
X[4, 0] = ParallelRobot.B3[0, 0]; X[5, 0] = ParallelRobot.B3[1, 0];
X = Numerics.NewtonRaphson(HeFtinhDonghocnghich, JacobiDonghocnghich, X, 5000, Math.Pow(10, -12)); //giải hệ phi tuyến với nghiệm ban đầu là X, số lần lặp tối đa là 5000, //sai số là 10^(-12)
...

Thư viện trên của em chưa hoàn chỉnh lắm, phần ma trận vẫn còn thiếu nhiều phép tính :D
Các lớp Matrix, Transform, Numerics nằm trong HaMTHaMathTools :)
Các bác xem qua, nếu có thể phát triển dc cho hoàn chỉnh thì ta làm luôn dc ko

falleaf
16-02-2008, 12:00 PM
Rất là hay, khi mà bắt đầu đưa tài liệu lên và cùng nghiên cứu thì sẽ có nhiều người cùng chia sẻ. Rất mong được sự hỗ trợ của các bạn.

Chúng ta sẽ tiếp tục thảo luận về các vấn đề này, bởi PIC Vietnam nhất định sẽ phải triển khai một hệ thống hoàn thiện để phát triển robotics.

Chúc vui

minhpupil
17-02-2008, 01:44 AM
Cho em hỏi là thư viện " Spacelib in C" , có cách nào add nó để dùng cho MFC không ạ?
Nếu add được thì khỏi lo về vấn đề ma trận nữa và ta chỉ lấy ra xài thôi?

falleaf
17-02-2008, 03:10 AM
Cái SpaceLib sẽ phục vụ được việc phát triển phần embedded mạnh, vì hầu hết các con dsp bây giờ chỉ mới hỗ trợ C mạnh, chưa phát triển được C++, có mỗi thằng Booster C++ viết cho PIC mà F có từ rất lâu, có cả bản quyền, nhưng cũng quá cũ rồi, F cũng chưa có điều kiện phát triển nó và cũng không muốn làm rối loạn xu hướng phát triển nên vẫn chưa tung ra nghiên cứu. Cũng có thể có nhiều người có, nhưng thực sự nó chưa cần vào lúc này.

Do vậy, nếu bạn đã nắm thằng nào về C mạnh, thì bạn có thể nghiên cứu thêm xem bộ thư viện nào là mạnh nhất trên C. Cũng giống như có rất nhiều thằng có thư viện ma trận mạnh, nhưng mà thằng newmat vẫn nên dùng bởi vì nó được ROBOOP dùng, mà ROBOOP thì lại quá mạnh thế nên ta lại dùng... :)

Mục tiêu ban đầu của F, đó là giúp các bạn làm quen đã, và có thể chúng ta sẽ phải đi làm lại khá nhiều việc mà những người đi trước đã làm, nhưng nó cần thiết để phát triển một hệ thống hoàn chỉnh và có cơ sở.

F đã nhận được email của Minh, rất vui nếu bạn cùng tham gia dự án này.

Công việc trước mắt của chúng ta, có lẽ sẽ là nghiên cứu và làm lại toàn bộ cái CRPMatrix, và thậm chí chúng ta sẽ phải nghiên cứu để code trên C/C++ Linux mà F chủ trương phát triển trên nền Ubuntu.

Bạn xem bài viết tại đây:
http://dientuvietnam.net/forums/showthread.php?t=10797

Lưu ý một điều rằng Eclipse chạy trên Ubuntu vẫn hơi chậm, máy F chạy core 2 duo 2G và 1G RAM nên thấy chạy ổn, chưa bị gì, nhưng một số bạn ở VN thì đúng là có gặp vấn đề với Eclipse trên Ubuntu khi chạy các máy cũ (hơi nặng nề một chút). Nhưng dù sao thì ta vẫn chọn công cụ này, bởi tương lai nó sẽ khá mạnh. Các đồng chí phát triển Eclipse CDT hầu hết đều khoái xài Windows, chắc sắp tới sẽ hay ho hơn.

Chúc vui

conso0
18-02-2008, 09:46 PM
các anh ơi!em nghe các anh nói về chủ đề này thú vị quá,em cũng muốn tham gia nhưng chỉ mỗi tội là biết ít quá.Mong các anh hướng dẫn em học theo với.Em phải bắt đầu từ đâu ạ?
Chúc các anh thành công!!!

minhpupil
19-02-2008, 11:48 PM
Bạn đã biết gì về Robot chưa>? Ma trận DH, động học thuận, động học nghịch, động học vận tốc, động lực học?

Nếu chưa, bạn down file này về thử xem.

http://www.esnips.com/doc/164d4d8d-0a1d-45bb-ba3e-f62e0e04ff5b/Robot-Cong-Nghiep

falleaf
21-02-2008, 09:13 AM
Các bạn chú ý tới phần lập trình trên Ubuntu luôn nhé, vì khi phát triển dự án này, chúng ta sẽ triển khai dạng Cross Platform. Bước đầu sẽ triển khai trên MFC bình thường, sau này sẽ chuyển dần sang Ubuntu.

Chúc vui

conso0
28-02-2008, 10:24 AM
Bạn đã biết gì về Robot chưa>? Ma trận DH, động học thuận, động học nghịch, động học vận tốc, động lực học?

Nếu chưa, bạn down file này về thử xem.

http://www.esnips.com/doc/164d4d8d-0a1d-45bb-ba3e-f62e0e04ff5b/Robot-Cong-Nghiep

Cảm ơn minhpupil nhé! thực ra mình đã về bài toán xây dựng ma trận DH,động học thuận ,ngược rồi nhưng chưa từng làm về động học vận tốc và động lực học.Trước mình mới chỉ giải quyết tính toán mấy bài toán đó trên Matlab chứ ko làm như mấy anh là viết trong VC++,mình download cả công cụ toolbox robotics cho matlab của anh F nhưng chẳng biết sử dụng như thế nào nên ko rõ hướng đi lắm
Rất mong anh em trong diễn đàn giúp đỡ thêm!

falleaf
28-02-2008, 10:48 AM
Bản chất khi giải các bài toán động học thuận, động học ngược cho robot, thì em phải giải quyết các phép toán với ma trận. Thế thì để lập trình tính toán một mà trận nào đó, bình thường em dùng matlab, em sẽ có:

A = [...; ...; ...; ...]
B = [...; ...; ...; ...]

Rồi em lấy A + B, A*B, inv(A)... để em giải bài toán Kinematics.

Vậy thì trong C++ nó chưa có cái việc khai báo thế nào là một ma trận, chưa có phép tính giữa các ma trận, cái Class CRPMatrix dùng để làm việc đó.

Chúc vui

conso0
19-03-2008, 03:34 PM
Bản chất khi giải các bài toán động học thuận, động học ngược cho robot, thì em phải giải quyết các phép toán với ma trận. Thế thì để lập trình tính toán một mà trận nào đó, bình thường em dùng matlab, em sẽ có:

A = [...; ...; ...; ...]
B = [...; ...; ...; ...]

Rồi em lấy A + B, A*B, inv(A)... để em giải bài toán Kinematics.

Vậy thì trong C++ nó chưa có cái việc khai báo thế nào là một ma trận, chưa có phép tính giữa các ma trận, cái Class CRPMatrix dùng để làm việc đó.

Chúc vui

Cảm ơn Anh!
Chúc các Anh thành công nhé!
Tất cả vì sự nghiệp R nước nhà!

vmt.dttt
05-05-2008, 06:59 PM
Nhưng anh làm trên phần mềm nào thế ?
Cho em xin link dowload và cả crack luôn nhé ./
Cám ơn anh./

towardthesea
23-07-2008, 04:52 PM
Anh Falleaf ơi anh có thể nói rõ hơn về hướng mà anh định phát triển cái robotics đó được không? Em rất khoái món đó nhưng không biết anh định làm theo hướng thế nào để có thể tham gia với nhóm được không?

duyanh007
05-01-2009, 11:32 AM
cho em hoi bai toan sau cac anh giai ra rui huong dan cho em voi

Khai bao mang 1 chieu toi da 20 phan tu
Tao cac gia tri tu dong cho mang (-20 -> 20)
Sap xep mang tang dan
Tim gia tri K co trong mang

kstn
28-01-2009, 02:32 PM
Đã sử dụng được thư viện roboop để tính toán động học thuận + nghịch cho robot dạng chuỗi động hở. Tui cũng tìm ra là roboop sử dụng RNEA (Recursive Newton Euler Algorithm) để tính toán động lực học ngược. Còn bài toán động lực học thuận vẫn chưa hiểu về cách tích phân tính vận tốc & vị trí từ gia tốc, có đồng chí nào làm rồi xin cho vài gợi ý.
Sử dụng OpenGL tui cũng xây dựng đc một chương trình 3D đơn giản hiển thị cánh tay máy (dạng như kuka) tuy nhiên chỉ hiển thị các trục tọa độ khớp vì tui kô có data về skin & texture của robot:confused: Từ đây tui đi theo hướng điều khiển robot đi theo một quĩ đạo cho trước (trajectory planning). Có thể move theo đường thẳng/phương trình/nubs. Tuy nhiên tui cũng kô có data thực nghiệm nên chỉ viết/kiểm tra rồi để đó. Một lần nữa có đồng chí nào đã làm về kuka programming/trajectory planning thì gợi ý nên làm như thế nào
Sử dụng c++ để lập trình tính toán robot thì nhanh nhưng làm GUI kô quen. Có đồng chí nào làm cái wrapper để xài roboop trên c# thì rất hoan nghênh:)
Trên c# chúng ta có thể sử dụng thư viện RADLib của anh Phạm Hữu Ngôn để vẽ 3D. Nếu ai từng làm mô phỏng robot thì sẽ thấy có cái mô hình robot đàng hoàng quan trọng đến mức nào