Mục lục:

IRobot Tạo-Sao Hỏa Thám hiểm Rover Mark I: 4 bước
IRobot Tạo-Sao Hỏa Thám hiểm Rover Mark I: 4 bước

Video: IRobot Tạo-Sao Hỏa Thám hiểm Rover Mark I: 4 bước

Video: IRobot Tạo-Sao Hỏa Thám hiểm Rover Mark I: 4 bước
Video: 100% Hình ảnh thực tế từ sứ mệnh Sao Hỏa Mars 2020 của NASA | Top thú vị | 2024, Tháng bảy
Anonim
IRobot Create-Mars Expedition Rover Mark I
IRobot Create-Mars Expedition Rover Mark I

Tài liệu hướng dẫn này sẽ dạy bạn cách thiết lập iRobot Create bằng cách sử dụng mã hóa MatLab. Robot của bạn sẽ có khả năng tìm kiếm khoáng chất bằng cách phân biệt hình dạng, di chuyển địa hình hiểm trở thông qua việc sử dụng cảm biến vách đá và có khả năng được điều khiển thủ công thông qua nguồn cấp dữ liệu trực tiếp.

Bước 1: Nguồn cung cấp

Quân nhu
Quân nhu

Đối với dự án này, bạn sẽ cần iRobot Create, đây là phiên bản có thể lập trình của máy hút bụi rô bốt Roomba. Robot được trang bị tất cả các cảm biến cần thiết cho dự án này, đặc biệt là cảm biến va chạm, cảm biến vách đá và cảm biến "Vết lồi sáng". Bạn cũng sẽ cần một Raspberry Pi và máy quay video, được sử dụng để giao tiếp không dây, lập trình trực tiếp và nguồn cấp dữ liệu video trực tiếp. Cuối cùng, bạn sẽ cần một ngàm in 3D cho Raspberry Pi và máy ảnh.

Bước 2: Phát triển mã hóa để đáp ứng kết quả mong muốn

Phát triển mã hóa để đáp ứng kết quả mong muốn
Phát triển mã hóa để đáp ứng kết quả mong muốn

Khi bạn đã kết nối Roomba của mình, bạn sẽ cần tạo một mã Matlab để cung cấp cho bạn các đầu ra mong muốn sau các đầu vào mong muốn của bạn.

Mã có thể được nhìn thấy ở đây:

