Tìm đƣờng đi ngắn nhất trong visibility graph với giải thuật Dijkstra

Một phần của tài liệu tìm hiểu và xây dựng phần mềm hỗ trợ bài toán tìm đường đi ngắn nhất tránh vật cản cho xe tự hành trong không gian 2d (Trang 29 - 80)

Để tạo visibility graph, giải thuật đơn giản nhất là lần lƣợt kiểm tra từng đoạn thẳng có trong đồ thị xem đoạn thẳng này có bị cắt bởi bất kỳ vật cản nào không. Giải thuật này chạy trong thời gian O(n3). Để giải thuật để đạt đƣợc độ phức tạp tốt hơn, Lee đã cải tiến độ phức tạp từ O(n3) xuống O(n2logn). Lee sử dụng phƣơng pháp quét xoay tròn và một danh sách lƣu lại thứ tự quét lần trƣớc để làm giảm độ phức tạp của giải thuật [8].

Visibility graph thƣờng đƣợc nghĩ đến để sử dụng trong việc tìm kiếm con đƣờng đi ngắn nhất trên mặt phẳng ơ-lít từ một điểm bắt đầu s đến điểm đích d và nhiệm vụ là tìm đƣờng đi nối tiếp tối ƣu thông qua không gian trở ngại mà không vi phạm các ràng buộc vật lý. Thực tế ứng dụng này đƣợc khai thác khi các đƣờng đi ngắn nhất đƣợc tìm thấy trên các đƣờng cong của visibility graph. Một khi đồ thị visibility graph đã đƣợc xây dựng, vấn đề tìm con đƣờng ngắn nhất có thể đƣợc giải quyết bằng cách sử dụng các thuật toán nổi tiếng nhƣ các thuật toán Dijkstra, thuật toán tìm kiếm A*, hoặc thuật toán Floyd-Warshall.

Việc sử dụng thuật toán Dijkstra để giải quyết bài toán tìm đƣờng đi ngắn nhất từ đỉnh xuất phát đến đỉnh đích trong đồ thị có trọng số trên các cung của đồ thị không âm là tối ƣu nhất.

Thuật toán đƣợc xây dựng trên cơ sở gán các đỉnh là các nhãn tạm thời. Nhãn của mỗi đỉnh sẽ cho biết cận trên của độ dài đƣờng đi ngắn nhất từ điểm xuất phát đến nó. Các nhãn này sẽ đƣợc biến đổi theo thủ tục lặp, nghĩa là ở mỗi bƣớc lặp sẽ có một nhãn tạm thời trở thành nhãn cố định. Nếu nhãn của một đỉnh nào đó trở thành cố định thì nó sẽ không phải là cận trên mà là độ dài đƣờng đi ngắn nhất từ đỉnh xuất phát đến nó. Thuật toán Dijkstra đƣợc mô tả nhƣ sau:

Procedure Dijkstra;

Đầu vào : Đồ thị có hướng G = (V, E) với n đỉnh, s V là đỉnh xuất phát, a[u,v] V là ma trận trọng số;

Giả thiết : a[u,v] ≥ 0; u,v V

Đầu ra : khoảng cách từ đỉnh s đến tất cả các đỉnh còn lại d[v], v V Begin (*Khởi tạo*)

Begin d[v] := a[s,v]; truoc [v] := s; end; d[s] := 0; T := V{s}; (*T là tập các đỉnh có nhãn tạm thời*) (*Bước lặp*) While T ≠ do Begin

Tim dinh u T thỏa mãn d[u] = min{d[z]:z T}; T := T {u}; (*cố định nhãn của đỉnh u*)

For v T do (*gán nhãn lại cho các đỉnh trong T*) If d[v] > d[u] + a[u,v] then

Begin d[v] := d[u] + a[u,v]; truoc[v]:=u; end; end; end;

Đánh giá số phép toán cần thực hiện theo thuật toán: Ở mỗi bƣớc lặp để tìm ra điểm u thì cần thực hiện O(n) phép toán, để gán nhãn lại cũng cần thực hiện một số lƣợng phép toán là O(n). Thuật toán cần phải thực hiện n - 1 bƣớc lặp. Vậy thời gian tính toán của thuật toán là cỡ O(n2).

Giải thuật tìm đường đi ngắn nhất giữa cặp đỉnh:

Định nghĩa 1: Xét đồ thị có trọng số G = (V,E,w), với hàm trọng số w: ER là ánh xạ từ tập các cạnh E đến tập số thực R.

