You are on page 1of 140

Mục lục

Mục lục...................................................................................................................1
Chương 1: TỔNG QUAN VỀ ROBOT CÔNG NGHIỆP, HỆ ĐIỀU HÀNH ROS
VÀ PHẦN MỀM ROBODK...................................................................................3
1.1 Tổng quan về robot công nghiệp....................................................................................................3
1.2. Tổng quan về hệ điều hành ROS..................................................................................................16
1.3. Tổng quan về phần mềm ROBODK............................................................................................39
1.4. Kết luận chương 1.........................................................................................................................44

Chương 2: ĐỘNG HỌC VÀ ĐỘNG LỰC HỌC ROBOT 6 BẬC TỰ DO..........45


2.1. Cơ sở lý thuyết về mô tả vị trí của robot công nghiệp.................................................................45
2.2. Xây dựng mô hình động học cánh tay robot................................................................................48

Chương 3: PHÂN TÍCH VÀ XÂY DỰNG PHẦN CƠ KHÍ CỦA......................58


FANUC MATE 100..............................................................................................58
3.1. Dựng lại kết cấu cánh tay robot 6 bậc tự do:...................................................................................58
3.2. Thông số làm việc của robot..............................................................................................................74

CHƯƠNG 4 : PHẦN MỀM LẬP TRÌNH NGOẠI TUYẾN ROBODK..............76


4.1. Xây dựng mô hình robot :..................................................................................................................76
4.2. Tạo một chương trình sử dụng file thiết kế từ phần mềm Cad :....................................................83

NGHIÊN CỨU VÀ MÔ PHỎNG CÁNH TAY ROBOT ỨNG DỤNG


ROS.......................................................................................................................91
5.1. Xây dựng mô hình robot...............................................................................................................91
5.2. Xây dựng môi trường mô phỏng..................................................................................................98
5.3. Lập trình kết nối với các nút khác trong hệ thống....................................................................128

1
Chương 1: TỔNG QUAN VỀ ROBOT CÔNG NGHIỆP, HỆ ĐIỀU HÀNH
ROS VÀ PHẦN MỀM ROBODK
1.1 Tổng quan về robot công nghiệp
1.1.1. Lịch sử phát triển robot

Xu thế vận động của xã hội luôn là phát triển đi lên, tư tưởng con người
cũng tiến bộ lên theo đó. Nền công nghiệp phát triển tương ứng với khối
lượng công việc sẽ nhiều hơn, nặng nhọc hơn, từ đó, con người đã suy nghĩ
và tạo ra các vật thể nhân tạo thay thế mình làm những công việc lặp đi lặp
lại, nhàm chán, nặng nhọc, vận chuyển, lắp ráp hay trong những môi người
khắc nghiệt như ngoài không gian vũ trụ, trong long đất, lò phản ứng hạt
nhân…

Sự bùng nổ của các cuộc cách mạng công nghiệp lần thứ 3 và lần thứ
4 đã thúc đẩy tự động hóa phát triển. Theo đó, xu hướng tạo ra các dây
chuyền về thiết bị tự động có tính linh hoạt cao đang cũng được hình thành.
Các thiết bị này đang thay thế dần các máy tự động “cứng nhắc” chỉ đáp ứng
một mệnh lệnh nhất định trong khi thị trường luôn đòi hỏi những mặt hàng
đa dạng về chủng loại, kích cỡ và về tính năng… Vì thế, việc ứng dụng
những thiết bị thông minh, hay nói cách khác là robot công nghiệp, đang dần
trở thành điểm mấu chốt để khẳng định năng lực cạnh tranh của doanh
nghiệp.

Khái niệm về robot công nghiệp được khai sinh vào năm 1954 khi
Unimate là robot công nghiệp đầu tiên phát minh bởi George Devol vào
những năm 1950 (ông xin cấp bằng sáng chế gốc vào năm 1954 và được cấp
vào năm 1961) hoạt động trên dây chuyền lắp ráp ở một nhà máy ô tô của
General Motors tại thị trấn Ewing, New Jersey, Hoa Kỳ vào năm 1961.

Công ty đầu tiên sản xuất robot là Unimation , được thành lập bởi
Devol và Joseph F. Engelberger vào năm 1956. Unimation sau đó đã cấp phép
công nghệ của họ cho Công ty Công nghiệp nặng Kawasaki và GKN , sản
xuất Unimates tại Nhật Bản và Anh. Trong một thời gian, đối thủ cạnh tranh
duy nhất của Unimation là Cincinnati Milacron Inc., Ohio . Điều này đã thay
2
đổi hoàn toàn vào cuối những năm 1970 khi một số tập đoàn lớn của Nhật
Bản bắt đầu sản xuất robot công nghiệp tương tự.

Từ những năm 80, nhất là vào những năm 90, do áp dụng rộng rãi các
tiến bộ kỹ thuật về vi xử lý và công nghệ thông tin, số lượng robot công
nghiệp đã gia tăng, giá thành giảm đi rõ rêt, tính năng đã có nhiều bước tiến
vượt bậc. Nhờ vậy robot công nghiệp đã có vị trí quan trọng trong các dây
chuyền sản xuất hiện đại.

1.1.2. Tổng quan về robot công nghiệp

- Định nghĩa robot công nghiệp:

Robot công nghiệp là tay máy tự động được đặt cố định hoặc di động
bao gồm thiết bị dạng tay máy có số bậc tự do cao hoạt động và thiết bị điều
khiển theo chương trình, có thể tái lập trình để hoàn thành các chức năng hoạt
động và điều khiển trong quá trình sản xuất.

- Hai đặc trưng cơ bản của robot công nghiệp:

+ Thiết bị vạn năng được tự động hóa theo chương trình và có thể lập
trình lại để đáp ứng một các linh hoạt, khéo léo nhiệm vụ khác.

+ Đước ứng dụng trong những trường hợp công nghiệp đặc trưng như xếp dỡ
nguyên liệu, lắp ráp, gia công…

1.1.3. Cấu trúc cơ bản của robot công nghiệp

- Robot công nghiệp được cấu hình bởi các yếu tố sau:

+ Tay máy: là cơ cấu cơ khí gồn các khâu khớp lắp ráp lại với nhau
hình thành cánh tay để tạo các chuyển động cơ bản, cổ tay tạo nên sự khéo léo
linh hoạt, bàn tay hoàn thành các thao tác trên đối tượng.

+ Cơ cấu chấp hành tạo chuyển động cho các khâu cổ tay máy, động cơ
là nguồn động lực của các cơ cấu chấp hành.

3
+ Hệ thống cảm biến gồm các cảm biến và các thiết bị chuyển đổi tín
hiệu cần thiết khác, các robot cần hệ thống cảm biến trong để nhận biết
trạng thái của bản thân, các cơ cấu của robot và các cảm biến ngoài để nhận
biết trạng thái của môi trường.

+ Hệ thống điều khiển hiện nay thường là máy tính để giám sát và
điều khiển hoạt động của robot.

* Kết cấu tay máy

Tay máy là phần cơ sở quyết định khả năng làm việc của RBCN, đó là
thiết bị đảm bảo cho robot khả năng làm việc như nâng hạ vật. Ban đầu
người ta chế tạo tay máy dựa theo tay người, còn hiện nay tay máy rất đa
dạng và nhiều loại khác xa tay người, tuy nhiên vẫn sử dụng thuật ngữ như:
vai, cánh tay, cổ tay, bàn tay và khớp để chỉ các bộ phận của nó.

Trong thiết kế tay máy, người ta quan tâ, đến các thông số ảnh hưởng
khả năng làm việc:

- Sức nâng, độ cứng vững lực kẹp của tay.

- Tầm với của vùng làm việc.

- Khả năng định vị, định hướng phần công tác

Chúng có đặc điểm như sau:

Kết cấu gồm các khâu được nối với nhau bằng các khớp để hình thành
một chuỗi động học hở. Các khớp chủ yếu là khớp quay và khớp trượt, tùy
theo cách bố trí mà các khớp có thể tạo ra các tay máy có tọa độ Descartes,
tọa độ trục, tọa độ cầu, SCADA…

1.1.4. Phân loại robot

Trong công nghiệp người ta sử dụng những đặc điểm khác nhau cơ
bản nhẩ để giúp cho việc nhận biết được dễ dàng. Có 4 yếu tố chin để phân
loại robot như sau:

4
a. Phân loại theo dạng hình học của không gian hoạt động

Để dịch chuyển khâu tác động cuối cùng của robot đến vị trí của đối
tượng thao tác được cho trước trong không gian làm việc cần phải có ba bậc
chuyển động chuyển dời hay chuyển động định vị (thường dùng khớp tịnh
tiến và khớp quay loại 5). Những robot công nghiệp thực tế thường không sử
dụng quá bốn bậc chuyển động chuyển dời (không kể chuyển động kẹp của
tay gắp) và thông thường với ba bậc chuyển động định vị là đủ, rất ít khi sử
dụng đến bốn bậc chuyển động định vị.

Robot được phân loại theo sự phối hợp giữa ba trục chuyển động cơ
bản rồi sau đó được bổ sung để mở rộng thêm bậc chuyển động nhằm tăng
thêm độ linh hoạt. Vùng giới hạn tầm hoạt động của robot được gọi là không
gian làm việc.

Theo hình dạng hình học của không gian hoạt động có các loại robot
sau:

+ Robot tọa độ vuông góc (Cartesian robot)

+ Robot toạ độ trụ (Cylindrical robot)

+ Robot toạ độ cầu (Spherical robot)

+ Robot khớp bản lề (Articular robot) bao gồm cả robot dạng SCADA

b. Phân loại theo thế hệ

Theo quá trình phát triển của robot, ta có thể chia ra các mức độ sau
đây:

+ Robot thế hệ thứ nhất

Bao gồm các dạng robot hoạt động lặp lại theo một chu trình không
thay đổi (playback robots), theo chương trình định trước. Chương trình ở
đây cũng có hai dạng; chương trình “cứng” không thay đổi được như điều
khiển bằng hệ thống cam và điều khiển với chương trình có thể thay đổi theo

5
yêu cầu công nghệ của môi trường sử dụng nhờ các panel điều khiển hoặc
máy tính.

Đặc điểm:

• Sử dụng tổ hợp các cơ cấu cam với công tác giới hạn hành trình.

• Điều khiển vòng hở.

• Có thể sử dụng băng từ hoặc băng đục lỗ để đưa chương trình vào
bộ điều

khiển, tuy nhiên loại này không thay đổi chương trình được.

• Sử dụng phổ biến trong công việc gắp - đặt (pick and place).

+ Robot thể hiện thứ hai

Trong trường hợp này robot được trang bị các bộ cảm biến (sensors)
cho phép cung cấp tín hiệu phản hồi hỗ trở lại hệ thống điều khiển về trạng
thái, vị trí không gian của robot cũng như những thông tin về môi trường
bên ngoài như trạng thái, vị trí của đối tượng thao tác, của các máy công
nghệ mà robot phối hợp, nhiệt độ của môi trường, v.v... giúp cho bộ điều
khiển có thể lựa chọn những thuật toán thích hợp để điều khiển robot thực
hiện những thao tác xử lý phù hợp. Nói cách khác, đây cũng là robot với
điều khiển theo chương trình nhưng có thể tự điều chỉnh hoạt động thích ứng
với những thay đổi của môi trường thao tác. Dạng robot với trình độ điều
khiển này còn được gọi là robot được điều khiển thích nghi cấp thấp.

Robot thế hệ này bao gồm các robot sử dụng cảm biến trong điều
khiển (sensor - controlled robots) cho phép tạo được những vòng điều khiển
kín kiểu servo.

Đặc điểm:

• Điều khiển vòng kín các chuyển động của tay máy.

6
• Có thể tự ra quyết định lựa chọn chương trình đáp ứng dựa trên tín
hiệu

phản hồi từ cảm biến nhờ các chương trình đã được cài đặt từ trước.

• Hoạt động của robot có thể lập trình được nhờ các công cụ như
bàn phím,

pa-nen điều khiển.

+ Robot thế hệ thứ ba

Đây là dạng phát triển cao nhất của robot tự cảm nhận. Các robot ở
đây được trang bị những thuật toán xử lý các phản xạ logic thích nghi theo
những thông tin và tác động của môi trường lên chúng; nhờ đó robot tự biết
phải làm gì để hoàn thành được công việc đã được đặt ra cho chúng. Hiện
nay cũng đã có nhiều công bố về những thành tựu trong lĩnh vực điều khiển
này trong các phòng thí nghiệm và được đưa ra thị trường dưới dạng những
robot giải trí có hình dạng của các động vật máy.

Robot thế hệ này bao gồm các robot được trang bị hệ thống thu nhận
hình ảnh trong điều khiển (Vision - controlled robots) cho phép nhìn thấy và
nhận dạng các đối tượng thao tác.

Đặc điểm:

• Có những đặc điểm như loại trên và điều khiển hoạt động trên cơ
sở xử lý

thông tin thu nhận được từ hệ thống thu nhận hình ảnh (Vision systems -
Camera).

• Có khả năng nhận dạng ở mức độ thấp như phân biệt các đối
tượng có hình dạng và kích thước khá khác biệt nhau.

+ Robot thế hệ thứ tư

7
Bao gồm các robot sử dụng các thuật toán và cơ chế điều khiển thích
nghi (adaptively controlled robot) được trang bị bước đầu khả năng lựa chọn
các đáp ứng tuân theo một mô hình tính toán xác định trước nhằm tạo ra
những ứng xử phù hợp với điều kiện của môi trường thao tác.

Đặc điểm :

• Có những đặc điểm tương tự như thế hệ thứ hai và thứ ba, có khả
năng tự động lựa chọn chương trình hoạt động và lập trình lại cho các hoạt
động dựa trên các tín hiệu thu nhận được từ cảm biến.

• Bộ điều khiển phải có bộ nhớ tương đối lớn để giải các bài toán
tối ưu với điều kiện biên không được xác định trước. Kết quả của bài toán sẽ
là một tập hợp các tín hiệu điều khiển các đáp ứng của robot.

+ Robot thế hệ thứ năm

Là tập hợp những robot được trang bị trí tuệ nhân tạo (artificially
intelligent robot).

Đặc điểm:

• Robot được trang bị các kỹ thuật của trí tuệ nhân tạo như nhận
dạng tiếng nói, hình ảnh, xác định khoảng cách, cảm nhận đối tượng qua tiếp
xúc, v.v... để ra quyết định và giải quyết các vấn đề hoặc nhiệm vụ đặt ra
cho nó.

• Robot được trang bị mạng Neuron có khả năng tự học.

• Robot được trang bị các thuật toán dạng Neuron Fuzzy/Fuzzy


Logic để tự suy nghĩ và ra quyết định cho các ứng xử tương thích với những
tín hiệu nhận được từ môi trường theo những thuật toán tối ưu một hay nhiều
mục tiêu đồng thời.

Hiện nay trong lĩnh vựcgiải trí, nhiều dạng robot thế hệ này đang được
phát triển như robot Aibo - chú chó robot của hãng Sony hay robot đi trên
hai chân và khiêu vũ được của hãng Honda.

8
Nhật Bản là đất nước có số lượng robot sử dụng trong công nghiệp
nhiều nhất thế giới. Người Nhật có quan niệm khá khác biệt về robot so với
các nước công nghiệp phát triển. Theo Hiệp hội robot Nhật - JIRA (Japanese
Robot Associasion), robot được chia thành sáu loại, theo mức độ thông minh
như sau:

1) Robot hoạt động nhờ người điều khiển trực tiếp từng động tác,
bằng pendant hay pa-nen điều khiển.

2) Robot hoạt động theo chu trình cố định (fixed sequence robots).

3) Robot hoạt động theo chu trình thay đổi được (variable sequence
robots): người điều khiển có thể dễ dàng chỉnh sửa trình tự hoạt động.

4) Robot hoạt động theo chương trình vả lặp lại chương trình
(playback robots): người điều khiển có thể lập trình cho robot trong chế độ
huấn luyện (teaching mode).

5) Robot điều khiển theo chương trình số (numerically controlled


robots).

6) Robot thông minh (intelligent robots): robot có thể hiểu, nhận


biết và tương tác với môi trường xung quanh.

c. Phân loại theo bộ điều khiển

+ Robot gắp đặt

Robot này thường nhỏ và sử dụng nguồn dẫn động khí nén. Bộ điều
khiển phổ biến là bộ điều khiển lập trình (PLC) để thực hiện điều khiển vòng
hở. Robot hoạt động căn cứ vào các tín hiệu phản hồi từ các tiếp điểm giới
hạn hành trình cơ khí đặt trên các trục của tay máy.

+ Robot đường dẫn liên tục

Robot loại này sử dụng bộ điều khiển servo thực hiện điều khiển vòng
kín. Hệ thống điều khiển liên tục là hệ thống trong đó robot được lập trình
theo một đường chính xác. Trong hệ thống điều khiển này, đường dẫn được
9
biểu điễn bằng một loạt các điểm rời rạc gần nhau và được lưu vào bộ nhớ
robot, sau đó robot sẽ thực hiện lại chính xác đường dẫn đó.

d. Phân loại theo nguồn dẫn động

+ Robot dung nguồn cấp điện

Nguồn điện cấp cho robot thường là DC để điều khiển động cơ DC.
Hệ thống dùng nguồn AC cũng được chuyển đổi sang DC. Các động cơ sử
dụng thường là động cơ bước, động cơ DC servo, động cơ AC servo. Robot
loại này có thiết kế gọn, chạy êm, định vị rất chính xác. Các ứng dụng phổ
biến là robot sơn, hàn.

+ Robot dùng nguồn khí nén

Hệ thống cán được trang bị máy nén, bình chứa khí và động cơ kéo
máy nén. Robot loại này thường được sử dụng trong các ứng dụng có tải
trọng nhỏ có tay máy là các xy-lanh khí nén thực hiện chuyển động thẳng và
chuyển động quay. Do khí nén là lưu chất nén được nén robot loại này
thường sử dụng trong các thao tác gắp đặt không cần độ chính xác cao.

+ Robot dùng nguồn thủy lực

Nguồn thuỷ lực sử dụng lưu chất không nén được là dầu ép. Hệ thống
cần trang bị bơm để tạo áp lực dầu. Tay máy là các xy - lanh thuỷ lực
chuyển động thẳng và quay động cơ dầu. robot loại này được sử dụng trong
các ứng dụng có tải trọng lớn.

Bảng 1-1: Bảng tóm tắt các yếu tố phân loại robot

Dấu hiệu phân loại Tên gọi của tay máy


- Có hai, ba hoặc nhiều hơn ở
Theo số bậc chuyển động
dạng:
(Kể cả bậc chuyển động
+ Không di chuyển
dời của cả tay máy)
+ Tự chuyển dời

10
- Một, hai hoặc nhiều tay máy
được điều khiển đồng thời:
+ Có nguồn dẫn động và điều
khiển riêng
Theo số lượng tay máy
+ Có nguồn dẫn động riêng và
được điều khiển chung
+ Có chung nguồn dẫn động
+ Tự di chuyển
+ Loại siêu nhẹ
+ Loại nhẹ
Theo tải nâng của tay máy + Loại trung
+ Loại nặng
+ Loại siêu nặng
+ Khí nén
Theo nguồn dẫn động của + Thủy lực
các cơ cấu chấp hành + Cơ điện
+ Hỗn hợp
- Với điều khiển chương trình
+ Theo chu kỳ
+ Theo vị trí
+ Theo chu vi
Theo hệ thống điều khiển
+ Hỗn hợp
theo nguyên lý điều khiển
- Với điều khiển theo cảm nhận
+ Điều khiển không thích nghi
+ Điều khiển thích nghi
- Với trí tuệ nhân tạo
Theo số robot được điều + Điều khiển riêng rẽ
khiển đồng thời + Điều khiển theo nhóm
+ Kiểu thông thường
+ Kiểu phòng bụi
Theo kiểu bảo hiểm
+ Kiểu phòng nhiệt
+ Kiểu phòng nổ
11
1.1.5. Ứng dụng của robot công nghiệp

Các Robot nói chung được sử dụng rộng rãi với nhiều mục đích, trong
nhiều lĩnh vực, từ các nhà máy, xí nghiê ̣p lớn tới các công viê ̣c phục vụ
trong sinh hoạt đời sống của con người. Robot có thể làm viê ̣c trong môi
trường độc hại, nguy hiểm như trong các lò phản ứng hạt nhân, phóng xạ,…
hay trong công viê ̣c thám hiểm không gian, thăm dò các hành tinh thuộc hê ̣
Mặt trời. Trong sinh hoạt, có các Robot trợ giúp, phục vụ người già, cắt cỏ,
lau nhà…

Đối với Robot công nghiê ̣p nói riêng, mức độ ứng dụng của nó diễn ra
mạnh mẽ và sâu rộng hơn cả. Hầu hết các dây chuyền tự động hoá sản xuất
hiê ̣n đại đều có sự xuất hiê ̣n của Robot.

Các Robot công nghiê ̣p được ứng dụng trong các lĩnh vực cụ thể sau:

a. Robot công nghiệp trong công nghệ gia công và lắp ráp

Độ chính xác định vị và thời gian là yếu tố quan trọng nhất khi thiết
kế các Robot lắp ráp. Có nhiều dây chuyền tự động gồm các máy vạn năng
và Robot công nghiê ̣p. Các dây chuyền đạt mức độ tự động hoá cao, tự động
hoàn toàn không có sự tham gia của con người, rất linh hoạt và không đòi
hỏi đầu tư lớn. Trong đó các máy và Robot trong dây chuyền được điều
khiển bằng cùng một hê ̣ thống chương trình. Đó là các dây chuyền lắp ráp ô
tô, các sản phẩm điê ̣n tử (Hình 1.1). Yêu cầu hiê ̣n nay đối với các Robot
công nghiê ̣p loại này là nâng cao tính linh hoạt để đáp ứng nhiều loại công
viê ̣c, hạ giá thành và dễ thích hợp với các sản phẩm loại nhỏ.

12
Hình 1.1: Robot công nghiệp trong công nghệ gia công và lắp giáp

b. Robot công nghiêp̣ trong các quá trình hàn và nhiêṭ luyêṇ

Các quá trình này bao gồm các công viê ̣c nặng nhọc, độc hại, nhiê ̣t độ
cao. Hàn đường thường được thực hiê ̣n bằng tay. Tuy nhiên năng suất thấp
do yêu cầu chất lượng bề mặt mối hàn liên quan đến các thao tác của đầu mỏ
hàn với môi trường khắc nghiê ̣t do khói và nhiê ̣t độ phát ra trong quá trình
hàn. Không giống kỹ thuật hàn điểm, ở đó mối hàn có vị trí cố định, mối hàn
trong kỹ thuật hàn đường nằm dọc theo mối ghép giữa hai tấm kim loại.
Những hê ̣ thống hàn đường thực tế phụ thuộc vào con người trong viê ̣c kẹp
chặt chính xác chi tiết được hàn và sau đó robot di chuyển dọc theo quĩ đạo
được lập trình trước. Ưu điểm duy nhất so với hàn bằng tay là chất lượng
mối hàn được ổn định. Người vận hành chỉ còn thực hiê ̣n một viê ̣c đơn giản
là kẹp chặt các chi tiết (Hình 1.2).

13
Hình 1.2: Robot công nghiệp trong quá trình hàn

c. Robot công nghiệp trong nhà máy sản xuất

Trong sản xuất lớn, những robot này là những hê ̣ thống được tự động
hoá hoàn toàn: chúng đo đạc, cắt, khoan các thiết bị chính xác và còn có khả
năng hiê ̣u chỉnh các công viê ̣c của mình, hầu như ở đây không cần sự giúp
đỡ của con người trừ chương trình điều khiển trong máy tính điê ̣n tử. Chỉ
với vài người giám sát công viê ̣c; các máy móc này có thể hoạt động suốt
ngày đêm; các robot làm tất cả các công viê ̣c như vận chuyển sản phẩm từ
công đoạn sản xuất này tới công đoạn sản xuất khác kể cả viê ̣c đưa và sắp
xếp thành phẩm vào kho (Hình 1.3).

14
Hình 1.3: Robot trong nhà máy sản xuất

1.2. Tổng quan về hệ điều hành ROS


1.2.1. Giới thiệu về ROS

ROS là một hệ điều hành meta mã nguồn mở cho robot của bạn. Nó
cung cấp các dịch vụ mà bạn mong đợi từ một hệ điều hành, bao gồm trừu
tượng hóa phần cứng, điều khiển thiết bị cấp thấp, thực hiện chức năng
thường được sử dụng, chuyển thông điệp giữa các quy trình và quản lý gói.
ROS được xây dựng theo kiến trúc mở, các nhà khoa học, kỹ sư có thể chia
sẽ, mở rộng, tích hợp nhiều thư viện, hệ thống khác nhau. Việc sử dụng hệ
điều hành ROS giúp cho việc thử nghiệm các ý tưởng, thuật toán được dễ
dàng, nhanh chóng hơn. ROS là hệ điều hành được phát triển chuyên dụng
cho các ứng dụng điều khiển robot.

15
Hình 1.4. ROS được phát triển chuyên dụng cho các ứng dụng điều khiển robot.

Ưu điểm của ROS là xây dựng các ứng dụng robotics trên nền ROS sẽ
giảm một lượng đáng kể các công việc lập trình, thiết lập hệ thống, những
phần này có thể tận dụng nguồn tài nguyên mã nguồn mở vô cùng phong phú
của cộng đồng.

ROS là chữ viết tắt của Robot Operating System, vì vậy nó sẽ an toàn
khi nói rằng đó là một hệ điều hành. Đặc biệt, những người mới vào ROS có
thể nghĩ rằng đó là một hệ điều hành tương tự như Windows, Linux, Android
….

Tuy nhiên, mô tả chính xác hơn là ROS là một hệ điều hành Meta. Mặc
dù hệ điều hành Meta không phải là một thuật ngữ được định nghĩa trong từ
điển, nó mô tả một hệ thống thực hiện các quá trình như lên kế hoạch, tải,
giám sát và xử lí lỗi bằng cách sử dụng lớp ảo hóa giữa các ứng dụng và tài
nguyên máy tính phân tán.

Do đó, ROS không phải là hệ điều hành thông thường như Windows,
Linux, IOS...., nó là một hệ siêu chạy trên hệ điều hành hiện tại. Để vận hành
ROS, một hệ điều hành như Ubuntu, là một trong những bản phân phối của
Linux, phải được cài đặt trước tiên. Sau khi hoàn thành cài đặt ROS trên
Linux, các tính năng được cung cấp bởi hệ điều hành thông thường như hệ
16
thống quản lý quá trình, hệ thống tập tin, giao diện người dùng và tiện ích
chương tình(trình biên dịch, mô hình luồng) có thể được sử dụng. Ngoài tính
năng cơ bản do Linux cung cấp. ROS cung cấp các chức năng cần thiết cho
các chương trình ứng dụng robot như là các thư viện truyền/nhận dữ liệu giữa
các phần cứng không đồng nhất, lên lịch và xử lý lỗi. Loại phần mềm này còn
được gọi là phần mềm trung gian hoặc khuôn khổ phần mềm.

Là một hệ điều hành meta, ROS đang phát triển, quản lý và cung cấp
các gói ứng dụng cho các mục đích khác nhau và nó đã hình thành một hệ
sinh thái phâ phối các gói do người sử dụng phát triển. ROS là một hệ thống
hỗ trợ cho việc điều khiển robot và cảm biến với phần cứng trừu tượng và
phát triển ứng dụng robot dựa trên các hệ điều hành thông thường hiện có.

Truyền thông dữ liệu ROS được hỗ trợ không chỉ bởi một hệ điều hành,
mà còn bởi nhiều hệ điều hành, phần cứng và các chương trình, làm cho nó
rất phù hợp cho sự phát triển của robot nơi kết hợp các phần cứng khác nhau.

1.2.2. Đặc điểm của ROS

ROS tập trung vào rối đa hóa việc tái sử dụng mã trong nghiên cứu và
phát triển người máy, thay vì định hướng về cái gọi là nền tảng phần mềm
robot, phần mềm trung gian và khuôn khổ. Để hỗ trợ điều này, ROS có các
đặc điểm sau:

 Quy trình phân tán: được lập trình dưới dạng các đơn vị tối
thiểu của các tiến trình thực thi (node), và mỗi quá trình chạy
một cách độc lập và trao đổi dữ liệu một cách có hệ thống.
 Quản lý gói: Nhiều quy trình có cùng mục đích được quản lý
như là một gói để nó dễ sử dụng và phát triển cũng như thuận
tiện để chia sẻ, sửa đổi và phân phối lại.
 Kho lưu trữ công cộng: Mỗi gói được công khai lên kho lưu trữ
công cộng ưa thích của nhà phát triển (ví dụ: GitHub) và chỉ định
lấy giấy phép của chúng.

17
 API: Khi phát triển một chương trình sử dụng ROS, ROS được
thiết kế để chỉ cần gọi một API và chèn nó một cách dễ dàng vào
mã đang được sử dụng. Trong mã nguồn được giới thiệu trong
mỗi chương, bạn sẽ thấy rằng lập trình ROS không khác nhiều so
với C++ và Python.
 Hỗ trợ các ngôn ngữ lập trình khác nhau: Chương trình ROS
cũng cấp một thư viện client để hỗ trợ các ngôn ngữ lâp trình
khác nhau. Thư viện có thể được nhập khẩu trong các ngôn ngữ
lập trình được phổ biến trong lĩnh vựa người máy như Python,
C++ và Lisp cũng như các ngôn ngữ như JAVA, C#, Lua và
Ruby. Nói cách khác, bạn có thể phát triển một chương trình
ROS bằng một ngôn ngữ lập trình ưu tiên.

Những đặc tính của ROS đã cho phép người dùng thiết lập một môi
trường nơi nó được có thể hợp tác về phát triển phần mềm robot trên phạm vi
toàn cầu. Sử dụng lại mã nguồn trong nghiên cứu và phát triển robotics đang
trở nên phổ biến hơn, đó là mục tiêu cuối cùng của ROS.

Xây dựng ứng dụng robotics trên nền tảng ROS sẽ giảm đi một lượng
đáng kể các công việc lập trình, thiết lập hệ thống, tận dụng nguồn tài nguyên
mã nguồn mở vô cùng phong phú của cộng đồng. Ta có thể so sánh khối
lượng công việc kỹ thuật cơ bản ( required engineering) và khối lượng nghiên
cứu khoa học (Core Research) như sau:

Không dùng ROS

Dùng ROS
18
Khối lượng công việc kỹ thuật
Khối lượng công việc nghiên
cứu
Hình 1.5. So sánh việc dùng và không dùng ROS

Từ đó ta thấy rằng, với sự hiệu quả từ ROS, thời gian dành cho các
công việc kỹ thuật cơ bản sẽ giảm xuống rất đáng kể và do đó, tang thời gian
cho công việc nghiên cứu chuyên sâu, hàm lượng khoa học đạt được trong
nghiên cứu sẽ lớn hơn nhiều lần.

Một số đặc điểm giúp cho ROS trở thành một hệ điều hành nên được sử
dụng khi nghiên cứu phát triển một ứng dụng robot là:

- Ros là một hệ điều hành mã nguồn mở;


- Các tài liệu kỹ thuật, tàu liệu hướng dẫn và các kênh hỗ trợ đầy
đủ;
- Vấn đề cốt lõi nhất khiến ROS trở nên mạnh đó là tính cộng
đồng rất lớn;
- Nguồn tài nguyên được cộng đồng đóng góp hầu như được xây
dựng, phát triển từ những việc nghiên cứu và những trường đại
học hàng đầu trên thế giới.

Những tài nguyên được cung cấp từ ROS thể hiện được sức mạnh trong
lĩnh vữ robotics:

- Đồ họa (Visualization);
- Nhận diện vật thể (Object recognition);

19
- Định hướng di động (Nacigation);
- Thao tác/cầm nắm (Manipulation/Grasping).

ROS có 3 cấp khái niệm: Hệ thống tập tin (File system), Biểu đồ tính toán
(Computation Graph) và tính cộng đồng (Community). Ngoài ra, ROS còn có
một số khái niệm cấp cao đặc trưng cho các ứng dụng robot như hệ tọa độ,
phép chuyển đổi thông tin mô tả …

1.2.3. Các thành phần của ROS

Như thể hiện ở hình , ROS bao gồm một thư viện khách hàng để hỗ trợ
các ngôn ngữ lập trình khác nhau, một giao diện phần cứng để kiểm soát phần
cứng, truyền thông để truyền và nhận giữ liệu. Khung ứng dụng Robotics là
một ứng dụng dịch vụ dựa trên khung ứng dụng Robotics, Các công cụ mô
phỏng có thể điều khiển robot trong không gian ảo và Công cụ phát triển phần
mềm.

Hình 1.6. Các thành phần của ROS

1.2.4. Tập tin hệ thống trong ROS (Filesystem)

Giống với hệ điều hành mã nguồn mở, ROS files cũng được tổ chức và
lưu trữ trên một bộ nhớ hệ thống.
20
Hình 1.7. Sơ đồ hệ thống ROS

Gói (Packages): Gói dữ liệu là đơn vị chính trong tổ chức phần mềm
của hệ điều hành ROS. Một package có thể chứa các lệnh thực thi của ROS
(các nodes), một thư viện dành cho ROS, tập dữ liệu, các file cấu hình, hoặc
các dữ liệu cần thiết khác trong hệ thống. Package chính là thành phần
nguyên tử nhỏ nhất được xây dựng và đưa vào sử dụng trong ROS. Có nghĩa
là hạt nhân nhỏ nhất mà ta có thể xây dựng và đưa vào sử dụng trong ROS
chính là một package.

Cấu trúc điển hình của một gói ROS được biểu diễn ở hình sau đây:

Hình 1.8. Cấu trúc điển hình của một gói ROS

Cách sử dụng mỗi folder như sau:

21
- Config: Tất cả các tệp cấu hình được sử dụng trong gói ROS
này được lưu trữ trong thư mục này, thư mục này được tạo
bởi người dùng.

- include/package_name: thư mục này bao gồm tiêu đề và thư


viện mà chúng ta cần phải sử dụng bên trong gói.

- scrip: đây là thư mục giữ các tập lệnh thực thi.

- src: tập tin này chứa các mã nguồn C, C++, Py.

- launch: thư mục này chứa các tệp launch sử dụng để khởi
chạy một hoặc nhiều node trong ROS.

- msg: thư mục này chứa các tệp .msg.

- package.xml: đây là tệp kê khai của gói.

- CmakeList.txt: đây tập tin để thực thi build một gói trong
ROS.

Chúng ta cần biết một số lệnh để tạo, sửa đổi, và làm việc với ROS gói.
Dưới đây là một số lệnh được sử dụng để làm việc với gói ROS:

- catkin_create_pkg: Lệnh này được sử dụng để tạo một gói


mới.

- rospack: Lệnh này được sử dụng để lấy thông tin về gói trong
tập tin.

Để làm việc với các gói, ROS cung cấp một lệnh bash giống như lệnh
rosbash, có thể được sử dụng để điều hướng và thao tác gói ROS. Dưới đây là
một số lệnh rosbash:

- roscd: Lệnh này được sử dụng để thay đổi thư mục gói.

- roscp: Lệnh này được sử dụng để sao chép một tập tin từ một
gói.

- rosdep: Lệnh này được sử dụng để chỉnh sửa một tệp.


22
- rosrun: được sử dụng để chạy một tệp tin thực thi bên trong một
gói.

Metapackage: Là các package làm nhiệm vụ đại diện cho nhóm


package khác có liên quan với nhau. Hầu hết các metapackages đều được sử
dụng giống như việc đảm bảo tính tương thích sau này khi chuyển đổi sang
rosbuild stack.

Hình 1.9. Hình ảnh mô tả về ngăn xếp

Package Mainfests: bảng kê khai thông tin dữ liệu của gói


(package.xml), cung cấp siêu dữ liệu về package đó bao gồm tên gọi, phiên
bản, thông tin bản quyền (license) và những yếu tố phụ thuộc của gói dữ liệu
đó, Mainfest còn chứa thông tin đặc trưng của ngôn ngữ lập trình như cờ báo
(flags) của trình biên dịch.

Ngăn xếp (Stacks): là tập hợp các gói phối hợp với nhau để thực hiện
một chức năng cụ thể. Ngăn xếp còn mô tả cách thức biên dịch ROS và thông
tin về phiên bản ROS tương thích (gọi là distro, ví dụ như các phiên bản ROS
hydro, groovy hay fuerte). Ví dụ pcl_ros là một ngăn xếp chứa các gói có
chức năng cung cấp các bộ lọc cho điểm đám mây (point cloud) như bộ lọc
PassThrough (giới hạn điểm đám mây theo các chiều x, y, z), VoxelGrid
(lượng tử hóa point cloud thành các ô 3 chiều), Inlier/Outlier (tìm các điểm
trong/ngoài một mặt theo các thông số của mặt đó trong điểm đám mây).
23
Phần phụ thuộc (Dependency): là mô tả trong tệp của một gói hay
ngăn xếp về các hệ thống tệp tin ngang cấp (ngăn xếp hoặc gói khác).

Gói tin (Message) (.msg): thông tin mô tả gói, được lưu trữ trong tệp
có dạng my_pack/msg/MyMessageType.msg, định nghĩa các cấu trúc dữ liệu
của gói tin được gửi trong ROS. Ví dụ có mô tả của gói tin PointCloud2 được
mô tả trong file sensor_msgs/PointCloud2.msg.

- Các node trong ROS có thể xuất bản một kiểu dữ liệu cụ thể, Các
kiểu dữ liệu này được định nghĩa bằng cách sử dụng một thông
điệp, còn được gọi là các ROS message.

- Các kiểu dữ liệu được định nghĩa trong tệp .msg có thể được sử
dụng chung cho các mã nguồn khác nhau, phù hợp với hầu hết
các ngôn ngữ khác nhau.

- Kiểu dữ liệu được miêu tả trong thông điệp được lưu trữ trong
tệp .msg trong thư mục msg của một gói ROS.

- Định nghĩa tin nhắn có thể bao gồm hai loại: trường và hằng số.
Trường bao gồm kiểu dữ liệu và tên biến. Hằng số định nghĩa
một giá trị không đổi trong tập tin tin nhắn.

Dưới đây là một ví dụ về định nghĩa thông điệp:

int32 number

string name

float32 speed

Bảng 1.2: Các kiểu dữ liệu chúng ta có thể sử dụng trong message
Primitiv Serializa C+ Pytho
e type tion + n
Int8 Signed 8-bit Int8_t int
int

24
Unit8 Unsigned 8- Unit8_t Int (3)
bit int
Init16 Signed 16- Int16_t int
bit int
Unit16 Unsigned Unit16_ int
16-bit int t
Int32 Signed 32- Int32_t int
bit int
Unit32 Unsigned Unit32_ int
32-bit int t
Int64 Signed 64- Int64_t long
bit int
Unit64 unsigned Uint64_ long
64-bit int t
Float32 32-bit IEEE float float
float
Float64 64-bit IEEE double float
float
String Ascii Std::stri string
sring(4) ng
Secs/nsecs
Time Ros::Ti Rospy.Time
unsigned me
32-bit ints
Secs/nsecs
duration Ros::Ti Rospy.Time
unsigned me
32-bit ints
Bool(1) Unsigned 8- Unit8_t( bool
bit int 2)
Dịch vụ (Services): thông tin mô tả các dịch vụ được lưu trữ trong
my_package/srv/MyserviceType.srv, định nghĩa cấu trúc dữ liệu cho các lệnh
truy cập (request) và các lệnh phản hồi (response) của các dịch vụ trong ROS.

Thực thi (Launch): là các tệp .launch dùng để khởi tạo một tập hợp
các nút cùng lúc, đồng thời cho các giá trị tham số và gán các chủ đề liên kết

25
các nút liên kết các nút bằng lệnh roslaunch trong Command Terminal của
Linux.

Tệp .src trong ROS: các dịch vụ ROS là một giao tiếp yêu cầu / đáp
ứng kiểu giữa các nút ROS.Một nút sẽ gửi yêu cầu và chờ cho đến khi nó
nhận được phản hồi từ phía bên kia. Các yêu cầu / đáp ứng truyền thông cũng
sử dụng mô tả thông điệp ROS.Tương tự với các định nghĩa thông báo sử
dụng tệp .msg, chúng ta phải xác định dịch vụ định nghĩa trong tệp khác được
gọi là .srv, tệp này phải được lưu trữ bên trong thư mục srv của gói. Tương tự
với định nghĩa tin nhắn, mô tả dịch vụ ngôn ngữ được sử dụng để xác định
các loại dịch vụ ROS.Định dạng mô tả dịch vụ ví dụ như sau:

#Request message type

string str

#Response message type

tring str

1.2.5. Biểu đồ tính toán trong ROS

Computation Graph, tạm gọi là biểu đồ tính toán, là mạng ngang hàng
(peer-to- peer) các tác vụ khi thực thi của ROS, trong đó các dữ liệu được trao
đổi và xử lý giữa các nút. Các khái niệm cơ bản của biểu đồ tính toán của
ROS là các nút, máy chủ, tham số máy chủ, dịch vụ, gói tin, các chủ đề và các
túi.

26
Hình 1.10. Cấu trúc của lớp ROS Graph
Nút: là đơn vị thực hiện một tác vụ tính toán, điều khiển. Một nút có
thể được khởi tạo khi biên dịch thành công một gói và có thể được khởi tạo
nhiều nút từ cùng một gói. Một hệ thống điều khiển thường bao gồm nhiều
nút. Ví dụ một nút điều khiển động cơ, một nút thực hiện tác vụ định vị, một
nút vẽ qũy đạo đường đi.

Máy chủ: ROS Master cung cấp tên đăng ký và tra cứu đến phần còn
lại của biểu đồ tính toán. Nếu không có Master, các nút sẽ không tìm thấy
nhau để trao đổi thông tin hay gọi các dịch vụ.

Tham số máy chủ: là một phần của Master, cho phép dữ liệu được lưu
trữ trong một vị trí trung tâm và cho phép các nút truy cập tới.

Hình 1.11. Mô tả cơ chế quản lý thông số trên ROS Master

(1) : gói tin đăng kí với máy chủ.

(2) : gói đăng kí nhận tin với máy chủ.

27
(3) : tạo kết nối máy chủ với địa chỉ *foo*.

Gói (Package): các nút giao tiếp với nhau thông qua các gói tin. Một
gói trong biểu đồ tính toán là dữ liệu cụ thể có cấu trúc như trong khai báo
của tệp .msg tương ứng. Các kiểu dữ liệu chuẩn như integer, floading, point,
Boolean... và mảng với kiểu chuẩn đều được hỗ trợ. Bên cạnh đó, gói tin cũng
có thể bao gồm các cấu trúc và các mảng lồng nhau như cấu trúc trong ngôn
ngữ C. Các nút khi nhận gói tin cần phải xác định qua đệm để xử lý dữ liệu
nhận được.

