You are on page 1of 36

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN ĐIỆN
****************

BÁO CÁO ĐỒ ÁN 1
TÌM HIỂU ROS
ROBOT OPERATING SYSTEM

Sinh viên thực hiện: Nguyễn Thị Trang - 20181786


Giảng viên hướng dẫn: TS. Dương Minh Đức

Hà Nội, tháng 06 năm 2021


MỤC LỤC
MỤC LỤC……………………………………………………………………………....2

CHƯƠNG I. ROS OPERATING SYSTEM………………………………………......3

I.1. Cài đặt ROS 1 và Ubuntu 18.04………………………………………………….3

I.2. Các thuật ngữ cần biết khi làm việc với ROS………………………………......4

I.3. Packages & xây dựng một package………………………………………….....10

I.3.1. Giới thiệu packages ………...………………………………………….…...10

I.3.2. Tạo một package và xây dựng 2 nodes………………………………..…...11

CHƯƠNG II. TURTLEBOT3………………………………………………………..19

II.1. Download Turtlebot3………...…………………………………………….......19

II.2. Mô phỏng di chuyển Turtlebot3 bằng Gazebo……………………………….19

II.3. Tạo map cho Turtlebot3 sử dụng gmapping………………………………….22

II.4. Điều hướng Turtlebot3 sử dụng Move_base……………………………..…..25

CHƯƠNG III. MOVE_BASE …………………………………………………..........27

III.1. Khái quát move_base……………………………………………………....…27

III.2. Lý thuyết tránh vật cản…………………………………………………….....29

III.3. Lý thuyết tạo đường đi bằng phương pháp Dijkstra……………………..….32

TÀI LIỆU THAM KHẢO…………………….……………………………………...35


CHƯƠNG I. ROS OPERATING SYSTEM

I.1 Cài đặt ROS 1 và Ubuntu 18.04

- Để 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:

• sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" >


/etc/apt/sources.list.d/ros-latest.list'

• sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key


C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

• sudo apt update

• sudo apt install ros-melodic-desktop-full

• echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc

• source ~/.bashrc

• sudo apt install python-rosdep python-rosinstall python-rosinstall-gene


rator python-wstool build-essential

• sudo apt install python-rosdep

• sudo rosdep init

• rosdep update

hoặc có thể truy cập vào link: http://wiki.ros.org/melodic/Installation/Ubuntu để xem rõ


hơn , trực quan hơn có thể truy cập vào link video youtube :

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

dẫn" trong truyền thông tin tức.

- Câu lệnh để thi hành Master là: <roscore>

- 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

nodes... và nó có chức năng thi hành các node đó.

- 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...

- Cách tạo ra một gói: <catkin_create_pkg package_name dependences>

- 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.

- Thao tác với topic:

$ rostopic bw: display bandwidth used by topic.

$ rostopic delay: display delay for topic which has header.

$ rostopic echo: print messages to screen.

$ rostopic find: find topics by type.

$ rostopic hz: display publishing rate of topic.

$ rostopic info: print information about active topic.

$ rostopic list: print information about active topics.

$ rostopic pub: publish data to topic.

$ rostopic type: print topic type.

➢ 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à

dịch vụ máy chủ (service server).


- Ros wiki hướng dẫn cụ thể cách viết một service client và service server.

- 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

được và thi hành một yêu cầu.

- 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à

sau đó nhận hồi đáp.

➢ 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

cho đến khi kết quả được trả về.

- 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ô

tả như yêu cầu và hổi đáp ở service.

- 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

như là đầu vào từ action server.

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

Roslaunch được tạo ra để :

- Thi hành nhiều nodes một lúc. Ví dụ:

<node name="listener1" pkg="rospy_tutorials" type="listener.py" args="—test>

- Set các tham số. Ví dụ:


<param name="publish_frequency" type="double" value="10.0" />

- Định nghĩa một thiết bị để sử dụng cho việc thi hành. Ví dụ:

<launch>

<machine name="foo" address="foo-address" ros-root="/u/user/ros/ros/" ro

<env name="LUCKY_NUMBER" value="13" />

</machine>

<node machine="foo" name="footalker" pkg="test_ros" type="talker.py" />