Dự án% Roomba% Brenten Arnold (barnol15); Julianne Korn (qdp218); Mike Heal (mheal)% 4/11/19% Mô tả vấn đề: Tạo một người đi đường để hỗ trợ con người trong% khám phá / cư trú của sao hỏa. % Phương pháp giải pháp: Tìm kiếm chất hữu cơ (màu xanh lá cây) thông qua việc sử dụng% cản sáng, cảm biến vách đá và máy ảnh để kiểm tra chất hữu cơ. Cho phép% người điều khiển điều hướng địa hình gồ ghề thông qua việc sử dụng cảm biến cản,% vách đá và cảm biến độ cao bánh xe. Cho phép con người điều khiển thiết bị di chuyển từ% một khoảng cách an toàn và tìm kiếm khoáng sản theo cách thủ công. lựa chọn = {'LIFE', 'ROUGH TERRAIN', 'USER CONTROL'}; % Ba tùy chọn trong trình đơn hộp thoại Setting = menu ('', lựa chọn) nếu Cài đặt> 0% Nếu tùy chọn được chọn yêu cầu lựa chọn xác nhận của người dùng2 = {'Có', 'Không'}% Tạo một mảng ô cho "có" hoặc "Không "lựa chọn Xác nhận = menu (['Bạn đã chọn"' lựa chọn {Setting} '"chế độ.'], lựa chọn2)% Xác nhận lựa chọn cài đặt của người dùng nếu Xác nhận == 1 nếu Cài đặt == 1% Kiểm tra xem cài đặt" SỐNG "đã được chọn chưa tôi = 0 while i == 0 r.setLEDDigits (num2str ('LIFE'))% Hiển thị 'CUỘC SỐNG' trên đèn LED cho i = 1: 100 r.setDriveVelocity (0,05)% Di chuyển roomba về phía trước ở 0,05 m / sy = r.getCliffSensors % Truy xuất và lưu trữ các giá trị cảm biến vách đá trong cấu trúc ô "y" l = r.getLightBumpers% Truy xuất và lưu trữ các giá trị cản sáng trong cấu trúc "f" nếu l.left> 100% Kiểm tra xem cản sáng bên trái có được che không r.moveDistance (-0,05)% Di chuyển roomba về phía sau 0,05 mét r.turnAngle (20)% Xoay roomba 20 độ CCW img = r.getImage% Lấy hình ảnh từ máy ảnh bánh mâm xôi trên roomba direct = [100 0 150 150]; img = imcrop (img, direct)% cắt hình ảnh để lấy nét ở tâm màu đỏ = mean (mean (img (:,:, 1)))% cường độ màu đỏ trung bình màu xanh lá cây = mean (mean (img (:,:, 2)))% cường độ xanh lá cây trung bình blue = mean (mean (img (:, 3)))% cường độ màu xanh lam trung bình nếu xanh lá cây> đỏ && xanh lá cây> xanh lam% Kiểm tra xem cây có trong hình không d = msgbox (['Tìm thấy sự sống! ']); % Hiển thị một hộp thông báo nói rằng "Cuộc sống được tìm thấy!" chờ đợi (d); end elseif l.leftFront> 100% Kiểm tra là bên trái / cản ánh sáng phía trước được che r.moveDistance (-0,05)% Di chuyển roomba về phía sau 0,05 mét img = r.getImage% Nhận hình ảnh từ máy ảnh bánh mâm xôi trên roomba và lưu trữ trong biến 'img 'trực tràng = [100 0 150 150]; img = imcrop (img, direct)% cắt hình ảnh để lấy nét ở tâm màu đỏ = mean (mean (img (:,:, 1)))% cường độ màu đỏ trung bình màu xanh lá cây = mean (mean (img (:,:, 2)))% cường độ xanh lá cây trung bình blue = mean (mean (img (:, 3)))% cường độ màu xanh lam trung bình nếu xanh lá cây> đỏ && xanh lá cây> xanh lam% Kiểm tra xem cây có trong hình không d = msgbox (['Tìm thấy sự sống! ']); % Hiển thị một hộp thông báo nói rằng "Cuộc sống được tìm thấy!" chờ đợi (d); end elseif l.leftCenter> 100% Kiểm tra xem cản sáng bên trái / trung tâm có bị che không r.moveDistance (-0,05)% Di chuyển roomba về phía sau 0,05 mét img = r.getImage% Lấy hình ảnh từ máy ảnh bánh mâm xôi trên roomba và lưu trữ trong biến 'img 'trực tràng = [100 0 150 150]; img = imcrop (img, direct)% cắt hình ảnh để lấy nét ở trung tâm màu đỏ = trung bình (trung bình (img (:,:, 1)))% cường độ đỏ trung bình xanh = trung bình (trung bình (img (:,:, 2)))% cường độ xanh lá cây trung bình blue = mean (mean (img (:, 3)))% cường độ màu xanh lam trung bình nếu xanh lá cây> đỏ && xanh lá cây> xanh lam% Kiểm tra xem cây có trong hình không d = msgbox (['Tìm thấy sự sống! ']); % Hiển thị một hộp thông báo nói rằng "Cuộc sống được tìm thấy!" chờ đợi (d); end elseif l.rightCenter> 100% Kiểm tra xem cản sáng bên phải / trung tâm có bị che không r.moveDistance (-0,05)% Di chuyển roomba lùi lại 0,05 mét img = r.getImage% Lấy hình ảnh từ máy ảnh bánh mâm xôi trên roomba và lưu trữ trong biến 'img 'trực tràng = [100 0 150 150]; img = imcrop (img, direct)% cắt hình ảnh để lấy nét ở trung tâm màu đỏ = trung bình (trung bình (img (:,:, 1)))% cường độ đỏ trung bình xanh = trung bình (trung bình (img (:,:, 2)))% cường độ xanh lá cây trung bình blue = mean (mean (img (:, 3)))% cường độ màu xanh lam trung bình nếu xanh lá cây> đỏ && xanh lá cây> xanh lam% Kiểm tra xem cây có trong hình không d = msgbox (['Tìm thấy sự sống! ']); % Hiển thị một hộp thông báo nói rằng "Cuộc sống được tìm thấy!" chờ đợi (d); end elseif l.rightFront> 100% Kiểm tra xem cản ánh sáng bên phải / phía trước có được che không r.moveDistance (-0,05)% Di chuyển roomba về phía sau 0,05 mét img = r.getImage% Nhận hình ảnh từ máy ảnh bánh mâm xôi trên roomba và lưu trữ trong biến 'img 'trực tràng = [100 0 150 150]; img = imcrop (img, direct)% cắt hình ảnh để lấy nét ở trung tâm màu đỏ = trung bình (trung bình (img (:,:, 1)))% cường độ đỏ trung bình xanh = trung bình (trung bình (img (:,:, 2)))% cường độ xanh trung bình blue = mean (mean (img (:, 3)))% cường độ xanh trung bình nếu xanh lá cây> đỏ && xanh lá> xanh lam% Kiểm tra xem cây có trong hình không d = msgbox (['Tìm thấy sự sống! ']); % Hiển thị một hộp thông báo nói rằng "Cuộc sống được tìm thấy!" chờ đợi (d); end elseif l.right> 100% Kiểm tra xem cản sáng bên phải có bị che không r.moveDistance (-0.05)% Di chuyển roomba về phía sau 0,05 mét r.turnAngle (-20)% Xoay roomba 20 độ CW img = r.getImage% Lấy hình ảnh từ máy ảnh bánh mâm xôi trên roomba và lưu trữ trong biến 'img' direct = [100 0 150 150]; img = imcrop (img, direct)% cắt hình ảnh để lấy nét ở trung tâm màu đỏ = trung bình (trung bình (img (:,:, 1)))% cường độ đỏ trung bình xanh = trung bình (trung bình (img (:,:, 2)))% cường độ xanh lá cây trung bình blue = mean (mean (img (:, 3)))% cường độ màu xanh lam trung bình nếu xanh lá cây> đỏ && xanh lá cây> xanh lam% Kiểm tra xem cây có trong hình không d = msgbox (['Tìm thấy sự sống! ']); % Hiển thị một hộp thông báo nói rằng "Cuộc sống được tìm thấy!" chờ đợi (d); end elseif y.leftFront <1500% Kiểm tra xem phần bên trái / phía trước của roomba có lệch khỏi vách đá không r.move Khoảng cách (-0,1, 0,05)% Di chuyển roomba lùi 0,1 mét ở 0,05 m / s r.turnAngle (-5)% Xoay roomba 5 độ C độ CCW else if y.left <1000% Kiểm tra xem phía bên trái của roomba có lệch khỏi vách đá không r.moveDistance (-0.05, 0.05)% Di chuyển roomba về phía sau 0,05 mét với tốc độ 0,05 m / s r.turnAngle (-10)% Xoay roomba 10 độ CW elseif y.right0% Chạy nếu nút được nhấn nếu Tiếp tục == 1 i = 0% Tiếp tục tìm kiếm cuộc sống khác i = 1% Kết thúc chế độ CUỘC SỐNG kết thúc kết thúc khác nếu Cài đặt == 2% Kiểm tra xem cài đặt "ROUGH TERRAIN" đã được chọn chưa i = 0 while i == 0 r.setLEDDigits (num2str ('RGH'))% Hiển thị 'Thô' trên Màn hình LED cho i = 1: 1000 r.setDriveVelocity (0,05)% Đặt tốc độ ổ đĩa roomba thành 0,05 m / sx = r.getBumpers% Truy xuất và lưu trữ các giá trị cảm biến đệm trong cấu trúc "x" y = r.get CliffSensors% Truy xuất và lưu trữ các giá trị cảm biến vách đá trong cấu trúc "y" if x.right == 1% Kiểm tra xem cản phải có được nhấn không r.turnAngle (10)% Xoay roomba 10 độ CCW elseif x.left == 1% Kiểm tra nếu trái cản được nhấn r.turnAngle (-10)% Xoay roomba 10 độ CW elseif x.front == 1% Kiểm tra xem cản trước có được nhấn r.turnAngle (20)% Xoay roomba 20 độ CCW elseif x.rightWheelDrop == 1% Kiểm tra xem bánh xe bên phải có bị giảm không r.turnAngle (-20)% Xoay roomba 20 độ CW elseif x.leftWheelDrop == 1% Kiểm tra xem bánh xe bên trái có giảm không r.turnAngle (20)% Xoay roomba 20 độ CCW elseif y.leftFront < 1500% Kiểm tra xem phần phía trước bên trái của roomba có lệch khỏi vách đá hay không. Khoảng cách (-0,05, 0,05)% Di chuyển roomba lùi lại 0,05 mét ở 0,05 m / s r.turnAngle (-5)% Xoay roomba 5 độ CW elseif y.rightFront < 1500% Kiểm tra xem phần phía trước bên phải của roomba có lệch khỏi vách đá hay không Khoảng cách (-0,05, 0,05)% Di chuyển roomba lùi lại 0,05 mét với tốc độ 0,05 m / s r.turnAngle (5)% Xoay roomba 5 độ CCW else if y.left <1000 % Kiểm tra xem phần bên trái o f roomba lệch khỏi vách đá r.moveDistance (-0.05, 0.05)% Di chuyển roomba lùi lại 0,05 mét ở tốc độ 0,05 m / s r.turnAngle (-10)% Xoay roomba 10 độ CW elseif y.right0 nếu Tiếp tục == 1 i = 0 % Tiếp tục địa hình gồ ghề khác i = 1% Kết thúc địa hình gồ ghề kết thúc kết thúc khác% Chế độ thủ công i = 0 r.setLEDDigits (num2str ('USER'))% Hiển thị 'USER' trên Màn hình LED d = msgbox (['Phím mũi tên - Di chuyển; S - Dừng Rover; ESC - Kiểm soát người dùng cuối; A - Định vị tài nguyên ']); chờ đợi (d); while i == 0 r.showCamera% Mở nguồn cấp dữ liệu trực tiếp của máy ảnh bánh mâm xôi trong cửa sổ riêng D = getkey (1)% Phím truy xuất do người dùng nhấn, lưu trữ giá trị ASCII dưới dạng biến D nếu D == 30% Kiểm tra xem mũi tên "lên" có được nhấn r.setDriveVelocity (0,1)% Gửi roomba về phía trước với tốc độ 0,2 m / s elseif D == 28% Kiểm tra xem mũi tên "trái" có được nhấn r.setDriveVelocity (0)% Dừng roomba di chuyển tới hoặc lùi r.turnAngle (15, 0,05)% Xoay roomba 45 độ CCW ở 0,05 m / s elseif D == 31% Kiểm tra xem mũi tên "xuống" có được nhấn không r.setDriveVelocity (-0,1)% Di chuyển roomba lùi lại 0,2 m / s elseif D == 29% Kiểm tra xem mũi tên "phải" có được nhấn không r.setDriveVelocity (0)% Dừng roomba di chuyển về phía trước hoặc phía sau r.turnAngle (-15, 0,05)% Xoay roomba 45 độ CW ở 0,05 m / s elseif D == 27% Kiểm tra xem phím "esc" (Escape) được nhấn i = 1% Thay đổi giá trị của biến "i" để thoát khỏi vòng lặp d = msgbox ('Thoát "User Control"')% Cho người dùng biết rằng chế độ thủ công đang được thoát ra elseif D == 115% Kiểm tra xem phím "s" đã được nhấn chưa r.setDriveVelocity (0)% Stop roomba from tiến hoặc lùi elseif D == 97% Kiểm tra xem "a" đã được nhấn chưa image = r.getImage; imwrite (image, 'image.png') W = Classify (image) K = mode (W) if K == 3 d = msgbox ('Resource found')% Hiển thị nếu tài nguyên hình chữ nhật được phát hiện waitfor (d); % Chờ người dùng đóng hộp thông báo "d" elseif K == 0 d = msgbox ('Không phải tài nguyên:(')% Hiển thị nếu tài nguyên hình chữ nhật không được phát hiện waitfor (d);% Chờ người dùng đóng hộp thông báo "d" end else d = msgbox ('Không phải là đầu vào khóa hợp lệ.')% Hiển thị nếu người dùng đóng menu "chọn cài đặt" waitfor (d);% Chờ người dùng đóng hộp thông báo "d" end waitfor (d);% Chờ người dùng đóng hộp thông báo "d" end end end else d = msgbox ('Goodbye')% Nói lời tạm biệt nếu các tùy chọn được đóng lại waitfor (d);