Định nghĩa 2: Đƣờng đi p đi từ đỉnh u đến đỉnh v là dãy các cạnh nối tiếp nhau, bắt đầu từ đỉnh u kết thúc tại đỉnh v đƣợc biểu diễn nhƣ sau:

p = (u = v0, v1, …,vk = v)

Định nghĩa 3: Độ dài của đƣờng đi p = (v0, v1, …, vk), ký hiệu (p) là tổng các trọng số của các cạnh trên đƣờng đi:

Định nghĩa 4: Gọi ρ(u,v) là tập tất cả đƣờng đi từ u đến v. Độ dài đƣờng đi ngắn nhất từ đỉnh u đến đỉnh v đƣợc xác định bởi:

d(u,v) = min{ (p) p (u,v)}

Định nghĩa 5: Đƣờng đi ngắn nhất pmin(u,v) từ đỉnh u đến đỉnh v là đƣờng đi có độ dài d(u,v)

Giải thuật Dijkstra:

Đây là bài toán tìm một đƣờng đi giữa hai đỉnh sao cho tổng trọng số của các cạnh tạo nên đƣờng đi đó là nhỏ nhất. Định nghĩa một cách hình thức, cho trƣớc một đồ thị có trọng số (nghĩa là một tập đỉnh V, một tập cạnh E, và một hàm trọng số có giá trị thực f : ER), cho trƣớc một đỉnh v thuộc V, tìm một đƣờng đi p từ v

tới mỗi đỉnh v' thuộc V sao cho là nhỏ nhất trong tất cả các đƣờng nối từ v tới

v' . Bài toán tìm đƣờng đi ngắn nhất giữa mọi cặp đỉnh là một bài toán tƣơng tự, trong đó, phải tìm các đƣờng đi ngắn nhất cho mọi cặp đỉnh vv'.

Ở mọi đỉnh v giải thuật Dijkstra xác định ba thông tin: kv, dv, và pv. Trong đó: kv: mang giá trị boolean xác định trạng thái đƣợc chọn của đỉnh v.

Ban đầu, khởi tạo tất cả các đỉnh v chƣa đƣợc chọn, nghĩa là: kv =

false, v V.

dv: chiều dài đƣờng đi đƣợc tìm thấy cho đến thời điểm đang xét. Khởi tạo dv = ∞, v V{a}, da = 0 (adsbygoogle = window.adsbygoogle || []).push({});

pv: đỉnh trƣớc của đỉnh v trên đƣờng đi ngắn nhất đi từ a đến b. Đƣờng đi ngắn nhất từ a đến b có dạng {a, …, pv, v, …, b}.

Khởi tạo, pv = null, v V

 Các bƣớc của giải thuật Dijkstra:

B1: Khởi tạo: Đặt kv := false v V; dv = ∞, v V{a}, da := 0

B2: Chọn v V sao cho kv = falsedv = min{dtt V, kt = false}. Nếu dv = ∞ thì kết thúc, không tồn tại đƣờng đi từ a đến b.

B3: Đánh dấu đỉnh v, gán kv := true

B4: Nếu v = b, kết thúc và db chính là độ dài đƣờng đi ngắn nhất đi từ a đến b. Ngƣợc lại nếu vb thì chuyển sang B5.

B5: Với mỗi đỉnh u kề với vku = false, kiểm tra. Nếu du > dv + w(v,u) thì du := dv + w(v,u).

Ghi nhớ đỉnh v: pu := v. Quay lại bƣớc B2.  Độ phức tạp của giải thuật Dijkstra:

Gọi f(n) số lần giải thuật Dijkstra khảo sát một cạnh của đồ thị G trong trƣờng hợp xấu nhất. Khi đó có: f(n) < O(V2)

Chứng minh: Cho n = V, B5 là vòng lặp chứa các bƣớc B2B5, vòng lặp đƣợc thực hiện đến khi v = b. Vì ở mỗi vòng lặp sẽ rút ra một đỉnh của V và khởi đầu Vn phần tử, nên vòng lặp đƣợc xử lý nhiều nhất là n lần.

B2 số đỉnh tối đa đƣợc khảo sát là n – 1 đỉnh Ở B5 số đỉnh kề tối đa đƣợc khảo sát là n – 1 đỉnh Do đó: f(n) ≤ 2(n – 1)n < O(V2)

Chƣơng 3:

TÌM HIỂU LEGO MINDSTORM NXT, MICROSOFT ROBOTICS DEVELOP STUDIO 3.1. Tìm hiểu Lego Mindstorm NXT

