Professional Documents
Culture Documents
BỘ GIÁO DỤC VÀ ĐÀO TẠO CỘNG HOÀ XÀ HỘI CHỦ NGHĨA VIỆT NAM
TRƯỜNG ĐHBK HÀ NỘI Độc lập - Tự do - Hạnh phúc
VIỆN CƠ KHÍ
BỘ MÔN CSTKM & ROBOT
NHIỆM VỤ
ĐỒ ÁN TỐT NGHIỆP
Ngành: CƠ ĐIỆN TỬ
Chương 1 Phương trình động học rôbốt tự hành đa hướng kiểu bánh xe
Menanum
Chương 2 Thiết kế bộ điều khiển phản hồi trạng thái tuyến tính cho Rôbốt tự
hành đa hướng kiểu bánh xe Mecanum
Chương 3 Chế tạo thực nghiệm
3. Giáo viên hướng dẫn
Phần Nội dung Giảng viên
ii
NHẬN XÉT
CỦA GIẢNG VIÊN HƯỚNG DẪN
Họ và tên sinh viên: Nguyễn Thành Long Ngành: Cơ điện tử Khoá: 62
iii
KẾT LUẬN
Với chất lượng và kết quả đạt được của đồ án đạt được trong bối cảnh phải nối là dình dập
đi được lên phòng thí nghiệm thì kết quả này ngoài mong đợi. Do đó tôi đề nghị để sinh viên
Nguyễn Thành Long được bảo vệ trước hội đồng đánh giá tốt nghiệp.
Điểm đánh giá: Nguyễn Thành Long 10/10
Hà nội, ngày 17 tháng 02 năm 2022.
Người nhận xét
(Ký, ghi rõ họ tên)
iv
NHẬN XÉT
CỦA NGƯỜI PHẢN BIỆN
Họ và tên sinh viên: Nguyễn Thành Long
Ngành: Cơ điện tử Khoá: 62
Với đề tài: THIẾT KẾ CHẾ TẠO RÔBỐT TỰ HÀNH ĐA HƯỚNG KIỂU BÁNH
XE MECANUM
Giảng viên hướng dẫn: TS. NGUYỄN HỒNG THÁI
Đơn vị công tác: BM. CƠ SỞ THIẾT KẾ MÁY & RÔ BỐT, VIỆN CƠ KHÍ
Địa chỉ: D3-304, ĐHBKHN, Số 1, Đại Cồ Việt.
E- mail: thai.nguyenhong@hust.edu.vn
Người nhận xét:
Đơn vị công tác:
vi
Trong thời gian tìm hiểu và nghiên cứu dưới sự hướng dẫn tận tình của
TS. Nguyễn Hồng Thái và sự góp ý đầy bổ ích của các thầy trong bộ môn Cơ sở Thiết kế
máy và Rô bốt cũng như các thầy cô trong trường Đại Học Bách Khoa Hà Nội, em đã hoàn
thành đồ án tốt nghiệp của mình. Qua quá trình làm đồ án, em đã củng cố được rất nhiều kiến
thức cơ bản, tìm hiểu thêm những vấn đề mới cũng như phương pháp tư duy, tìm tòi khi giải
quyết một vấn đề cụ thể, đặc biệt như tìm hiểu về điều khiển động lực học Rôbốt. Song vì thời
gian có hạn, hạn chế về mặt kiến thức và kinh nghiệm làm việc nên đồ án không tránh khỏi
những sai sót, em rất mong nhận được những ý kiến đóng góp của các thầy và các bạn để em
hoàn thiện hơn về mặt chuyên môn cũng như cung cách làm việc. Qua đây, em xin gửi lời cảm
ơn chân thành đến các thầy trong bộ môn Cơ sở Thiết kế máy và Rô bốt và đặc biệt em xin
bày tỏ lòng biết ơn sâu sắc nhất của mình đến thầy TS. Nguyễn Hồng Thái đã tận tình và
dành rất nhiều tâm huyết cho em. Em xin chúc thầy và gia đình thật nhiều sức khỏe nhiều
niềm vui và hạnh phúc trong cuộc sống.
vii
MỤC LỤC
LỜI NÓI ĐẦU .......................................................................................................................... vii
DANH MỤC CÁC HÌNH VẼ VÀ ĐỒ THỊ ................................................................................ x
DANH MỤC CÁC BẢNG ...................................................................................................... xiii
LỜI MỞ ĐẦU ............................................................................................................................. 1
Chương 1 ..................................................................................................................................... 4
PHƯƠNG TRÌNH ĐỘNG HỌC RÔBỐT TỰ HÀNH ĐA HƯỚNG KIỂU BÁNH XE
MECANUM ................................................................................................................................ 4
1.1 GIỚI THIỆU CHUNG....................................................................................................... 4
1.2 PHƯƠNG TRÌNH ĐỘNG HỌC CỦA AVG ĐIỀU HƯỚNG LINH HOẠT KIỂU
BÁNH XE ĐA HƯỚNG MECANUM ................................................................................... 7
1.2.1 Bài toán động học thuận ........................................................................................... 10
1.2.2 Bài toán động học ngược .......................................................................................... 10
1.3 THIẾT KẾ QUỸ ĐẠO CHUYỂN ĐỘNG BẰNG ĐƯỜNG CONG NURBS ............... 11
1.3.1 Đường cong NURBS ................................................................................................ 11
1.3.2 Đường cong và hàm NURBS ................................................................................... 13
1.3.3 Đạo hàm đường cong NURBS ................................................................................. 15
1.3.4 Thiết kế đường cong ................................................................................................. 16
1.4 KHẢO SÁT QUỸ ĐẠO CHUYỂN ĐỘNG CỦA ĐƯỜNG CONG BẤT KỲ .............. 19
1.4.1 Thiết kế quỹ đạo ....................................................................................................... 19
1.4.2 Khảo sát các chuyển động của xe ............................................................................. 20
KẾT LUẬN CHƯƠNG 1 ...................................................................................................... 29
Chương 2 ................................................................................................................................... 30
THIẾT KẾ BỘ ĐIỀU KHIỂN PHẢN HỒI TRẠNG THÁI TUYẾN TÍNH CHO RÔBỐT TỰ
HÀNH ĐA HƯỚNG KIÊU BÁNH XE MECANUM .............................................................. 30
2.1 THIẾT LẬP MÔ HÌNH SAI SỐ ĐỘNG HỌC ............................................................... 30
2.2 THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN PHẢN HỒI TRẠNG THÁI TUYẾN TÍNH.... 31
2.3 THIẾT KẾ QUỸ ĐẠO ĐƯỜNG CONG NURBS .......................................................... 33
2.4 KẾT QUẢ MÔ PHỎNG SIMULINK MATLAB ........................................................... 34
KẾT LUẬN CHƯƠNG 2 ...................................................................................................... 40
Chương 3 ................................................................................................................................... 41
CHẾ TẠO THỰC NGHIỆM ..................................................................................................... 41
3.1 MÔ TẢ CẤU TRÚC CỦA RÔBỐT ............................................................................... 41
3.1.1 Cấu trúc thân xe ........................................................................................................ 41
3.1.2 Phần mềm chương trình............................................................................................ 43
3.1.3 Bộ điều khiển ............................................................................................................ 43
3.2 CẤU TRÚC BỘ DẪN ĐỘNG ........................................................................................ 43
3.3 CẤU TRÚC PHẦN CỨNG CỦA BỘ ĐIỀU KHIỂN ..................................................... 45
3.4 THÔNG SỐ KỸ THUẬT CỦA CÁC THIẾT BỊ PHẦN CỨNG ................................... 46
3.5 CHẾ TẠO THỰC NGHIỆM ........................................................................................... 50
3.6 THỰC NGHIỆM THỬ NGHIỆM ................................................................................... 51
3.6.1 Chế độ bằng tay ........................................................................................................ 51
3.6.2 Chế độ điều khiển tự động bám theo quỹ đạo .......................................................... 56
3.6.3 Thực nghiệm quét bản đồ ......................................................................................... 58
KẾT LUẬN CHƯƠNG 3 ...................................................................................................... 59
Chương 4 ................................................................................................................................... 61
viii
ix
Hinh 1.5 Vị trí và hướng của Rôbốt tự hành trong hệ quy chiếu cố định 7
Hinh 1.15 Đồ thị biểu diễn bán kính cong khi V = 1 m/s 22
Hinh 1.22 Đồ thị biểu diễn bán kính cong khi V = 0,3 m/s 26
Hinh 1.23 Đồ thị vận tốc góc Ω của xe khi V = 0,3 m/s 27
Kết quả mô phỏng quỹ đạo chuyển động của rôbốt theo đường cong
Hinh 2.2 34
NURBS
Sai số tư thế (vị trí và hướng) trung bình khi thay đổi ζ , g = 1; K1 >
Hinh 2.3 35
K2
Sai số tư thế (vị trí và hướng) trung bình khi thay đổi ζ , g = 1; K1 <
Hinh 2.4 35
K2
Sai số tư thế (vị trí và hướng) trung bình khi thay đổi g, ζ = 0,9; K1 >
Hinh 2.5 36
K2
Sai số tư thế (vị trí và hướng) trung bình khi thay đổi g, ζ = 0,9; K1 <
Hinh 2.6 36
K2
Quỹ đạo chuyển động của rôbốt đa hướng với (a) Quỹ đạo thực tế và
Hinh 2.7 quỹ đạo mong muốn, (b) Bán kính cong của quỹ đạo chuyển động 38
mong muốn
Sự di chuyển của robot đa hướng với (a) Tốc độ ban đầu của robot
Hinh 2.8 39
(b) Vận tốc góc thực tế và mong muốn của robot
Hinh 2.9 Vận tốc góc của bánh xe 1,bánh 2, bánh 3, bánh 4 39
Hinh 2.10 Sai số vị trí và hình dáng của robot trong quá trình di chuyển 40
xi
Hinh 3.8 Ảnh chụp tấm đế của Rôbốt sau khi chế tạo 50
Hinh 3.9 Ảnh chụp tổng thế Rôbốt sau khi chế tạo 51
Hinh 3.12 Kích thước của phỏng kín và vị trí các vật cản trong phòng 59
Hình 4.3 Dạng tín hiệu của 2 kênh Encoder trong một động cơ 64
Hình 4.7 Vận tốc và vận tốc góc rôbốt trong thực nghiệm 83
Hình 4.8 Vận tốc góc của các bánh xe trong thực nghiệm 84
Hình 4.9 Sai số vận tốc của thực nghiệm với mong muốn 84
Hình 4.10 Sai số vị trí của thực nghiệm với mong muốn 85
xii
Bảng 2.1 Các nút điều khiển quỹ đạo đường cong NURBS 33
Bảng 3.1 Các thông số kỹ thuật thiết bị phần cứng của Rôbốt 46
Bảng 3.4 Thực nghiệm khả năng thay đổi tư thế của Rôbốt 55
Bảng so sánh các kích thước thực tế và kích thước bản đồ rôbốt thiết
Bảng 3.5 59
lập
Bảng 4.1 Xác định góc quay của một động cơ tại các thời điểm 64
xiii
LỜI MỞ ĐẦU
Ngày nay nền kinh tế thế giới đang bước sang giai đoạn phát triển kinh tế số với cuộc
cách mạng công nghiệp lần thứ 4, trong đó Rôbốt tự hành trở thành một phần tử không thể
thiếu trong các nhà máy sản suất thông minh. Trên thế giới các lĩnh vực được ứng dụng phổ
biến Rôbốt tự hành trong công tác hậu cần như: công nghiệp, logistics, y tế. Một trong những
tính chất đặc biệt làm cho rôbốt tự hành trở nên không thể thay thế là khả năng tự động điều
khiển mà không cần tới sự can thiệp của con người, giúp thay thế con người thực hiện những
công việc nguy hiểm và đặc thù. Trong số các rôbốt đa dạng đang tồn tại, rôbốt tự hành đa
hướng có khả năng di chuyển theo bất kỳ hướng nào. Việc xử lý và di chuyển linh hoạt, thêm
với khả năng kiểm soát thời gian thực, đã trở thành một phần không thể thiếu trong các hệ
thống sản xuất hiện đại.
Nhiều thiết kế xe đa hướng hoặc gần đa hướng đã được đề xuất. Nhìn chung, chúng có
thể được chia thành hai cách tiếp cận: thiết kế bánh xe thông thường và thiết kế bánh xe đặc
biệt. Bánh xe thông thường về mặt cơ học đơn giản, có khả năng chịu tải cao và khả năng
chịu đựng các bề mặt làm việc không đều cao. Tuy nhiên, loại hệ thống này không thực sự đa
hướng. Các thiết kế đã được đề xuất để đạt được khả năng di chuyển gần như đa hướng bằng
cách sử dụng bánh xe thông thường, thiết kế phổ biến nhất là những thiết kế sử dụng bánh lái.
Các xe dựa trên thiết kế này có ít nhất hai bánh chủ động, mỗi bánh có cả cơ cấu dẫn động và
dẫn động lái. Chúng có thể di chuyển theo bất kỳ hướng nào từ bất kỳ cấu hình nào. Tuy
nhiên, loại hệ thống này không thực sự đa hướng vì nó cần dừng lại và định hướng lại bánh xe
theo hướng mong muốn. Hầu hết các thiết kế bánh xe đặc biệt đều dựa trên khái niệm đạt
được lực kéo theo một hướng và cho phép chuyển động thụ động theo hướng khác, do đó cho
phép linh hoạt hơn trong môi trường tắc nghẽn. Cấu trúc ba bánh xe sử dụng 'Omni-wheel' và
cấu trúc bốn bánh sử dụng ‘bánh xe Mecanum’ là những ví dụ tiêu biểu của nền tảng rôbốt đa
hướng. Đặc biệt, rôbốt tự hành đa hướng với Bánh xe Mecanum được sử dụng trong trường
hợp yêu cầu sự ổn định, loại bánh xe này được sử dụng trong các ứng dụng rôbốt đòi hỏi mức
độ cơ động cao. Bánh xe đa hướng có 3 bậc tự do: chuyển động quay của bánh xe, chuyển
động quay của con lăn, và trượt chuyển động về trục thẳng đứng đi qua tiếp điểm [1], [2].
Trong hầu hết các trường hợp, các bánh xe đa hướng được kết nối với thân rôbốt và chúng
không xoay để đánh lái, việc lái xe có thể được thực hiện bằng cách kết hợp các tốc độ quay
của các bánh xe. Bánh xe Mecanum có những ưu điểm sau: thiết kế nhỏ gọn, khả năng chịu tải
cao, điều khiển đơn giản, tốc độ thấp và lực đẩy thấp khi di chuyển theo đường chéo. Nhược
điểm có thể kể đến: tiếp xúc không liên tục, độ nhạy cao với các bất thường bề mặt chuyển
động, thiết kế phức tạp [3]. Các rôbốt tự hành đa hướng đã được quan tâm nghiên cứu [4], [5],
[6]. Trong danh mục các rôbốt tự hành này, rôbốt tự hành đa hướng sử dụng bánh xe
Mecanum có thể thực hiện các nhiệm vụ quan trọng trong môi trường đông đúc có chướng
ngại vật tĩnh và động, các lối đi trong nhà, chẳng hạn như văn phòng, xưởng, nhà máy, nhà
kho hoặc được sử dụng để tạo điều kiện chăm sóc người già hoặc bệnh nhân nhập viện, v.v ...
[5], [7]. Chính vì vậy, nội dung đồ án sẽ thiết kế chế tạo rôbốt tự hành bánh xe Mecanum cùng
với một bộ điều khiển phản hồi trạng thái tuyến tính áp dụng vào rôbốt.
Từ những phân tích ở trên, cùng với định hướng của TS. Nguyễn Hồng Thái với mục
đích góp một phần nhỏ bé trong việc thiết kế rôbốt tự hành đa hướng kiểu bánh xe Mecanum
tác giả đã lựa chọn đề tài đồ án “ Thiết kế chế tạo rôbốt tự hành đa hướng kiểu bánh xe
Mecanum”.
Đồ án đặt ra các mục tiêu phải giải quyết cụ thể như sau:
(1) Thiết lập mô hình động học rôbốt tự hành đa hướng kiểu bánh xe Mecanum.
(2) Thiết kế và mô phỏng bộ điều khiển phản hồi trạng thái tuyến tính của rôbốt tự hành
đa hướng kiểu bánh xe Mecanum.
(3) Chế tạo thực nghiệm rôbốt đa hướng kiểu bánh xe Mecanum.
Rôbốt tự hành đa hướng là một đề tài nóng được rất nhiều nhà nghiên cứu khoa học
quan tâm, nghiên cứu thiết kế và chế tạo. Các kết quả của đồ án là cơ sở để tiếp tục nghiên cứu
sâu hơn về các phương pháp thiết kế bộ điều khiển của rôbốt đa hướng Mecanum. Kết quả
nghiên cứu lý thuyết, mô phỏng và thực nghiệm đã đóng góp một phần vào quá trình xây dựng
tài liệu kỹ thuật cho thiết kế rôbốt tự hành đa hướng Mecanum.
Chương 1: Thiết lập phương trình động học cho rôbốt tự hành đa hướng kiểu bánh
xe Mecanum
Trong chương này đồ án tiến hành thiết lập mô hình động học lý thuyết của rôbốt tự hành đa
hướng kiểu bánh xe Mecanum. Thiết kế quỹ đạo đường cong NURBS cho rôbốt. Kết quả của
chương này là cơ sở cho các tính toán, thiết kế và mô phỏng ở các chương tiếp theo của đồ án.
Chương 2: Thiết kế bộ điều khiển phản hồi trạng thái tuyến tính
Trong chương này đồ án tiến hành trình bày phương pháp thiết kế bộ điều khiển phản hồi
trạng thái tuyến tính. Tiến hành mô phỏng bộ điều khiển bám theo quỹ đạo tham chiếu được
thiết kế trong chương 1.
Trong chương này đồ án tiến hành thiết kế và chế tạo rôbốt đa hướng kiểu bánh xe Mecanum.
Trong chương này đồ án tiến hành lập trình rôbốt hoạt động, đưa bộ điều khiển đã được thiết
kế trong chương 2 vào trong rôbốt thực nghiệm. Kiểm tra mức độ hoạt động của thuật toán.
KẾT LUẬN ĐỒ ÁN
Phần này sẽ tóm tắt các kết quả đạt được của đồ án về lý thuyết, mô phỏng và thực
nghiệm cũng như những đóng góp mà đồ án đã thực hiện và đề ra các vấn đề hạn chế để tiếp
tục nghiên cứu và hoàn thiện trong tương lai.
Chương 1
2. Tính an toàn
- AGV hoạt động một cách có kiểm soát, với khả năng tăng/ giảm tốc mượt, ổn định
được giám sát.
- AGV được lập trình sự an toàn đặt lên hàng đầu, được trang bị các cảm biến, laser cho
phép chúng hoạt động an toàn xung quanh công nhân và máy móc trong nhà máy
- AGV hoạt động tốt trong các môi trường mà con người không thể tiếp cận và nguy
hiểm như xử lý các chất độc hại, làm việc trong nhiệt độ khắc nghiệt và di chuyển vật liệu
nặng.
3. Nâng cao năng suất lao động
- AGV có thể hoạt động 24/7 và trong điều kiện con người không thể làm việc, điều này
làm tăng năng suất và hiệu quả công việc.
4. Dễ dàng thay đổi và mở rộng modul
Hầu hết các xe AGV có thể thay đổi về modul để đáp ứng yêu cầu của người sử dụng
như: nâng cấp, giảm tải trọng, thay đổi quãng dường,…
Bánh xe đa năng Mecanum
Bánh xe đa năng Mecanum được phát minh bởi Ilon (một
kỹ sư người Thụy Điển) vào năm 1973 tại Công ty Mecanum
và được ứng dụng vào thiết kế Robot tự hành lần đầu tiên vào
năm 1997 (Hình 1.2). Khi truyền momen vào trục bánh xe các
con lăn trên bánh xe sẽ tiếp xúc với sàn hình thành hai thành
phần vận tốc: V1 theo hướng di chuyển của bánh xe và V L1 có
phương vuông góc với trục con lăn và có chiều phụ thuộc vào
chiều momen tác dụng. Vì vậy, khi điều khiển phối hợp các
động cơ dẫn động của các bánh xe sẽ tạo thành véc tơ vận tốc
Hình 1.2 Bánh răng Mecanum
tổng hợp đẩy robot tự hành di chuyển theo các hướng khác
nhau làm tăng tính linh hoạt của AGV.
Hình 1.3 Các phương án điều khiển Robot tự hành đa hướng kiểu bánh xe Mecanum
Ngày nay, để tăng tính linh hoạt trong vận chuyển vật liệu và hậu cần phục vụ sản xuất
kiểu bánh xe này cũng được ứng dụng trong thiết kế các AGV trong những trường hợp không
đủ không gian dành làm đường đi cho AGV đặc biệt là khoảng không để làm những chỗ quay
vòng
Như vậy, nếu gọi: f O f , x f , y f là hệ quy chiếu cố định gắn liền với sàn di chuyển;
R {OR , xR , yR } là hệ quy chiếu gắn trên robot (Hình 5).Giả sử q f x f (t ) y f (t ) (t )T là các
tham số định vị robot trong hệ quy chiếu f và q R xR (t ) yR (t ) (t ) là các tham số
T
cos sin 0
Trong đó: Q( ) sin cos 0 là ma trận cô sin chỉ hướng của hệ quy chiếu R so với
0 0 1
hệ quy chiếu f .
1.2 PHƯƠNG TRÌNH ĐỘNG HỌC CỦA AVG ĐIỀU HƯỚNG LINH HOẠT KIỂU
BÁNH XE ĐA HƯỚNG MECANUM
Xét trong hệ quy chiếu ϑR của AGV. Ta có vận tốc của các bánh xe:
V1 (t ) r1 (t )
V (t ) r (t )
2 2
(1.2)
V3 (t ) r3 (t )
V4 (t ) r4 (t )
L d 1
V1 (t ) VGx (t ) (t ) VGy (t ) (t ) (1.4)
2 2 tg
Tương tự với bánh xe 2,3,4 ta có:
L d 1
V1 (t ) VGx (t ) 2 (t ) VGy (t ) 2 (t ) tg
V (t ) V (t ) (t ) V (t ) (t ) 1
L d
2 Gx
2
Gy
2 tg
(1.5)
V3 (t ) VGx (t ) (t ) VGy (t ) (t ) 1
L d
2 2 tg
L d 1
V4 (t ) VGx (t ) (t ) VGy (t ) (t )
2 2 tg
L d
V1 (t ) VGx (t ) VGy (t ) 2 2 (t )
V (t ) V (t ) V (t ) (t )
L d
2 Gx Gy
2 2
(1.6)
V3 (t ) VGx (t ) VGy (t ) L d (t )
2 2
L d
V4 (t ) VGx (t ) VGy (t ) (t )
2 2
Kết hợp (1.2) và (1.6), sau khi biến đổi về ma trận đại số:
1 1
r r 2r L d
1
1 (t ) 1
(t )
1 1
L d VGx (t )
2 r r 2r VGy (t ) (1.7)
3 (t ) 1 1 1
r r 2r L d
(t )
4 (t ) 1
1
1
L d
r r 2r
1 1
r r 2r L d
1
1
1 1
L d
Đặt ω 1 (t ) 2 (t ) 3 (t ) 4 (t ) và J r r 2r
T
1 1 1 L d
r r 2r
1
L d
1 1
r r 2r
Khi đó (1.7) được viết lại:
ω Jq R (1.8)
q R J *ω (1.9)
1 1 1 1
r
* T
1 T
J J J J 1
4
1 1 1 (1.10)
2 2 2 2
Ld Ld Ld Ld
đưa phương trình (1.9) về hệ quy chiếu cố định f thông qua phương trình (1.1) ta có:
Từ (1.11) ta tìm được vị trí và hướng của AGV đa hướng kiểu bánh xe Mecanum:
t
chiếu f thay vào (1.1) sau đó kết hợp với (1.8) ta có:
ω JQ q f
T
(1.13)
Từ (1.13) ta xác định được tham số điều khiển biến các biến khớp của bánh Mecanum
10
1 Ld
1 r cos sin x f (t ) cos sin y f (t ) 2 (t )
1 Ld
2 cos sin x f (t ) cos sin y f (t ) (t )
r 2
(1.14)
1 cos sin x (t ) cos sin y (t ) L d (t )
3 r f f
2
1 cos sin x (t ) cos sin y (t ) L d (t )
4 r f f
2
Phương trình (1.14) xác định các thông số điều khiển 4 bánh Mecanum để AGV đa hướng đi
theo quỹ đạo x f (t ), y f (t ) và VG cho trước.
1.3 THIẾT KẾ QUỸ ĐẠO CHUYỂN ĐỘNG BẰNG ĐƯỜNG CONG NURBS
Tại đây Bih là các đỉnh đa giác điều khiển đồng nhất 4D của đường cong B-Spline vô tỷ 4D.
N i ,k (t ) là các hàm B-Spline vô tỷ cơ sở được xác định bằng công thức đệ qui:
1 xi t xi 1
N i,1(t)
0
(1.16)
N (t) t xi N i,k 1(t) xi k t t N i 1,k 1(t)
i,k xi k 1 xi xi k xi 1
11
xi 0 1 i k
xi i k k 1 i n 1 (1.17)
x n k 2 n 2 i nk 1
i
Chiếu đường cong B-Spline vô tỷ xác định trên không gian 4D lên không gian vật lý 3D bằng
cách chia phương trình đường cong B-Spline vô tỷ cho tọa độ đồng nhất:
n 1
BhN i i i,k (t ) n 1
P (t ) i 1
n 1
Bi Ri , k (t ) (1.18)
h N
i 1
i i,k (t ) i 1
Tại đây Bi là các đỉnh của đa giác khống chế trong không gian 3D của đường cong B-Spline
hữu tỷ và
hi N i ,k (t )
Ri ,k (t ) n 1
(1.19)
h N
j 1
j j ,k (t )
R
i 1
i,k (t ) 1 (1.20)
12
- Khi k = n, đường cong NURBS là đường cong Bezier hữu tỷ. Khi mọi hi 1 đường
cong Bezier hữu tỷ trở thành đường cong Bezier vô tỷ. Do đó cả 2 loại đường cong
Bezier hữu tỷ và vô tỷ đều là trường hợp đặc biệt của đường cong NURBS.
Bởi các đường cong NURBS là sự suy rộng 4 chiều của các hàm B-Spline vô tỷ, nên các giải
thuật cho sự nâng bậc, chia nhỏ, ước lượng đường cong của đường cong B-Spline vô tỷ đúng
cho đường cong NURBS bằng cách áp dụng cho các đỉnh khống chế 4 chiều.
Hình 1.8 Đường cong NURBS với n+1=5, k=3, vector nút mở
[X] = [0 0 0 1 2 2 2 2] và [h] = [1 1 h3 1 1]
13
Tuy nhiên với đường cong NURBS cấp cao như ta thấy trong Hình 1.9 với h3 =0 , đường cong
không biến đổi thành một đường thẳng giữa B2 và B4 .
Tương tự đường cong B-Spline mở, điểm đầu và điểm cuối của đường cong NURBS mở trùng
với đỉnh đầu và cuối của đa giác điều khiển
P(0) = B1 và P(t max ) P(n k 2 Bn1 )
Hình 1.9 Đường cong NURBS với n+1=5, k=4, vector nút mở
X= 0 0 0 1 2 2 2 2 và h = 1 1 h3 1 1
Hình 1.10 Đường cong NURBS với n+1=5, k=3, vector nút mở
X= 0 1 2 3 4 5 6 7 và h = 1 1 h3 1 1
Hình 1.10 thể hiện đường cong NURBS với n+1=5, k=3, vector nút có chu kì
14
Như có thể thấy trên hình, các đường cong NURBS có điểm đầu và điểm cuối trùng nhau và
không trùng với đỉnh đầu và cuối của đa giác điều khiển.
Tương tự với đường cong NURBS bậc 4 trong hình 1.11.
Với n+1=5, k=4, vector nút chu kỳ là X = 0 1 2 3 4 5 6 7 8
Hình 1.11 Đường cong NURBS với n+1=5, k=4, vector nút mở
X= 0 1 2 3 4 5 6 7 8 và h = 1 1 h3 1 1
Ở đây, các điểm đầu và các điểm cuối của một đường cong cùng nằm trên một đường thẳng.
f ( x x) f ( x)
Từ định nghĩa tính đạo hàm f ' ( x) lim ta tính được:
x 0
x
P (t t ) P (t )
P (t ) lim (1.21)
t 0
t
(t ) lim P(t t ) P(t )
P (1.22)
t 0 t
15
Ví dụ 1.1:
Cho đa giác điều khiển bởi Bảng 1.1 :
Bảng 1.1 Đa giác điều khiển đường cong NURBS
B1 B2 B3 B4 B5
T
5
0 0
T
1 2 T
2 0 4 2
T
5 0
T
3
Xác định điểm tại t thuộc đường cong NURBS mở bậc 3 ( k = 3) với hệ số tọa độ thuần
2
N 3, 2 (t ) 2 t ; N 4, 2 (t ) t 1 , N i , 2 (t ) 0 , i ≠ 3,4
N 2,3 (t )
2 t 2 ; N 3,3 (t )
t 2 t (3 t )(t 1)
2 2 2
N 4,3 (t )
t 12 ; N i ,3 (t ) 0 , i ≠ 2,3,4
2
Từ phương trình (1.19):
n 1
S hi N i ,k (t ) h1 N1,3 (t ) h2 N 2,3 (t ) h3 N 3,3 (t ) h4 N 4,3 (t ) h5 N 5,3 (t )
i 1
16
(2 t ) 2 (t 1) 2 (2 t ) 2
S h2 N 2,3 (t ) h4 N 4,3 (t ) 2
2 2 2t 6t 5
R1,3 (t ) 0
h2 N 2,3 (t ) (2 t ) 2
R2,3 (t )
S 2t 2 6t 5
R3,3 (t ) 0
h2 N 4,3 (t ) (t 1) 2
R4,3 (t ) 2
S 2t 6t 5
R5,3 (t ) 0
1
h3
4
S h2 N 2,3 (t ) h3 N 3,3 (t ) h4 N 4,3 (t )
(2 t ) 2 t (2 t ) (3 t )(t 1) (t 1) 2
2 8 8 2
6t 18t 17
2
2t 2 6t 5
R1,3 (t ) 0
h2 N 2,3 (t ) 4(2 t ) 2
R2,3 (t ) 2
S 6t 18t 17
h3 N 3,3 (t ) t (2 t ) (3 t )(t 1) 2t 2 6t 3
R3,3 (t ) 2
S 6t 2 18t 17 6t 18t 17
h4 N 4,3 (t ) 4(t 1) 2
R4,3 (t ) 2
S 6t 18t 17
R5,3 (t ) 0
h3 1
S=1
R1,3 (t ) 0
(2 t ) 2
R2,3 (t ) N 2,3 (t )
2
t (2 t )) (3 t )(t 1) 2t 2 6t 3
R3,3 (t ) N 3,3 (t )
t 2 6t 2 18t 17
17
(t 1) 2
R4,3 (t ) N 4,3
2
R5,3 (t ) 0
h3 5
R1,3 (t ) 0
h2 N 2,3 (t ) (2 t ) 2
R2,3 (t )
S 2(4t 2 12t 5)
h3 N 3,3 (t ) 5t (2 t ) 5(3 t )(t 1) (5 2t 2 6t 3)
R3,3 (t )
S 2(4t 2 12t 5) 2(4t 2 12t 5)
h4 N 4,3 (t ) (t 1) 2
R4,3 (t )
S 2(4t 2 12t 5)
R5,3 (t ) 0
3
Tính toán những kết quả trên tại t= ta thu được:
2
3 3 1 3 3 1 3
h3 0 R1,3 ( ) 0 R2,3 ( ) R3,3 ( ) 0 R4,3 ( ) R5,3 ( ) 0
2 2 2 2 2 2 2
1 3 3 2 3 3 3 2 3
h3 R1,3 ( ) 0 R2,3 ( ) R3,3 ( ) R4,3 ( ) R5,3 ( ) 0
4 2 2 7 2 7 2 7 2
3 3 1 3 3 3 1 3
h3 1 R1,3 ( ) 0 R2,3 ( ) R3,3 ( ) R4,3 ( ) R5,3 ( ) 0
2 2 8 2 4 2 8 2
3 3 1 3 15 3 1 3
h3 5 R1,3 ( ) 0 R2,3 ( ) R3,3 ( ) R4,3 ( ) R5,3 ( ) 0
2 2 32 2 16 2 32 2
Tọa độ các điểm tương ứng trên đường cong NURBS:
h3 0
3 1 5
P 1 2 4 2
1
2
2 2 2 2
18
1
h3
4
3 2 3 5 2 5 8
P 1 2 0 4 2
2 7 7 2 7 2 7
h3 1
3 1 3 5 1 5 1
P 1 2 0 4 2
2 8 4 2 8 2 2
h3 5
3 1 15 5 1 5 1
P 1 2 0 4 2
2 32 16 2 32 2 8
1.4 KHẢO SÁT QUỸ ĐẠO CHUYỂN ĐỘNG CỦA ĐƯỜNG CONG BẤT KỲ
19
B1 B2 B3 B4 B5 B6 B7
[0 0] [-6,5 0] [-6,5 5] [-3 5] [-3 8] [-6,5 8] [-6,5 13]
B8 B9 B10 B11 B12 B13 B14
[6,5 13] [6,5 8] [3 8] [3 5] [6,5 5] [6,5 0] [0 0]
Sau khi sử dụng phương pháp thiết kế quỹ đạo bằng đường cong NURBS ta có quỹ đạo
cảu xe như Hình 1.13
y ' (t )
(t ) arctan 0 2 (1.23)
x' (t )
Bán kính cong tại t được tính theo công thức:
20
R
x 2
y2
3/ 2
(1.24)
xy yx
Thời gian chuyển động bẳng tổng độ dài quãng đường chia cho vận tốc V
S
(s) (1.29)
V
Ví dụ 1.3 Lấy quỹ đạo chuyển động như trên ví dụ 1.2, các thông số bổ sung thêm:
Kích thước xe: L = 0.5(m) ; d = 0,8(m)
Bán kính bánh xe Mecanum r = 0,05(m)
Vận tốc của xe V = 1 m/s.
Dựa vào công thức (1.27) và (1.28) ta tính được:
Quãng đường di chuyển là S = 54,8232 (m)
Thời gian di chuyển là τ = 54,8232 (s)
Đồ thị các giá trị , R, , 1 , 2 , 3 , 4 được biểu diễn từ Hình 1.14 - 1.20.
21
Hình 1.15 Đồ thị biểu diễn bán kính cong khi V = 1 m/s
22
23
24
Nhận xét:
- Vận tốc góc của các bánh luôn thay đổi đối xứng nhau (ω1. ω4 tăng thì ω2, ω3 giảm)
nhằm giữ cho vận tốc của rôbốt theo phương x của rôbốt không đổi và vận tốc theo
phương y của rôbốt bằng 0.
- Tại các vị trí bánh xe có vận tốc góc lớn nhất hoặc nhỏ nhất, là các vị trí rôbốt có biên độ
vận tốc góc là lớn nhất.
Ví dụ 1.4: Xét chuyển động và các thông số của rôbốt như ví dụ 1.3 nhưng thay vận tốc
chuyển động V = 0,3(m/s) ta tính được:
Quãng đường di chuyển là S=54,8232 (m)
Thời gian di chuyển là τ = 182,7441 (s)
Khi đó đồ thị các giá trị , R, , 1 , 2 , 3 , 4 tương tự như ví dụ 1.3 nhưng thời gian thực hiện
quá trình thay đổi. Cụ thể , R, , 1 , 2 , 3 , 4 được biểu diễn từ Hình 1.21-1.27
25
Hình 1.22 Đồ thị biểu diễn bán kính cong khi V=0, 3 m/s
26
Hình 1.23 Đồ thị vận tốc góc Ω của xe khi V=0,3 m/s
27
28
Nhận xét:
- Từ các Hình 1.21-1.27 (trường hợp V = 1 m/s) so với các Hình 1.14-1.20 (trường hợp V =
0,3 m/s) nhận thấy khi thay đổi giá trị vận tốc, các giá trị vận tốc góc của các bánh xe thay đổi,
tuy nhiên dạng đồ thị vận tốc góc theo thời gian t không đổi, nguyên nhân là do vận tốc thay
đổi thì thời gian và vận tốc góc từng bánh thay đổi nhằm đáp ứng theo quỹ đạo chuyển động
của rôbốt.
29
Chương 2
e(t ) e x ey e
T
q d (t ) q(t ) (2.1)
Đạo hàm phương trình (1.7) ta có phương trình sai số tốc độ:
e (t ) q d (t ) q (t ) (2.2)
Trong đó:
q d xd y d d T q x y T .
Ta có phương trình sai số trong hệ quy chiếu gắn với Robot R {OR x R y R z R } cho bởi:
e R QT ( )e (2.3)
Với Q là ma trận quay biến đổi từ hệ quy chiếu R {OR x R y R z R } sang hệ quy chiếu quán tính
f {O f x f y f z f } một góc θd cho bởi:
cos sin 0
Q sin cos 0 (2.4)
0 1
0
30
sin cos
0 cos sin 0 eRx
cos sin 0 sin cos 0 eRy (2.7)
0 0 1 0 0 1 eR
Hay:
eRx Vxd cos d Vyd sin d Vx cos Vy sin cos Vxd sin d Vyd cos d Vx sin Vy cos sin eRy
eRy Vxd cos d Vyd sin d Vx cos Vy sin sin Vxd sin d Vyd cos d Vx sin Vy cos cos eRx
eR d
(2.8)
2.2 THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN PHẢN HỒI TRẠNG THÁI TUYẾN TÍNH
Mô hình (2.10) là mô hình sai số phi tuyến của Rôbốt. Theo [8] ta có thể xấp xỉ mô hình
(2.10) về mô hình tuyết tính cho phạm vi lân cận giá trị của điểm tham chiếu xd, yd, φd kết hợp
với (2.3) ta được:
0 d 0 e Rx 1 e R 0 V xd (t ) VGx (t )
e R d 0 0 e Ry e R 1 0 V yd (t ) VGy (t ) (2.11)
0
0 0 e R 0 0 1 d (t ) (t )
31
0 d V yd
Với A d 0 V xd , B=I3˟3
0 0 0
Bộ điều khiển được thiết kế gồm 3 trạng thái x(t), y(t), φ(t) và hai đầu vào là u1, u2, u3.Sử dụng
bộ điều khiển không gian trạng thái tuyến tính [9] với phương trình tổng quát:
u=KeR(t) (2.15)
Do đó luật điều khiển kiểm soát phản hồi như sau:
u1 k1 0 0 e Rx
u 2 0 k2 0 e Ry (2.16)
u 0
3 0 k 3 e R
Trong đó k1,k2,k3 là các hệ số của bộ điều khiển. Trong mô hình này, sự kết hợp giữa điều
khiển truyền thẳng và điều khiển phản hồi tuyến tính dựa trên cách tiếp cận vị trí, do đó, đầu
vào điều khiển mới được tạo ra:
V x (t ) V xd u1
V (t ) V u
y yd 2 (2.17)
(t ) d u 3
Vd
Ωd được xác định theo Ωd = trong đó ρ là bán kính cong được xác định từ quỹ đạo đường
cong NURBS
Thay (2.15) vào (2.14) ta có:
e R Ae R BKe R A BK e R (2.18)
Từ (2.12) và (2.14) suy ra đa thức đặc trưng của hệ vòng kín:
0 d V yd k1 0 0
det( sI 33 ( A BK )) sI 33 d 0 Vxd 0 k2 0
(2.19)
0 0 0 0 0 k3
s k3 s 2 k1 k 2 s k1k 2 2d
So với phương trình đặc trưng mong muốn:
(s+2ωnξ)(s2+2 ωnξs+ωn2) (2.20)
32
k1 k 2 2 n
k1 k 2 n d
2 2
(2.21)
k 3 2 n
Với:
2
g
1 2 max
2
(2.23)
Từ phương pháp thiết kế đường cong NURBS với các điểm điều khiển được cho dưới Bảng
2.1 có được quỹ đạo NURBS được thể hiện trong Hình 2.2
Bảng 2.1. Các nút điều khiển quỹ đạo đường cong NURBS
B1 B2 B3 B4 B5 B6 B7 B8 B9 B10
1 2 2 3 3 1 1 0 0 1
0 0 1 1 2 2 1 1 0 0
33
Hình 2.2 Kết quả mô phỏng quỹ đạo chuyển động của robot
Với các thông số của robot đa hướng và bánh xe như sau: L = 316(mm), d = 270(mm),
bán kính bánh xe r = 30(mm). Cài đặt các thông số như sau:
Bước 1: Quỹ đạo chuyển động của robot đa hướng là đường cong NURBS trên Hình 2.2 với
cơ sở dữ liệu trong Bảng 2.1
Bước 2: Các thông số chuyển động: (i) Vận tốc góc mong muốn Vd=0,3(m/s) và(ii) Vận tốc
góc của robot đa hướng Ω được xác định như sau :Ωd=Vd / ρ với ρ là bán kính cong của quỹ
đạo NURBS
T
V 0 0 1
Đặt Vxd V yd d
T
T d với T
d 1 0 0
Bước 3: Lựa chọn tham số bộ điều khiển
Lần lượt thay đổi các giá trị của g và ζ, chọn g và ζ sao cho các giá trị sai số trung bình trên
toàn quỹ đạo là nhỏ nhất.
Tiến hành cho g = 1 và ζ chạy từ 0,1 đến 0,9, ta thu được đồ thị thể hiện sai số trung bình
trong các Hình 2.3, 2.4:
34
Hình 2.3 Sai số tư thế (vị trí và hướng) trung bình khi thay đổi ζ , g = 1; K1 > K2
Hình 2.4 Sai số tư thế (vị trí và hướng) trung bình khi thay đổi ζ , g = 1; K1 < K2
35
Từ Hình 2.3 và Hinh 2.4 ta thấy các giá trị sai số giảm dần khi ζ tăng từ 0,1 đến 0,9, từ đó
chọn chọn ζ = 0,9. Với ζ = 0,9 và ρmax = 4 (m) thay vào (2.23) xác định 0 ≤ g ≤ 0,266
Hình 2.5 Sai số tư thế (vị trí và hướng) trung bình khi thay đổi g, ζ = 0,9; K1 > K2
Hình 2.6 Sai số tư thế (vị trí và hướng) trung bình khi thay đổi g, ζ = 0,9; K1 < K2
36
Từ Hình 2.5 và Hình 2.6 ta thấy sai số quỹ đạo của rôbốt giảm dần khi g tăng từ 0 dến
0,226 chọn chọn g = 0,266.
Bước 4: Sau đánh giá sai số trung bình chọn ξ=0,9, g=0,266 thay vào phương trình (2.22) các
tham số k1 ,k2, k3 của bộ điều khiển có thể xác định được. Hình 2.7 bên dưới là quỹ đạo chuyển
động của robot được điều khiển theo dõi quỹ đạo NURBS mong muốn. Robot đa hướng vận
chuyển NURBS mong muốn được miêu tả trong Hình 2.7 với các thông số trên.Sau đó Hình
2.10 là tốc độ di chuyển của robot bao gồm cả vận tốc V và vận tốc góc Ω của rôbot khi bán
kính cong ρ của quỹ đạo ξ mong muốn thay đổi từ 0.358 (m) đến 4 (m) ( Hình 2.7b).
Từ Hình 2.7 và Hình 2.10, từ vận tốc góc mong muốn Ω ta xác định được V và ρ, sai số
chuyển vị trí góc của robot tại mỗi thời điểm ΔΩ‒Ω‒Ωd từ 0 rad/s đến 0,8 rad/s (Hình 2.8b).
Lý do tại các vị trí , ,, , , là vị trí của robot thay đổi hướng từ cùng chiều kim
đồng hồ sang ngược chiều kim đồng hồ để đi theo quỹ đạo mong muốn như được mô tả trong
Hình 2.7a. Sai số theo dõi giữa quỹ đạo chuyển động và quỹ đạo mong muốn được thể hiện
trong Hình 2.10.
Từ Hình 2.7a và Hình 2.10 nhận thấy một điều khi robot di chuyển: (1) Từ điểm bắt đầu
đến điểm sẽ có sự thay đổi hướng từ cùng chiều kim đồng hồ sang ngược chiều kim đồng
hồ và theo chiều ngược lại, theo dõi từ trong ra ngoài quỹ đạo mong muốn với sai số vị trí là
1mm và sai số phương hướng khoảng 1˚; (2) Từ vị trí đến vị trí trên quỹ đạo, robot bắt
đầu theo dõi từ bên ngoài vào bên trong quỹ đạo mong muốn là đưa trực tiếp vào bên trong bắt
đầu từ vị trí cùng với vị trí sai số giảm từ 1.2 mm xuống 2.8 mm và sai số phương hướng
vào khoảng 4,6˚; (3) Từ vị trí đến vị trí robot đảo ngược hướng theo dõi từ ngoài vào
trong theo quỹ đạo mong muốn và ngược lại ở vị trí sai số theo phương x là 1,8mm tại vị trí
(15) là hướng ngược lại với sai số góc là 4,59˚ tạo ra sai số phương y là 2,2 mm; (4) Từ vị trí
sang vị trí robot sẽ theo dõi từ ngoài vào trong quỹ đạo mong muốn với sai số tối đa là
1,5 mm theo phương x, 0,8mm theo hướng y và 8,6˚ theo hướng ngược lại; (5) Từ vị trí đến
vị trí robot theo dõi từ bên ngoài vào bên trong của quỹ đạo mong muốn với sai số max
=1,9 mm theo phương x và 2,4mm theo phương y, 1,1˚ trong các tư thế đảo ngược; (6) Từ vị
trí đến vị trí robot sẽ theo dõi hướng từ ngoài vào trong của quỹ đạo mong muốn thông
qua các điểm và (18). Điểm đảo ngược hướng với sai số góc là 5,16˚ làm cho điểm có sai
số theo phương x là 1,8mm; (7) Từ điểm đến điểm xuất phát, rôbốt sẽ theo dõi từ trong ra
ngoài của quỹ đạo mong muốn.
37
Hình 2.7 Quỹ đạo chuyển động của robot đa hướng với (a) Quỹ đạo thực tế và quỹ đạo
mong muốn, (b) Bán kính cong của quỹ đạo chuyển động mong muốn
38
Hình 2.8 Sự di chuyển của robot đa hướng với (a) Tốc độ ban đầu của robot
(b) Vận tốc góc thực tế và mong muốn của robot
Hình 2.9 Vận tốc góc của bánh xe 1,bánh 2, bánh 3, bánh 4
39
Hình 2.10 Sai số vị trí và hình dáng của robot trong quá trình di chuyển
Như vậy đồ thị Hình 2.9 là thông số điều khiển tốc độ của bốn bánh xe để robot đa hướng
có thể chuyển động theo quỹ đạo NURBS mong muốn.
40
Chương 3
Cấu trúc Rôbốt tự hành điều hướng kiểu bánh xe mecanum như được mô tả trên Hình 3.1
dưới đây.
Trong đó: Cụm dẫn động bao gồm bánh xe mecanum ❶ và động cơ hộp giảm tốc hành
tinh ❷; Công tắc ❸; Báo dung lượng pin ❹; Nguồn điện pin Lithium ❺; Mạch công suất điều
khiển động cơ ❻; Bộ xử lý trung tâm máy tính nhúng ❼; Cảm biến IMU ❽; Mạch trung gian
Arduino Mega ❾; Máy quét Lidar ❿.
Thân Rôbốt được làm bằng vật liệu Mica nhằm đảm bảo nhẹ có thông số kích thước như
sau.
Tấm đế: có kích thước 260mm × 380mm, dày 10 mm và được mô tả trên Hình 3.2
41
42
Tấm đỡ mạch: có kích thước 260 mm × 480mm, dày 5 mm và được thiết kế như mô tả trên
Hình 3.3. Tấm này có chức năng chứa các bộ phận: mạch điều khiển động cơ, máy tính nhúng,
Lidar, v.v..
Sử dụng hệ thống ROS để kết nối và điều khiển rôbốt từ xa thông qua kết nối không dây
Wifi giữa máy tính (người dùng) và máy tính nhúng Raspbery Pi 4B (trên rôbốt).
Trên các máy tính (máy tính nhúng và máy tính người điều khiển) cài hệ điều hành ROS
NOETIC, trong đó máy tính nhúng trên rôbốt có vai trò làm master (bộ quản lý trung tâm), các
máy tính người điều khiển còn lại sẽ kết nối chung với master. Trong máy tính nhúng trung
tâm và máy tính người điều khiển có các Nodes là các nút chương trình phục vụ cho mục đích
tính toán. Các nodes gửi và nhận các tin nhắn với nhau nhằm giao tiếp giữa máy tính người
điều khiển, máy tính nhúng và các thiết bị ngoại vi trên rôbốt.
Bộ điều khiển được thiết kế là bộ điều khiển phản hồi trạng thái tuyến tính có tham số
điều khiển biến đổi theo thời gian được thiết kế trong Chương 2.
43
Hệ dẫn động được mô tả trên Hình 3.4 có chức năng dẫn động cho Rôbốt. Trong đó:
1. Động cơ DC-Hộp giảm tốc có thông số như sau: Động cơ DC 12V, hộp giảm tốc bánh răng
hành tinh có tỷ số truyền 1:14.
2. Bánh xe dẫn động
Bánh xe dẫn động mecanum cho Rôbốt có kết cấu như mô tả trên Hình 3.5. Trong đó vật liệu
bằng nhôm hợp kim với các con lăn là nhựa PP và PE để đảm bảo ma sát với mặt đường với
bánh xe là loại có góc nghiêng β = 45°.
3. Giá liên kết động cơ và thân xe có kích thước như mô tả trên Hình 3.6.
4. Đế mica
Đế mica cố định cụm dẫn động
44
Cấu trúc phần cứng của Rôbốt được mô tả trên Hình 3.7.
45
Trong đó:
Pin Lithium có thông số kỹ thuật: Điện áp hoạt động 2,5-3,65V, dung lượng 15Ah có chức
năng nuôi hệ thống mạch đièu khiển và mạch động lực.
Máy tính nhúng đóng vai trò là bộ xử lý trung tâm có chức năng nhận các dữ liệu từ các bộ
phận chấp hành, xử lý dữ liệu và gửi tín hiệu điều khiển để điều khiển các bộ phận khác.
Arduino Mega 2560 có vai trò là mạch điều khiển trung gian giữa máy tính nhúng với
động cơ và các đơn vị phản hồi để , có chắc năng nhận dữ liệu phản hồi từ IMU và encoder
gửi về bộ xử lý trung tâm và nhận tín hiệu điều khiển để điều khiển động cơ.
Mạch công suất có chức năng điều chỉnh dòng điện và điện áp để điều khiển tốc độ của
động cơ theo tín hiệu điều khiển nhận từ mạch arduino.
Lidar có chức năng xác định khoảng cách các vật xung quanh và gửi dữ liệu về bộ xử lý để
xử lý và điều khiển tránh vật cản.
IMU có chức năng xác định các gia tốc quán tính và vận tốc góc của Rôbốt và gửi dữ liệu
về bộ xử lý trung tâm để xử lý và điều khiển.
Bảng 3.1 dưới đây là các thông số kỹ thuật của thiết bị phần cứng của Rôbốt.
Bảng 3.1 Các thông số kỹ thuật thiết bị phần cứng của Rôbốt
GP36E13CPR 1:14
Điện áp sử dụng: 12VDC.
Dòng tiêu thụ: 3A
Stalling current: 7A (dòng khi động
cơ bị kẹt hoặc quá tải đứng im).
Encoder quang 500CPR (Count Per
Round), 2 kênh A-B.
Động cơ Servo-tích Điện áp cấp cho Encoder: 5VDC, tín
hợp hộp giảm tốc hiệu xuất ra 2 kênh TTL 0/5VDC
hành tinh Hộp số kim loại giảm tốc hành tinh
Planetary.
Tỉ số giảm tốc 1:14.
Moment lực kéo:
6.2Kg.cm (1:14 gear ratio) - 280rpm
12.2Kg.cm (1:27 gear ratio) - 145rpm
Motor: Đen - Đỏ cấp nguồn 12VDC.
Encoder:
Đỏ: 5VDC.
46
Raspberry Pi 4 Model b
Broadcom BCM2711, Quad core
Cortex-A72 (ARM v8) 64-bit SoC @
1.5GHz.
RAM: 4GB LPDDR4-2400 SDRAM.
Wifi chuẩn 2.4 GHz và 5.0 GHz
IEEE 802.11ac. Bluetooth 5.0, BLE.
Cổng mạng Gigabit Ethernet 2 cổng
USB 3.0 và 2 cổng USB 2.0.
Chuẩn 40 chân GPIO, tương thích với
các phiên bản trước.
Hỗ trợ 2 cổng ra màn hình chuẩn
Micro HDMI với độ phân giải lên tới
4K.
Máy tính nhúng
Cổng MIPI DSI.
Cổng MIPI CSI.
Cổng AV 4 chân.
H.265 (4kp60 decode), H264
(1080p60 decode, 1080p30 encode).
OpenGL ES 3.0 graphics.
Khe cắm Micro-SD cho hệ điều hành
và lưu trữ.
Nguồn điện DC 5V – 3A DC chuẩn
USB-C.
5V DC via GPIO header (minimum
3A*).
Hỗ trợ Power over Ethernet (PoE)
(yêu cầu có PoE HAT).
47
BTS7960 43A
Nguồn: 6 ~ 27V.
Dòng điện tải mach: 43A (Tải trở)
hoặc 15A (Tải cảm).
Tín hiệu logic điều khiển: 3.3 đến 5V.
Mạch công suất điều Tần số điều khiển tối đa: 25KHz.
khiển động cơ
Tự động tắt khi điện áp thấp: Nhỏ
hơn 5.5V module sẽ tự động tắt.
Bảo vệ quá nhiệt: BTS7960 bảo vệ
chống quá nhiệt bằng cảm biến nhiệt
tích hợp bên trong. Đầu ra sẽ bị ngắt
khi có hiện tượng quá nhiệt.
48
49
Sau khi chế tạo thực nghiệm mô hình, rôbốt đa hướng kiểu bánh Mecanum được mô tả
trên Hình 3.8 và Hình 3.9 dưới đây:
Hình 3.8. Ảnh chụp tấm đế của Rôbốt sau khi chế tạo
50
Hình 3.9. Ảnh chụp tổng thể Rôbốt sau khi chế tạo
Thử nghiệm di chuyển và điều khiển từ máy tính theo các tình huống sau:
Trình tự thì nghiệm:
51
Bước 1: Vạch 2 đường thẳng thế hiện 2 trục x,y của rôbốt trên sàn để xác định điểm bắt đầu
của rôbốt.
Bước 2: Cài đặt các thông số VGx, VGy, Ω, thời gian chạy t
Bước 3: Thu thập dữ liệu từ IMU để xác định vị trí của rôbốt sau khi chạy so với vị trí bất đầu,
ta có kết quả được thể hiện trong Bảng 3.2, Bảng 3.3, Bảng 3.4 qua mỗi lần thì nghiệm.
(1) Chạy thẳng
Thí nghiệm 1: Khả năng chạy thẳng theo phương x
Ta tiến hành cho rôbốt di chuyển thẳng với quảng đường S = 1 m, rôbốt di chuyển trên bề
mặt sàn gỗ phẳng nhẵn, trong quá trình di chuyển không có vật cản. Tiến hành thử nghiệm với
các tốc độ đặt VGx lần lượt là 0.1 m/s, 0.2 m/s, 0.25 m/s, 0.4 m/s tương ứng với các thời gian
chạy là 10 s, 5 s, 4 s, 2.5 s. Với mỗi tốc độ đặt như trên ta thử nghiệm 5 lần. Kết quả thu được
được thể hiện trong Bảng 3.2 bao gồm vận tốc đặt (m/s), vận tốc trung bình thực tế được tính
S
theo v = (m/s), khoảng cách đặt (m), quãng đường đi được S (m), góc lệch γ = φd – φ =
t
atan2(∆y, ∆x) (với φd = 0° là góc đặt, φ là góc của rôbốt sau khi di chuyển) và sai số ∆ =
1 S
(%) ứng với từng vận tốc.
1
Bảng 3.2 Thưc nghiệm khả năng di chuyển theo phương x
Lần Vận Thời gian Vận tốc Khoảng Khoảng Góc lệch Sai số
chạy tốc đặt chạy thực cách đặt cách thực (°) (%)
(m/s) (s) (m/s) (m) (m)
52
Nhận xét:
- Với yêu cầu rôbốt tự hành di chuyển một khoảng cách S = 1 m, trong các lần thử với các vận
tốc khác nhau, sai số lớn nhất là 0,1 m (tương ứng với 10%) ( ở vận tốc 0,1 m/s). Điều này
cho thấy khi di chuyển trong thực tế, quỹ đạo của rôbốt luôn sẽ sai lệch so với lý thuyết được
thiết lập trên máy tính. Những sai lệch này xảy ra là do sai số trong quá trính điều khiển, sai số
của IMU và sai số khi bánh xe trượt. Điều đó cho thấy khi hoạt động phải hiệu chỉnh lại các hệ
số của bộ điều khiển, hiệu chỉnh IMU đảm bảo kết quả được chính xác nhất ứng với mỗi môi
trường khác nhau.
- Đối với vận tốc của rôbốt, sai lệch lớn nhất là 0,02 m/s (ở vận tốc 0,4 m/s). Nguyên nhân của
sai lệch này là do đáp ứng của bộ điều khiển PID và trượt của bánh xe trên sàn. Do đó cần
hiệu chỉnh các hệ số của bộ PID để giảm tối thiểu sai lệch gây ra.
(2) Chạy ngang
Thí nghiệm 2: Khả năng chạy thẳng theo phương y
Ta tiến hành cho rôbốt di chuyển ngang với quãng đường S = 1 m, rôbốt di chuyển trên
bề mặt sàn gỗ phẳng nhẵn, trong quá trình di chuyển không có vật cản. Tiến hành thử nghiệm
với các tốc độ đặt VGy lần lượt là 0.1 m/s, 0.2 m/s, 0.25 m/s, 0.4 m/s tương ứng với các thời
gian chạy là 10 s, 5 s, 4 s, 2.5 s. Với mỗi tốc độ đặt như trên ta thử nghiệm 5 lần. Kết quả thu
được được thể hiện trong Bảng 3.3 bao gồm vận tốc đặt (m/s), vận tốc trung bình thực tế được
S
tính theo v = (m/s), khoảng cách đặt (m), quãng đường đi được S (m), góc lệch γ = φd – φ =
t
53
atan2(∆y, ∆x) (với φd = 90° là góc đặt, φ là góc của rôbốt sau khi di chuyển) và sai số ∆ =
1 S
(%) ứng với từng vận tốc.
1
Bảng 3.3 Thưc nghiệm khả năng di chuyển theo phương y
Lần Vận Thời gian Vận tốc Khoảng Khoảng Góc lệch Sai số
chạy tốc đặt chạy thực cách đặt cách thực (°) (%)
(m/s) (s) (m/s) (m) (m)
54
(ở 0,2 m/s). Nguyên nhân dẫn đến sai số lớn là do mặt phẳng sàn không phẳng đồng đều
(chênh lệch độ cao giữa các viên đá lát) dẫn đến trượt của các bánh xe không đồng đều, rôbốt
di chuyển không đúng hướng so với lý thuyết.
- Qua thí nghiệm này cho thấy khi thiết kế chuyển động nên thêm các bộ điều khiển phản hồi
để giảm sai số về hướng đi cũng như vận tốc của rôbốt khi di chuyển ngang.
(3) Quay tại chỗ
Thí nghiệm 3: Khả năng điều hướng của rôbốt
Ta tiến hành cho rôbốt xoay tại chỗ một góc φ = 2π (rad) = 360(°), rôbốt di chuyển trên
bề mặt sàn đá phẳng nhẵn, trong quá trình di chuyển không có vật cản. Tiến hành thử nghiệm
với các tốc độ đặt Ωd lần lượt là π/10 rad/s, π/5 rad/s, π/3 rad/s, π/2 rad/s tương ứng với các
thời gian chạy là 20 s, 10 s, 6 s, 4 s. Với mỗi tốc độ đặt như trên ta thử nghiệm 5 lần. Kết quả
thu được được thể hiện trong Bảng 3.4 bao gồm vận tốc góc đặt (rad/s), vận tốc góc trung bình
thực tế được tính theo Ω = (rad/s), góc quay đặt (°), góc quay thực (°) và sai số (%) ứng
t
với từng vận tốc.
Bảng 3.4 Thực nghiệm khả năng thay đổi tư thế của Rôbốt
Lần Vận tốc Thời gian Vận tốc Góc đặt Góc thực Sai số
chạy góc đặt chạy góc thực (°) (°) (%)
(rad/s) (s) (rad/s)
55
Nhận xét:
- Sau 20 lần thử nghiệm với 4 vận tốc góc khác nhau, ta nhận thấy sai lệch về góc quay lớn
nhất là 3,06 % ( 11° ở vận tốc góc π/2 rad/s), các lần thử với vận tốc góc càng lớn thì góc quay
thực tế càng lớn hơn so với góc đặt (11° ở vận tốc góc π/2 rad/s), vận tốc góc càng nhỏ thì góc
quay thưc tế càng nhỏ so với góc đặt (3° ở vận tốc góc π/10 rad/s). Nguyên nhân là do ma sát
giữa sàn và bánh xe chưa xét đến và chưa xét đến lực quán tính. Ngoài ra, sai số của kết cấu
cũng như bộ truyền động chưa được đánh giá.
- Qua thí nghiệm này có thể cho thấy khi thiết kế quỹ đạo chuyển động, cần tránh việc quay
nhanh một góc hay tăng tốc độ góc đột ngột.
Sử dụng dữ liệu đường cong NURBS được thiết kế trong Chương 2, điều khiển robot đi theo
quỹ đạo cho trước.
Thí nghiệm 4: Thực nghiệm chạy theo quỹ đạo cho trước của rôbốt
Trình tự thì nghiệm:
Bước 1: Xác định vị trí bắt đầu của rôbốt, đảm bảo quỹ đạo di chuyển của rôbốt phẳng, không
có vật cản trên đường đi.
Bước 2: Đưa tệp dữ liệu của đường cong Nurbs đã thiết kế vào trong chương trình chạy.
Bước 3: Theo dõi sự di chuyển của rôbốt bằng IMU và lưu vị trí của rôbốt vào tệp văn bản
mỗi 0,1s.
Từ tệp văn bản dữ liệu có ở Bước 3 kết hợp với xử lý so sánh trên phần mềm MATLAB, kết
quả quỹ đạo thu được và sai số được thế hiện trong Hình 3.10 và Hình 3.11
56
Hình 3.10 Đồ thị quỹ đạo mong muốn và thực tế của rôbốt
Nhận xét:
- Qua đồ thị quỹ đạo di chuyển trong hình 3.10, ta thấy rằng quỹ đạo thực tế của rôbốt bám sát
chưa hoàn toàn. Cần thay đổi các tham số của bộ điều khiển để đáp ứng tốt hơn trong các môi
trường khác nhau.
- Có thế thấy rằng sai số thực nghiệm trong Hình 3.11 lớn nhất là 0.075m, lớn hơn sai số khi
mô phỏng ở chương 2. Lý do là do những nguyên nhân sau: Bài toán tính lý thuyết và bộ điều
khiển ở chương 2 chưa tính đến lực, các sai số của cảm biến IMU, sai số của Encoder.
57
Dữ liệu Lidar được thu thập về máy tính nhúng, sử dụng bộ lọc điểm để kiểm tra mức độ
tương ứng dữ liệu của 2 lần quét kế tiếp. Từ đó suy ra vị trí của rôbốt trong hệ quy chiếu cố
định gắn với sàn nhà.
Các bước thực hiện:
Bước 1: Quét dự liệu lidar lần đầu để xác định vị trí ban đầu của rôbốt
Bước 2: Lấy dữ liệu của lidar trong lần sau đó. So sánh sự trùng lặp giữa 2 lần quét, đưa
ra vị trí tâm của rôbốt ở 2 lần quét liên tiếp
Bước 3: So sánh dữ liệu để xác định vị trí của lần quét hiện tại so với lần quét đầu tiên, vẽ
lên bản đồ.
Thí nghiệm 5: Thực nghiệm khả năng quét bản đồ của rôbốt
Trong thí nghiệm này, tiến hành điều khiển rôbốt di chuyển trong phỏng kín có các thông
số kích thước và vật cản được thể hiện trong Hình 3.12
Hình 3.12 Kích thước của phòng kín và vị trí các vật cản trong phòng
Sau khi quét khu vực phòng kín, ta thiết lập được bản đồ và thi được các kích thước như
Hình 3.13 so sánh với các kích thước thực tế trong Bảng 3.6
58
Bảng 3.5 Bảng so sánh các kích thước thực tế và kích thước bản đồ rôbốt thiết lập
STT Kích thước thực Kích thước rôbốt Sai lệch Tỷ lệ sai lệch
tế (m) thiết lập (m) (m) (%)
Nhận xét:
Bản đồ thu được có sai lệch so với thực tế, tuy nhiên sai lệch nhỏ ( tối đa 0,83 %) không
gây ảnh hưởng nhiếu đến quá trình vận hành rôbốt. Nguyên nhân gây ra sai lệch do trong
phòng có một số vật cản đặc biệt, có tính phản quang tốt dẫn đến sai số của lidar; do thuật toán
xử lý dữ liệu chưa được tốt, khoảng cách giữa các pixel điểm lưu lại còn sai lệch.
59
60
Chương 4
Hệ điều hành ROS (Robot Opera Systems) là một bộ phần mềm trung gian người máy mã
nguồn mở. Mặc dù ROS không phải là một hệ điều hành hoàn chỉnh mà là một tập hợp các
khung phần mềm để phát triển phần mềm rô bốt, nó cung cấp các dịch vụ được thiết kế cho
một cụm máy tính không đồng nhất như trừu tượng hóa phần cứng, điều khiển thiết bị cấp
thấp, ...
Lợi ích của hệ điều hành ROS:
- Quản lý phần cứng bằng cách viết trình điều khiển.
- Quản lý bộ nhớ và các quy trình.
- Quản lý đồng thời, song song, hợp nhất dữ liệu.
- Cung cấp các thuật toán trừu tượng, sử dụng trí tuệ nhân tạo.
Có nhiều hệ điều hành để điều khiển rôbốt như Microsoft Robotics Developer Studio,
NAOQi, URBI, ROS … . Lý do đồ án chọn chọn ROS để lập trình bộ điều khiển rôbốt:
- Mã nguồn mở và miễn phí: Phần lõi của ROS được phát hành theo giấy phép BSD,
cho phép sử dụng thương mại và phi thương mại. ROS truyền dữ liệu giữa các mô-đun bằng
cách sử dụng giao tiếp (IPC), có nghĩa là các hệ thống được xây dựng bằng ROS có thể có
giấy phép chi tiết cho các thành phần khác nhau của chúng.
- Đa ngôn ngữ: ROS là ngôn ngữ trung lập và có thể được lập trình bằng nhiều ngôn ngữ
khác nhau. Đặc tả ROS hoạt động ở lớp nhắn tin. Các kết nối ngang hàng được đàm phán
trong XML-RPC, tồn tại trong một số lượng lớn ngôn ngữ. Để hỗ trợ một ngôn ngữ mới, ví
dụ, các lớp C ++ được bọc lại (được thực hiện cho ứng dụng khách Octave chẳng hạn) hoặc
các lớp được viết cho phép tạo ra các thông điệp. Các thông báo này được mô tả bằng IDL
(Ngôn ngữ định nghĩa giao diện).
- Có nhiều công cụ hỗ trợ: Thay vì môi trường thời gian chạy nguyên khối, ROS đã áp
dụng thiết kế vi hạt, sử dụng một số lượng lớn các công cụ nhỏ để xây dựng và chạy các thành
phần ROS khác nhau. Khi bạn trình bày các hướng dẫn của ROS, bạn sẽ học cách sử dụng một
số lệnh được sử dụng để thao tác với các nút và thông báo. Mỗi lệnh trong thực tế là một thực
thi. Ưu điểm của hệ thống này là một vấn đề với một thực thi không ảnh hưởng đến các hệ
thống khác, điều này làm cho hệ thống mạnh mẽ và linh hoạt hơn một hệ thống dựa trên môi
trường thời gian chạy tập trung.
61
Đồ án sử dụng một bo mạch nhúng Arduino Mega 2560 có chức năng trung gian trao đổi
tín hiệu giữa máy tính nhúng và các thiết bị ngoại vi động cơ, mạch điều khiển động cơ, IMU .
Hình 4.2 là sơ đồ kết nối giữa máy tính nhúng và bo mạch nhúng.
62
Đồ án sử dụng thuật toán PID để điều khiển động cơ, thuật toán PID là một cơ chế phản
hồi vòng kín điều khiển được sử dụng rất rộng rãi trong các bộ điều khiển động cơ. Trong đó
thuật toán PID sẽ kết hợp dữ liệu vận tốc góc của mỗi bánh xe được lấy từ Encoder, sau đó
đưa ra tín hiệu Analog phù hợp để động cơ hoạt động đúng với vận tốc góc mong muốn.
Encoder trên mỗi động cơ là loại 2 kênh, 182 xung/1 vòng quay động cơ (bao gồm cả hộp số),
Mỗi kênh của Encoder nối vào một chân I/O của bo mạch nhúng. Trên Hình 4.3 là dạng tín
hiệu 2 kênh A B của một Encoder khi đọc dữ liệu.
63
Hình 4.3 Dạng tín hiệu của 2 kênh Encoder trong một động cơ
Sử dụng Timer của bo mạch nhúng đọc đồng thời tín hiệu của các Encoder và xác định
góc quay dựa theo Bảng 4.1
Bảng 4.1 Xác định góc quay của một động cơ tại các thời điểm
1 0 0 0 0 0
2 1 0 0 0 +1
3 0 1 0 0 -1
4 1 1 0 0 +2
5 0 0 1 0 -1
6 1 0 1 0 0
7 0 1 1 0 -2
64
8 1 1 1 0 +1
9 0 0 0 1 +1
10 1 0 0 1 -2
11 0 1 0 1 0
12 1 1 0 1 -1
13 0 0 1 1 +2
14 1 0 1 1 -1
15 0 1 1 1 +1
16 1 1 1 1 0
Trong đó, dữ liệu đầu vào là tín hiệu xung của lần đọc hiện tại cà lần đọc trước đó của mỗi
kênh, từ đó tính đước sự tăng giảm của biến đếm xung của các động cơ. Với phương pháp đọc
như trên, ứng với một vòng của đầu ra động cơ (sau hộp số) thì số lượng xung đếm được là
182×4 = 728 (xung).
Bộ điều khiển PID nằm trong thư viện có sẵn của Arduino, bằng cách thay đổi, hiệu chỉnh các
thông số và thực nghiệm, bộ số cho bộ điều khiển PID là kp = 0.5, ki = 0.4, kd = 0.2, với bộ số
điều khiển này, rôbốt đi được ổn định và đáp ứng được tốc độ cài đặt.
65
Chương trình được viết bằng ngôn ngữ C/C++ và được nạp vào Arduino Mega 2560 bằng
phần mềm Arduino IDE
#if (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#include "ros.h"
#include "ros/time.h"
#include "lino_msgs/Velocities.h"
#include "geometry_msgs/Twist.h"
#include "lino_msgs/PID.h"
#include "lino_msgs/Imu.h"
#include "geometry_msgs/Point.h"
#include "Imu.h"
#include <Adafruit_NeoPixel.h>
66
float g_req_linear_vel_x = 0;
float g_req_linear_vel_y = 0;
float g_req_angular_vel_z = 0;
class motor
{
private:
int pinA, pinB, encoderA, encoderB;
bool a,b,la,lb;
byte state;
double e_speed = 0;
double e_speed_pre = 0;
double e_speed_sum = 0;
double kp = 0.5;
double ki = 0.4;
double kd = 0.2;
unsigned long t_pid = millis();
public:
double pwm_pulse = 0; //this value is 0~255
double pv_speed = 0;
volatile long encoder = 0;
void set(int pinA_motor, int pinB_motor, int enA, int enB)
{
pinA = pinA_motor;
pinB = pinB_motor;
encoderA = enA;
encoderB = enB;
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(encoderA, INPUT_PULLUP);
pinMode(encoderB, INPUT_PULLUP);
}
void PID(float& set_speed)
{
pv_speed = 60.0 * (encoder / 728.0) / (millis()-t_pid) * 1000;
t_pid = millis();
e_speed = set_speed - pv_speed;
pwm_pulse = e_speed * kp + e_speed_sum * ki + (e_speed - e_speed_pre) * kd;
e_speed_pre = e_speed; //save last (previous) error
e_speed_sum += e_speed; //sum of error
if (e_speed_sum > 4000) e_speed_sum = 4000;
if (e_speed_sum < -4000) e_speed_sum = -4000;
encoder = 0;
67
out(pwm_pulse);
return;
}
void exit()
{
e_speed_sum = 0;
e_speed_pre = 0;
}
void out(int pwm_pulse)
{
if (pwm_pulse > 0) {
if (pwm_pulse>250) pwm_pulse=60;
analogWrite(pinA, 0);
analogWrite(pinB, abs(pwm_pulse));
}
else {
if (pwm_pulse<-250) pwm_pulse=60;
analogWrite(pinA, abs(pwm_pulse));
analogWrite(pinB, 0);
}
}
void update(uint8_t s)
{
s |= state & 3;
switch (s) {
case 0: case 5: case 10: case 15:
break;
case 1: case 7: case 8: case 14:
encoder++; break;
case 2: case 4: case 11: case 13:
encoder--; break;
case 3: case 12:
encoder += 2; break;
default:
encoder -= 2; break;
}
state = (s >> 2);
}
} motor1, motor2, motor3, motor4;
lino_msgs::Imu raw_imu_msg;
ros::Publisher raw_imu_pub("raw_imu", &raw_imu_msg);
lino_msgs::Velocities raw_vel_msg;
ros::Publisher raw_vel_pub("raw_vel", &raw_vel_msg);
geometry_msgs::Point raw_pos_msg;
ros::Publisher raw_pos_pub("raw_pos", &raw_pos_msg);
void setup()
{
led.begin();
led.clear();
68
motor1.set(4,5,17,16);
motor2.set(7,6,14,15);
motor3.set(2,10,22,23);
motor4.set(8,9,19,18);
TCCR1B = TCCR1B & 0b11111000 | 1;
nh.initNode();
nh.getHardware()->setBaud(57600);
nh.subscribe(cmd_sub);
nh.advertise(raw_vel_pub);
nh.advertise(raw_imu_pub);
nh.advertise(raw_pos_pub);
while (!nh.connected())
{
nh.spinOnce();
}
nh.loginfo("LINOBASE CONNECTED");
delay(1);
cli();
TCCR1A = 0;
TCCR1B = 0;
TIMSK1 = 0;
TCCR1B |= (1 << CS11) ;
TCNT1= 65000;
TIMSK1 |= (1 << TOIE1);
sei();
}
ISR (TIMER1_OVF_vect)
{
TCNT1= 65400;
motor1.update(ENCODER1);
motor2.update(ENCODER2);
motor3.update(ENCODER3);
motor4.update(ENCODER4);
}
void loop()
{
static unsigned long prev_control_time = 0;
static unsigned long prev_imu_time = 0;
static unsigned long prev_debug_time = 0;
static bool imu_is_initialized;
69
if(imu_is_initialized)
nh.loginfo("IMU Initialized");
else
nh.logfatal("IMU failed to initialize. Check your IMU connection.");
}
else
{
publishIMU();
}
prev_imu_time = millis();
}
if(DEBUG)
{
if ((millis() - prev_debug_time) >= (1000 / DEBUG_RATE))
{
printDebug();
prev_debug_time = millis();
}
}
nh.spinOnce();
}
g_prev_command_time = millis();
}
void moveBase()
{
float w1 = 1/WHEEL_DIAMETER*2 * (g_req_linear_vel_x - g_req_linear_vel_y -
(LR_WHEELS_DISTANCE+FR_WHEELS_DISTANCE)/2*g_req_angular_vel_z) *30/M_PI;
float w2 = 1/WHEEL_DIAMETER*2 * (g_req_linear_vel_x + g_req_linear_vel_y +
(LR_WHEELS_DISTANCE+FR_WHEELS_DISTANCE)/2*g_req_angular_vel_z) *30/M_PI;
float w3 = 1/WHEEL_DIAMETER*2 * (g_req_linear_vel_x - g_req_linear_vel_y +
(LR_WHEELS_DISTANCE+FR_WHEELS_DISTANCE)/2*g_req_angular_vel_z) *30/M_PI;
float w4 = 1/WHEEL_DIAMETER*2 * (g_req_linear_vel_x + g_req_linear_vel_y -
(LR_WHEELS_DISTANCE+FR_WHEELS_DISTANCE)/2*g_req_angular_vel_z) *30/M_PI;
motor1.PID(w1);
motor2.PID(w2);
motor3.PID(w3);
motor4.PID(w4);
70
raw_vel_pub.publish(&raw_vel_msg);
void publishIMU()
{
raw_imu_msg.linear_acceleration = readAccelerometer();
raw_imu_msg.angular_velocity = readGyroscope();
raw_imu_msg.magnetic_field = readMagnetometer();
raw_imu_pub.publish(&raw_imu_msg);
}
4.3 THUẬT TOÁN ĐIỀU KHIỂN
Đồ án sử dụng thuật toán điều khiển phản hồi trạng thái tuyến tính được thiết kế ở
Chương 2 của Đồ án. Dữ liệu vị trí được lấy từ topic /tf và gửi đi thông qua topic /cmd_vel để
điều khiển Rôbốt
Chương trình của bộ điều khiển viết bằng ngôn ngữ C++
#define _CRT_SECURE_NO_DEPRECATE
#include <ros/ros.h>
#include <iostream>
#include <fstream>
#include <sstream>
71
#include "Queue_adv.h"
Queue_adv full_data;
data_pos Ldata, Ndata;
ofstream myWriteFile1;
void docfile()
{
data_pos data;
std::ifstream myReadFile;
myReadFile.open("src/rb_chay_1m/sdk/Long_025_cong.txt", std::ios_base::in);
if (!myReadFile.is_open()) return;
std::string line;
std::getline(myReadFile, line);
cout << line << endl;
while (std::getline(myReadFile, line))
{
std::istringstream iss(line);
if (!(iss >> data.t >> data.x >> data.y >> data.phi >> data.bk >>
data.V>>data.x1>>data.y1>>data.x2>>data.y2)) break;
full_data.Add(data);
}
myReadFile.close();
}
data_vel xu_ly(float time, float x, float y, float phi, float vx, float vy, float o,
float imuax, float imuay, float imuaz, float imugx, float imugy, float imugz, float
imumx, float imumy, float imumz)
{
data_vel curr_vel;
if (startPoint < 20) {
startPoint++;
return curr_vel;
}
if (!start)
{
myWriteFile1.open("src/rb_chay_1m/sdk/data_save.txt",
std::ios_base::out);
72
myWriteFile1<<
"t\txd\tyd\tphid\tx\ty\tphi\tvx\tvy\to\timuax\timuay\timuaz\timugx\timugy\timugz\timumx
\timugy\timugz\n";
time0 = time;
xStart = x;
yStart = y;
phiStart = phi;
start = true;
run = full_data.Getitem(Ldata);
run = full_data.Getitem(Ndata);
}
float dx = x-xStart;
float dy = y-yStart;
float dphi = phiStart;
x = dx*cos(dphi) + dy*sin(dphi);
y = -dx*sin(dphi) + dy*cos(dphi);
phi = phi - phiStart;
float t = time - time0;
cout << "t: " <<setprecision(4)<<fixed << t << "\tx: " << x << "\ty: "<< y <<
"\tphi: " << phi*180/M_PI << endl;
if (run)
{
if (t >= Ndata.t) {
Ldata = Ndata;
run = full_data.Getitem(Ndata);
}
float xd = Ldata.x;
float yd = Ldata.y;
float phid = Ldata.phi;
float vd = Ldata.V;
float od = Ldata.V/Ldata.bk*((Ndata.phi-Ldata.phi)>0?1:-1);
cout << "t: " <<setprecision(4)<<fixed << t << "\txd: " << xd << "\tyd:
"<< yd << "\tphid: " << phid*180/M_PI << endl;
float ex = x - xd;
float ey = y - yd;
float ephi = phi-phid;
while (ephi > M_PI) ephi -= 2*M_PI;
while (ephi <-M_PI) ephi += 2*M_PI;
curr_vel.vx = vd - u1;
73
curr_vel.vy = 0 - u2;
curr_vel.o = od - u3;
myWriteFile1 << setprecision(6)<<fixed << t << "\t" << xd << "\t"<< yd <<
"\t" << phid << "\t" << x << "\t" << y << "\t" << phi << "\t" ;
myWriteFile1 << setprecision(6)<<fixed << vx << "\t" << vy << "\t"<< o <<
"\t" ;
myWriteFile1 << setprecision(6)<<fixed << imuax << "\t" << imuay <<
"\t"<< imuaz << "\t" ;
myWriteFile1 << setprecision(6)<<fixed << imugx << "\t" << imugy <<
"\t"<< imugz << "\t" ;
myWriteFile1 << setprecision(6)<<fixed << imumx << "\t" << imumy <<
"\t"<< imumz << "\t" ;
myWriteFile1 << '\n';
}
else if (!savefile) {
myWriteFile1.close();
cout<< "save OK" <<endl;
savefile = true;
}
return curr_vel;
}
Lidar được sử dụng là RPLidar, chương trình đọc dữ liệu từ Lidar [11] và hiệu chỉnh lại
các thông số để hoạt động đúng cổng USB của máy tính nhúng.
Chương trình xây dựng bản đồ dựa trên phương pháp so sánh vị trí các điểm của 2 lần
quét liên tiếp, tự đó tìm ra vị trí có số điểm quét trùng nhau nhiều nhất, ứng với mỗi điểm
được chia lưới trong ma trận bản đồ.
74
Hình 4.5 Phương pháp quét bản đồ; a) Dữ liệu lidar quét; b) Dữ liệu bản đồ có sẵn;
Theo phương pháp được nêu trên Hình 4.5, mỗi lần liên tiếp sẽ được ghi lại vào ma trận
bản đồ như Hình 4.5c, các điểm màu xanh lá là điểm mới thêm vào bản đồ, từ đó ta có ma trận
bản đồ hoàn chỉnh.
Chương trình quét tạo bản đồ được viết dưới dạng C++:
#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <math.h>
#include <vector>
#include<fstream>
#include <stdio.h>
#include <thread>
75
position p;
double scale;
double _cos[1440];
double _sin[1440];
unsigned char arr[10240][10240];
unsigned long countmax = 0;
scan_matching::scan_matching(double meshing)
{
scale = 1 / meshing;
_scale = scale;
for (int i = 0; i < 1440; i++) _cos[i] = scale * cos(DEG2RAD(i));
for (int i = 0; i < 1440; i++) _sin[i] = scale * sin(DEG2RAD(i));
}
76
arr[x][y] = 30;
arrout[x][y] = 30;
}
else
for (int i=0 ; i <= abs(y2-y1); i++)
{
long x = (long) ((x2-x1)>0?1:-1) * i/k + x1;
long y = ((y2-y1)>0?1:-1) * i + y1;
arr[x][y] = 30;
arrout[x][y] = 30;
}
}
void scan_matching::draw(double ranges[], position pos)
{
long ox = lidar1_x * _cos[pos.t] + lidar1_y * _sin[pos.t] + scale * pos.x;
long oy = lidar1_x * _sin[pos.t] - lidar1_y * _cos[pos.t] + scale * pos.y;
for (int i = 0; i < 180; i++)
{
if (ranges[i] > 0)
{
unsigned long _x = 5120 + ranges[i] * _cos[i + pos.t] + ox;
unsigned long _y = 5120 + ranges[i] * _sin[i + pos.t] + oy;
if (_x < x_min) x_min = _x;
if (_x > x_max) x_max = _x;
if (_y < y_min) y_min = _y;
if (_y > y_max) y_max = _y;
if (_x >= 10240 || _y >= 10240) continue;
rline(5120 + ox, 5120 + oy, _x, _y);
arr[_x][_y] = 130;
arrout[_x][_y] = 130;
arrout[_x][_y] = 130;
arrout[_x-1][_y] = 130;
arrout[_x+1][_y] = 130;
arrout[_x][_y-1] = 130;
arrout[_x][_y+1] = 130;
}
}
ox = lidar2_x * _cos[pos.t] + lidar2_y * _sin[pos.t] + scale * pos.x;
oy = lidar2_x * _sin[pos.t] - lidar2_y * _cos[pos.t] + scale * pos.y;
for (int i = 180; i < 360; i++)
{
if (ranges[i] > 0)
{
unsigned long _x = 5120 + ranges[i] * _cos[i + pos.t] + ox;
unsigned long _y = 5120 + ranges[i] * _sin[i + pos.t] + oy;
if (_x < x_min) x_min = _x;
if (_x > x_max) x_max = _x;
if (_y < y_min) y_min = _y;
if (_y > y_max) y_max = _y;
if (_x >= 10240 || _y >= 10240) continue;
rline(5120 + ox, 5120 + oy, _x, _y);
arr[_x][_y] = 130;
arrout[_x][_y] = 130;
arrout[_x-1][_y] = 130;
arrout[_x+1][_y] = 130;
arrout[_x][_y-1] = 130;
arrout[_x][_y+1] = 130;
}
77
}
return;
}
void calc_F(double ranges[], long x1, long x2, long y1, long y2)
{
for (long dx = x1; dx < x2; dx+=3)
{
for (long dy = y1; dy < y2; dy+=3)
{
for (long dt = 0; dt < 360; dt+=4)
{
unsigned long count = 0;
for (int i = 0; i < 180; i+=2)
{
if (ranges[i] > 0)
{
unsigned long _x = ranges[i] * _cos[i + dt] + lidar1_x *
_cos[dt] + lidar1_y * _sin[dt] + dx;
unsigned long _y = ranges[i] * _sin[i + dt] + lidar1_x *
_sin[dt] - lidar1_y * _cos[dt] + dy;
if (_x < 0 || _y < 0 || _x >= 10240 || _y >= 10240) continue;
if (arr[_x][_y]==130) count++;
}
}
for (int i = 180; i < 360; i+=2)
{
if (ranges[i] > 0)
{
unsigned long _x = ranges[i] * _cos[i + dt] + lidar2_x *
_cos[dt] + lidar2_y * _sin[dt] + dx;
unsigned long _y = ranges[i] * _sin[i + dt] + lidar2_x *
_sin[dt] - lidar2_y * _cos[dt] + dy;
if (_x < 0 || _y < 0 || _x >= 10240 || _y >= 10240) continue;
if (arr[_x][_y] == 130) count++;
}
}
if (count > countmax)
{
countmax = count;
p.x = (dx - 5120) / scale;
p.y = (dy - 5120) / scale;
p.t = dt;
}
}
}
}
}
void match_F(double ranges[], long x1, long x2, long y1, long y2)
{
calc_F(ranges, x1, x2, y1, y2);
}
78
/ 2);
std::thread t2(match_F, ranges, x_min, (x_max + x_min) / 2, (y_max + y_min) / 2,
y_max);
std::thread t3(match_F, ranges, (x_max + x_min) / 2, x_max, y_min, (y_max + y_min)
/ 2);
std::thread t4(match_F, ranges, (x_max + x_min) / 2, x_max, (y_max + y_min) / 2,
y_max);
t1.join();
t2.join();
t3.join();
t4.join();
_countmax = countmax;
return p;
}
void calc(double ranges[], long x1, long x2, long y1, long y2, position pos)
{
long x = 5120 + scale * pos.x;
long y = 5120 + scale * pos.y;
for (long dx = x1; dx < x2; dx++)
{
for (long dy = y1; dy < y2; dy++)
{
for (long dt = 0+pos.t; dt < 360+pos.t; dt++)
{
unsigned long count = 0;
for (int i = 0; i < 180; i++)
{
if (ranges[i] > 0)
{
unsigned long _x = x + ranges[i] * _cos[i + dt] + lidar1_x *
_cos[dt] + lidar1_y * _sin[dt] + dx;
unsigned long _y = y + ranges[i] * _sin[i + dt] + lidar1_x *
_sin[dt] - lidar1_y * _cos[dt] + dy;
if (_x >= 10240 || _y >= 10240) continue;
if (arr[_x][_y]==130) count++;
}
}
for (int i = 180; i < 360; i++)
{
if (ranges[i] > 0)
{
unsigned long _x = x + ranges[i] * _cos[i + dt] + lidar2_x *
_cos[dt] + lidar2_y * _sin[dt] + dx;
unsigned long _y = y + ranges[i] * _sin[i + dt] + lidar2_x *
_sin[dt] - lidar2_y * _cos[dt] + dy;
if (_x >= 10240 || _y >= 10240) continue;
if (arr[_x][_y]==130) count++;
}
}
if (count > countmax)
{
countmax = count;
p.x = dx / scale + pos.x;
p.y = dy / scale + pos.y;
p.t = dt;
while (p.t >= 360) p.t -= 360;
}
79
}
}
}
}
void match1(double ranges[], long _limit, position pos)
{
calc(ranges, - _limit, 0, - _limit, 0, pos);
}
void scan_matching::save()
{
std::cout << "save ... ";
for (int i = 0; i < 10240; i++)
{
for (int j = 0; j < 1280; j++)
{
char c = '\0';
for (int k = 0; k < 8; k++) c = c << 1 | arr[i][j * 8 + k];
arr_convert[i][j] = c;
}
}
pFile = fopen("file.txt", "wb");
fwrite(arr_convert, 1, 10240 * 1280 * sizeof(unsigned char), pFile);
fclose(pFile);
std::cout << "OK" << std::endl;
}
80
bool scan_matching::load()
{
std::cout << "load ... ";
x_min = 10240, y_min = 10240, x_max = 0, y_max = 0;
pFile = fopen("file.txt", "rb");
if (pFile == NULL) return 0;
fread(arr_convert, 1, 10240 * 1280 * sizeof(unsigned char), pFile);
fclose(pFile);
for (int i = 0; i < 10240; i++)
{
for (int j = 0; j < 1280; j++)
{
char c = arr_convert[i][j];
for (int k = 0; k < 8; k++)
{
unsigned char ch = (c & 0x80) > 0;
arr[i][j * 8 + k] = ch;
c = c << 1;
if (ch == 1)
{
if (i < x_min) x_min = i;
if (i > x_max) x_max = i;
if (j * 8 + k < y_min) y_min = j * 8 + k;
if (j * 8 + k > y_max) y_max = j * 8 + k;
}
}
}
}
std::cout << "OK" << std::endl;
return 1;
}
Tiến hành cho rôbốt chạy thử nghiệm bám theo quỹ đạo được lưu trong tệp “text”. Bộ
điều khiển được sử dụng là BĐK phản hồi trạng thái tuyến tính
Chương trình điều khiển của rôbốt
#include <iostream>
#include <ros/ros.h>
#include "ros/time.h"
#include "lino_msgs/Velocities.h"
#include "geometry_msgs/Twist.h"
#include "lino_msgs/Imu.h"
#include "geometry_msgs/Point.h"
#include "xu_ly.h"
float x = 0, y = 0, phi = 0;
float vx = 0, vy = 0, o = 0;
float imuax = 0, imuay = 0, imuaz = 0;
float imugx = 0, imugy = 0, imugz = 0;
float imumx = 0, imumy = 0, imumz = 0;
81
{
imuax = Imu_input->linear_acceleration.x;
imuay = Imu_input->linear_acceleration.y;
imuaz = Imu_input->linear_acceleration.z;
imugx = Imu_input->angular_velocity.x;
imugy = Imu_input->angular_velocity.y;
imugz = Imu_input->angular_velocity.z;
imumx = Imu_input->magnetic_field.x;
imumy = Imu_input->magnetic_field.y;
imumz = Imu_input->magnetic_field.z;
}
ros::NodeHandle nh;
ros::Subscriber sub1 = nh.subscribe("/raw_imu", 1000, Call_Imu);
ros::Subscriber sub2 = nh.subscribe("/raw_vel", 1000, Call_Vel);
ros::Subscriber sub = nh.subscribe("/tf", 1000, Call_Pos);
ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/cmd_vel", 1000);
docfile();
ros::Rate loop_rate(20);
ros::Time start_time = ros::Time::now();
while (ros::ok()) {
geometry_msgs::Twist cmd;
data_vel out = xu_ly((ros::Time::now()-start_time).toSec(),x,y, vx, vy,
o, imuax, imuay, imuaz, imugx, imugy, imugz, imumx, imumy, imumz);
cmd.linear.x = out.vx;
cmd.linear.y = out.vy;
cmd.angular.z = out.o;
std::cout << out.vx << '\t' << out.vy << '\t' << out.o << '\n';
pub.publish(cmd);
ros::spinOnce();
loop_rate.sleep();
}
ros::spin();
return 0;
}
Kết quả thu được thể hiện ở các Hình 4.6 – Hình 4.10
82
Hình 4.7 Vận tốc và vận tốc góc rôbốt trong thực nghiệm
83
Hình 4.8 Vận tốc góc của các bánh xe trong thực nghiệm
Hình 4.9 Sai số vận tốc của thực nghiệm với mong muốn
84
Hình 4.10 Sai số vị trí của thực nghiệm với mong muốn
Nhận xét:
- Rôbốt đã bám tương đối theo quỹ đạo cho trước với sai số không quá lớn (Hình 4.6),
không bị lệch hoàn toàn khỏi quỹ đạo mong muốn. Có khả năng tự giảm sai số khi di chuyển,
tuy nhiên cần mất một khoảng thời giàn lớn để giảm lượng sai số đó.
- Vận tốc của Rôbốt đã bám được theo vân tốc mong muốn, nhưng biên độ dao động
quanh vận tốc mong muốn vẫn còn lớn (Hình 4.8, Hình 4.9).
- Nguyên nhân là do phần cơ khí chưa được tối ưu, ma sát trượt với sàn nhà nhỏ, khả
năng đáp ứng chưa được tốt. Cần tối ưu hóa lại chương trình, tùy chỉnh lại các hệ số ở bộ điều
khiển.
85
KẾT LUẬN ĐỒ ÁN
86
87
DOI: 10.1007/978-3-030-91892-7_39
Tên: Trajectory Tracking Using Linear State Feedback Controller for a Mecanum Wheel
Omnidirectional
Ngày xuất bản: 2021/12/15
Hội thảo: IFToMM Asian conference on Mechanism and Machine Science
Trang: 411-421
Nhà xuất bản: Springer, Cham
Nội dung bài báo:
88
89
90
91
92
93
94
95
96
97
98
99