Chủ đề (Topic): gói tin được lọc thông qua một hệ thống vận chuyển,
trong đó phân loại thành hai công việc chính: phát (publish) và nhận
(subcribe). Một nút gửi đi một gói bằng việc đưa thông tin tới một chủ đề.
Một chủ đề có tên và kiểu gói tin xác định. Một nút chỉ nhận đến đúng chủ đề
có tên và kiểu dữ liệu như đã khai báo. Một chủ đề có thể có nhiều đối tượng
đưa tin và cũng có thể có nhiều đối tượng đăng ký nhận tin. Mỗi nút cũng có
thể truyền tin trên nhiều chủ đề khác nhau, cũng như có thể nhận tin từ nhiều
chủ đề khác nhau. Các nguồn truyền tin và các đối tượng nhận tin nhìn chung
không cần phải biết về sự tồn tại của nhau. Ý tưởng xây dựng ROS ở đây là
tách biệt nguồn tạo ra thông tin với bộ phận sử dụng thông tin đó. Chủ đề
được xem như là một kênh truyền các thông điệp được định kiểu. Mỗi kênh
truyền này có một tên riêng, và nút cũng có thể kết nối với kênh này để
gửi/nhận thông tin, miễn là thông tin cùng kiểu với chủ đề đó.

Dịch vụ (Services): mô hình truyền thông theo mẫu publish/subcribe


như trình bày ở trên là một mô hình rất linh hoạt, tuy vậy, đặc điểm của nó là
thông tin được truyền đa đối tượng, thông tin một chiều (many-to-many, one-
way) đôi khi lại không phù hợp với các trường hợp cần tương tác theo kiểu
yêu cầu/trả lời (request/reply), kiểu tương tác này thường gặp trong các hệ
thống phân phối. Do vậy, cần có thêm một thành phần nữa trong ROS Graph,
đó là gói dịch vụ (service), nhằm thực hiện được các yêu cầu và một thông
điệp dành cho đáp ứng. Một nút cung ứng một dịch vụ (service) với một

28
thuộc tính tên (name), một khách hàng (client) sử dụng dịch vụ đó bằng cách
gửi đi một thông tin yêu cầu rồi đợi phản hồi. Trong thư viện client của ROS,
phương pháp tương tác này thường được cung cấp như một hàm được gọi từ
xa.

Hình 1.12. Mô hình truyền thông tin thư viện của ROS

(0): thông báo dịch vụ.

(1): tra cứu dịch vụ.

(2): nhận địa chỉ XML/RPC.

(3): yêu cầu.

(4): trả lời.

Bags: là một định dạng để lưu trữ và phát lại dữ liệu từ ROS các gói
tin. Bags là một cơ chế quan trọng để lưu trữ dữ liệu.

Cách xây dựng hệ thống trong ROS cho phép nguồn cung cấp tin và đối
tượng nhận tin có thể tách rời nhau, và mối liên hệ được thực hiện thông qua
thuộc tính tên. Tên là thuộc tính đóng vai trò rất quan trong trong ROS: các
nút, các chủ đề, các dịch vụ, và các tham số đều được đặt tên. Mỗi thư viện
khách hàng ROS đều hỗ trợ dòng lệnh (command-line) để liên kết các tên này
(remapping names), nhờ đó mà chương trình đã được biên dịch có thể cấu
hình lại khi chạy ngay cả khi hoạt động trong cấu trúc biều đồ tính toán khác.

29
Ví dụ về một Computation Graph:

Hình 1.13. Giao tiếp giữa ROS Master với Hello World Publisher và
Hello World Subscriber

Khi nút của nhà xuất bản bắt đầu xuất bản thông báo "Hello World"
trong chủ đề cụ thể, máy chủ ROS nhận được các chi tiết của chủ đề và chi
tiết của nút. Nó sẽ tìm kiếm xem liệu nút nào đang đăng ký nhận cùng một
chủ đề. Nếu không có nút nào đăng ký cùng một chủ đề vào thời điểm đó, cả
hai nút vẫn không kết nối. Nếu nhà xuất bản và các nút thuê bao chạy đồng
thời, máy chủ ROS sẽ trao đổi chi tiết của nhà xuất bản cho thuê bao và họ sẽ
kết nối và có thể trao đổi dữ liệu thông qua các thông điệp ROS.

1.2.6. Ứng dụng HĐH ROS cho cánh tay robot

ROS cung cấp cho người dùng một công cụ rất mạnh để mô phỏng và
lập trình cánh tay robot là gói ROS-Industial.

a. Gói ROS-Industrial

ROS-Industrial cơ bản mở rộng khả năng tiên tiến của phần mềm ROS
để robot công nghiệp làm việc trong quá trình sản xuất. ROS-Industrial bao
gồm nhiều gói phần mềm, có thể được sử dụng cho interfacing robot công
nghiệp. Những gói này có BSD (kế thừa) / Apache 2.0 (ưu tiên) được cấp
phép chương trình, có chứa các thư viện, trình điều khiển, và các công cụ cho

30
phần cứng công nghiệp. Các ROS-Industrial hiện nay được định hướng bởi
Tập đoàn ROS- Industrial . Trang web chính thức của ROS-I là
http://rosindustrial.org/ . Sơ đồ dưới đây là biểu trưng của ROS-I:

Hình 1.14. Gói ROS-Industrial

b. Mục tiêu của ROS-Industrial

Các mục tiêu chính đằng sau việc phát triển ROS-Industrial được quy
định như sau:

- Kết hợp sức mạnh của ROS với công nghệ công nghiệp hiện có
để khám phá khả năng tiên tiến của ROS trong quá trình sản
xuất.
- Đang phát triển một phần mềm đáng tin cậy và mạnh mẽ cho các
ứng dụng robot công nghiệp.
- Cung cấp một cách dễ dàng để thực hiện nghiên cứu và phát triển
trong robot công nghiệp.
- Tạo một cộng đồng rộng được hỗ trợ bởi các nhà nghiên cứu và
các chuyên gia cho robot công nghiệp.
- Cung cấp ứng dụng ROS công nghiệp lớp và trở thành một vị trí
của các ứng dụng đến công nghiệp liên quan.
c. Lợi ích của ROS-Industrial

Chúng ta hãy xem những lợi ích ROS-I cung cấp cho cộng đồng:

- Khám phá các tính năng trong ROS: Các gói ROS-Industrial
được gắn với khuôn khổ ROS để chúng ta cũng có thể sử dụng
tất cả các tính năng trong ROS robot công nghiệp. Sử dụng ROS,
31
chúng ta có thể tạo tùy chỉnh giải động học IK cho mỗi robot, đối
tượng thao tác sử dụng nhận thức 2D/3D. ROS cũng cung cấp
một bộ công cụ phong phú, chẳng hạn như RViz, Gazebo, và
rqt_gui để trực quan, mô phỏng, và gỡ lỗi.
- Ứng dụng Out-of-the-box: Giao diện ROS cho phép nhận thức
tiên bộ trong robot để làm việc với gắp và đặt đối tượng phức
tạp.
- Đơn giản hoá lập trình robot: ROS-I loại bỏ giảng dạy và lập kế
hoạch đường đi của robot và thay vì nó, tự động tính toán một
con đường tối ưu va chạm-tự do cho những điểm nhất định.
- Giá thành thấp: Thay vì mô phỏng robot độc quyền tốn kém,
ROS-I là một phần mềm mã nguồn mở cho phép sử dụng thương
mại mà không cần bất kỳ hạn chế.
d. Sơ đồ khối của gói ROS-Industrial

Sơ đồ dưới đây đơn giản trình bày sơ đồ khối của gói ROS-I, được tổ
chức đầu vào ROS. Chúng ta có thể nhìn thấy lớp ROS-I trên đầu trang của
các lớp ROS. Chúng ta có thể thấy một mô tả ngắn gọn của từng lớp để hiểu
rõ hơn: GUI ROS: Lớp này bao gồm các công cụ GUI ROS Plugin dựa trên
lớp, trong đó bao gồm các công cụ như RViz, rqt_gui, vv

32
Hình 1.15. Sơ đồ khối của gói ROS-Industrial

+ GUI ROS-I: Những GUI là UI công nghiệp tiêu chuẩn để làm việc
với robot công nghiệp có thể được thực hiện trong tương lai;

+ Lớp ROS: Đây là lớp cơ sở, trong đó tất cả các thông tin liên lạc đang
diễn ra Lớp MoveIt!: Các MoveIt! lớp cung cấp một giải pháp trực tiếp để
thao tác công nghiệp trong quy hoạch, chuyển động, và chọn và địa điểm;

+ Ứng dụng ROS-I (Application ROS-I): Lớp này bao gồm một kế
hoạch quá trình công nghiệp, được sử dụng để lên kế hoạch những gì là được
sản xuất, làm thế nào nó sẽ được sản xuất, và những nguồn lực cần thiết cho
quá trình sản xuất Lớp giao diện ROS-I (interface ROS-I): Lớp này bao gồm
các khách hàng robot công nghiệp, có thể kết nối với bộ điều khiển robot
công nghiệp sử dụng giao thức thông điệp đơn giản;

+ Các lớp thông điệp đơn giản ROS-I (ROS-I simple message): Đây là
lớp giao tiếp của robot công nghiệp, mà là một bộ tiêu chuẩn của giao thức đó
sẽ gửi dữ liệu từ client robot để điều khiển và ngược lại;

+ Các lớp điều khiển ROS-I: Lớp này có nhà cung cấp cụ công nghiệp
điều khiển robot.
33
1.2.7. Tình hình nghiên cứu ứng dụng HĐH ROS cho cánh tay robot

Trong năm 2012, các dự án mã nguồn mở ROS-Industrial bắt đầu như


là sự hợp tác của Yaskawa Motoman Robotics (http://www.motoman.com/),
Willow Garage (https://www.willowgarage.com/) Và Viện Nghiên cứu Tây
Nam (SwRI) tại http://www.swri.org/cho việc sử dụng nghiên cứu và phát
triển ROS trong sản xuất công nghiệp. Các ROS-I được thành lập bởi Shaun
Edwards vào tháng giêng năm 2012.

Trong năm 2013, ROS-I Consortium Mỹ ra mắt tháng 3 năm 2013 do


SwRI và ROS-I Consortium châu Âu do Fraunhofer IPA ở Đức.

Tính đến thời điểm hiện tại có rất nhiều robot cánh tay đã và đang được
nghiên cứu và phát triển, ứng dụng có thể kể đến như:

a. Universal Robot

Universal Robots (http://www.universal-robots.com/) Là một nhà sản


xuất robot công nghiệp có trụ sở tại Đan Mạch. Công ty chủ yếu sản xuất ba
cánh tay UR3, UR5, UR10 và UR16. Các robot được hiển thị trong ảnh chụp
màn hình sau đây:

Hình 1.16. Hình ảnh và thông số kỹ thuật của robot UR3, UR5, UR10 và
UR16

34
b. ABB Manipulators

ABB cung cấp một loạt các robot để giúp các nhà sản xuất cải thiện
năng suất, chất lượng sản phẩm và an toàn cho công nhân. ABB đã cài đặt
hơn 400.000 robot trên toàn thế giới và tiên phong trong việc tự động hóa
robot công nghiệp.

Hình 1.17. Robot ABB IRB 6640

IRB 6640 có sẵn trong các độ dài cánh tay khác nhau và khả năng xử lý
phù hợp. Nó dựa trên các thành phần đã được chứng minh từ các thế hệ trước,
để đảm bảo dễ bảo trì và trao đổi cũng như thời gian hoạt động cao

Phần mở rộng cánh tay trên và các mô-đun cổ tay khác nhau cho phép
tùy chỉnh cho từng quy trình. Khi robot có thể uốn cong hoàn toàn về phía
sau, phạm vi làm việc được mở rộng đáng kể cho phép nó phù hợp với các
dây chuyền sản xuất dày đặc. Các lĩnh vực ứng dụng điển hình là xử lý vật
liệu, chăm sóc máy và hàn điểm. Robot cũng có sẵn với các tùy chọn khác
nhau như Foundry Plus, Foundry Prime cho các môi trường làm việc khác
nhau.

Tải trọng cao hơn Tải trọng tối đa là 235 kg, điều này phù hợp với
nhiều ứng dụng xử lý vật liệu nặng. Robot cũng theo truyền thống có khả

35
năng quán tính vượt trội, giúp nó có thể xử lý các bộ phận nặng và rộng.
Robot ABB cũng được biết đến với khả năng chống va chạm.

Bảo trì dễ dàng Túi nâng ngã ba được đơn giản hóa và nhiều không
gian hơn trong chân robot giúp robot dễ bảo trì hơn.

Hiệu suất đường dẫn tăng IRB 6640 tương thích với TrueMove ™ và
QuickMove ™ thế hệ thứ hai. Phần mềm cho phép chuyển động chính xác
hơn trong thời gian lập trình ngắn hơn cho các quy trình được cải thiện. Phần
mềm cũng giám sát tải robot bên trong giúp giảm nguy cơ quá tải và tăng
vòng đời của robot.

Các tính năng an toàn thụ động Các tính năng an toàn thụ động bao
gồm nhận dạng tải trọng, dừng cơ học có thể di chuyển, Công tắc vị trí điện tử
(EPS) và kết cấu thép cứng. Các ứng dụng chính: Máy chăm sóc, xử lý vật
liệu, hàn điểm.

c. Fanuc R-1000iA

Robot tốc độ cao linh hoạt cho một loạt các hoạt động bao gồm hàn, xử
lý và xếp hàng: Nhanh, mỏng, đáng tin cậy - có khả năng xử lý tới 130 kg và
đạt tới 2,2 m, dòng R-1000 tiêu chuẩn 6 hoặc 5 trục là lý tưởng để xử lý các
ứng dụng liên quan đến tải trọng trung bình. Được thiết kế chủ yếu để xử lý
vật liệu và hàn điểm, thời gian chu kỳ tốt nhất là do tốc độ tăng tốc cao trong
khi thiết kế mỏng của loạt giúp tiết kiệm không gian sàn quý giá.

Robot công nghiệp tốc độ cao cho ngành công nghiệp ô tô: Độ chính
xác tối đa, tốc độ vận hành rất cao và độ tin cậy vượt trội là những gì ngành
công nghiệp ô tô đang tìm kiếm khi nói đến hàn điểm. Với dòng R-1000,
FANUC đã xây dựng một robot công nghiệp hoàn toàn phù hợp với nhu cầu
của các ứng dụng hàn điểm nhỏ gọn, mật độ cao. Bảo vệ IP67 và động cơ cổ
tay ở phía sau J3 giữ cho các bộ phận nhạy cảm tránh xa môi trường nóng, ẩm
ướt hoặc bẩn.

36
Hình 1.18. Robot Fanuc R-1000iA/80H

Điểm nổi bật của robot công nghiệp R-1000:

Xây nhanh: Mọi thành phần trong dòng R-1000 đều được xây dựng
nhằm mục đích mang lại tốc độ và độ tin cậy tối đa.

Xếp hàng tốc độ cao: Với cánh tay robot 5 trục và tay cầm lớn, R-1000
mang đến khả năng xếp hàng tốc độ cao chính xác.

Chuyên gia hàn điểm: Thể hiện thời gian tăng hệ thống vô song và hiệu
suất tối đa, R-1000 là một chuyên gia hàn phù hợp lý tưởng với các tế bào đa
robot. Nó cung cấp năng suất hàng đầu và cung cấp lõi cho các tế bào hàn tại
chỗ nhanh nhất trên thị trường.

Thiết kế tiết kiệm không gian: Một thiết kế nhỏ gọn và tiết kiệm không
gian cho phép định vị gần hơn giữa các robot liền kề trong các ô nhỏ gọn.

Tìm hiểu sâu về ứng dụng của bạn: Bằng cách mô phỏng kịch bản sản
xuất của bạn, Roboguide cho bạn thấy chính xác những gì R-1000 có thể làm
cho bạn và nơi tiết kiệm nằm.

37
Dịch vụ tích hợp: Các dịch vụ điện và không khí tích hợp bao gồm 8
đầu vào và 8 đầu ra cộng với PROFIBUS theo tiêu chuẩn. Có sẵn với một gói
armout chuyên dụng cho hàn điểm.

1.3. Tổng quan về phần mềm ROBODK


1.3.1. Giới thiệu về phần mềm ROBODK

RoboDK là phiên bản thương mại của mô phỏng robot RoKiSim có lẽ


được biết đến nhiều hơn được phát triển tại École de Technologie Supérieure
(ETS) ở Montreal, Canada bởi Ph.D. tốt nghiệp Albert Nubiola. Phần mềm
này đã trở nên khá phổ biến trong 3 năm tồn tại, vì vậy người sáng tạo ra nó
đã thành lập RoboDK với mục tiêu tạo ra một sản phẩm tinh tế hơn cho các
robot trên toàn thế giới.

RoboDK cho phép lập trình và mô phỏng ngoại tuyến bất kỳ robot
công nghiệp nào với RoboDK. Tạo chương trình robot cho bất kỳ bộ điều
khiển robot trực tiếp từ PC của bạn.

Hình 1.19. Mô phỏng Robot bằng phần mềm RoboDK

RoboDK là một trình giả lập mạnh mẽ và hiệu quả về chi phí cho robot
công nghiệp và lập trình robot, là một nền tảng phát triển rất linh hoạt cho lập
trình và mô phỏng ngoại tuyến robot công nghiệp hỗ trợ hơn 200 robot công
38
nghiệp từ các nhà sản xuất hàng đầu như ABB, KUKA, Yaskawa, Adept,
FANUC và nhiều hơn nữa.

RoboDK hướng đến môi trường chuyên nghiệp và được định vị là một
giải pháp lập trình ngoại tuyến cho robot công nghiệp. Để hiểu rõ hơn về lợi
ích của phương pháp này, chúng ta cần nói một chút về phương pháp lập trình
dạy mặt dây chuyền.

 Lập trình robot bằng phương pháp dạy mặt dây chuyền (Teach
Pendant):

Phương pháp phổ biến nhất của lập trình robot có lẽ là dạy mặt dây
chuyền. Theo Hiệp hội Robot và Tự động hóa Anh , hơn 90% robot được lập
trình bằng phương pháp này. Phương pháp này là sử dụng các nút trên tay
điều khiển hoặc bảng điều khiển cảm ứng để di chuyển xung quanh và lưu
từng vị trí riêng lẻ. Khi toàn bộ chương trình đã được học, robot có thể phát
lại các điểm ở tốc độ tối đa.

Hình 1.20. Dạy mặt dây chuyền cho robot

+ Ưu điểm của mặt dây chuyền giảng dạy:

- Hầu hết các robot công nghiệp truyền thống đi kèm với một mặt
dây chuyền dạy, làm cho chúng quen thuộc với các kỹ thuật viên.

39
- Chúng cho phép định vị chính xác, vì robot có thể được lập trình
bằng tọa độ số, theo tọa độ thế giới, tọa độ robot hoặc hệ tọa độ
khác.
- Dạy mặt dây rất tốt cho các chuyển động đơn giản, chẳng hạn
như vẽ theo đường thẳng hoặc trên một bề mặt phẳng lớn.

+ Nhược điểm của mặt dây chuyền giảng dạy:

- Làm gián đoạn toàn bộ hệ thống do thời gian chết của robot.
Robot phải được đưa vào "chế độ dạy" và mọi hoạt động sử dụng
robot dừng lại cho đến khi nó được lập trình.
- Yêu cầu đào tạo để học và lập trình.
- Có thể khó khăn cho những người thợ lành nghề không quen với
lập trình.

 Lập trình robot bằng phương pháp mô phỏng/lập trình ngoại tuyến:

Lập trình ngoại tuyến, hoặc mô phỏng, thường được sử dụng nhất trong
nghiên cứu robot để đảm bảo rằng các thuật toán điều khiển tiên tiến đang
hoạt động chính xác trước khi chuyển chúng lên một robot thực sự. Tuy
nhiên, nó cũng được sử dụng trong công nghiệp để giảm thời gian chết và
nâng cao hiệu quả. Nó có thể là một phương pháp đặc biệt hữu ích cho các
doanh nghiệp vừa và nhỏ, vì robot có nhiều khả năng được cấu hình lại nhiều
lần so với trong môi trường sản xuất hàng loạt. Lập trình ngoại tuyến có nghĩa
là điều này không can thiệp vào sản xuất quá nhiều. Lập trình ngoại tuyến cho
phép robot được lập trình bằng cách sử dụng một mockup ảo của robot và tác
vụ. Nếu phần mềm mô phỏng là trực quan để sử dụng, đây có thể là một cách
nhanh chóng để kiểm tra ý tưởng trước khi chuyển nó sang robot.

40
Hình 1.21. Mô phỏng robot sơn bằng phần mềm ngoại tuyến

+ Ưu điểm của lập trình ngoại tuyến

- Giảm thời gian chết cần thiết cho lập trình robot. Các chương
trình được phát triển ngoại tuyến, do đó robot chỉ phải tạm dừng
trong khi chương trình mới đang được tải xuống và thử nghiệm.
- Có thể khá trực quan, đặc biệt là nếu robot có thể được di chuyển
trong môi trường CAD 3D bằng kỹ thuật kéo và thả.
- Dễ dàng kiểm tra nhiều cách tiếp cận khác nhau cho cùng một
vấn đề, sẽ không hiệu quả đối với các phương pháp lập trình trực
tuyến.

+ Nhược điểm của lập trình ngoại tuyến

- Các mô hình ảo sẽ (có thể) không bao giờ có thể đại diện cho thế
giới thực với độ chính xác 100%. Các chương trình có thể vẫn
cần được thay đổi sau khi chúng được áp dụng cho robot thực sự.
- Có thể mất nhiều thời gian tổng thể. Mặc dù lập trình ngoại
tuyến giúp giảm thời gian chết của robot, nhưng điều đó có nghĩa
là ai đó phải dành thêm thời gian để phát triển mô phỏng, cũng
như thử nghiệm nó trên robot.

41
- Đôi khi có thể sẽ lãng phí thời gian để phân loại các vấn đề giả
lập thay vì giải quyết các thách thức sản xuất. Điều này có thể
liên quan đến chất lượng của trình giả lập.

Lập trình ngoại tuyến vẫn chưa phổ biến như dạy mặt dây chuyền tuy
nhiên nó đang nhanh chóng đạt được vị thế nhờ những lợi thế vốn có của nó.
Thời gian chết của thiết bị robot được giảm đáng kể trong khi môi trường
phần mềm phức tạp tiếp tục hỗ trợ phát triển.

1.3.2. Các tính năng của phần mềm ROBODK

ROBODK cung cấp cho người dùng các tín năng sau:

- Tất cả các tính năng mô phỏng và lập trình ngoại tuyến


- Gia công robot (sử dụng bất kỳ phần mềm CAM nào)
- In 3D (sử dụng bất kỳ phần mềm Máy cắt nào)
- Truy cập không giới hạn vào thư viện robot
- Tạo chương trình không giới hạn
- Mô phỏng nhiều robot
- Truy cập vào trình điều khiển robot
- Hỗ trợ cho bàn xoay và đường sắt tuyến tính
- Đồng bộ hóa tối đa 12 trục cho hoạt động sản xuất
 Gia công Robot

Sử dụng cánh tay robot của bạn như máy phay 5 trục (CNC) hoặc máy
in 3D. Mô phỏng và chuyển đổi các chương trình NC (tệp G-code hoặc APT-
CLS) sang các chương trình robot. RoboDK sẽ tự động tối ưu hóa đường dẫn
robot, tránh các điểm kỳ dị, giới hạn trục và va chạm.

 Phần mềm lập trình ngoại tuyến

Mô phỏng và lập trình ngoại tuyến của robot công nghiệp chưa bao giờ
dễ dàng hơn thế. Tạo môi trường ảo của bạn để mô phỏng ứng dụng của bạn
trong vài phút.Dễ dàng tạo chương trình robot ngoại tuyến cho bất kỳ bộ điều

42
khiển robot. Bạn không cần phải học lập trình dành riêng cho nhà cung cấp
nữa.

 Thư viện robot

Truy cập vào một thư viện rộng lớn gồm các cánh tay robot công
nghiệp, các trục bên ngoài và các công cụ từ hơn 30 nhà sản xuất robot khác
nhau. Dễ dàng sử dụng bất kỳ robot cho bất kỳ ứng dụng nào, chẳng hạn như
gia công, hàn, cắt, sơn, kiểm tra, gỡ lỗi, và nhiều hơn nữa!

 Độ chính xác của robot

Hiệu chỉnh cánh tay robot của bạn để cải thiện độ chính xác và kết quả
sản xuất. Chạy thử nghiệm hiệu suất robot của ISO283 . Xác nhận robot với
một bài kiểm tra ballbar .

 Xuất các chương trình sang Robot của bạn

Bộ xử lý bài RoboDK hỗ trợ nhiều bộ điều khiển robot, bao gồm: ABB
RAPID (mod/prg); Fanuc LS (LS/TP); KUKA KRC/IIWA (SRC/java);
Motoman Inform (JBI); Universal Robots (URP/script) ... và nhiều hơn nữa!

Phần mềm này cũng phù hợp như là một nền tảng giáo dục. Các nhà
giáo dục có thể thiết lập các cuộc tìm hiểu trong lớp và sinh viên có thể thực
hiện các thí nghiệm mà không sợ làm hỏng các thiết bị robot đắt tiền khác.
Trong thực tế, phần mềm có thể được sử dụng bởi bất kỳ ai có hứng thú với
robot công nghiệp bất kể trình độ chuyên môn của họ.

1.3.3. Các phiên bản cập nhật

Từ lúc ra mắt đến thời điểm hiện tại, RoboDK liên tục cập nhật các
phiên bản để tối ưu hóa các tính năng cũng như hiệu năng của phần mềm.

RoboDK cập nhật liên tục từ phiên bản RoboDK v3.0.0 (22-12-2016),
v3.0.1 (30-12-2016), v3.0.2 (16-01-2017) cho đến các phiên bản mới nhất

43
hiện tại là RoboDK v4.0.1 (26-11-2019), v4.0.2 (17-12-2019) với mỗi lần cập
nhật sẽ sửa lỗi, cải tiến bộ xử lý và các trình điều khiển …..

1.4. Kết luận chương 1

Chương này ta đã tìm hiểu ba nội dung: thứ nhất là tổng quan về robot
công nghiệp, ứng dụng, phân loại robot công nghiệp, qua đó, ta thấy tầm quan
trọng và các ứng dụng của robot công nghiệp; Thứ hai là tổng quan về hệ điều
hành ROS cho thấy được các ứng dụng của hệ điều hành trong các mô hình
robot cánh tay; Cuối cùng là tổng quan về phần mềm RoboDK cho thấy được
các tính năng, ứng dụng vượt trội của phần mềm trong lập trình mô phỏng
cánh tay robot.

Chương 2: ĐỘNG HỌC VÀ ĐỘNG LỰC HỌC ROBOT 6 BẬC TỰ DO


2.1. Cơ sở lý thuyết về mô tả vị trí của robot công nghiệp

Nhóm tác giả sử dụng phương pháp Denavit-Hartenberg để tính toán


cho bài toán động học thuận của cánh tay robot, xây dựng một cách tổng quát
tọa độ và hướng trong không gian của khâu thao tác, không chỉ cho mẫu cánh
tay robot 6 bậc tự do trong đồ án mà có thể áp dụng cho các mẫu cánh tay
robot khác có cấu trúc tương tự. Hơn nữa, do có 6 bậc tự do nên việc biến đổi,
tính toán trực tiếp sẽ rất khó khăn và phức tạp. Đối với bài toán ngược, để tìm
bộ thông số biến khớp khi biết vị trí và hướng của khâu công tác, có thể sử
dụng phương pháp giải tích hoặc phương pháp hình học:

- Phương pháp giải tích: Sử dụng các lý thuyết và công thức đại số, các
mối liên hệ giữa các góc khớp với nhau để tìm ra lời giải. Phương pháp này
phù hợp với khả năng tính toán của máy tính, có thể dùng cho nhiều mẫu
robot khác nhau có cùng cấu trúc mà không phải thay đổi hoặc thay đổi rất ít
các thông số bên trong.

- Phương pháp hình học: Sử dụng các đặc điểm hình học trong kết cấu
robot để tìm giá trị các góc khớp theo các thông số độ dài đã biết, chủ yếu là
dựa vào các hệ thức lượng trong tam giác. Phương pháp này tuy đơn giản

44
nhưng lại chỉ áp dụng cho 1 mẫu robot nhất định, khi muốn áp dụng sang loại
khác phải thay đổi nhiều thông số.

Trong đồ án, nhóm tác giả sử dụng phương pháp giải tích để giải bài
toán động học ngược.

Phương pháp Denavit-Hartenberg:

Giả sử trong chuỗi động học của tay máy có n khâu, khâu thứ i nối
khớp thứ i và khớp thứ i+1.

Hình 2.1. Biểu diễn các thông số động học của quy tắc D-H

Quy ước khi gắn hệ trục tọa độ lên các khâu, khớp như sau:

- Trục zi của hệ tọa độ thứ i đặt dọc theo trục khớp động thứ i+1.
- Trục xi của hệ tọa độ thứ i nằm dọc theo đường vuông góc chung
của trục zi và zi-1, hướng từ khớp động thứ i đến khớp động thứ
i+1. Nếu trục zi và zi-1 cắt nhau thì trục xi đặt vuông góc với mặt
phẳng chứa trục zi và zi-1 tại giao điểm trục zi và zi-1 cắt nhau.
- Gốc của hệ tọa độ gắn liền với khâu thứ i (hệ tọa độ thứ i) đặt tại
giao điểm giữa đường vuông góc chung của trục zi và zi-1 và

45
trục khớp thứ i+1. Nếu 2 trục song song thì chọn gốc tọa độ bất
kì sao cho dễ tính toán.

Có một số quy ước riêng cho các trường hợp đặc biệt:

- Đối với hệ tọa độ cơ sở, chỉ có phương của trục z0 là xác định,
trục x0 có thể chọn tùy ý.
- Đối với hệ tọa độ thứ n, chỉ có phương của trục xn là xác định,
trục zn có thể chọn tùy ý.

Sau khi thiết lập được hệ tọa độ, ta hoàn toàn có thể xác định được vị
trí của hệ tọa độ thứ i so với hệ tọa độ thứ i-1 dựa vào bộ thông số sau:

- ai: Khoảng cách giữa 2 khớp theo phương đường vuông góc
chung.
- di: Khoảng cách giữa giao điểm của 2 đường vuông góc chung
với trục quay, theo phương đường vuông góc chung.
- iGóc xoắn giữa trục zi và trục zi-1 , hay còn gọi là góc
xoắn của khâu.
- iGóc xoay quanh trục zi-1 mà khi đó trục xi-1 trùng với trục
xi
Trong 4 thông số trên, ta thấy ai, ichỉ phụ thuộc vào kết cấu của
khâu thứ i, còn di, i phụ thuộc vào tính chất của khớp thứ i. Nếu khớp thứ i
là khớp quay thì di = const, i = variable, và ngược lại, nếu là khớp tịnh tiến
thì di = variable, i = const.
Như vậy, để mô tả phép chuyển đổi giữa 2 hệ tọa độ thứ i và i-1, ta cần
thực hiện 4 bước sau:
1. Quay hệ tọa độ quanh trục zi-1 một góc i
2. Tịnh tiến dọc trục zi-1 một đoạn di
3. Tịnh tiến dọc trục xi-1 (đã trùng với xi) một đoạn ai
4. Quay quanh trục xi một góc i
Tương ứng với 4 bước trên là 4 ma trận thuần nhất:

46
 cosi  sin i 0 0
 sin  cosi 0 0
Rot (z,i )   i 
 0 0 1 0
 
 0 0 0 1

1 0 0 0
0 1 0 0
Trans (0,0,d i )   
0 0 1 di 
 
0 0 0 1
1 0 0 ai 
0 1 0 0
Trans (a i ,0,0)   
0 0 1 0
 
0 0 0 1
1 0 0 0
0 cos   sin  i 0
Rot (x, i )   i 
0 sin  i cos  i 0
 
0 0 0 1

Nhân 4 ma trận thuần nhất tương ứng cho 4 bước biến đổi trên, ta thu

Ai 1,i
được ma trận thể hiện mối quan hệ về vị trí và hướng giữa hai hệ trục
tọa độ liền kề.
Ai 1,i  Rot ( z ,i ).Trans(0,0,d i ).Trans(a i ,0,0).Rot ( x,  i )
 cosi  sin i cos  i sin  i sin  i ai cos i 
 sin  cosi cos  i  cos i sin  i ai sin  i 
Ai 1,i  i 
 0 sin  i cos  i di 
 
 0 0 0 1 

2.2. Xây dựng mô hình động học cánh tay robot


2.2.1. Động học thuận

Động học nghiên cứu chuyển động các khâu của Robot về phương diện
hình học, không quan tâm tới các lực và moment gây ra chuyển đông. Động

47
học Robot là bài toán quan trọng trong phục vụ tính toán và thiết kế robot.
Nhiệm vụ chủ yếu của bài toán động học thuận là xác định vị trí và hướng của
khâu công tác dưới dạng hàm của các biến khớp.

Hệ tay máy Robot Fanuc MATE 100 có cấu trúc gồm 6 khâu, 6 khớp
và một khâu là giá. Mô hình cấu trúc của hệ có dạng (RRRRRR) quay-quay-
quay-quay-quay-quay được thể hiện trong hình dưới.

Hình 2.5. Mô hình động học của hệ.

Ma trận biến đổi thuần nhất khâu công tác

48
Theo cách tiếp cận Dennavit – Hartenberg, để xác định các quan hệ
động học (vị trí , vận tốc) chúng ta cần xác định các ma trận chuyển đổi thuần
nhất. Trên mô hình cơ hệ, các tọa độ đã được định nghĩa theo phương pháp
này. Bảng tham số Dennavit – Hartenberg (D – H) như sau:

Khâu θi di ai αi


1 q1 d1 a1
2

2 q2 0 a2 0

3 q3 0 a3
2

4 q4 d4 0
2

5 q5 0 0 
2

6 q6 d6 0 0
Bảng 2.1. Bảng tham số D-H

Theo quy tắc D-H, ta xác định được ma trận biến đổi thuần nhất:

C1 0  S1 a1C1 
S 0 C1 a1S1 
A01   1
0 1 0 d1 
 
0 0 0 1 

49
C2 S2 0 a2C2 
S C2 0 a2 S 2 
A12   2
0 0 1 0 
 
0 0 0 1 

C3 0  S3 a3C3 
S 0 C3 a3 S3 
A23   3
0 1 0 0 
 
0 0 0 1 

C4 0 S4 0
S 0 C4 0 
A34   4
0 1 0 d4 
 
0 0 0 1

C5 0  S5 0
S 0 C5 0 
A45   5
0 1 0 0
 
0 0 0 1

C6  S6 0 0
S C6 0 0 
A56   6
0 0 1 d6 
 
0 0 0 1

Từ các ma trận chuyển đổi tọa độ thuần nhất, ta suy ra vị trí khâu thao
tác so với hệ tọa độ gốc O 0xyz bằng phép nhân ma trận, thực hiện trên phần
mềm Matlab, code tính toán được trình bày trong phụ lục I:

 nx ox ax px 
n oy ay p y 
A06  A01. A12 . A23 . A34 . A45 . A46   y
 nz oz az pz 
 
0 0 0 1

Trong đó:
50
n x  C1 ((C4C5C6  S 4 S6 )(C2C3  S 2 S3 )  S5 (C2 S3  C3 S 2 ))  S1 (C 4 S 6  S 4C5C6 ) (2.1)
n y  S1 ((S4 S6  C6C5C4 )(S 2 S3  C2C3 )  S5 (C2 S3  C3 S 2 ))  C1 (S6C4  S 4C5C6 ) (2.2)
nz  S23 S4 S6  C6 (C23 S5  S 23C4C5 ) (2.3)
ox  C1 (( S 4C6  C4C5 S 6 )(C2C3  S 2 S3 )  S5 (C2 S3  C3 S2 ))  S1 (C4C6  C5 S 4 S 6 ) (2.4)
o y  S1 ((C4 S6  C6 S 4 )(S 2 S 3 C2C3 )  S5 (C2 S3  C3 S 2 ))  C1 (C4C5 S 6  C4C6 ) (2.5)
oz  S6 (C23 S5  S 23C4C5 )  S 23C6 S 4 (2.6)
ax  C1 ( S5C4 (C2C3  S 2 S3 )  C5 (C2 S3  C3 S 2 ))  S1 S 4 S5 (2.7)
a y  S1 (C4 S5 ( S 2 S3  C2C3 )  C5 (C2 S3  C3 S2 ))  C1S 4 S5 (2.8)
az  S23C4 S5  C23C5 (2.9)
px  C1 (a1  d 4 S 23  a2C2  d 6 S 23C5  a3 (C2C3  S 2 S3 )  d 6 (C4 S 2 S3 S5  C2C3C4 S5 ))  d 6 S1S 4 S5 (2.10)
p y  S1 (a1  d 4 S23  a2C2  d 6 S 23C5  a3 (C2C3  S 2 S3 )  d 6 (C4 S 2 S3 S5  C2C3C4 S5 ))  d 6C1S 4 S5 ( 2.11)
pz  d1  d 4C23  a3 S 23  a2 S 2  (d 6S23S45 ) / 2  d 6C23C5  (d 6 S 4 5 S 23 ) / 2 (2.12)

Với
Si  sin(q i ), Ci  cos(q i ), S 23  sin(q 2  q3 ), C23  cos(q 2  q3 ),S45  sin(q 4  q5 )
Có thể ghi lại như sau :

A RE 
A06   E
0 1 

A là ma trận mô tả hướng và RE là véc tơ mô tả vị trí khâu thao tác


trong hệ tọa độ cơ sở.

RE   pxE p yE pzE 
T (2.13
)
 n x   ,  ,   ox   ,  ,   a x   ,  ,   
  (2.14
AE   n y   ,  ,   o y   ,  ,   a y   ,  ,   
 nz   ,  ,   oz   ,  ,   a z   ,  ,    )

C C C S  S  S C C S  C  S S 
  (2.15
AE   S C S S  S  C C S S  C  C S 
 S  )
 C  S  C  C  
Với α, β, γ là các góc quay của khâu thao tác lần lượt theo ba trục x, y,
z.

51
Bằng cách thay các biến khớp q(t) vào ma trận A06 ta nhận được vị trí
và hướng của khâu công tác. Như vậy bài toán động học thuận được giải hoàn
toàn.

Thông thường bài toán động học thuận được áp dụng để tìm miền làm
việc cho Robot khi biết giới hạn góc quay của khác khâu Robot.

2.2.2. Động học ngược

Nội dung của bài toán động học thuận là cho biết chuyển động của các
toạ độ khớp, ta cần phải xác định chuyển động của các toạ độ thao tác. Ngược
lại trong bài toán động học ngược, cho biết chuyển đông của các toạ độ thao
tác, ta cần xác định chuyển động của các toạ độ khớp.

Mục đích của bài toán nhằm xác định các góc i (i  1..6) để tay máy
nắm bắt được đối tượng tại một vị trí đã cho theo một hướng xác định. Do đó
dữ liệu vào vị trí đầu mỏ hàn và hướng mỏ hàn R

Nhìn chung, việc giải bài toán động học ngược cho robot 6 bậc tự do là
rất khó khăn, tuy nhiên, vẫn có những phương pháp giải để đơn giản hóa bài
toán hơn.

Từ bài toán động học thuận, ta có ma trận mô tả vị trí điểm công tác E
như sau:

 nx ox ax px 
n oy ay p y 
AE   y
 nz oz az pz 
 
0 0 0 1

Đối với các robot có sáu khớp với ba khớp cuối cùng giao nhau tại một
điểm, có thể tách vấn đề động học ngược thành hai vấn đề đơn giản hơn.
Chúng được biết đến tương ứng, như động học nghịch đảo, và động học định
hướng nghịch đảo. Nói chính xác hơn, bài toán động học nghịch đảo có thể
được chia thành hai bài toán đơn giản hơn. Bước đầu tiên là tìm vị trí giao

52
nhau của trục cổ tay, việc tiếp theo là tìm hướng của cổ tay. Vị trí cổ tay có
thể được tìm thấy bằng cách giải các phương trình, trong đó p x, py, pz, ax, ay, az
là các phần tử của ma trận chuyển.

 Tính góc q1
Thực hiện nhân phương trình (2.10) với S1, phương tình (2.11) với C1,
ta thu được:

C1 p y  S1 px  d 6 S 4 S5
(2.16)

Thực hiện nhân phương tình (2.7) với S 1, phương trình (2.8) với C1, ta
thu được:

C1a y  S1ax  S 4 S5
(2.17)

Từ (2.16) và (2.17), ta có:

C1 p y  S1 px  d 6C1a y  d 6 S1ax
 C1 (p y  d 6 a y )  S1 ( px  d 6 ax )
 q1  a tan 2   px  d 6 ax  , (p y  d 6 a y ) 

 Tính góc q4, q5, q6

Ta sử dụng ma trận quay RPY trong (2.15) để tính 3 góc còn lại:

RRPY  Rot ( z , ), Rot ( y, ), Rot ( x, )


C C C S  S  S C C S  C  S S 
 
 RRPY   S C S S  S  C C S S  C  C S 
 S C  S C C 
  (2.30)

Mặt khác, ta lại có:

53
C1C23 S1 C1S23 
R30  R10 R21 R32   S1C23 C1  S 23S1 
 
  S23 0 C23  (2.31)

C4C5C6  S4 S6 C6 S4  C4C5 S6 C4 S5 


 R63   R 
0 1
3 .R60   S 4C5C6  C4 S6 C4C6  C5 S 4 S6  S 4 S5 
 C6 S5  S5 S 6 C5 
(2.32)

So sánh 2 ma trận quay trong biểu thức (2.30) và (2.32) , ta có:

RRPY (1,3)  R 36 (1,3) (2.33)


RRPY (2,3)  R 36 (2,3) (2.34)
RRPY (3,1)  R 36 (3,1) (2.35)
RRPY (3,2)  R 36 (3,2) (2.36)
RRPY (3,3)  R 36 (3,3) (2.37)
Chia biểu thức (2.43) cho biểu thức (2.42) có :

RRPY (2,3) R 36 (2,3)



RRPY (1,3) R 36 (1,3)
RRPY (2,3)  S 4 S5 S 4
    tan q4
RRPY (1,3) C4 S5 C4
 q4  a tan 2( RRPY (2,3),R RPY (1,3))

Tính toán góc q6 tương tự :

Chia biểu thức (2.36) cho biểu thức (2.35) ;

RRPY (3,2) R 36 (3,2)



RRPY (3,1) R 36 (3,1)
RRPY (3,2)  S5 S6
 
RRPY (3,1) S5C6

 TH1 :
sin(q 5 )  0

54
 RRPY (3,2) S6
   tanq 6
RRPY (3,1) C6
 q6  a tan 2( RRPY (3,2), RRPY (3,1))

 TH2 :
sin(q 5 )  0

RRPY (3,2) S6
   tanq 6
 RRPY (3,1) C6
 q6  a tan 2( RRPY (3,2),  RRPY (3,1))

Mặt khác, ta lại có:


R63 (3,3)  C5 (2.38)
Từ biểu thức (2.37), (2.38), ta có:

 S5  1  C52  1  RRPY
2
(3,3) (2.39)
Chia biểu thức (2.39) cho biểu thức (2.38):

1  RRPY
2
(3,3) S5
  tan q5 (2.40)
RRPY (3,3) C5
 q5  a tan 2( 1  RRPY
2
(3,3), RRPY (3,3)) (2.41)
Như vậy, ta có 2 trường hợp ứng với các giá trị của sin(q5):
 Với sin(q5) > 0 thì

 q4  a tan 2( RRPY (2,3), RRPY (1,3)) (2.42)



q5  a tan 2( 1  RRPY (3,3), RRPY (3,3))
2

 q  a tan 2( R (3, 2),  R (3,1))


 6 RPY RPY

 Với
sin(q 5 )  0 thì

 q4  a tan 2( RRPY (2,3), RRPY (1,3)) (2.43)



q5  a tan 2( 1  RRPY (3,3), RRPY (3,3))
2

 q  a tan 2( R (3,2), R (3,1))


 6 RPY RPY

Tổng kết lại, góc tại mỗi khớp được tính theo các công thức sau:

55
q1  a tan 2   px  d 6 ax  , (p y  d 6 a y ) 

Góc khớp q4, q5, q6 được tính dựa vào ma trận RPY mô tả hướng AE  :
 Với sin(q5)  0 thì

 q4  a tan 2( RRPY (2,3), RRPY (1,3))



q5  a tan 2( 1  RRPY (3,3), RRPY (3,3))
2

 q  a tan 2( R (3, 2),  R (3,1))


 6 RPY RPY

 Với sin(q5)  0 thì

 q4  a tan 2( RRPY (2,3), RRPY (1,3))



q5  a tan 2( 1  RRPY (3,3), RRPY (3,3))
2

 q  a tan 2( R (3,2), R (3,1))


 6 RPY RPY

56
Chương 3: PHÂN TÍCH VÀ XÂY DỰNG PHẦN CƠ KHÍ CỦA
FANUC MATE 100
3.1. Dựng lại kết cấu cánh tay robot 6 bậc tự do:
3.1.1. Tìm hiểu và chọn phần mềm thiếu kế 3D:

Autodesk Inventor là một trong những phần mềm CAD phổ biến nhất
hiện nay. Phần mềm Autodesk Inventor được phát triển bởi Autodesk là giải
pháp tổng thể của CAD/CAM/CAE khả năng tối ưu , linh hoạt , đặc biệt là
khá dễ tiếp cận và sử dụng . Vì vậy mà Autodesk Inventor được rất nhiều
nhà thiết kế sử dụng . Do vậy khi ứng dụng tốt phần mềm chúng ta hoàn
toàn có lợi thế để làm việc cho những công ty, tập đoàn lớn trong và ngoài
nước .

a. Những đặc điểm nổi bật của phần mềm Autodesk Inventor:

- Thiết kế chi tiết nhanh chóng, thuận tiện : Người dùng có thể thiết
kế, hiệu chỉnh sản phẩm một cách nhanh chóng . Chính vì vậy mà hiệu suất
tăng lên rất nhiều .

- Khả năng hiệu chỉnh, sửa chữa mô hình : Có thể nói việc hiệu chỉnh
và tái sử dụng dữ liệu là thách thức không nhỏ của các kỹ sư, một sản phẩm
được đưa ra thị trường cần được thiết kế và chỉnh sửa thiết kế rất nhiều lần.
Inventor cung cấp khả năng đọc và chỉnh sửa toàn bộ dữ liệu 2D và 3D qua
đó các kỹ sư có thể mở và thao tác trực tiếp với sản phẩm, chi tiết.

- Khả năng liên kết dữ liệu giữa các Files khác nhau : Hiện nay mỗi
doanh nghiệp thường làm việc với rất nhiều đối tác khác nhau, và mỗi đối tác
lại sử dụng một phần mềm CAD khác nhau, Inventor cho phép người dùng
mở và chỉnh sửa trực tiếp dữ liệu từ các phần mềm khác như: Solidwork,
Catia, Fusion … như vậy sẽ tiết kiệm thời gian đáng kể cho việc chuyển đổi
dữ liệu qua một phần mềm trung gian khác.

- Phần mềm Inventor tích hợp giải pháp tổng thể : Quản lý từ khâu thiết
kế sản phẩm, mô phỏng kiểm tra đến lập trình gia công CAM, cho tới lắp ráp
thành chi tiết hoàn chỉnh .
57
b. Các chức năng chính của phần mềm Inventor :

- Thiết kế 3D cho các chi tiết đơn với Part

- Assembly cho phép lắp ráp các chi tiết đơn để tạo thành một sản
phẩm hoàn chỉnh

- Xuất bản vẽ đúng theo các tiêu chuẩn

- Môi trường HSMCAM để gia công cơ khí

- Mô phỏng động học, động lực học, phân tích ứng suất, tính toán các
điều kiện bền với

- Thiết kế kim loại tấm trên phần mềm băng Sheet metal

- … và còn rất nhiều ứng dụng khác nữa.

c. Các chức năng được sử dụng :

- Part : là chức năng thiết kế chính của Inventor. Hầu hết mọi chi tiết từ
đơn giản tới phức tạp đều được thiết kế ở môi trường này.

- Assembly : là môi trường lắp ráp trong Inventor . Tại đây phần mềm
sẽ ràng buộc về bậc tự do, cố định chi tiết với các hệ trục tọa độ, mặt phẳng
tọa độ tạo mối quan hệ giữa các đối tượng và chúng có thể chuyển động
tương đối lẫn nhau và nó hoàn toàn tuân theo các quy luật về cơ học, nguyên
lý máy .

- Presentation : module này bạn có thể mô phỏng trình tự lắp ráp và


phân rã các chi tiết .

- Drawing : module này dùng để xuất bản vẽ 2D theo quy chuẩn .

3.1.2. Kết cấu cánh tay robot 6 bậc tự do :

Mô hình cánh được sử dụng là mô hình cánh tay robot Fanuc Mate 100
gồm 6 khớp quay. Việc thiết kế này cho phép khâu thao tác có thể di chuyển
tùy ý trong không gian làm việc . Mỗi khớp của robot đều được điều khiển
bởi một động cơ AC servo thông qua hộp giảm tốc .
58
Hình 3.1. Robot hàn Fanuc Mate 100

Giới thiệu Fanuc Mate 100 : Fanuc Mate 100 là loại tay máy nối tiếp,
bao gồm 6 khâu động và 6 khớp quay bản lề. Tay máy được dẫn động bởi các
động cơ AC servo thông qua các hộp số hamonic và cyclo giúp tay máy làm
việc trơn tru và nhẹ nhàng. Tay máy có thể di chuyển linh hoạt tới các vị trí
trong vùng làm việc với các hướng tiếp cận khác nhau, qua đó có thể thực
hiện được nhiều thao tác với nhiều chế độ cho người lập trình mong
muốn.Việc sử dụng các hộp số harmonic , cyclo mang lại cho tay máy sự ổn
định và chính xác cao bên cạnh đó giúp cho tay máy có kết cấu gọn nhẹ
nhưng lại rất bền bỉ khi hoạt động. Để thích nghi với nhiều loại công việc với
các mức độ khác nhau tay máy còn được trang bị bộ gồm rất nhiều các cơ cấu
công tác khác nhau với mục đích sử dụng khác nhau. Tay máy có thể sử dụng
để hàn, gắp các sản phẩm, kiểm tra các thành phẩm và phế phẩm, nhưng để
thực hiện được các tác vụ đó một cách chính xác thì tay máy cần tới hệ thống
cảm biến để tự động nhận dạng như hệ thống xử lý ảnh, cảm biến màu sắc, hệ
59
thống tay gắp…đây chính là đôi mắt của tay máy. Tay máy còn đặc biệt chú
trọng tới yếu tố an toàn và thân thiện với người sử dụng các vị trí giới hạn
hoạt động của tay máy luôn được chăm sóc và bảo vệ kỹ lưỡng. Hệ thống
năng lượng cấp cho tay máy luôn được bảo đảm, kiểm tra theo kế hoạch bảo
dưỡng không gây nguy hiểm cho người sử dụng. bộ điều khiển tay máy được
thiết kế dạng khối với tủ điều khiển trung tâm và hệ thống dây cáp kết nối tới
tay máy, trên tủ điện có màn hình lớn để giám sát tay máy hoạt động và các
lỗi khi xảy ra. Đây cũng là nơi giúp người lập trình có thể điều khiển tay máy
theo ý muốn của mình. Các chương trình mô phỏng hoạt động tay máy cũng
đóng vai trò quan trọng nó kiểm tra chương trình được lập và đưa ra quỹ đạo
chuyển động của tay máy nhờ đó có thể điều chỉnh chương chình cũng như
bảo vệ được tay máy.

a. Các kết cấu cơ khí trên tay máy Fanuc Mate 100 :

Sau khi tiếp nhận xác tay máy Fanuc Mate 100 bản thân đã tiến hành
lên kế hoạch để khai thác tay máy, tháo rời từng chi tiết của tay máy để đánh
giá đúng thực trạng của tay máy, kiểm tra các chi tiết của tay máy để đưa ra
các phương án khôi phục và thay thế phù hợp. Bên canh đó kết hợp với sử
dụng các phần mềm thiết kế để hỗ trợ việc thiết kế ngược lại hệ thống cơ khí
tay máy cụ thể như sau:

Khâu 1 : Chân đế :

60
Hình 3.2 Bản vẽ 3D đế tay máy

Đế tay máy được thiết kế liền khối làm tăng tính ổn định và cứng vững
cho tay máy. Trên đế có các vị trí để liên kết với mặt sàn hay các cơ cấu di
chuyển khác. Đế này là nơi tập trung phần lớn khối lượng của tay máy giúp
tay máy khi hoạt động ổn định bền bỉ, tránh những rung động khi thao tác,
các mô men quán tính của cả cánh tay. Trên tay máy các vị trí lắp hộp số, lắp
ổ lăn và vị trí lắp vào sàn cố định đều được gia công phay phẳng bảo đảm liên
kết với các chi tiết khác chính xác. Trên khâu 0 có bố trí vị trí để lắp cụm
chuyển động cho trục 1 bao gồm hộp giảm tốc và động cơ, hộp số dạng mặt
bích được lắp trực tiếp lên trên khâu đế để dẫn động toàn bộ các khâu tiếp
theo. Bên cạnh đó trên khâu 0 còn có các vị trí để bố trí hệ thống giắc kết nối
với cáp kết nối tới tủ điện và lắp hệ thống vỏ bảo vệ giúp tay máy trở lên
thẩm mỹ hơn và an toàn hơn. Bản vễ chi tiết khâu 1 được thể hiện trên hình
3.2.

61
Hình 3.3. Bản vẽ chi tiết khâu 1.1 tay máy

Hình 3.4. Bản vẽ chi tiết khâu 1.2 tay máy

Kết cấu khâu 2 : Khâu bả vai của tay máy :

Khâu 2 của tay máy được thiết kế tương đối ngắn và to khỏe, có đầy đủ
các vị trí, mặt bích để liên kết với khâu đế tay máy thông qua hộp số

62
harmonic . Vị trí liên kết với khâu 3 đã bố trí các lỗ ốc để gắn vào mặt bích
của hộp số .

Hình 3.5. Bản vẽ 3D khâu 2 của tay máy

Hình 3.6 Bản vẽ chi tiết khâu 2

63
Kết cấu khâu 3: Khâu cẳng tay của tay máy

Hình 3.7 Bản vẽ 3D khâu 3

Hình 3.8 Bản vẽ chi tiết khâu 3

Khâu 3 có thiết kế thon dài giúp cho tầm làm việc của tay máy trở lên
rộng hơn (hình 3.7) với việc hộp số gắn trực tiếp lên khớp giúp cho tay máy
trông rất gọn gàng. Các chi tiết được thiết kế theo dạng hộp giúp giảm trọng
lượng nhưng vẫn bảo đảm chịu được các mô men lớn.

64
Khâu này liên kết với khâu 2 thông qua hộp số hamonic vị trí liên kết
giữa khâu 2 và khâu 3 cực kỳ quan trọng, nó đảm nhiệm vai trò nâng toàn bộ
cánh tay sau này, nơi chịu mô mem rất lớn bởi trọng lượng các khâu phía sau
và momem quán tính các khâu vì cách xa trục quay. Bản vẽ chi tiết khâu này
được thể hiện trên hình 3.8 .Yêu cầu chế tạo và lắp ráp của khâu này rất cao
và chính xác nhằm mục đích bảo đảm sai số của tay máy khi hoạt động. Việc
sử dụng hộp số chịu tải trọng cao phần nào bảo đảm vấn đề đó , kết cấu khâu
này cũng không quá dài tránh được các vị trí làm trọng tâm của các khâu ở
quá xa khâu đế gây mất cân bằng, nhưng nó cũng đủ dài để bảo đảm tầm làm
việc khi hoạt động.

Kết cấu khâu 4: Khâu vai trên của tay máy :

Khâu 4 liên kết với khâu 3 thông qua khớp xoay bản lề và được gắn
vào hộp số harmonic và liên kết với khâu 5 thông qua bộ truyền răng thẳng
răng trụ truyền momen từ động cơ sang cho khâu 5 .

Hình 3.9. Bản vẽ 3D khâu 4

65
Hình 3.10. Bản vẽ chi tiết khâu 4

Kết cấu khâu 5: Khâu cánh tay của tay máy

Khâu 5 liên kết với khâu 4 thông qua khớp xoay đ ư ợc truyền momen
từ động cơ thông qua bộ truyền răng cũng là một thiết kế thon nhỏ nhưng dài
đủ lớn phục vụ quá trình thao tác của tay máy với vùng làm việc lớn và ổn
định (hình 2.10). Tại khâu này yếu tố khối lượng cũng được chú ý đến bên
cạnh độ bền và chính xác của tay máy . Phía đầu khâu 5 , chỗ liên kết với
khâu 6 có chứa một hộp số thường . Hộp số này lấy momen từ động cơ gắn
bên trong th ân kh âu 5 biến đổi và truyền sang cho khâu 6

66
Hình 3.11. Bản vẽ 3D khâu 5

Hình 3.12. Bản vẽ tách lớp 3D khâu 5

67
Hình 3.13. Bản vẽ chi tiết nắp 1 khâu 5

Hình 3.14. Bản vẽ chi tiết nắp 2 khâu 5

68
Hình 3.15. Bản vẽ chi tiết thân khâu 5

Kết cấu khâu 6 : Khâu cổ tay của tay máy

Khâu 6 (hình 3.16) được thiết kế rất đặc biệt với kích thước ngắn, nhẹ
nhưng cũng không kém phần phức tạp, bộ dẫn động cho khớp này là sự kết
hợp ăn khớp giữa các bánh răng trong hộp số đặt trên khâu 5 . Đầu của khâu 6
là một hộp số harmonic thực hiện nhiệm vụ biến đổi và truyền mômen ra
khâu công tác .

69
Hình 3.16. Bản vẽ 3D khâu 6

Hình 3.17. Bản vẽ chi tiết khâu 6

Với kết cấu ngắn giúp cho tay máy dễ dàng len lỏi vào các ngõ ngách
nhỏ để thao tác giúp tay máy trở lên linh hoạt, thực hiện được nhiều công
việc phức tạp hơn. Bản vẽ chi tiết khâu 6 sau khi dựng lại ở trên hình 3.16

Kết cấu khâu 7: Khâu công tác

70
Khâu 7 (hình 3.18) được gắn với khâu 6 thông qua hộp số hamonic,
trên khâu 7 còn có các vị trí lỗ bắt bulong để lắp các cơ cấu công tác như tay
gắp, bút, hay các thiết bị kiểm tra, các thiết bị đầu dò… Đây được coi như bàn
tay của tay máy là nơi liên kết với nhiều loại thiết bị lên đòi hỏi sự cơ động
cao, thao tác thay đổi nhanh chóng gọn gàng đơn giản. Chi tiết của khâu 6
được thể hiện trên hình 3.19.

Hình 3.18. Bản vẽ 3D khâu 7

Hình 3.19 : Bản vẽ chi tiết khâu 7

71
Hình 3.18. Mô hình 3D Fanuc Mate 100

Bên cạnh yếu tố thẩm mỹ của robot, việc thiết kế đảm bảo các yêu cầu
động lực học, phù hợp với điều kiện làm việc là rất quan trọng. Đế của robot
được thiết kế để có thể dễ dàng gắn lên sàn, tường, trần hoặc trên các modul
di động. Ta thấy khớp thứ hai có cấu tạo khớp bản lề được bố trí lệnh, với cấu
tạo này, robot sẽ có tầm hoạt động rộng hơn so với cấu tạo khớp bản lề đối
xứng. Khi thiết kế cơ khí robot người ta luôn có xu hướng thiết kế sao cho
trọng tâm của các khâu nằm gần trục quay của nó, khi đó sẽ giảm được
momen trọng lực của bản thân các khâu gây nên và đối với các khâu khác.
Bản vẽ 3D sau khi thiết kế ngược các khâu, khớp và ghép lại được thể hiện

72
trên hình 3.20. Mô hình này sẽ được sử dụng phục vụ nghiên cứu mô phỏng
và thử nghiệm điều khiển robot về sau.

3.2. Thông số làm việc của robot


Bảng 3-1 Thông số làm việc của tay máy Fanuc Mate 100

Khớp Tầm làm việc (độ)


1 -165165

2 -75135

3 -149150

4 -190190

5 -140140

6 -320320

Thông tin về robot

 Tải trọng tối đa của robot: 6 kg


 Tầm với tối đa: 1368 mm

Tốc độ chuyển động của robot

 Trục 1: 115º / s
 Trục 2: 110º / s
 Trục 3: 115º / s
 Trục 4: 240º / s
 Trục 5: 240º / s
 Trục 6: 400º / s
 Tải : 6 kg
 Khối lượng Robot :
 Tổng khối lượng : 290 Kg

73
74
CHƯƠNG 4 : PHẦN MỀM LẬP TRÌNH NGOẠI TUYẾN ROBODK
4.1. Xây dựng mô hình robot :
Trong phần này chúng ta sẽ xem xét cách để đưa một mô hình robot
vào trong phần mềm roboDK dựa trên mô hình 3D đã xây dựng được ở trong
chương 3 .

a. Các dạng robot được RoboDK hỗ trợ :

RoboDK hỗ trợ 11 cấu hình robot thông dụng hiện nay bao gồm :

- Robot 1 trục quay

- Robot 2 trục quay

- Robot 1 trục tịnh tiến

- Robot 2 trục tịnh tiến

- Robot 1 trục quay , 1 trục tịnh tiến

- Robot kẹp dạng ngón tay (finger gripper)

- Robot 3 trục tịnh tiến (dạng chữ H)

- Robot 4 trục Scara

- Robot 6 trục quay (trục quay đầu và trục quay cuối đồng phằng)

- Robot 6 trục quay (trục quay 2 và trục quay cuối đồng phẳng và
song song)

- Robot 7 trục quay

75
Hình 4.1 : Các cấu hình được hỗ trợ

Các file STEP và IGES là hai định dạng được RoboDK hỗ trợ . Do đó
để nhập được mô hình 3D robot vào thì ta cần chuyển về định dạng STEP
hoặc IGES .

b. Các cách nhập mô hình :

Có 2 cách để nhập mô hình Robot vào RoboDK :

76
- Cách 1 : Thay đổi gốc toạ độ cho các khâu bằng phần mềm CAD
(Inventor) sau đó nhập đồng loạt các file Step vào RoboDK rồi nhập các
thông số động học để tạo các khớp và ràng buộc chuyển động cho robot .

- Cách 2 : Nhập từng khâu của robot vào phần mềm RoboDK sau
đó tạo các hệ toạ độ và gán các khâu cho chúng rồi căn chỉnh các hệ toạ độ đó
về đúng vị trí ăn khớp phù hợp dựa trên các thông số kích thước đã có .

Do cách 1 là cách đơn giản và nhanh gọ hơn nên ta sẽ ưu tiên sử


dụng cách 1 :

Các bước nhập mô hình vào RoboDK :

- Bước 1 : Do khi vẽ chúng ta lấy trục toạ độ là bất kì nên để nhập


mô hình các khâu vào đúng vị trí lắp ghép mong muốn thì chúng ta cần thay
đổi hệ trục toạ độ cho các khâu . Mở file lắp ráp bên phần mềm Cad , sao ra
thanh 7 bản và đổi tên 7 file theo tên các khâu

 đối với file của khâu nào thì chỉ giữ lại khâu đó và xoá hết các khâu
có liên quan  export ra các file Step lưu riêng vào 1 folder . Ví dụ với khâu
1:

77
Xoá bỏ toàn bộ các khâu khác , chỉ giữ lại khâu 1  export ra file step,
các khâu khác làm tương tự .

- Bước 2 :mở phần mềm robotDK , đồng thời mở thư mục nơi chứa
các file step vừa tạo kéo thả các khâu vào trong giao diện làm việc của
RoboDK

78
Kết quả nhận được mô hình như hình sau :

Tuy nhiên mô hình này chưa thể sử dụng được vì các ràng buộc động
học chưa có , bây giờ ta cần tạo các ràng buộc đó bằng cách nhập các thông
số động học tương ứng .

- Bước 3 : tạo ràng buộc động học :

Kích vào Ultilities  Model Mechanism or Robot

chọn loại 6 axes industrial robot  nhập các thông số theo yêu cầu
cấu hình nhấn Update để tạo mô hình mới với các ràng buộc

79
Robot được tạo cùng với một bảng điều khiển các góc khớp .

80
Bên cạnh đó , RoboDK cũng cung cấp 1 thư viện bao gồm hầu hết các
robot thông dụng trong thư viện trực tuyến mà chúng ta có thể tải về dung .

c. Cách thêm công cụ vào Robot :

RobotDK có một thư viện công cụ có sẵn , bao gồm hầu hết các
loại công cụ phổ biến cho robot hiện nay , ta có thể sử dụng các công cụ có
sẵn này cho robot . . Chọn open online library  typetoolchọn công cụ
mong muốn  kích vào download để thêm công cụ vào đầu thao tác của
robot .

Bên cạnh đó , chúng ta cũng có thể tự tạo cho robot một công cụ
bằng cách kích chuột phải vào tên robot trong trạm chọn Add Tool (TCP)

81
 mở file Step của công cụ bạn muốn tạo rồi kéo nó vào công cụ mới
tạo

Chọn Active Tool để cấp quyền hoạt động cho công cụ

4.2. Tạo một chương trình sử dụng file thiết kế từ phần mềm Cad :
RoboDK hỗ trợ liên kết với khá nhiều phần mềm cad thông dụng
hiện nay , nó cung cấp chức năng chuyển trực tiếp file thiết kế từ phần mềm
cad sang để tạo chương trình mô phỏng và gia công . Các Chương trình CAD
được RoboDK hỗ trợ : Inventor (bản 2019 trở lên) , Solid work (bản 2016 trở

82
lên) , Fusion , MasterCam (bản 2017 trở lên) và Rhino . Trong phần này ta sử
dụng Inventor 2020 kết hợp RoboDK để tạo chương trình .

Bổ trợ RoboDK cho Inventor cho phép bạn kết hợp các tính năng
mô hình 3D CAD / CAM của Inventor với RoboDK để mô phỏng robot, lập
trình ngoại tuyến và gia công robot . Với bổ trợ RoboDK cho Inventor, bạn có
thể dễ dàng tải các mô hình 3D được tạo trong Inventor sang RoboDK . Robot
có thể dễ dàng được lập trình cho nhiều ứng dụng sản xuất như khoan, hàn,
cắt tỉa, in 3D hoặc gia công robot.  Phần xử lý của robot hiển thị danh sách
các nhãn hiệu và bộ điều khiển robot được hỗ trợ . Cũng có thể sửa đổi hoặc
tạo bộ xử lý mới để tùy chỉnh việc tạo chương trình.
a. Tạo một chương trình gia công :
- Bước 1 : tạo 1 file cad trên inventor
- Bước 2 : cài đặt xuất file từ inventor sang RoboDK

83
- Bước 3 : chọn Auto Setup và chọn các đường , mặt , khối muốn gia
công  chọn Done để hoàn tất .
- Bước 4 : kích đúp vào vật mới tạo chọn select curve

Chọn các đường và ấn Done

kích chuột phải vào curve  chọn Run để chạy mô phỏng

84
- Bước 5: xuất chương trình đầu ra cho bộ xử lý :

Để chọn một bộ xử lý cụ thể cho robot : Nhấp chuột phải vào robot
hoặc chương trình  Select post processor  Chọn một bộ xử lý từ danh
sách  OK.

Nhấn F6 để xuất đầu ra cho bộ xử lý Robot , một file LS được tạo ra


mang theo thông số các khớp trong quá trình thực thi chương trình .

85
/PROG CURVE
/ATTR
OWNER = MNEDITOR;
COMMENT = "RoboDK sequence";
PROG_SIZE = 0;
CREATE = DATE 07-01-20 TIME 11:55:01;
MODIFIED = DATE 07-01-20 TIME 11:55:01;
FILE_NAME= ;
VERSION = 0;
LINE_COUNT = 39;
MEMORY_SIZE = 0;
PROTECT = READ_WRITE;
TCD: STACK_SIZE = 0,
TASK_PRIORITY = 50,
TIME_SLICE = 0,
BUSY_LAMP_OFF = 0,
ABORT_REQUEST = 0,
PAUSE_REQUEST = 0;
DEFAULT_GROUP = 1,*,*,*,*;
CONTROL_CODE = 00000000 00000000;
/MN
1: UTOOL_NUM=1;
2: UFRAME_NUM=1;
3:J P[1] 50% CNT1 ;
4: PR[10,1]=800.000 ;
5: PR[10,2]=800.000 ;
6: PR[10,3]=0.000 ;
7: PR[10,4]=90.000 ;
8: PR[10,5]=-0.000 ;
9: PR[10,6]=-45.000 ;
10: UFRAME[1]=PR[10] ;
11: PR[10,1]=-4.000 ;
12: PR[10,2]=0.000 ;
13: PR[10,3]=371.300 ;
14: PR[10,4]=0.000 ;
15: PR[10,5]=45.000 ;
16: PR[10,6]=0.000 ;
17: UTOOL[1]=PR[10] ;
18: R[10]=1000 ;
19:J P[2] 50% CNT1 ;
20:L P[3] R[10]mm/sec CNT1 ;
21: R[10]=50 ;
22:L P[4] R[10]mm/sec CNT1 ;
86
23: R[10]=1000 ;
24:L P[5] R[10]mm/sec CNT1 ;
25: R[10]=1000 ;
26:L P[6] R[10]mm/sec CNT1 ;
27:L P[7] R[10]mm/sec CNT1 ;
28: R[10]=50 ;
29:L P[8] R[10]mm/sec CNT1 ;
30:L P[9] R[10]mm/sec CNT1 ;
31: R[10]=1000 ;
32:L P[10] R[10]mm/sec CNT1 ;
33: R[10]=1000 ;
34:L P[11] R[10]mm/sec CNT1 ;
35:L P[12] R[10]mm/sec CNT1 ;
36: R[10]=50 ;
37:L P[13] R[10]mm/sec CNT1 ;
38: R[10]=1000 ;
39:L P[14] R[10]mm/sec CNT1 ;
/POS
P[1]{
GP1:
UF : 1, UT : 1,
J1= 121.164 deg, J2= 50.493 deg, J3= 37.581 deg,
J4= -67.258 deg, J5= 78.539 deg, J6= -145.611 deg
};
P[2]{
GP1:
UF : 1, UT : 1,
J1= 121.164 deg, J2= 50.493 deg, J3= 37.581 deg,
J4= -67.258 deg, J5= 78.539 deg, J6= -145.611 deg
};
P[3]{
GP1:
UF : 1, UT : 1,
J1= 116.342 deg, J2= 58.021 deg, J3= 32.766 deg,
J4= -72.616 deg, J5= 77.564 deg, J6= -143.025 deg
};
P[4]{
GP1:
UF : 1, UT : 1,
J1= 87.437 deg, J2= 46.129 deg, J3= -22.779 deg,
J4= -33.482 deg, J5= 94.336 deg, J6= -195.656 deg
};
P[5]{
87
GP1:
UF : 1, UT : 1,
J1= 88.682 deg, J2= 41.199 deg, J3= -23.385 deg,
J4= -33.297 deg, J5= 99.600 deg, J6= -197.742 deg
};
P[6]{
GP1:
UF : 1, UT : 1,
J1= 55.009 deg, J2= 25.461 deg, J3= -5.413 deg,
J4= -19.155 deg, J5= 91.060 deg, J6= -194.710 deg
};
P[7]{
GP1:
UF : 1, UT : 1,
J1= 60.048 deg, J2= 27.205 deg, J3= 4.431 deg,
J4= -31.446 deg, J5= 78.378 deg, J6= -198.509 deg
};
P[8]{
GP1:
UF : 1, UT : 1,
J1= 91.342 deg, J2= 74.614 deg, J3= 70.249 deg,
J4= -104.230 deg, J5= 88.971 deg, J6= -89.600 deg
};
P[9]{
GP1:
UF : 1, UT : 1,
J1= 116.342 deg, J2= 58.021 deg, J3= 32.766 deg,
J4= -72.616 deg, J5= 77.564 deg, J6= -143.025 deg
};
P[10]{
GP1:
UF : 1, UT : 1,
J1= 121.164 deg, J2= 50.493 deg, J3= 37.581 deg,
J4= -67.258 deg, J5= 78.539 deg, J6= -145.611 deg
};
P[11]{
GP1:
UF : 1, UT : 1,
J1= 88.682 deg, J2= 41.199 deg, J3= -23.385 deg,
J4= -33.297 deg, J5= 99.600 deg, J6= -197.742 deg
};
P[12]{
GP1:
88
UF : 1, UT : 1,
J1= 87.437 deg, J2= 46.129 deg, J3= -22.779 deg,
J4= -33.482 deg, J5= 94.336 deg, J6= -195.656 deg
};
P[13]{
GP1:
UF : 1, UT : 1,
J1= 60.048 deg, J2= 27.205 deg, J3= 4.431 deg,
J4= -31.446 deg, J5= 78.378 deg, J6= -198.509 deg
};
P[14]{
GP1:
UF : 1, UT : 1,
J1= 55.009 deg, J2= 25.461 deg, J3= -5.413 deg,
J4= -19.155 deg, J5= 91.060 deg, J6= -194.710 deg
};
/END

b. Sửa đổi một bộ xử lý :


Có thể sửa đổi bộ xử lý hiện có hoặc tạo bộ xử lý mới. Bộ xử lý
phải được đặt trong thư mục C: / RoboDK / post / để có thể chọn chúng trong
RoboDK.  Mỗi bộ xử lý là một tệp PY. Có thể đổi tên tệp hoặc sao chép tệp
từ / sang thư mục C: / RoboDK / post / để chia sẻ các bộ xử lý khác nhau. Để
xóa tập lệnh bộ xử lý hiện có, chỉ cần xóa tệp PY tương ứng. Bộ xử lý có thể
được chỉnh sửa bằng bất kỳ trình soạn thảo văn bản hoặc trình soạn thảo
Python (Python IDLE). Sử dụng trình soạn thảo Python cho phép nhanh
chóng gỡ lỗi và đánh giá một chương trình mẫu ở cuối tệp.
Để sửa đổi bộ xử lý hiện có:
1.Chọn Chương trình Add / Edit post processor
2.Chọn một bộ xử lý hiện có
3.Chọn OK . Một trình soạn thảo văn bản sẽ mở và chương
trình.
4.Chọn Run Run module (F5) để xem trước kết quả. Thực hiện
bất kỳ thay đổi nếu cần thiết.

89
Ngoài ra, có thể chỉnh sửa thủ công bài viết:
1.Chuyển đến thư mục bộ xử lý bài: C: / RoboDK / post /
2.Mở tệp PY bằng Python IDLE hoặc trình soạn thảo khác
3.Thực hiện các thay đổi mong muốn
4.Chạy kiểm tra kết quả: Chọn Run Run module (F5) từ Python
IDLE.

NGHIÊN CỨU VÀ MÔ PHỎNG CÁNH TAY ROBOT ỨNG


DỤNG ROS
5.1. Xây dựng mô hình robot
Trong phần này, ta sẽ xem xét thêm các thẻ URDF xml, giúp mô
hình hóa robot. Urdf có thể mô tả mô tả động học và động lực học của
robot, mô tả trực quan robot và mô hình va chạm của robot.
Các thẻ sau đây là các thẻ thường được sử dụng để mô hình hóa robot:

- link: Khâu đại diện cho một liên kết của robot. Sử dụng thẻ này, ta có
thể mô hình liên kết robot và các thuộc tính của nó. Mô hình bao
gồm kích thước, hình dạng, màu sắc, và thậm chí có thể nhập một
lưới 3D để đại diện cho liên kết robot. Ta cũng có thể cung cấp các
thuộc tính động của liên kết như ma trận quán tính và đặc tính va
90
chạm.
Cú pháp như sau:
<link name="<name_link>">
<inertial>. </inertial>
<visual>. .</visual>
<collision>. </collision>
</link>
Thẻ inertial biển diễn các đặc tính vật lý như khối lượng, momen quán
tính khối của khâu.
Thẻ visual tượng trưng cho hình ảnh biểu diễn của khâu.
Thẻ collision sẽ thể hiện phần vật chất của khâu thực để phát hiện sự va
chạm trước khi chạm vào khâu.

91
Hình 5.1. Mô hình của khâu trong urdf
- joint: Joint đại diện cho một khớp robot. Chúng ta có thể xác định động học
và động lực học của khớp và cũng đặt ra các giới hạn của chuyển động
của khớp và vận tốc của nó. Thẻ chung hỗ trợ các loại khớp khác nhau
như: khớp quay - revolute, khớp tịnh tiến - prismatic, khớp cố định -
fixed,…

Hình 5.2. Mô hình của khớp


Cú pháp như
sau:
<joint name="<tên khớp >">
<origin> xyz = “” rpy = “” </origin>
<parent link="link1"/>
<child link="link2"/>

92
<calib
ration................

93
<dynamics damping />
<limit effort />
</joint>
Một khớp được hình thành giữa hai liên kết; liên kết đầu tiên với khâu thứ
nhất được gọi là liên kết Parent và liên kết với khâu thứ hai là liên kết Child.
Sau đây là một minh hoạ của hai khâu và liên kết của nó:
- robot: Thẻ này gói gọn toàn bộ mô hình robot có thể được biểu diễn bằng
xacro. Bên trong thẻ robot, chúng ta có thể xác định tên của robot, các liên
kết, và các khớp của robot.
Cú pháp như sau:
<robot name="<name_robot>"
<link> </link>
<link> </link>
<joint> </joint>
<joint> </joint>
</robot>
Một mô hình robot bao gồm các khâu và khớp. Dưới đây là hình ảnh mô
hình robot:

Hình 5.3 Mô hình robot có các khớp và các khâu

94
- gazebo: Thẻ này được sử dụng khi chúng ta đưa các thông số mô phỏng
của trình mô phỏng Gazebo bên trong urdf. Chúng ta có thể sử dụng thẻ
này để bao gồm đầu vào gazebo, vật liệu được định nghĩa sẵn trong
Gazebo,
v.v … Sau đây cho thấy một ví dụ bằng cách sử dụng thẻ gazebo:
<gazebo reference="link_1">
<material>Gazebo/Black</material>
</gazebo>
Trong môi trường ROS, có nhiều cách để thực hiện mô phỏng robot một
trong số đó là sử dụng mô tả robot bằng xacro khá thuận lợi. Chúng ta có thể mô
tả mô hình robot trong xacro tương tự như mô tả trong urdf và có thêm các
macro và các phép toán cơ bản tăng tính linh hoạt khi mô hình hóa.

Một tệp xacro luôn có một cấu trúc chung là:


<?xml version="1.0"?>

<robot name="fanuc" xmlns:xacro="http://www.ros.org/wiki/xacro">


<link name="ground">

<inertial>
<origin xyz="6.6613E-16 -4.4409E-16 0.032944" rpy="0 0 0" />
<mass value="38.913" />
<inertia ixx="6.9308" ixy="-7.8097E-07" ixz="-1.0189E-17"
iyy="6.9308" iyz="8.2481E-17" izz="13.741" />
</inertial>

<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
95
<mesh filename="package://fanuc/meshes/ground.STL" />
</geometry>
<material name="">
<color rgba="0.8 0.8 0.2 0.4" />
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="package://fanuc/meshes/ground.STL" />
</geometry>
</collision>
</link>
<link name="L1">

<inertial>
<origin xyz="0.0016108 -0.00060005 0.14869" rpy="0 0 0" />
<mass value="5.6605" />
<inertia ixx="0.093709" ixy="-0.0003876" ixz="0.0030073"
iyy="0.087992" iyz="0.0003561" izz="0.061293" />
</inertial>

<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="package://fanuc/meshes/L1.STL" />
</geometry>
<material name="">
<color rgba="0.8 0.8 0.9 1" />

96
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<mesh filename="package://fanuc/meshes/L1.STL" />
</geometry>
</collision>
</link>
<joint name="J0" type="fixed">
<origin xyz="0 -0.0002427 0.1255" rpy="0 0 0" />
<parent link="ground" />
<child link="L1" />
<axis xyz="0 0 0" />
</joint>
</robot>

Mã mô tả < inertial> là đặc tính vật lý cần thiết của khâu gồm khối lượng, mô
mem quán tính khối của khâu và đặt tại vị trí trọng tâm của khâu xác định bởi
97
<origin> trong thẻ. Các thẻ < visual> < collision> lần lượt mô tả hình dạng,
vùng

98
va chạm của khâu bằng cách đưa mô hình lưới mà ta đã xây dựng được ở phần
trước.
Trong thực tế các khâu của robot được liên kết với nhau bằng khác khớp
động. Để mô phỏng robot ta cũng phải mô phỏng các khớp này. Các khớp này
trong thẻ <joint> của tệp xacro.
Đoạn mã mô tả khớp động được đặt tên là joint_1 và là một khớp quay
nên có dạng là revolute. Vị trí của khớp được xác định trong thẻ <origin>.
Tùy loại khớp và mô hình robot ta có thể xác định trục của khớp trong thẻ
<axis> lần lượt là các giá trị của x, y, z. Giá trị nào bằng 1 thì đó là trục chuyển
động tương úng của khớp.
Thẻ <limit> xác định giới gian chuyển động của khớp như lực, góc quay
(revolute), độ dịch chuyển (prismatic), vận tốc, gia tốc,…
Các khâu còn lại đều có thể mô tả được bằng cách tương tự.
Chương trình mô phỏng bằng tệp xacro được trình bày trong phần phụ lục.
5.2. Xây dựng môi trường mô phỏng
Sau khi thiết kế mô hình 3D cho robot, ta tiến hành mô phỏng robot trong
môi trường thực ảo.
Chúng ta sử dụng mô phỏng gazebo để mô phỏng mô hình FANUC.
Gazebo mô phỏng nhiều robot, mô phỏng robot phức tạp trong nhà và
ngoài trời. Chúng ta có thể mô phỏng các robot phức tạp, cảm biến robot và
nhiều đối tượng 3D khác nhau. Gazebo đã có các mô hình mô phỏng các robot,
cảm biến phổ biến và một loạt các đối tượng 3D trong kho thư viện của chúng.
Chúng ta có thể trực tiếp sử dụng các mô hình này mà không cần phải tạo ra.
Ngoài ra trong Gazebo còn mô phỏng các đặc tính vật lý của đối tượng cho phép
mô phỏng tương ứng với môi trường thực tế.
Mô phỏng robot sử dụng Gazebo-ROS
Trong phần trước, chúng ta đã mô hình hóa cánh tay FANUC 6 bậc tự do. Trong
phần này ta sẽ mô phỏng robot trong gazebo sử dụng ROS.

Sau thiết kế xacro ở phần trước, ta có thể đưa mô hình robot vào bên trong môi
trường mô phỏng thực tế Gazebo được tích hợp sẵn trong ROS bằng cách khởi
99
tạo một tệp robot_description.launch như sau:
<launch>
<!-- Tìm đến file mô tả robot ta đã tạo -->
<param name="robot_description" command="$(find xacro)/xacro --
inorder '$(find fanuc)/urdf/fanuc.xacro'"/>

<!-- Khởi tạo môi trường làm việc cho robot trong Gazebo -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="paused" value="false"/>
<arg name="use_sim_time" value="true"/>
<arg name="gui" value="true"/>
<arg name="headless" value="false"/>
<arg name="debug" value="false"/>
</include>
<!-- Thêm mô hình robot vào trong môi trường tại vị trí mong muốn-->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model"
respawn="false"

output="screen" args="-urdf -param


robot_description -x 0 -y 0 -z 0 -R 0 -P 0 -Y 0 -model fanuc"/>
<node pkg="tf" type="static_transform_publisher"
name="link_broadcaster" args="0.0 0.0 0.0 0 0 0 world base_footprint
100"/>

</launch>

Ta khởi chạy mô hình bằng lệnh:


$ roslaunch fanuc robot_description.launch

100
Hình 5.4. Mô phỏng FANUC trong Gazebo

Để kích hoạt robot bằng bộ điều khiển ROS, chúng ta nên xác định phần tử
<transmission> để các khâu truyền động với các khớp. Đây là macro được định
nghĩa để truyền chuyển động:
<transmission name="trans_J1">
<type>transmission_interface/SimpleTransmission</type>
<joint name="J1">

<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInte
rface>
</joint>
<actuator name="J1_motor">

<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInte
rface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>

101
Ở đây, <joint name = ""> là khớp mà ta liên kết các bộ truyền động. Phần tử
<type> là kiểu loại truyền chuyển động. Hiện tại, chỉ truyền hỗ trợ
transmission_interface / SimpleTransmission. Phần tử <hardwareInterface> là
loại giao diện phần cứng để tải (giao diện vị trí, vận tốc hoặc lực). Giao diện
phần cứng được tải bởi đầu vào gazebo_ros_control.

Sau khi thêm các thẻ transmission, ta nên thêm đầu vào gazebo_ros_control
trong mô dun mô phỏng để phân tích của thẻ transmission và gán giao diện phần
cứng thích hợp và quản lý điều khiển. Đoạn mã sau thêm đầu vào
gazebo_ros_control vào tệp xacro:

<gazebo>
<plugin

name="gazebo_ros_control" filename="libgazebo_ros_control.so">

<robotNamespace>/fanuc</robotNamespace>

<robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSi
mTyp e>

<legacyModeNS>true</legacyModeNS>
</plugin>
</gazebo>

Hãy xem cách một bộ điều khiển ROS tương tác với Gazebo. Hình dưới đây cho
thấy sự kết nối của bộ điều khiển ROS, giao diện phần cứng robot, và mô phỏng
/ phần cứng thực tế:
Chúng ta có thể thấy công cụ của bên thứ ba như các gói Navigation và
102
MoveIt. Các gói này có thể cung cấp cho mục tiêu (điểm đặt) cho bộ điều khiển

103
robot di động và bộ điều khiển cánh tay robot. Các bộ điều khiển này có thể gửi
vị trí, vận tốc hoặc lực đến giao diện phần cứng robot.

Hình 5.5 Điều khiển ROS tương tác với Gazebo

Giao diện phần cứng phân bổ từng tài nguyên cho các bộ điều khiển và gửi
các giá trị cho mỗi tài nguyên. Sơ đồ chi tiết về truyền thông giữa các bộ điều
khiển robot và giao diện phần cứng robot được thể hiện như sau:

Hình 5.6 Minh họa các bộ điều khiển ROS và các giao diện phần cứng

104
Giao diện phần cứng được tách rời khỏi phần cứng và mô phỏng thực tế.
Các giá trị từ giao diện phần cứng có thể được cấp cho Gazebo để mô phỏng
hoặc cho phần cứng thực tế.
Giao diện phần cứng (hardware interface) là một phần mềm đại diện cho
robot và phần cứng trừu tượng của nó. Tài nguyên của giao diện phần cứng là bộ
truyền động, khớp và cảm biến. Một số tài nguyên chỉ đọc, chẳng hạn như trạng
thái chung, IMU, cảm biến lực mô-men xoắn, v.v. một số tài nguyên được đọc
và ghi tương thích như vị trí, vận tốc và lực đặt vào các khớp.
Để thực hiện điều khiển robot thì ta cần cấu hình hai tệp điều khiển cho
robot. Đầu tiên, joint_state_controller sẽ gửi giá trị vị trí các biến khớp của tay
máy và joint_posision_controller có thể nhận vị trí điểm cuối ứng với mỗi bộ
biến khớp.
Chúng ta sẽ tạo tệp cấu hình robot_control.yaml trong thư mục config như sau:
fanuc:
#publish aa joint states
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50

arm:
type: "position_controllers/JointTrajectoryController"
joints:
- J1
- J2
- J3
- J4
- J5
- J6
gains:

105
J1: {p: 1000, i: 0.01, d: 10}
J2: {p: 1000, i: 0.01, d: 10}
J3: {p: 1000, i: 0.01, d: 10}
J4: {p: 1000, i: 0.01, d: 10}
J5: {p: 1000, i: 0.01, d: 10}
J6: {p: 1000, i: 0.01, d: 10}

constraints:

goal_time: 10.0 # Override default

state_publish_rate: 50 # Override default


action_monitor_rate: 30 # Override default
stop_trajectory_duration: 0 # Override default.
stop_velocity_tolerance: 0.05
Có thể thấy rằng tất cả các đối tượng điều khiển đầu nằm trong không
gian fanuc và dòng đầu tiên khai báo joint_state_controller, nó sẽ khai báo vị trí
biến khớp của robot với tần số 50Hz.
Còn lại là joint_posision_controllers, nó sẽ quy định cho vị trí đầu của 6
khớp và xác định hệ số PIDs.

Sau khi cấu hình điều khiển cho cánh tay robot, ta sẽ bắt đầu điều khiển với
trình mô phỏng Gazebo. Tạo tệp robot_control.launch với đoạn mã sau để khởi
chạy điều khiển:
<launch>

<!--Load the joint controllers to param server-->

106
<rosparam file="$(find fanuc)/config/robot_control.yaml"
command="load"/>

<rosparam file="$(find fanuc_moveit_config)/config/joint_names.yaml"


command="load"/>

<!--Load controllers-->
<node name="spawner" pkg="controller_manager" type="spawner"
respawn="false"
output="screen" ns="/fanuc" args="joint_state_controller arm "/>

</launch>
Trong tệp cấu hình ta đã đặt hết các đối tượng điều khiển ( J1,J2,J3…) vào trong
nhóm arm nên khi gọi đối tượng điều khiển ta chỉ cần gọi tên nhóm điều khiển.
Chạy file launch để kiểm tra:
$roslaunch fanuc robot_control.launch
Nếu lệnh chính xác, ta sẽ nhận được thông tin như sau:

107
Hình 5.7. Thông số bộ điều khiển của FANUC

Mô phỏng robot trong Rviz

Trong phần trước, ta đã trình bày về mô hình hóa và mô phỏng cánh tay
robot. Chúng tôi kiểm soát từng nhánh của cánh tay robot ở Gazebo bằng bộ điều
khiển ROS.
Trong phần này, ta sẽ chuyển tới giao diện khối chức năng, chẳng hạn
như thao tác robot và điều hướng tự động bằng cách sử dụng ROS MoveIt và
Ngăn xếp điều hướng.
MoveIt là một bộ các gói và công cụ để thực hiện thao tác trên thiết bị di
động trong ROS. Trang web chính thức (http://moveit.ros.org/) chứa các tài liệu,

danh sách các robot sử dụng MoveIt, và các ví dụ khác nhau để gắp, nhả vật,
nắm bắt, lập quỹ đạo chuyển động đơn giản bằng cách sử dụng động học thuận,
và động học ngược, v.v.
MoveIt chứa phần mềm hiện đại để lập quỹ đạo chuyển động , thao tác,
nhận thức 3D, động học, kiểm tra va chạm, điều khiển và điều hướng. Ngoài
giao diện dòng lệnh, MoveIt có một số giao diện người dùng (GUI) tốt để giao
diện một robot mới cho MoveIt. Ngoài ra, RViz cho phép lập quỹ đạo chuyển
động từ chính RViz. Chúng ta cũng sẽ thấy cách lập quỹ đạo chuyển động robot
của chúng ta bằng lập trình C++ hoặc python.

108
Hình 5.8. Cấu trúc Moveit

109
Chúng ta có thể nói rằng move_group là trái tim của MoveIt khi nút này
hoạt động như một bộ tích hợp của các thành phần khác nhau của robot và cung
cấp các thao tác, dịch vụ theo nhu cầu của người dùng.
Từ cấu trúc, rõ ràng là nút move_group thu thập thông tin robot như đám
mây điểm, trạng thái chung của robot và biến đổi (TF) của robot theo dạng chủ
đề và dịch vụ.
Từ máy chủ tham số, nó thu thập dữ liệu động học robot, chẳng hạn như
mô tả robot_ (URDF), SRDF (Semantic Robot Description Format - Định dạng
mô tả ngữ nghĩa robot) và các tệp cấu hình. Tệp SRDF và tệp cấu hình được tạo
trong khi tạo MoveIt! gói cho robot. Các tệp cấu hình chứa tệp tham số để thiết
lập các giới hạn khớp, nhận thức, động học, v.v.
Khi MoveIt nhận được tất cả thông tin về robot và cấu hình của nó, ta có
thể nói nó được cấu hình đúng và ta có thể bắt đầu chỉ huy robot từ giao diện
người dùng. Chúng ta có thể sử dụng giao diện lập trình C ++ hoặc Python để
chỉ huy nút move_ group để thực hiện các hành động như gắp/đặt vật, động học
ngược
- IK, động học thuận - FK, trong số các lệnh khác. Sử dụng plugin lập quỹ đạo
chuyển động RViz, chúng ta có thể chỉ huy robot từ chính giao diện RViz.
Nút move_group là một trình tích hợp; nó không chạy bất kỳ loại thuật
toán lập quỹ đạo chuyển động nào mà thay vào đó kết nối tất cả các chức năng
như các plugin. Có các trình bổ sung cho các giải pháp động học, lập quỹ đạo
chuyển động , v.v. Chúng tôi có thể mở rộng khả năng thông qua các plugin này.
Sau khi lập quỹ đạo chuyển động , quỹ đạo được tạo ra sẽ giao tiếp với
các bộ điều khiển trong robot bằng cách sử dụng giao diện
FollowJointTrajectoryAction. Đây là một giao diện hành động trong đó một máy
chủ hành động được chạy trên robot, và move_node khởi tạo một máy khách
hành động mà giao tiếp với máy chủ này và thực hiện quỹ đạo trên robot thực
mô phỏng Gazebo.

110
Planning scene thuật ngữ được sử dụng để đại diện cho thế giới xung
quanh robot và cũng lưu trữ trạng thái của robot. Trình giám sát planing scene
bên trong move_group duy trì biểu diễn cảnh lập kế hoạch. Nút move_group bao
gồm một phần khác được gọi là giám sát thế giới xung quanh, nó tạo ra vùng
hình ảnh của đối tượng xung quanh từ các cảm biến của robot và từ đầu vào của
người dùng.
Trình giám sát planning scene đọc giá trị biến khớp trong chủ đề
joint_states từ robot, và thông tin cảm biến và vùng hình ảnh của đối tượng xung
quanh. Thiết bị kiểm tra đọc từ màn hình bản đồ phòng, sử dụng nhận thức 3D để
xây dựng một đại diện 3D của môi trường, được gọi là Octomap. Octomap có thể
được tạo ra từ các đám mây điểm được xử lý bởi một đầu vào cập nhật bản đồ
chiếm dụng đám mây điểm và hình ảnh độ sâu được xử lý bởi trình cập nhật bản
đồ dung lượng ảnh chiếm dụng chiều sâu. Hình sau đây cho thấy sự thể hiện của
cảnh lập kế hoạch từ MoveIt! wiki chính thức.
(http://moveit.ros.org/documentation/concepts/)

Hình 5.9 MoveIt! sơ đồ tổng quan planning scene

111
MoveIt cung cấp một sự linh hoạt tuyệt vời để chuyển đổi các thuật toán
động học nghịch đảo bằng cách sử dụng các trình bổ sung robot. Người dùng có
thể viết giải quyết động học ngược của riêng mình như một phương pháp đầu
vào cho MoveIt và chuyển từ đầu vào trình giải quyết mặc định bất cứ khi nào
được yêu cầu. Trình giải quyết động học ngược mặc định trong MoveIt là một
bộ giải dựa trên số jacobian.
So với cách giải quyết bằng phân tích, giải quyết số có thể mất thời gian
để giải quyết động học ngược. Gói được gọi là IKFast có thể được sử dụng để
tạo mã C++ để giải quyết động học ngược bằng cách sử dụng cá phương pháp
phân tích, có thể được sử dụng cho các loại robot khác nhau và thực hiện tốt hơn
nếu bậc tự do nhỏ hơn 6. Mã C ++ này cũng có thể được chuyển đổi thành
MoveIt plugin bằng cách sử dụng một số công cụ ROS.
Động học thuận và tìm jacobians đã được tích hợp vào MoveIt!, vì vậy chúng tôi
không cần sử dụng các đầu vào để giải quyết động học thuận.

Đối tượng CollisionWorld bên trong MoveIt được sử dụng để tìm xung
đột bên trong một vùng hình cảnh đang sử dụng gói FCL (Flexible Coolision
Library
-Thư viện va chạm linh hoạt) làm phụ trợ. MoveIt hỗ trợ kiểm tra va chạm cho
các loại đối tượng khác nhau, chẳng hạn như dạng lưới, hình dạng cơ bản như
hộp, hình trụ, hình nón, hình cầu, và như vậy, và Octomap.
Kiểm tra va chạm là một trong những nhiệm vụ tốn kém về tính toán
trong quá trình lập quỹ đạo chuyển động . Để giảm tính toán này, MoveIt cung
cấp một ma trận gọi là ACM (Allowed Collision Matrix - Phép đối chiếu ma
trận). Nó chứa một giá trị nhị phân tương ứng với sự cần thiết phải kiểm tra va
chạm giữa hai khâu của robot.Nếu giá trị của ma trận là 1, nó có nghĩa là va
chạm của cặp tương ứng là không cần thiết. Chúng ta có thể thiết lập giá trị là 1
nơi mà các vật thể luôn luôn ở xa đến mức chúng sẽ không bao giờ va chạm với
nhau. Tối ưu hóa phép đối chiều ma trận có thể giảm tổng số tính toán cần thiết
112
để tránh va chạm.

113
Sau khi giới thiệu về các khái niệm cơ bản trong MoveIt, giờ ta có thể
trình bày cách cấu hình một cánh tay robot vào MoveIt. Để giao tiếp với cánh
tay robot trong MoveIt, chúng ta cần thỏa mãn các thành phần mà chúng ta đã
thấy trong hình 5.2.8. Nút move_group về cơ bản đòi hỏi các tham số như
URDF, SRDF, các tệp cấu hình và các chủ đề chung của nhóm điều khiển từ một
robot để bắt đầu lập quỹ đạo chuyển động .
MoveIt cung cấp một công cụ dựa trên giao diện được gọi là Setup
Assistant để tạo ra tất cả các phần tử này. Sau đây là quy trình tạo MoveIt cấu
hình từ công cụ Setup Asistant.

MoveIt Setup Assistant là một giao diện người dùng đồ họa để định cấu
hình bất kỳ robot nào từ MoveIt. Về cơ bản, công cụ này tạo ra SRDF, các tệp
cấu hình, các tệp khởi chạy và tạo ra từ mô hình URDF của robot, được yêu cầu
để cấu hình nút move_group.
Tệp SRDF chứa thông tin chi tiết về các khớp cánh tay, khớp nối hiệu ứng
đầu cuối, khớp ảo và các cặp liên kết va chạm được cấu hình trong MoveIt! quá
trình cấu hình bằng cách sử dụng công cụ Setup Assistant .
Tập tin cấu hình chứa các chi tiết về các bộ giải động học, các giới hạn khớp,
các bộ điều khiển, v.v., cũng được cấu hình và lưu trong quá trình cấu hình.
Sử dụng gói cấu hình được tạo ra của robot, chúng ta có thể làm việc với lập quỹ
đạo chuyển động trong Rviz mà không có sự hiện diện của một robot thực hoặc
giao diện mô phỏng.
Hãy bắt đầu tạo cấu hình và chúng ta làm theo các bước sau:
Bước 1: Khởi động công cụ Setup Assistant
Để có thể bắt đầu công cụ Setup Assistant, ta cần cài đặt chúng trong ROS:
$ sudo apt-get install ros-kinetic-moveit-setup-assistant
Khi chắc chắn công cụ đã được cài đặt ta chạy công cụ:
$ roslaunch moveit_setup_assistant setup_assistant.launch

114
- Một cửa sổ được mở lên với hai lựa chọn: Create New Package!
Configuration Package hoặc Edit Existing MoveIt!. Ở đây chúng ta
đang tạo một gói mới, vì vậy chúng ta cần tùy chọn đó. Nếu chúng ta có
một MoveIt! đã có, sau đó chúng ta có thể chọn tùy chọn thứ hai.
- Bấm vào nút Create New MoveIt! Configuration Package, một cửa
sổ mới mở lên như hình bên dưới:

Hình 5.10 MoveIt! Setup Assitant


- Trong bước này, trình hướng dẫn yêu cầu mô hình URDF của robot
mới. Cho tệp URDF, nhấp vào nút Browse và điều hướng đến
fanuc_arcmate_100/src/fanuc/urdf/fanuc.urdf. Chọn tệp này và nhấn nút
Load để tải mô hình robot. Chúng ta có thể cung cấp cho robot mô hình
như URDF thuần túy hoặc xacro, nếu chúng ta cung cấp cho xacro, công
cụ sẽ tự chuyển đổi thành URDF.
- Nếu mô hình robot được phân tích thành công, chúng ta có thể thấy
mô hình robot trên cửa sổ, như được hiển thị tiếp theo:

115
Hình 5.11 Phân tích cú pháp thành công mô hình robot trong công cụ
Setup Assitant

Bước 2: Tạo ma trận va chạm


- Trong bước này, MoveIt tìm kiếm một cặp liên kết trên robot khi
đó có thể là vô hiệu hóa an toàn từ việc kiểm tra va chạm. Chúng có thể
làm giảm quá trình xử lý thời gian. Công cụ này phân tích từng cặp liên
kết và phân loại các liên kết trong khi va chạm, không bao giờ va chạm,
mặc định trong va chạm, các liên kết lân cận bị vô hiệu hóa và đôi khi
trong va chạm, và nó vô hiệu hóa các cặp liên kết mà làm cho bất kỳ loại
va chạm nào.

116
Hình 5.12 Tạo lại ma trận Self-Collision.
- Mật độ lấy mẫu là số vị trí ngẫu nhiên để tự kiểm tra va chạm. Nếu
mật độ lớn, tính toán sẽ cao nhưng tự va chạm sẽ ít hơn. Giá trị mặc định
là 10.000. Chúng ta có thể thấy cặp liên kết bị vô hiệu hóa bằng cách nhấn
nút Generate Collision Matrix; nó sẽ mất một vài giây để liệt kê ra cặp
liên kết bị vô hiệu hóa.
Bước 3: Thêm các khớp ảo
- Các khớp ảo gắn robot với thế giới. Nó không phải là bắt buộc đối
với robot không di chuyển. Chúng ta cần khớp ảo khi vị trí cơ sở của cánh
tay không cố định. Ví dụ: nếu cánh tay robot được cố định trên robot di
động, chúng ta nên xác định một khớp ảo liên quan đến khung odom.
- Trong trường hợp robot của chúng ta, chúng ta không tạo ra các
khớp ảo.
Bước 4: Thêm nhóm điều khiển
- Nhóm lập kế hoạch về cơ bản là một nhóm các khớp/khâu của
robot để thực hiện điều khiển robot trong môi trường mô phỏng sau này.
Chúng ta phải tạo ra hai nhóm lập kế hoạch, một cho cánh tay và một cho
tay gắp.

117
- Nhấp vào thẻ Planning Groups ở bên trái và nhấp vào nút Add
Group. Bạn sẽ thấy màn hình sau, trong đó có các thiết lập của nhóm
arm:

Hình 5.13 Thêm Planning group của cánh tay


- Ở đây chúng ta đang đưa Group Name như arm, và Kinematic
Solver là trac_ik_kinematic_plugin/TRAC_IKKinematicsPlugin, là một
phương pháp giải động học ngược của MoveIt. Chúng tôi có thể chọn các
thông số khác làm mặc định giá trị.
- Bên trong nhóm cánh tay, trước tiên chúng ta phải thêm một động
học Chain. Chúng ta phải thêm base_link là liên kết đầu tiên đến tip_link.

118
Hình 5.14 Nhóm lên kế hoạch điều khiển

Bước 5: Thêm các tư thế robot

- Trong bước này, chúng ta có thể thêm một số vị trí cố định nhất
định trong cấu hình robot. Ví dụ: chúng tôi có thể chỉ định vị trí nhà riêng
hoặc vị trí chọn/địa điểm trong bước này. Ưu điểm là trong khi lập trình
điều khiển, chúng ta có thể gọi trực tiếp những tư thế này, cũng được gọi
là trạng thái nhóm. Điều này có nhiều ứng dụng trong việc lựa chọn/địa
điểm và nắm bắt hoạt động. Robot có thể chuyển sang tư thế cố định mà
không gặp bất kỳ rắc rối nào.

Bước 6: Thiết lập khâu công tác cho robot


- Trong bước này, chúng ta đặt tên cho khâu công tác của robot và
gán nhóm cho khâu công tác.
- Chúng ta có thể thêm bất kỳ số hiệu ứng cuối nào cho robot này.
Trong trường hợp của chúng tôi, đó là tay gắp được thiết kế để lựa chọn
và vận hành địa điểm.

119
- Nhấp vào nút Add End Effector và đặt tên cho khâu công tác, lập
kế hoạch nhóm công tác mà chúng tôi đã tạo ra, liên kết cha mẹ là cánh
tay robot.
Bước 7: Thêm các khớp bị động
- Trong bước này, chúng ta có thể chỉ định các khớp bị động trong
robot. Khớp bị động có nghĩa là các khớp không có bất kỳ bộ truyền động
nào. Bánh xe là một trong những ví dụ về các khớp bị động. Người lập kế
hoạch sẽ bỏ qua những loại khớp này trong lập quỹ đạo chuyển động .
Bước 8: Tạo tệp cấu hình robot trong Rviz
- Chúng ta đang gần hoàn tất!! Chúng tôi đang ở giai đoạn cuối cùng,
tức là tạo ra tệp cấu hình. Trong bước này, công cụ sẽ tạo ra một gói cấu
hình trong đó có các tập tin cần thiết để giao diện MoveIt.
- Nhấp vào nút Browse để định vị một thư mục để lưu tệp cấu hình
sẽ được tạo bởi công cụ Setup Assistant. Ở đây chúng ta có thể thấy các
tệp được tạo bên trong một thư mục có tên là fanuc_moveit_config. Bạn
có thể thêm _config hoặc _generated cùng với tên robot cho cấu hình gói.
- Nhấp vào nút Generate Package và nó sẽ tạo tệp cho thư mục đã cho.
- Nếu quá trình thành công, chúng ta có thể nhấp vào Exit Setup
Assistant, điều này sẽ thoát khỏi chúng tôi từ công cụ.
- Sau đây là ảnh chụp màn hình của quá trình tạo:

120
Hình 5.15 Tạo gói cấu hình MoveIt!
Sau khi tạo MoveIt gói cấu hình, chúng ta có thể sao chép nó vào vùng làm
việc catkin của chúng ta và xây dựng nó bằng lệnh catkin_make.

MoveIt cung cấp một plugin cho RViz cho phép tạo các planning scenes
mới, nơi robot hoạt động, thiết lập quỹ đạo chuyển động, thêm đối tượng mới,
trực quan hóa đầu ra lập kế hoạch và có thể tương tác trực tiếp với robot được
hiển thị.
Gói cấu hình MoveIt bao gồm các tệp cấu hình và khởi chạy các tệp để
bắt đầu lập kế hoạch chuyển động trong RViz. Có một tệp khởi chạy demo trong
gói để khám phá tất cả các chức năng của gói này.
Sau đây là lệnh gọi tệp khởi chạy demo:
$ roslaunch fanuc_moveit_config demo.launch
Nếu mọi thứ hoạt động tốt, chúng ta sẽ nhận được màn hình sau đây của
RViz đang được nạp với các plugin MotionPlanning được cung cấp bởi MoveIt:

121
Hình 5.16 Moveit – giao diện thiết lập quỹ đạo chuyển động

Từ Hình 5.2.16 ở trên, chúng ta có thể thấy rằng RViz-Motion Planning


được tải ở bên trái màn hình. Có một số thẻ trên cửa sổ Motion Planning, chẳng
hạn như Context, Planning, v.v. thẻ mặc định là thẻ Context và chúng ta có thể
thấy Planing Library – thư viện kế hoạch mặc định là OMPL, được hiển thị bằng
màu xanh lục. Nó chỉ ra rằng MoveIt đã tải thành công thư viện thiết kế quỹ
đạo. Nếu nó không được tải, chúng ta không thể thực hiện thiết lập quỹ đạo
chuyển động.
Tiếp theo là thẻ Planning. Đây là một trong các thẻ được sử dụng thường
xuyên được sử dụng để gán trạng thái bắt đầu, kế hoạch trạng thái mục tiêu một
đường dẫn và thực hiện đường dẫn. Hiển thị tiếp theo là giao diện của thẻ
Planning:

122
Hình 5.17 Moveit – thẻ Rviz Planning
Chúng ta có thể gán trạng thái bắt đầu và trạng thái mục tiêu của robot
trong bảng Query. Sử dụng nút Plan, chúng ta có thể lập kế hoạch đường dẫn từ
đầu đến trạng thái mục tiêu và nếu việc lập kế hoạch thành công, chúng tôi có
thể thực hiện nó. Theo mặc định, thực hiện được thực hiện trên bộ điều khiển
chưa liên kết với robot thực. Chúng ta có thể thay đổi các bộ điều khiển này
thành các bộ điều khiển quỹ đạo để thực hiện quỹ đạo chuyển động ở Gazebo
hoặc robot thực.
Chúng ta có thể thiết lập vị trí bắt đầu và vị trí mục tiêu kết thúc của robot
bằng cách sử dụng điểm đánh dấu tương tác được gắn trên tay kẹp . Chúng ta có
thể tịnh tiến và quay tư thế điểm đánh dấu, và nếu có một giải pháp thiết lập,
chúng ta có thể thấy một cánh tay màu cam. Trong một số trường hợp, cánh tay
sẽ không di chuyển ngay cả khi điểm đánh dấu hiệu ứng đầu cuối di chuyển, và
nếu cánh tay không đến vị trí điểm đánh dấu, chúng ta có thể giả định rằng
không có giải pháp động học ngược trong tư thế đó. Chúng tôi có thể cần nhiều
bậc tự do hơn để đạt được điều đó hoặc có thể có một số va chạm giữa các khâu.
Sau đây là một tư thế mục tiêu không hợp lệ:

123
Hình 5.18 Một tư thế hợp lệ và một tư thế không hợp lệ của robot
trong RViz
Cánh tay màu xanh lá cây đại diện cho vị trí bắt đầu của cánh tay và màu
cam biểu thị vị trí mục tiêu. Trong hình đầu tiên, nếu chúng ta nhấn nút Plan,
MoveIt thiết lập một quỹ đạo từ điểm đầu đến điểm cuối. Trong hình ảnh thứ
hai, chúng ta có thể quan sát hai điều. Đầu tiên, một trong các liên kết của cánh
tay màu da cam có màu đỏ có nghĩa là tư thế mục tiêu ở trạng thái va chạm. Thứ
hai, nhìn vào điểm đánh dấu hiệu ứng cuối; nó cách xa hiệu ứng cuối thực tế và
nó cũng chuyển thành màu đỏ.
Chúng tôi cũng có thể làm việc với một số quỹ đạo chuyển động nhanh
bằng cách sử dụng các tùy chọn hợp lệ ngẫu nhiên trong Start State và Goal
State. Nếu chúng ta chọn trạng thái mục tiêu là ngẫu nhiên hợp lệ và nhấn nút
Update, nó sẽ tạo ra một tư thế mục tiêu hợp lệ ngẫu nhiên. Nhấp vào nút Plan
và chúng ta có thể thấy kế hoạch chuyển động.
Chúng ta có thể tùy chỉnh hiển thị RViz bằng cách sử dụng các tùy chọn
khác nhau trong MotionPlanning. Hiển thị tiếp theo là một số tùy chọn:

124
Hình 5.19 Các thiết lập của plugin MotionPlanning trên RViz
Khu vực được đánh dấu đầu tiên là Scene Robot sẽ hiển thị mô hình robot;
nếu nó là không được chọn, ta sẽ không thấy bất kỳ mô hình robot nào.
Khu vực được đánh dấu thứ hai là Trajectory Topic, trong đó RViz nhận
được quỹ đạo trực quan.
Nếu chúng ta muốn tạo hiệu ứng cho việc lập quỹ đạo chuyển động và
muốn hiển thị vết chuyển động chúng ta nên kích hoạt tùy chọn này.
Một trong các phần khác trong cài đặt plugin được hiển thị trong hình dưới đây:

125
Hình 5.20 Cài đặt đối tượng điều khiển trong MotionPlanning plugin
Trong hình trên, chúng ta có thể thấy các tùy chọn State Start State và
Query Goal State. Các tùy chọn này có thể hình dung tư thế bắt đầu và tư thế
mục tiêu của cánh tay mà chúng ta đã thấy trong hình 5.2.17. Hiện không gian
làm việc khối (hình học không gian) xung quanh robot. Việc trực quan hóa có
thể giúp gỡ lỗi thuật toán lập kế hoạch chuyển động của chúng tôi và hiểu rõ
hành vi chuyển động của robot.
Trong phần tiếp theo, chúng ta sẽ thấy cách giao diện gói cấu hình MoveIt
với Gazebo. Điều này sẽ thực hiện quỹ đạo do MoveIt tạo ra ở Gazebo.

Ta đã mô phỏng cánh tay robot trong Gazebo trước đó và bộ điều khiển


kèm theo. Việc liên kết giữa Gazebo với Moveit là rất cần thiết để có thể quan
sát cũng như điều khiển robot trong thực tế. Chúng ta cần bộ điều khiển quỹ đạo
sử dụng FollowJointTrajectoryAction.
Sau đây là các thủ tục để có thể liên kết chuyển động của robot trong
Gazebo và Moveit.
Bước 1: Cấu hình điều khiển cho Moveit
Trong thư mục config của thư mục vừa tạo nhờ công cụ hỗ trợ trong mục
trước, tạo thêm một tệp joint_name.yaml để khai báo những đối tượng được điều
khiển:
controller_joint_names: [J1, J2, J3, J4, J5, J6]

126
Trong các phiên bản mới cập nhật, trong thư mục config, công cụ hỗ trợ
đã tạo sẵn cho chúng ta tệp controllers.yaml là tệp chứa cấu hình điều khiển
robot cho Moveit.
Bước 2: Tạo tệp launch điều khiển
Trong thư mục launch có một tệp
fanuc_moveit_controller_manager.launch.xml ban đầu mã lệnh trống nên chúng
ta thêm mã lệnh vào để có thể tự động chạy điều khiển mỗi khi ta mở giao diện
Moveit.
<launch>
<!-- load controller_list -->
<rosparam file="$(find
fanuc_moveit_config)/config/controllers.yaml"/>

<!-- Set the param that trajectory_execution_manager needs


to find the controller plugin -->

<param name="use_controller_manager" value="true"/>


<param
name="trajectory_execution/execution_duaration_monitoring
" value="false"/>

<param name="moveit_controller_manager"
value="moveit_simple_controller_manager/MoveItSimpleControlle
rManager"/>

<arg name="moveit_controller_manager"
default="moveit_simple_controller_manager/MoveItSimpleControl
lerManager"/>

<param name="moveit_controller_manager"
value="$(arg moveit_controller_manager)"/>

</launch>
127
Bước 3: Tạo tệp chạy điều khiển Moveit liên kết với Gazebo
Sau khi cấu hình đầy đủ cho liên kết Moveit với Gazebo. Ta tiến hành khởi tạo
tệp myrobot.launch với mã lệnh:
<launch>
<param name="use_gui" value="true"/>

<!-- By default, we are not in debug mode -->


<arg name="debug" default="false" />

<include file="$(find fanuc)/launch/robot_control.launch"/>


<include file="$(find
fanuc_moveit_config)/launch/move_group.launch">
<arg name="publish_monitored_planning_scene" value="true"/>
<arg name="allow_trajectory_execution" value="true"/>
<arg name="info" value="true"/>
<arg name="debug" value="$(arg debug)"/>
</include>

<!--
<arg name="sim" default="true" />

<group if ="$(arg sim)">

<include file = "$(find


industrial_robot_simulator)/launch/robot_interface_simulator.launch" />

</group>
-->

<!-- run rviz -->


<include file="$(find fanuc_moveit_config)/launch/moveit_rviz.launch">
128
<arg name="config" value="true"/>
<arg name="debug" value="$(arg debug)"/>
</include>

<!--Publish robot state to TF-->

<!--node name="joint_state_publisher" pkg="joint_state_publisher"


type="joint_state_publisher">
<param name="/use_gui" value="false"/>
<rosparam param="source_list">[/joint_state]</rosparam>
</node-->

<node name="robot_state_publisher" pkg="robot_state_publisher"


type="robot_state_publisher" respawn="true" output="screen">
<remap from="/joint_states" to="/fanuc/joint_states" />
</node>

<node name="joint_state_relay" pkg="topic_tools" type="relay"


args="/fanuc/joint_states /joint_states"/>

<!--node name="joint_trajectory_action" pkg="joint_trajectory_action"


type="joint_trajectory_action" >
<rosparam param="source_list">[joint_state]</rosparam>
</node-->
</launch>
Tệp launch này sẽ tiến hành mở Moveit, thêm mô hình FANUC đã tạo
vào trong môi trường điều khiển và tải bộ điều khiển đã liên kết với Gazebo.
Khi đó ta điều khiển robot bên trong giao diện điều khiển Moveit tới một
vị trí bất kỳ thì mô hình robot trong Gazebo cũng chuyển động tương tự.

5.3. Lập trình kết nối với các nút khác trong hệ thống
Để có thể lập trình kết nối giữa các nút trong hệ thống, trước hết ta phải tìm

129
hiểu cách tạo một nút trong ROS và xây dựng nút đó trong không gian làm việc.

130
Tạo một gói catkin trong không gian làm việc
Gói catkin chính là nới lưu trữ nút cũng như thực hiện xây dựng các nút do
người dùng tạo ra. Vì vậy, để tạo một nút làm việc trong ROS trước hết ta phải tạo
một gói catkin để chứa và xây dựng các nút đó.

- Mỗi gói phải bao gồm một tập tin package.xml . Tập tin package.xml này chứa các
thông tin , các ràng buộc cần thiết mà gói đó bị phụ thuộc vào.
- Mỗi gói phải bao gồm tập tin CMakeLists.txt sử dụng catkin . Nếu gói cần tạo là
gói sử dụng catkin thì bắt buộc gói đó phải có tập tin CMakeLists.txt
- Mỗi gói phải có một thư mục riêng . Điều này có nghĩa là sẽ không có các gói lồng
nhau hay nhiều gói cùng chia sẻ chung một thư mục
Một gói đơn giản nhất có thể có cấu trúc như sau :
New_package/
CMakeLists.txt
Package.xml

Phần này sẽ trình bày cách sử dụng tập lệnh catkin_create_pkg để tạo gói
catkin mới và những gì ta có thể làm với nó sau khi được tạo.
Đầu tiên thay đổi thư mục không gian nguồn của không gian làm việc catkin mà
bạn đã tạo, ví dụ :
$ cd ~ / catkin_ws / src
Bây giờ , ta sẽ sử dụng tập lệnh catkin_create_pkg để tạo một gói mới có tên
“Beginner_tutorials” và nó phụ thuộc vào std_msgs , roscpp , rospy :

$ catkin_create_pkg Beginner_tutorials std_msgs roscpp rospy


Câu lệnh trên sẽ tạo ra một thư mục với tên “Beginner_tutorials” , trong thư
mục đó có chứa cả 2 tập tin package.xml và CMakeLists.txt như đã giới thiệu ở trên
. Cả 2 thư mục đó đều chưa tất cả những thông tin cần thiết mà một gói cần phải có,
những thông tin đó nhận được từ tập lệnh catkin_create_pkg.

131
Tập lệnh catkin_create_pkg yêu cầu người dùng đặt tên cho gói và đưa ra
danh sách những rang buộc mà nó phụ thuộc vào :
$ catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
Sau khi đã tạo được gói catkin, việc tiếp theo cần làm là xây dựng không
gian làm việc cho gói . Để xây dựng được không gian làm việc cho gói, ta cần vào
trong không gian làm việc chứa gói đó , ví dụ :
$ cd catkin_ws
Sau đó sử dụng catkin_make để thực hiện quá trình xây dựng không gian làm việc
:
$ catkin_make
Như vậy là đã xây dựng xong không gian làm việc cho gói. Sau khi xây
dựng xong không gian làm việc , ta cần đưa không gian làm việc đó vào trong môi
trường ROS . Để đưa không gian làm việc vào trong ROS ta cần cấp nguồn cho
không gian vừa được thiết lập :
$ . ~ / catkin_ws / source / devel / setup.bash
Hiểu thế nào là một nút và chủ đề trong ROS

Một nút thực chất chỉ là một tệp thực thi được thực hiện trong gói ROS. Một
nút trong ROS sử dụng thư viện máy khách của ROS để kết nối, giao tiếp với các
nút khác . Các nút có thể xuất bản hoặc đăng ký một chủ đề. Các nút cũng có thể
cung cấp hoặc sử dụng dịch vụ trong ROS. Các nút sẽ kết nối với nhau thông qua
các chủ đề.
Một nút có thể đăng ký cũng như xuất bản cùng một lúc cho nhiều chủ đề,
đồng nghĩa với việc một nút có thể giao tiếp, kết nối với nhiều nút khác trong cùng
một lúc.
Thư viện máy khách ROS cho phép các nút được viết bằng các ngôn ngữ lập
trình khác nhau khi giao tiếp:
rospy : thư viện máy khách python
roscpp : thư viện máy khách c++

132
Các chủ đề trong ROS giống như những trạm chung chuyển trung gian ,
dùng để giúp kết nối và thực hiện việc đảm bảo quá trình giao tiếp diễn ra giữa các
nút với nhau. Các nút sẽ thực hiện việc kết nối với nhau thông qua việc xuất bản
hay đăng ký vào cùng một chủ đề.
Tương tự như nút thì một chủ đề có thể cho phép nhiều nút đăng ký hay xuất
bản vào nó, tuy nhiên để tránh việc mất dữ liệu do dữ liệu bị ghi đè khi xuất bản ra
chủ đề thì một chủ đề chỉ nên nhận dữ liệu được xuất bản ra từ một nút, tránh việc
nhiều nút cùng xuất bản vào một chủ đề cùng lúc. Việc đăng ký vào chủ đề từ các
nút sẽ không bị ảnh hưởng.
Công cụ rostopic cho phép bạn lấy thông tin từ các chủ đề trên ROS. Để biết
rõ hơn về các tùy chọn có sẵn trong rostopic ta có thể sử dụng lệnh :
$ rostopic – h
Ta sẽ nhận được hỗ trợ sơ bộ về các tùy chọn như sau :

rostopic bw: Hiển thị độ rộng dữ liệu được sử dụng bởi chủ đề
rostopic echo: In các tin nhắn của chủ đề lên màn hính
rostopic hz: Hiển thị tần số xuất bản
rostopic list: Hiển thị danh sách các chủ đề đang hoạt động
rostopic pub: Xuất bản lên chủ đề
rostopic type: In kiểu dữ liệu của chủ đề
Ở đây ta chỉ quan tâm đến các tùy chọn thường được sử dụng nhất là
rostopic echo, rostopic list, rostopic pub

Rostopic list: được sử dụng để hiện lên tất cả các chủ đề đang chạy trên hệ
thống
rostopic echo: được sử dụng để hiện ra những dữ liệu được xuất bản lên trên
chủ đề , ví dụ :
$ rostopic echo /joint_states
Ta sẽ nhận được tất cả các dữ liệu được xuất bản lên chủ đề có tên joint_states
Rostopic pub : được sử dụng để xuất bản dữ liệu bằng tay lên chủ đề , ví dụ :

133
$ rostopic pub -1 Data std_msgs / Int32 1000
Có nghĩa là, xuất bản 1 lần vào chủ đề có tên Data với kiểu dữ liệu là
std_msgs/Int32 giá trị muốn xuất là 1000.
Lập trình kết nối giữa các nút
Trong phần này ta sẽ thực hiện ví dụ lập trình kết nối giữa 2 nút có tên
Publisher và Subscriber

Tạo 1 tập tin có tên talker.cpp trong thư mục chứa gói catkin
Beginner_tutorials ta đã tạo ở trên, sau đó nhập hoặc sao chéo đoạn code sau vào
rồi lưu lại.
#include "ros/ros.h"
#include
"std_msgs/String.h"
#include <sstream>

int main(int argc, char **argv)


{
ros::init(argc, argv,
"talker"); ros::NodeHandle
n;

ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",


1000); ros::Rate loop_rate(10);

int count = 0; while (ros::ok())

{
std_msgs::String
msg;
std::stringstream ss;

134
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();

135
loop_rate.sleep();
++count;
}
return 0;
}

Giải thích :
#include "ros/ros.h"
Là câu lệnh để thêm thư viện ros/ros.h , nó bao gồm tất cả các tiêu đề cần
thiết để sử dụng chung cho hệ thống ROS
#include "std_msgs/String.h"
Thêm định dạng kiểu dữ liệu truy xuất được sử dụng trong nút.
ros::init(argc, argv, "talker");
Khởi tạo tên nút được sử dụng là
talker ros::NodeHandle n;

Khai báo NodeHandle , sử dụng để khai báo nút và xử lý dữ liệu trong nút
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",
1000);

Khai báo với máy chủ rằng sẽ xuất bản dữ liệu có tên chatter_pub với kiểu dữ liệu
là String vào chủ đề có tên là chatter . Máy chủ sẽ báo với tất cả các nút đang đăng
ký vào chủ đề có tên chatter rằng dữ liệu sẽ được xuất bản. Trong trường hợp dữ
liệu xuất bản quá nhanh, bộ nhớ đệm sẽ lưu trữ lại 1000 giá trị tin nhắn trước khi
xóa.
ros::Rate loop_rate(10);
đặt tần số xuất bản là 10Hz
std_msgs::String msg;
std::stringstream ss; ss <<
"hello world " << count;
msg.data = ss.str();
136
Khai báo tên biến gửi là msg, và đặt dữ liệu cho biến đó bằng “hello world”
chatter_pub.publish(msg);

Gửi tin nhắn lên chủ đề thông qua


chatter_pub ros::spinOnce();

Hàm này không có tác dụng trong chương trình trên vì không có bất kỳ hàm
callback nào cả, nếu có hàm callback trong chương trình để lấy dữ liệu trả về thì
bắt buộc phải có hàm này
loop_rate.sleep();
Cho hệ thống ngủ tạm thời để hệ thống đạt chuẩn với tần số gửi đã khai báo.

Ta tạo một tập tin có tên listener.cpp giống như Publisher, sau đó viết
hoặc sao chép đoạn code sau :
#include "ros/ros.h"
#include "std_msgs/String.h”
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv,
"listener"); ros::NodeHandle
n;

ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback); ros::spin();

return 0;
}

Giải thích :
void chatterCallback(const std_msgs::String::ConstPtr& msg)
137
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
Đây là hàm Callback, nó sẽ được gọi bất cứ khi nào có tin nhắn mới trên chủ
đề chatter
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
Tương tự như với Publisher nhưng lần này là khai báo đăng ký vào topic
chatter với kích thước bộ nhớ đệm là 1000 tin nhắn và hàm gọi lại có tên
chatterCallback
ros::spin();
Nhảy vào vòng lặp và gọi tin nhắn hàm callback nhanh nhất có thể.

Để xây dựng các nút ta cần phải khai báo các nút đó trong tập tin
CMakeLists.txt . Việc khai báo rất đơn giản, chỉ cần mở CMakeLists.txt trong gói
catkin chứa các node đó rồi thêm các dòng khai báo như sau vào cuối
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

add_dependencies(talker beginner_tutorials_generate_messages_cpp)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})

add_dependencies(listener beginner_tutorials_generate_messages_cpp)
Với các tên đặt vào như talker hay listener có thể thay đổi bằng tên của tập tin được
tạo.
Sau khi lưu lại tập tin CMakeLists.txt, thì trở lại không gian làm việc ban
đầu và chạy catkin_make để xây dựng lại không gian làm việc lúc này đã bao gồm
hai nút vừa tạo ở trên.

138
5.4. Kết luận chương 5
Trong chương này trình bày xây dựng mô hình robot trong ROS và xây
dựng môi trường sử dụng Rviz trong hệ điều hành ROS. Đồng thời lập trình kết
nối các nút trong ROS để kết nối gazebo, rviz với ROS.

139
140

You might also like