3.1.1. Giới thiệu

LEGO Mindstorm là các bộ thiết bị chứa phần mềm và phần cứng dùng để xây dựng mô hình của một hệ thống nhúng. Chúng bao gồm các chƣơng trình trên máy tính có thể đƣợc lập trình để điều khiển hệ thống, một tập các mô đun cảm biến, động cơ và các bộ phận LEGO đƣợc kết hợp lại với nhau để tạo ra các hệ thống máy móc.

Phiên bản phần cứng và phần mềm của bộ thiết bị Mindstorms Robotics Invention System là một khối có khả năng lập trình đƣợc tạo ra tại MIT Media Lab, kết hợp giữa MIT và Lego. Môi trƣờng lập trình trực quan đầu tiên đƣợc gọi là LEGOsheets đƣợc tạo ra bởi Trƣờng đại học University of Colorado vào năm 1994 dựa trên AgentSheets.

Những thiết bị Mindstorms cũng đƣợc bán và sử dụng nhƣ một thiết bị hỗ trợ giáo dục. Ban đầu thông qua sự hợp tác giữa Lego và MIT Media Laboratory. Các sản phẩm cho phiên bản giáo dục đƣợc gọi là Lego Mindstorms đƣợc sử dụng cho các trƣờng học, và đi kèm với các phần mềm lập trình dựa trên ROBOLAB GUI. Nó đƣợc phát triển tại Đại học Tufts bằng cách sử dụng National Instruments LabVIEW nhƣ một động cơ. Ngoài ra, phần mềm vận chuyển có thể đƣợc thay thế bằng phần mềm của đối tác thứ ba hoặc ngôn ngữ lập trình, bao gồm một trong số những phổ biến nhất đƣợc sử dụng bởi các chuyên gia trong ngành công nghiệp hệ thống nhúng nhƣ Java và C,... Sự khác biệt duy nhất giữa các phiên bản giáo dục đƣợc gọi là các “Challenge Set” và hàng loạt ngƣời tiêu dùng đƣợc gọi là “Inventor Set”, nó bao gồm một cảm biến cảm ứng và nhiều lựa chọn hơn trong ngành.

Những sản phẩm thuộc họ Lego Mindstorm thông dụng:  Robotics Invention System:

 RCX (Programming languages);

 Lego Mindstorm NXT: Lego Mindstorm NXT Educational Version; Lego Mindstorms NXT 1.0 và Lego Mindstorms NXT 2.0.

 Những sản phẩm hỗ trợ kỹ thuật khác: Lego camera; 4.5V PC Interface; Technic Control Center; Dacta Control Lab; Cybermaster; Codepilot; Scout; Micro Scout; Spybotics và Lego Mindstorms NXT.

RCX và NXT (gọi tắt là NXT) đƣợc nhƣ một khối não, gắn vào các hệ thống robot hoặc hệ thống nhúng để điều khiển các hoạt động xung quanh. Chúng chứa vi điều khiển, bộ nhớ, các cổng giao tiếp,… RCX là thế hệ đầu tiên, NXT đƣợc phát triển sau với nhiều cải tiến hơn.

RCX là thế hệ đầu tiên của Lego Mindstorm đƣợc xây dựng thành một hệ thống nhúng để điều khiển các hoạt động xung quanh. Nó chứa một vi xử lý 8-bit Renesas (một phần của Hichi), H8/300 đƣợc xem nhƣ là một vi điều khiển bên trong của nó. Nó cũng chứa 32K bộ nhớ RAM để lƣu trữ các chƣơng trình phần mềm và ngƣời dùng. RCX đƣợc lập trình bằng cách đƣa một chƣơng trình (viết bằng một trong những ngôn ngữ lập trình có sẵn) từ một máy tính chạy hệ điều hành Windows hay Mac vào bộ nhớ RAM của nó thông qua một (IR) giao diện hồng ngoại đặc biệt.

Hình 3.1 - RCX [24]

NXT là thế hệ sau của RCX, nó đƣợc xem nhƣ não của một Mindstorms robot, giúp robot điều khiển và thực hiện các hành động khác nhau. NXT chứa vi xử lý 32- bit ARM7, 256 Kbytes FLASH, 64Kbytes RAM.

Hình 3.2 - NXT [24]

3.1.2. Lego Mindstorm NXT

LEGO Mindstorms NXT là một bộ các robot có khả năng lập trình, đƣợc thay thế bởi LEGO vào cuối tháng 07 năm 2006 và là phiên bản đầu tiên của bộ LEGO Mindstorms, nó đƣợc gọi là Robotics Invention System. Cơ bản thì Robotics Invention System có 2 phiên bản: Reil Version (set #8527) và Education Base Set

(set #9797), đi kèm với phần mềm lập trình là NXT-G hay tùy chọn trong LabVIEW cho LEGO MINDSTORMS. Một phien bản mới của bộ LEGO Mindstorms là Lego Mindstorms NXT 2.0 đƣợc thay thế ngày 01 tháng 08 năm 2009, bao gồm một cảm biến màu và nhiều khả năng khác đƣợc nâng cấp, nhƣ là:Các thiết bị lắp ghép; 3 mô tơ; 4 loại cảm biến (cảm biến siêu âm, cảm biến chạm, cảm biến ánh sang, cảm biến màu); 7 dây cáp kết nối, một cáp giao diện USB và 1 NXT Intelligent Brick. (adsbygoogle = window.adsbygoogle || []).push({});

Từ bộ kit này, có thể xây dựng rất nhiều loại robot có hình dạng khác nhau và có thể lập trình điều khiển chúng hoạt động theo yêu cầu. Có 4 dạng robot thông dụng nhất đƣợc xây dựng và hỗ trợ bởi NXT-G:

(a) Dạng xe (b) Dạng cánh y (c) Dạng ngƣời (d) Robot dạng xe

Hình 3.3 - Các dạng robot thông dụng của họ Lego Mindstorm NXT [24]

Lego Mindstorm NXT gồm các phiên bản: Lego Mindstorms NXT Educational Version; Lego Mindstorms NXT 1.0 và Lego Mindstorms NXT 2.0. Trong đó:

Lego Mindstorms NXT Educational Version: Phiên bản giáo dục, đƣợc thiết kế nhằm mục đích hỗ trợ các trƣờng học. Bao gồm: Một cảm biến ánh sang, một cảm biến siêu âm, một cảm biến âm thanh, ba đèn, một cặp cảm biến chạm. Phiên bản đầu chứa 400 mẫu, phiên bản thêm chứa 600 mẫu.

Lego Mindstorms NXT 1.0 và 2.0: Là những phiên bản thƣơng mại, mà phiên bản 2.0 có thêm vào cảm biến màu, tăng thêm số lƣợng các cảm biến khác lên và cũng có thêm một số hoạt động khác nhƣ: làm việc trên số thực thay vì chỉ làm việc trên số nguyên nhƣ phiên bản 1.0.

Lego Mindstorm NXT 2.0 có thể đƣợc xem là sự kết hợp linh hoạt trong việc xây dựng một hệ thống cho robot họ Lego với tất cả những kỹ thuật mới. Bao gồm một vi điều khiển, một phần mềm lập trình kéo thả, cùng với các thiết bị cung cấp

kèm trong Mindstorm NXT 2.0. Do đó, giúp dễ dàng tạo ra rất nhiều dạng robot khác nhau, thực hiện rất nhiều công việc khác nhau.

(a) Cảm biến chạm (b) Cảm biến sáng (c) Cảm biến âm thanh (d) Cảm biến siêu âm

(e) Cảm biến la bàn (f) Cảm biến màu (g) Cảm biến gia tốc (h) Cảm biến RF ID

Hình 3.4 - Các cảm biến trong bộ Lego Mindstorm NXT [24]

3.1.3. Intelligent Brick NXT

Intelligent Brick NXT có thể đƣợc xem nhƣ thành phần chính trong bộ kit, là não của hệ thống Mindstorms. Nó làm cho robot có thể tự động thực hiện những hoạt động khác nhau nhƣ: lấy input từ các cảm biến, điều khiển các mô tơ, giao tiếp với máy tính nhận hoặc gởi dữ liệu.

Các thành phần chính trong bộ Lego Mindstorm là một khối gọi là NXT thông minh gạch AKA (Ciara). Nó có thể dữ liệu đầu vào từ 4 cảm biến và điều khiển 3 mô tơ thông qua cáp RJ12 (không tƣơng thích với RJ11). Intelligent Brick NXT có một màn hình LCD 100 × 60 điểm ảnh đơn sắc và bốn nút có thể đƣợc sử dụng để điều hƣớng các trình đơn phân cấp thông qua giao diện ngƣời dùng để lấy dữ liệu đầu vào từ các cảm biến, điều khiển các mô tơ, giao tiếp với máy tính để nhận hoặc gởi dữ liệu. Những đặc tính kỹ thuật của Intelligent Brick NXT 2.0:

- Bộ xử lý chính: 32-bit Atmel AT91SAM7S256 (256 KB bộ nhớ flash, 64KB RAM) và 8-bit Atmel ATmega48@4 MHz (4 KB flash memory, 512 Bytes RAM);

- Bộ xử lý phụ: 8-bit AVR và 4 Kbytes FLASH, 512 Byte RAM, 8MHz; - Giao tiếp không dây Bluetooth (Bluetooth Class II V2.0 compliant);

- Cổng Giao tiếp USB (12 Mbit/s): đƣợc dùng để gắn USB cáp, kết nối NXT với máy tính để nạp chƣơng trình từ máy tính tới NXT hoặc lấy dữ liệu từ NXT về máy tính. Có thể sử dụng một kết nối bluetooth thay thế cho USB port này;

- 4 port dữ liệu vào 6-pin, để gắn các cảm biến vào (đặt tên là Port 1, 2, 3 và 4); - 3 port dữ liệu ra 6-pin, để điều khiển các mô tơ (đƣợc đặt tên: Port A, B và C); - LCD đơn sắc 100 x 64 pixel và 4 nút nhấn để thực hiện một số thao tác cơ bản

cho Brick;

- Loudspeaker: âm thanh 8 kHz và độ phân giải 8-bit; - Nguồn: 6 AA batteries;

- Four Push Buttons; - Orange button: On/Enter;

- Light grey arrows: Di chuyển sang trái và sang phải trong menu NXT; - Dark grey button: Clear/Go back.

Lego phát hành firmware cho NXT Intelligent Brick nhƣ một Open Source, có thể đƣợc nâng cấp thƣờng xuyên [24].

3.1.4. Bluetooth trên Brick NXT

Một trong những đặc trƣng quan trọng nhất của Brick NXT là khả năng kết nối đến những thiết bị khác có hỗ trợ bluetooth. Việc kết nối này giúp robot gởi nhận dữ liệu (chƣơng trình, lệnh, tập tin âm thanh, …) với các thiết bị khác một cách có thứ tự. Từ đó, những lệnh có thể đƣợc gởi để điều khiển robot từ xa. Bluetooth giao tiếp giữa máy tính (hoặc một vài dạng điện thoại di động) với NXT Brick, hoặc giữa các NXT Brick với nhau.

Các đặc tính kỹ thuật của bluetooth: CSR BlueCoreTM 4 v2.0 +EDR System; Supporting the Serial Port Profile (SPP); Internal 47 KByte RAM; External 8 MBit FLASH; 26 MHz và kết nối với tối đa ba thiết bị khác tại một thời điểm.

NXT brick hỗ trợ giao tiếp không dây sử dụng bluetooth bằng cách sử dụng một chip CSR BlueCoreTM 4 v2.0. NXT brick có thể kết nối không dây cùng lúc tới ba thiết bị khác, nhƣng tại một thời điểm chỉ có thể giao tiếp với một thiết bị.

Khoảng cách giao tiếp bluetooth có thể lên đến 10m. Nhƣng làm thế nào để thiết lập giao tiếp bluetooth giữa máy tính và khối NXT tham khảo thêm trong [24].

Các vấn đề nhƣ: Cài đặt giao tiếp giữa các NXT brick, Interface giữa ARM7 và BlueCore chip, UART giữa ARM7 và BlueCore chip, hay các vấn đề kỹ thuật khác có thể tham khảo tại [24].

3.1.5. Lập trình với Brick NXT (adsbygoogle = window.adsbygoogle || []).push({});

Với những chƣơng trình đơn giản, chƣơng trình có thể lập trình sử dụng những menu trực tiếp trên NXT Intelligent Brick. Với những chƣơng trình phức tạp hơn, việc lập trình đƣợc thực hiện trên máy tính, sử dụng một số ngôn ngữ hoặc môi trƣờng lập trình đặc biệt dành cho Mindstorm NXT, sau đó nạp vào Brick để điều khiển robot.

Những môi trƣờng lập trình thông dụng cho Mindstorm NXT thông thƣờng chia làm nhóm chính:

 Nhóm môi trƣờng lập trình trực quan dạng kéo thả, cung cấp lập trình theo

Một phần của tài liệu tìm hiểu và xây dựng phần mềm hỗ trợ bài toán tìm đường đi ngắn nhất tránh vật cản cho xe tự hành trong không gian 2d (Trang 29 - 80)