</launch>

- Định nghĩa tên một remap. Ví dụ:

<remap from="/different_topic" to="/needed_topic"/>

- Thi hành các file launch khác thông qua <include>

- Định nghĩa các tham số. Thông qua <arg>

- 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.

- Cách lưu trữ dữ liệu bằng file bag:

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.

- Hiện thị graph bằng lệnh: rosrun rqt_graph rqt_graph


➢ Các thuật ngữ khác

- 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

được xác minh với MD5.

- 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

triển viết chương trình để điều khiển từ xa.a

- 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

phần khác nhau như .launch, .urdf, và package.xml.

- 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

phần cứng và các ngôn ngữ.

- 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

mỗi thư mục gói.

- 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.

I.3 Packages & xây dựng một package

I.3.1 Giới thiệu packages

- Hệ thống quản lý file của ROS Packages

(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.

• config: các file cấu hình của package.


• include: các header và các thư viện (library).
• scripts: các file python (.py).
• src: các file C++ (.cpp).
• launch: các launch file để chạy 1 hoặc nhiều node.
• msg: các file message tự tạo (.msg)
• srv: các file service (.srv)
• action: các file action (*actionlib)
▪ package.xml: file chứa các khai xuất của package (package này có những
gì và dùng những gì)
▪ CMakeLists.txt: CMake file của package (để hướng dẫn máy tính tạo các
folder, executables, dependencies, target libraries).
I.3.2 Tạo một package và xây dựng 2 nodes.

- Các lệnh sử dụng cơ bản.

• 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.

- Tạo 1 package và xây dựng 2 nodes.

Mở terminal chạy lần lượt các lệnh sau:

$ 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. //

Màn hình terminal hiển thị:


Bây giờ gói hello_world đã được tạo trong thư mục src của thư mục catkin_ws:

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.

Giờ chúng ta sẽ tạo 2 nodes trong package vừa tạo.

Truy cập vào package hello_world và tạo file scripts (file sẽ chứa code python đuôi .py)

Gõ lệnh trên terminal:


$ cd ~/catkin_ws/src/hello_world

$ mkdir scripts // tạo file scripts tại package hello_world được truy cập vào//

Bây giờ file scripts đã được tạo trong package hello_world:

Tiếp theo tạo 2 tập tin đuôi .py (sẽ code bằng python) trong file scripts.

Gõ lệnh trên terminal:

$ cd ~/catkin_ws/src/hello_world/scripts

$ touch hello_world_publisher.py

$ touch hello_world_subscriber.py

2 files publisher.py và subsciber.py được tạo trong thư mục scripts:


Mở 2 files và gõ chương trình vào, 1 đoạn chương trình mình đã gõ trước:
Lưu và thực hiện gõ các lệnh sau:

//Truy cập vào thư mục scripts.

$ 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.

Tiến hành compile lại bằng lệnh:

$ cd ~/catkin_ws

$ catkin_make

$ echo “source ~/catkin_ws/devel/setup.bash” >> ~/.bashrc

$ 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//

$ rosrun hello_world hello_world_publisher.py // sau lệnh này mở tiếp 1 terminal khác gõ


lệnh tiếp theo//

$ rosrun hello_world hello_world_subscriber.py

Màn hình terminal hiển thị:

File hello_world_publisher.py sẽ gửi dữ liệu lên topic và file hello_world_subscriber.py sẽ


đọc dữ liệu từ topic đó và hiển thị lên.
CHƯƠNG II. TURTLEBOT3
II.1. Download Turtlebot3.

- 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/

$ git clone -b melodic-devel https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git

$ git clone -b melodic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git

$ cd ~/catkin_ws && catkin_make

$ cd ~/catkin_ws/src/

$ git clone -b melodic-devel https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git

$ cd ~/catkin_ws && catkin_make

II.2. Mô phỏng di chuyển Turtlebot3 bằng Gazebo.

- 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.

Mở terminal và gõ các lệnh sau:

$ export TURTLEBOT3_MODEL=burger

$ roslaunch turtlebot3_gazebo turtlebot3_stage_3.launch


Sẽ xuất hiện khung cảnh stage_3 mô phỏng 1 con robot và 4 cái bàn của tòa nhà:

Mở 1 terminal mới thực hiện tiếp các lệnh sau để di chuyển robot:

$ export TURTLEBOT3_MODEL=burger

$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

Lệnh này dùng để chạy file turtlebot3_teleop_key.launch trong package turtlebot3_teleop.

Package turtlebot3_teleop có thể thấy được khi mở thư mục Turtlebot3.


Có thể thấy các nút điều khiển turtlebot3 từ bàn phím:

W: tăng vận tốc

X: giảm vận tốc

S: dừng

A/D : tăng giảm vận tốc góc.

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.

II.3. Tạo map cho Turtlebot3 sử dụng gmapping.

- Mở terminal thực hiện các lệnh sau:

$ export TURTLEBOT3_MODEL=burger

$ roslaunch turtlebot3_gazebo turtlebot3_stage_3.launch


- Tiếp theo mở 1 terminal khác và gõ các lệnh sau để cho phép điều khiển robot bằng bàn
phím :

$ export TURTLEBOT3_MODEL=burger

$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

-Mở 1 terminal khác và chạy lệnh sau để chạy gmapping:

$ export TURTLEBOT3_MODEL=burger

$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping


Mở cùng lúc terminal cho phép điều khiển robot bằng bàn phím để quét hết map :
Lưu map lại bằng lệnh:

$ rosrun map_server map_saver -f ~/Desktop/stage_3

Map được lưu lại gồm 2 file: file cấu hình .yaml và file hình ảnh .pgm

II.4. Điều hướng Turtlebot3 sử dụng Move_base

- 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

$roslaunch turtlebot3_gazebo turtlebot3_stage_3.launch

B2. Mở 1 terminal khác và chạy lệnh:

$export TURTLEBOT3_MODEL=burger

$roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/stage

_3.yaml

Sẽ xuất hiện như hình ảnh dưới đây trong Rviz

- 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:

2D pose estimate để điều chỉnh vị trí ban đầu của robot.


2D nav goal để đặt vị trí mà người dùng muốn robot đi đến.

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.

CHƯƠNG III. MOVE_BASE


III.1. Khái quát move_base.

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 )

III.3. Lý thuyết tạo đường đi bằng phương pháp Dijkstra

- 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.

Hình dưới đây biểu diễn cơ bản về Dijkstra :

(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:

# Python program for Dijkstra's single


# source shortest path algorithm. The program is
# for adjacency matrix representation of the graph
# Library for INT_MAX
import sys

class Graph():

def __init__(self, vertices):


self.V = vertices
self.graph = [[0 for column in range(vertices)]
for row in range(vertices)]

def printSolution(self, dist):


print "Vertex \tDistance from Source"
for node in range(self.V):
print node, "\t", dist[node]

# A utility function to find the vertex with


# minimum distance value, from the set of vertices
# not yet included in shortest path tree
def minDistance(self, dist, sptSet):

# Initilaize minimum distance for next node


min = sys.maxint

# Search not nearest vertex not in the


# shortest path tree
for v in range(self.V):
if dist[v] < min and sptSet[v] == False:
min = dist[v]
min_index = v

return min_index

# Funtion that implements Dijkstra's single source


# shortest path algorithm for a graph represented
# using adjacency matrix representation
def dijkstra(self, src):

dist = [sys.maxint] * self.V


dist[src] = 0
sptSet = [False] * self.V

for cout in range(self.V):

# Pick the minimum distance vertex from


# the set of vertices not yet processed.
# u is always equal to src in first iteration
u = self.minDistance(dist, sptSet)

# Put the minimum distance vertex in the


# shotest path tree
sptSet[u] = True
# Update dist value of the adjacent vertices
# of the picked vertex only if the current
# distance is greater than new distance and
# the vertex in not in the shotest path tree
for v in range(self.V):
if self.graph[u][v] > 0 and sptSet[v] == False and \
dist[v] > dist[u] + self.graph[u][v]:
dist[v] = dist[u] + self.graph[u][v]

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);

# This code is contributed by Divyanshu Mehta

TÀI LIỆU THAM KHẢO


[1] https://www.hindawi.com/journals/jat/2018/6392697/

[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

You might also like