Bước 3: Kiểm tra

Thử nghiệm
Thử nghiệm

Khi mã của bạn đã được viết, bạn sẽ cần phải kiểm tra Roomba của mình. Mặc dù mã của bạn có vẻ đúng, nhưng nhiều giá trị của bạn, đặc biệt là về màu sắc hoặc hình dạng, sẽ cần phải được thay đổi để nhận dạng đúng các đối tượng mà bạn muốn Roomba của mình xác định.

Bước 4: Quan sát kết quả đầu ra trực quan

Quan sát kết quả đầu ra trực quan
Quan sát kết quả đầu ra trực quan
Quan sát kết quả đầu ra trực quan
Quan sát kết quả đầu ra trực quan

Sẽ rất rõ ràng liệu bạn có lập trình thành công Roomba của mình hay không dựa trên kết quả đầu ra trực quan của nó.

Kết quả đầu ra bao gồm:

  • Phát hiện hình dạng: Khả năng phân biệt chính xác các hình dạng của Roomba để tìm ra các khoáng chất chính xác
  • Thao tác trên địa hình gồ ghề: Tránh vách đá hoặc khu vực tối
  • Chế độ thủ công: Nguồn cấp dữ liệu trực tiếp và khả năng điều khiển Roomba
  • Hình ảnh: Hình ảnh về khoáng sản
  • Life Found !: Một hộp văn bản MatLab biểu thị rằng thực vật của bạn đã xác định được sự sống hữu cơ.

Đó là phần cuối của hướng dẫn của chúng tôi, hãy tận hưởng chiếc Rover thám hiểm sao Hỏa mới của bạn!

Đề xuất: