Professional Documents
Culture Documents
VIỆN ĐIỆN
****************
BÁO CÁO ĐỒ ÁN 1
TÌM HIỂU ROS
ROBOT OPERATING SYSTEM
I.2. Các thuật ngữ cần biết khi làm việc với ROS………………………………......4
- Để cài đặt và sử dụng được ROS 1 cần cài đặt Ubuntu 18.04 vào máy. Download Ubuntu
18.04 tại link: https://ubuntu.com/download/desktop và cài đặt theo link:
https://quantrimang.com/cach-cai-ubuntu-song-song-voi-windows-bang-usb-148331.
- Trên dao diện terminal của Ubuntu, thực hiện lần lượt các dòng lệnh sau:
• source ~/.bashrc
• rosdep update
https://www.youtube.com/watch?v=pRzFGhM8YWs&list=PLgtFb-
Njh6AocMVcgCVGukyJHLL2DIAKC&index=1&t=1260s.
- Nếu cài đặt thành công, gõ lệnh <roscore> trên dao diện sẽ hiển thị:
I.2 Các thuật ngữ cần biết khi làm việc với ROS
➢ Master
- Master hoạt động như một máy chủ có chức năng kết nối giữa các node và " đường
- Master giao tiếp với các slavers bằng việc sử dụng XMLRPC ( XML- Remote Procedure
Call), là một tính năng truyền tải dữ liệu của Wordpress. Khi thao tác với master, nó sẽ
được cấu hình với địa chỉ URI và một cổng được cấu hình trong ROS_MASTER_URI.
Mặc định, địa chỉ URI chính là địa chỉ IP của máy, còn cổng được đặt là 11311.
➢ Node
- Node là một phần tử nhỏ nhất trong ROS, nó thường được xem như một chương trình
để thực thi một chức năng hoặc một nhiệm vụ nào đó.
- Để một node có thể hoạt động, nó phải có các thông tin cơ bản như: tên, kiểu message,
địa chỉ URI, cổng. Node có thể đóng vai trò như publisher, subscriber, service server
hoặc service client... tùy thuộc vào thông tin mà nó đăng ký lên master. Các nodes có
thể giao tiếp với nhau bằng cách sử dụng topics và services.
- Node sử dụng XMLRPC khi giao tiếp với master và sử dụng XMLRCP hoặc TCPROS
của giao thức TCP/IP khi giao tiếp với các nodes khác.
➢ Package
- Package là một phần tử cơ bản trong ROS. Trong package chứa các file cấu hình, các
- Package chứa nhiều files cần thiết cho việc thi hành package, các gói, thư viện, các
phụ thuộc...
- Sau khi tạo xong một gói, cần phải catkin_make lại workspace: <catkin_make>
➢ Metapackage
- Metapackage là một bộ các packages có chung mục đích ,chức năng, nhiệm vụ...
- Ví dụ như: Navigation chứa 10 packages bao gồm ACML, DWA, EKF và map_server...
➢ Message
- Message chính là nội dung thông tin, dữ liệu trao đổi giữa các nodes. Có rất nhiều kiểu
message khác nhau được thực hiện trên các biến cơ bản như int, boolean, string...
- Message là một "bó" dữ liệu để trao đổi giữa các nodes. Các topics, service, action đều
sử dụng message để giao tiếp. Cấu trúc của một kiểu message như sau:
fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3
Ví dụ:
int32 x
int32 y
➢ Topic
- Topic là chủ đề để các nodes có thể giao tiếp được với nhau. Bởi vì trong một hệ thống
của chúng ta có rất nhiều nodes, các nodes giao tiếp được với nhau nếu chúng có cùng
topic.
➢ Publish và Subscriber
- Đây là hai thuật ngữ dùng để cho biết đâu là node truyền thông tin và đâu là node nhận
thông tin. Một node vừa có thể truyền thông tin và vừa có thể nhận thông tin. Sử dụng
Publish để truyền thông tin tới Master và Subcriber để nhận thông tin từ Master.
➢ Service
- Service là một giao tiếp đồng bộ 2 chiều giữa dịch vụ máy khách (service client) và
- Service server: là một server trong dịch vụ giao tiếp tin nhắn. Nó tiếp nhận các yêu cầu
từ dịch vụ máy khách và hồi đáp lại yêu cầu đó. Nó được thi hành trong node mà nhận
- Service client: là một client trong dịch vụ giao tiếp tin nhắn. Nó gửi yêu cầu tới server và
➢ Action
- Action là một phương pháp giao tiếp đồng bộ hai chiều. Nó được thực hiện khi mà quá
trình phản hồi diến ra lâu, khi thực hiện action thì phản hồi sẽ được yêu cầu liên tục
- Cấu trúc của một file action giống với service. Tuy nhiên, phần phản hồi dữ liệu cho sự
hồi đáp ngay lập tức được thêm vào cùng với dữ liệu đích và kết quả, cái mà được mô
- Action server: phụ trách việc nhận mục tiêu từ client sau đó đáp trả lại với phản hồi và
kết quả.
- Action client: phụ trách việc truyền mục tiêu tới server và nhận lại kết quả và phản hồi
Trên ros.wiki.org hướng dẫn đầy đủ cách tạo và sử dụng Action server cũng như action
client.
➢ ROS launch
- Định nghĩa một thiết bị để sử dụng cho việc thi hành. Ví dụ:
<launch>
</machine>
</launch>
- Chỉ định biến môi trường cho node thi hành. Thông qua <env>
- Gộp nhóm các phần tử mà chia sẻ một namespace hoặc remap. Thông qua
<group>
➢ Bag
- Dữ liệu của các messages trong ROS có thể được lưu trữ lại thông qua một "file.bag" và
có thể được dùng để tái tạo lại những gì đã lưu mà không phải tiến hành lại từ đầu.
http://wiki.ros.org/.../Recording%20and%20playing%20back...
➢ Graph
- Mối quan hệ giữa các nodes, topics, subscribers, publishers... được biểu diễn thông qua
một graph.
- URI: (Uniform Resource Identifier) là một địa chỉ duy nhất thể hiện một nguồn trên
Internet. URI là một trong những thành phần cơ bản cho phép tương tác với Internet và
được sử dụng như một định danh trong giao thức Internet.
- MD5: (Message-Digest algorithm): MD5 (Thuật toán thông báo-thông báo 5) 24 là một
hàm mật mã 128-bit. Nó được sử dụng chủ yếu để xác minh tính toàn vẹn của dữ liệu,
chẳng hạn như kiểm tra xem chương trình hoặc tệp có ở dạng nguyên bản chưa được
sửa đổi hay không hình thức. Tính toàn vẹn của việc truyền / nhận tin nhắn trong ROS
- RCP: (Remote Procedure Call) là viết tắt của hàm gọi một thủ tục phụ trên điều khiển
máy tính từ xa từ một máy tính khác trong mạng. RPC sử dụng các giao thức như TCP
/ IP và IPX, và cho phép thực thi các chức năng hoặc thủ tục mà không cần nhà phát
- XML: (Extensible Markup Language) là một ngôn ngữ đánh dấu đa năng và rộng rãi
mà W3C đề xuất để tạo các ngôn ngữ đánh dấu mục đích đặc biệt khác. XML sử dụng
các thẻ để mô tả cấu trúc của dữ liệu. Trong ROS, nó được sử dụng trong các thành
- XMLRPC :(XML-Remote Procedure Call) là một loại giao thức RPC sử dụng XML làm
mã hóa định dạng và sử dụng phương thức yêu cầu và phản hồi của giao thức HTTP
không duy trì cũng như kiểm tra kết nối. XMLRPC là một giao thức rất đơn giản, chỉ
được sử dụng để xác định dữ liệu nhỏ các loại hoặc lệnh. Do đó, XMLRPC rất nhẹ và
hỗ trợ nhiều loại ngôn ngữ lập trình, làm cho nó rất phù hợp với ROS, hỗ trợ nhiều loại
- TCP/IP: Lớp giao thức Internet đảm bảo truyền dữ liệu bằng TCP, dựa trên lớp IP (Giao
thức Internet) trong Lớp giao thức Internet. Nó đảm bảo việc truyền và nhận dữ liệu
tuần tự.
- CMakeLists.txt: Môi trường xây dựng là được chỉ định trong tệp ‘CMakeLists.txt’ trong
- Package.xml: Tệp XML chứa thông tin gói mô tả tên gói, tác giả, giấy phép, và các gói
phụ thuộc.
(Nguồn: https://cuocduaso.fpt.com.vn/en )
- Một package gồm những folder sau: config, include, scripts, src, launch, msg, srv,
action và những file: package.xml, CMakeLists.txt.
• cd ~/name_0/name_1: truy cập đến thư mục và được toàn quyền sử dụng nó.
• mkdir -p ~/name_0/name_1: tạo cả 2 thư mục, name_1 thuộc thư mục name_0.
• mkdir name_0: tạo thư mục mới.
• touch name0: tạo tập tin.
• catkin_create_pkg name_0 name1 name2: tạo package có tên name_0 và các gói phụ
thuộc name1, name2.
• catkin_make: sau khi làm việc, chỉnh sửa với package, workspace, …cần chạy lệnh
này. Lệnh này giống như lệnh compile các chương trình khi code c ấy . Sau khi
compile lại thì sẽ xuất hiện 2 files là build và devel, vậy nên khi source là source
vào cái file, thư viện mà mình compile ra.
• roscore: lệnh chạy ros, sau khi chạy lệnh này xong, mở terminal mới để thực hiện
các lệnh khác.
• Có thể xem các lệnh khác rõ hơn vào link:
https://github.com/nguyen97vn/ros_basic/tree/day_1?fbclid=IwAR2aYaNWas9T_Cs
DJklThRCWuoj_xe5yd8c8VfHO_APk5Xvys33hDRmIuJw.
$ cd ~/catkin_ws/src // lệnh này truy cập vào file src của thư mục catkin_ws //
$ catkin_create_pkg hello_world std_msgs rospy // tạo package có tên hello_world và các
gói std_msgs rospy là các gói phụ thuộc, các gói này được hiểu nhu các thư viện sẵn có,
nếu cần thì cài thêm. //
Trong gói hello_world sẽ có các thư mục sau được tạo ra:
Các thư mục là các thành phần của 1 package mà phía trên đã đề cập tới.
Truy cập vào package hello_world và tạo file scripts (file sẽ chứa code python đuôi .py)
$ mkdir scripts // tạo file scripts tại package hello_world được truy cập vào//
Tiếp theo tạo 2 tập tin đuôi .py (sẽ code bằng python) trong file scripts.
$ cd ~/catkin_ws/src/hello_world/scripts
$ touch hello_world_publisher.py
$ touch hello_world_subscriber.py
$ cd ~/catkin_ws/src/hello_world/scripts
$ chmod +x hello_world_publisher.py
$ chmod +x hello_world_subscirber.py
//2 lệnh trên dùng để cấp quyền truy cập đến 2 nodes vừa tạo.
$ cd ~/catkin_ws
$ catkin_make
$ source ~/.bashrc
Sau các lệnh này các sửa đổi, các thao tác bạn làm vừa rồi trong Workspace catkin_ws sẽ
được compile vào 2 files build và devel.
Tiếp theo thực hiện truyền nhận dữ liệu 2 nodes đó:
Gõ lệnh:
$ roscore // sau lệnh này mở tiếp 1 terminal khác gõ lệnh tiếp theo//
- Mở màn hình terminal và thực hiện lần lượt các lệnh sau:
$ sudo apt-get install ros-melodic-joy
$ cd ~/catkin_ws/src/
$ cd ~/catkin_ws/src/
- Sau khi tải Turtlebot3 về, trong không gian làm việc catkin sẽ gồm các thư mục sau:
Turtlebot3, Turtlebot3_mgs, Turtlebot3_simulations
Chọn package turtlebot3_gazebo trong thư mục turtlebot3_simulations và chọn thư mục
launch để xem các stages có sẵn:
Có rất nhiều stages có sẵn, bây giờ sẽ chọn mô phỏng và chạy thử stage_3.
$ export TURTLEBOT3_MODEL=burger
Mở 1 terminal mới thực hiện tiếp các lệnh sau để di chuyển robot:
$ export TURTLEBOT3_MODEL=burger
S: dừng
Mở cùng lúc terminal trên cùng với màn hình gazebo, sau đó ấn các phím di chuyển lên
terminal, robot sẽ được di chuyển theo ý muốn. Trong thực tế có thể di chuyển robot đến
các bàn để phục vụ đồ ăn.
$ export TURTLEBOT3_MODEL=burger
$ export TURTLEBOT3_MODEL=burger
$ export TURTLEBOT3_MODEL=burger
Map được lưu lại gồm 2 file: file cấu hình .yaml và file hình ảnh .pgm
- Sau khi tạo được map cho turtlebot3, muốn điều hướng robot đến vị trí đã định ta thực
hiện các bước sau:
B1. Mở bản đồ trong gazebo (ví dụ stage_3)
$export TURTLEBOT3_MODEL=burger
$export TURTLEBOT3_MODEL=burger
_3.yaml
- Trong quá trình thực hiện nếu trên màn hình báo lỗi global status map không tồn tại,người
dùng hãy kiểm tra lại, cài đặt các thứ còn thiếu theo yêu cầu hiển thị trên terminal.
Sử dụng lệnh trên thanh phía trên để điều hướng chính xác:
Trong thực tế, có thể điều chỉnh cho robot đến các bàn để phục vụ đồ ăn.
- Trong quá trình robot di chuyển, robot sẽ tự động tránh vật cản, tìm đường đi và đến đích
một cách hiệu quả nhất.
Move_base giúp Robot di chuyển đến đích và tự động tránh vật cản trong quá trình di
chuyển. Move_base gồm các thành phần chính: local_costmap, global_costmap,
global_planner, local_planner.
Hình ảnh sau khái quát sơ lược sự liên kết của các thành phần trong move_base:
(Nguồn: http://wiki.ros.org/move_base )
- Trong đó local_costmap, global_costmap đóng vai trò phát hiện, tránh vật cản.
Local_planner và global_planner dùng để tạo đường đi đến đích một cách hiệu quả nhất.
- Costmap:
• Costmap dùng cảm biến đo vật cản, sau khi có costmap thì có thể dùng để làm thuật
toán lập kế hoạch đường đi an toàn và hiệu quả. Thông tin chướng ngại vật sẽ được
chèn vào costmap và được xóa đi khi chướng ngại vật không còn.
• Sự khác nhau giữa local costmap và global costmap: Local costmap cảm biến quét và
cập nhật tất cả mọi thứ có thể biết được từ vị trí hiện tại. Global costmap là thông tin về
mọi thứ mà robot quét được từ những lần trước đó, giống như bản đồ.
• Local costmap phủ màu đỏ lên chướng ngại vật, chướng ngại vật được thổi phồng lên
đủ để tránh va chạm, robot sẽ không được chạm vào phần thổi phồng đó.
(Nguồn: https://www.oreilly.com/library/view/ros-programming-
building/9781788627436/7c463b67-441a-496b-9c43-b3e308c13cad.xhtml)
• Phần thổi phồng lên được dựa theo bán kính tính từ điểm trung tâm của robot đến đường
tròn ngoài cùng bao quanh robot. Vùng đường màu đỏ được hiểu là giấu chân của robot.
Tùy theo robot có bán kính tính từ tâm ra đường tròn ngoài bao nhiêu thì phần màu xanh
được thổi phồng bấy nhiêu.
(Nguồn: http://wiki.ros.org/costmap_2d)
- Để tránh va chạm, tâm của robot sẽ không được chạm vào vùng màu xanh, tương đương
với giấu chân của robot sẽ không được chạm vào phần màu đỏ có chướng ngại vật. Hình
ảnh trên biểu thị các khoảng cách giới hạn từ một robot cho trước.
III.2. Lý thuyết tránh vật cản.
- Từ kích thước robot có trước, tập hợp các vòng tròn nhỏ nhất bao bọc hoàn toàn robot.
Tăng số lượng vòng tròn nhằm giảm bán kính thổi phồng, cho phép kiểm tra va chạm
chính xác hơn. Hình ảnh sau là ví dụ robot có hình dạng xe hình chữ nhật như bên
dưới, được bao quanh bởi nhiều vòng tròn. Các bán kính của các vòng tròn là R.
(Nguồn: https://jp.mathworks.com/help/driving/ref/vehiclecostmap.html )
- Local_costmap sẽ tiến hành quét theo chu kỳ, lấy mẫu. Bản đồ thu được xung quanh
robot được biểu diễn dưới dạng bản đồ lưới.
- Coi chướng ngại vật như các cells màu đỏ đậm, thổi phồng là tăng kích thước của
chướng ngại vật bằng cách tăng các cell lên, số cells tăng lên là số nguyên bé nhất sao cho
kích thước >=R. Là các ô đỏ nhạt dưới hình sau:
(Nguồn: https://jp.mathworks.com/help/driving/ref/vehiclecostmap.html )
- Trong quá trình di chuyển bất kỳ tâm nào nằm trên 1 ô đỏ thì hàm checkoccupied trả về
true, không có tâm nào nằm trên ô đỏ thì hàm checkfree trả về true.
(Nguồn: https://jp.mathworks.com/help/driving/ref/vehiclecostmap.html )
-Và đây chính là hình ảnh cuối cùng của chướng ngại vật chúng ta thu được trong Rviz:
( Nguồn: https://www.oreilly.com/library/view/ros-programming-
building/9781788627436/7c463b67-441a-496b-9c43-b3e308c13cad.xhtml )
- Thuật toán Dijkstra là một thuật toán cho việc tìm kiếm các đường đi ngắn nhất giữa các
nút trong một đồ thị.
- Thuật toán Dijkstra ban đầu là tìm thấy đường đi ngắn nhất giữa 2 nút nhất định. Một
biến thể phổ biến hơn là cho 1 nút cố định làm nút nguồn, tìm đường đi ngắn nhất đến tất
cả các nút khác trong bản đồ, tạo ra một cây đường đi ngắn nhất. Biến thể đó dùng để tìm
đường đi ngắn nhất từ 1 nút đến 1 nút đích.
(Nguồn: https://vi.wikipedia.org/wiki/Thu%E1%BA%ADt_to%C3%A1n_Dijkstra )
- Dijkstra tiếp cận theo lộ trình di chuyển của robot, chuyển đổi thông tin thành một
phương pháp tìm kiếm đồ họa bằng cách sử dụng thông tin dưới dạng bản đồ ô lưới.
- Phương pháp này bắt đầu với một tập hợp các nút trống, là ô mà robot có thể điều hướng
đến. Đặt một giá trị cho mỗi nút mà robot quét đến. Từ điểm bắt đầu, giá trị này được tăng
lên bởi số lượng nút cần thiết phải đi qua để đến được nút đích. Ví dụ, trong hình dưới,
không gian trống xung quanh điểm bắt đầu nhận giá trị 1 đơn vị và đối với các ô kế nó
nhận giá trị 2 đơn vị,... Đối với mỗi ô đã được đặt giá tri, phương pháp được tiếp tục với
các ô lân cận tiếp theo cho đến khi đạt được điểm đích. Giá trị nhỏ nhất của tổng tất cả các
nút từ điểm đầu đến điểm cuối là đường đi ngắn nhất.
Hình sau biểu diễn thuật toán dưới dạng bản đồ lưới, các cells màu đen là chướng ngại vật,
ô S là vị trí ban đầu robot, ô G là đích cần đến.
- Sau khi tính toán xong đường đi ngắn nhất sẽ được lưu vào bản đồ toàn cục hay
global_costmap. Trong quá trình robot di chuyển, local_costmap sẽ dùng cảm biến để
quét, cập nhật các chướng ngại vật động hay các chướng ngại vật, độ lệch thay đổi so với
ban đầu. Local_costmap sẽ tính toán lại đường đi sao cho khớp với đường đi ban đầu nhất.
Code:
class Graph():
return min_index
self.printSolution(dist)
# Driver program
g = Graph(9)
g.graph = [[0, 4, 0, 0, 0, 0, 0, 8, 0],
[4, 0, 8, 0, 0, 0, 0, 11, 0],
[0, 8, 0, 7, 0, 4, 0, 0, 2],
[0, 0, 7, 0, 9, 14, 0, 0, 0],
[0, 0, 0, 9, 0, 10, 0, 0, 0],
[0, 0, 4, 14, 10, 0, 2, 0, 0],
[0, 0, 0, 0, 0, 2, 0, 1, 6],
[8, 11, 0, 0, 0, 0, 1, 0, 7],
[0, 0, 2, 0, 0, 0, 6, 7, 0]
];
g.dijkstra(0);
[2] http://wiki.ros.org/base_local_planner?distro=noetic
[3] https://jp.mathworks.com/help/driving/ref/vehiclecostmap.html
[4] https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
[5] http://wiki.ros.org/base_local_planner?distro=noetic
[6] http://wiki.ros.org/move_base
[7] http://wiki.ros.org/costmap_2d
[8] https://emanual.robotis.com/docs/en/platform/turtlebot3/overview/
[9] http://wiki.ros.org/ROS/Tutorials
[10] https://www.facebook.com/groups/322887668674316
[11]
https://www.facebook.com/search/top?q=c%E1%BB%99ng%20%C4%91%E1%BB%93n
g%20ros%20-%20robot%20operating%20system
[12]
https://github.com/nguyen97vn/ros_basic/tree/day_1?fbclid=IwAR2aYaNWas9T_CsDJkl
ThRCWuoj_xe5yd8c8VfHO_APk5Xvys33hDRmIuJw
[13] https://www.youtube.com/watch?v=pRzFGhM8YWs&list=PLgtFb-
Njh6AocMVcgCVGukyJHLL2DIAKC&index=1&t=916s