Điều khiển từ xa rô bốt di động và Mục tiêu với Python


Trong phần ở đầu cuối của loạt bài này, tất cả chúng ta sẽ xem xét mã được cho phép tất cả chúng ta điều khiển Cerus từ xa và cung ứng cho nó hành vi tiên phong của nó, đơn cử là năng lực tự động hóa chuyển dời đến vị trí tiềm năng. Trong suốt bài viết này, tôi sẽ phân phối cho bạn rất nhiều tài nguyên mà tôi thấy có ích trong hành trình dài này, cũng như một kho tàng trữ mã thao tác hoàn hảo mà tôi hoàn toàn có thể kiến thiết xây dựng .
⚠ ️ Mã trong bài viết này hoạt động giải trí tốt trong quy trình thử nghiệm, nhưng vẫn hoàn toàn có thể có yếu tố. Nếu bạn gặp phải bất kể yếu tố nào, vui mừng thêm yếu tố trên trang GitHub .
Mọi thứ đều được viết bằng Python bằng Máy tính xách tay Jupyter, rất tương thích để thử nghiệm. Trong bản dựng Cerus của tôi, mã này chạy trên Jetson Nano .

Hành vi là gì?

Giờ đây, rô bốt của chúng tôi đã có hình dạng vật lý và tất cả các thiết bị điện tử để làm việc, chúng tôi có thể bắt đầu nghiên cứu các thuật toán cho phép rô bốt thực hiện các nhiệm vụ hoặc giải quyết vấn đề. Chúng ta có thể gọi một cách lỏng lẻo khả năng của robot để thực hiện những hành vi này. Có những hành vi rất phức tạp (nghĩ về một chiếc ô tô tự lái điều hướng giao thông nội thành) và những hành vi rất đơn giản trong đó robot phản ứng với một nhóm nhỏ các đầu vào bên ngoài.

Bạn đang đọc: khiển từ xa rô bốt di động và Mục tiêu với Python">Điều khiển từ xa rô bốt di động và Mục tiêu với Python

Sử dụng ứng dụng đi đến tiềm năng của chúng tôi làm ví dụ đơn cử, chúng tôi hoàn toàn có thể nghĩ về hành vi này bằng cách sử dụng biểu đồ sau :

Nếu rô-bốt của chúng tôi nhận biết điều gì đó ( ví dụ : tín hiệu từ cảm ứng ), nó sẽ thực thi một số ít giải quyết và xử lý, dẫn đến hành vi ( ví dụ : lái xe đến một tọa độ xác lập ) .
Bởi vì robot của chúng tôi tiếp xúc với những quy luật vật lý, không bảo vệ rằng nguồn vào của chúng tôi sẽ thực sự dẫn đến những gì chúng tôi đã xác lập là tiềm năng của mình. Ví dụ : chạy động cơ của bạn trong một khoảng chừng thời hạn nhất định hoàn toàn có thể dẫn đến khoảng cách vận động và di chuyển khác nhau, dựa trên khối lượng của rô bốt hoặc mặt phẳng mà rô bốt đang lái. Do đó, chúng tôi dựa vào một vòng phản hồi được cho phép robot so sánh trạng thái của nó với nguồn vào và kiểm soát và điều chỉnh đầu ra cho tương thích. Đây được gọi là mạng lưới hệ thống phản hồi vòng kín. Nếu bạn muốn khám phá thêm về kim chỉ nan điều khiển cho robot di động, đây là một khóa học tuyệt vời .
Đầu vào, một tiến trình, đầu ra và một vòng phản hồi là những nền tảng thiết yếu cho những hành vi của robot mà tất cả chúng ta sẽ xem xét. Hãy xem hai ví dụ đơn cử :

Điện thoại

Trong điều khiển từ xa, nguồn vào của chúng tôi là những giá trị từ những thanh analog của bộ điều khiển Xbox phân phối vận tốc góc và hướng của rô bốt. Quy trình của chúng tôi làm cho những giá trị này tương thích với việc điều khiển động cơ của rô-bốt và xuất chúng tới bộ vi điều khiển, khiến rô-bốt chuyển dời. Trong trường hợp này, vòng phản hồi được tranh luận ở trên được thực thi bởi người quản lý và vận hành .

Chuyển đến Mục tiêu

Trong ứng dụng hướng tới tiềm năng, nguồn vào là tọa độ đích trong khoảng trống 2D, quy trình kiểm tra trạng thái của rô bốt ( đây là vòng phản hồi của chúng tôi ) và nếu xác lập rằng rô bốt không ở vị trí tiềm năng thì quy trình này sẽ tạo đầu ra điều khiển động cơ thích hợp để vận động và di chuyển rô bốt đến gần vị trí tiềm năng .

Triển khai Teleoperation

Với bộ vi điều khiển của chúng tôi được thiết lập để nhận lệnh, việc tiến hành điều khiển từ xa trên Jetson Nano thật thuận tiện. Tôi đã dựa phần này của mã vào việc tiến hành điều khiển từ xa cho Jetbot .
Chúng tôi sử dụng những đặc thù để tiến hành quy mô quan sát giám sát sự biến hóa trên tiện ích gamepad. Khi phát hiện biến hóa, nó đọc những giá trị trục của gamepad và chuyển chúng thành thông tin Twist được xác lập trong Điều 2. Cuối cùng, thông tin Twist được gửi đến rô bốt trải qua Serial .
Dưới đây là bảng nghiên cứu và phân tích từng bước .
Đầu tiên, chúng tôi thiết lập liên kết Serial với Arduino :

ser = serial.Serial(‘COM3’, 115200)
controller = widgets.Controller(index=0)
display(controller)

Chúng tôi tạo một lớp đơn thuần với những đặc thù cho động cơ trái và phải, khởi tạo nó, sau đó link những động cơ với hai thanh analog trên bộ điều khiển của chúng tôi :

Cuối cùng, chúng tôi xác lập một hàm đọc những giá trị trục khi những giá trị mới được phát hiện và gửi thông tin Twist tương ứng đến Arduino. Sau đó, chúng tôi sử dụng phương pháp quan sát trên lớp động cơ của mình để gọi hàm này bất kể khi nào những giá trị trục biến hóa – nghĩa là bất kỳ khi nào chúng tôi chạm vào những thanh kim .

Bạn hoàn toàn có thể tìm thấy mã hoàn hảo tại đây, trên Github .

Xây dựng hành vi hướng tới mục tiêu

Một hành vi đi đến tiềm năng là sự tự chủ ở dạng đơn thuần nhất của nó. Robot sẽ phải thực thi 1 số ít giám sát và quyết định hành động để đến được vị trí tiềm năng một cách hiệu suất cao. Trong ví dụ về viễn thông của chúng tôi, tổng thể những quyết định hành động này đều do nhà quản lý và điều hành đưa ra .
Ở Lever cao, tất cả chúng ta sẽ khởi tạo robot với vị trí xuất phát và vị trí tiềm năng. Sau đó, robot sẽ phải thống kê giám sát sai số giữa vị trí của chính nó và vị trí của tiềm năng rồi tạo ra những lệnh vận động và di chuyển thích hợp để giảm lỗi này, chuyển dời nó đến gần tiềm năng một cách hiệu suất cao. Chúng tôi sẽ gọi vị trí của robot là ‘ tư thế ‘ của nó, không riêng gì gồm có vị trí x / y mà còn cả tiêu đề của nó, được ký hiệu bằng chữ phi .
Trong hình ảnh dưới đây minh họa điều này. Robot của chúng tôi được khởi tạo tại x, y, phi = 0 và có trách nhiệm đạt được tiềm năng x_goal, y_goal. Để làm như vậy, nó sẽ hướng về phía trước và tìm cách giảm thiểu lỗi giữa phi ( tiêu đề của chính nó ) và tiêu đề đến tiềm năng phi_desosystem. Điều này sẽ dẫn đến một đường dẫn giống như đường màu xanh lam .

Mô hình quan trọng

Điều mà tôi đã trở nên rất rõ ràng khi kiến thiết xây dựng mạng lưới hệ thống này là những quy mô toán học được nhu yếu để kiến thiết xây dựng một hành vi can đảm và mạnh mẽ. Những thứ tôi sử dụng ở đây dựa trên khu công trình của Tiến sĩ Magnus Egerstedt tại Trường Kỹ thuật Điện và Máy tính Georgia Tech. Chúng sẽ giúp tất cả chúng ta đạt được hai điều :
· Tính toán tư thế của Cerus
· Tính toán sai số giữa tư thế của Cerus và vị trí tiềm năng

Tính tư thế

Chúng tôi biết rằng rô bốt của chúng tôi được khởi tạo tại x, y, phi = 0 ( chúng tôi cũng hoàn toàn có thể khởi tạo nó với những giá trị khác nhau, nhưng vị trí quốc tế khởi đầu phải được biết ). Sau khi chuyển dời, tất cả chúng ta hoàn toàn có thể giám sát khoảng cách mà robot đã vận động và di chuyển bằng cách sử dụng tích tắc mã hóa của bánh xe bên trái và bên phải của tất cả chúng ta bằng cách sử dụng quy mô dẫn động vi sai sau :
Dl = 2 * 𝜋 * R * deltaTicksLeft / N
Dr = 2 * 𝜋 * R * deltaTicksRight / N
Trong đó Dl và Dr là khoảng cách do những bánh xe bên trái và bên phải điều khiển, R là nửa đường kính của những bánh xe và N là số lượng tích tắc mã hóa trên mỗi vòng xoay của bánh xe. Sau đó, tất cả chúng ta hoàn toàn có thể đo lường và thống kê khoảng cách đường tâm được điều khiển Dc ( đây là mức độ tâm của robot của tất cả chúng ta đã chuyển dời ) :

Dc = (Dl + Tiến sĩ) / 2

Sử dụng khoảng cách đường tâm này, chúng tôi hoàn toàn có thể giám sát tư thế update x ‘, y ‘, phi ‘ :
x ‘ = x + Dc * cos ( phi )
y ‘ = y + Dc * sin ( phi )
phi ‘ = phi + ( Dr – Dl ) / L
Trong đó L là chiều rộng rãnh của rô bốt của tất cả chúng ta. Việc tiến hành điều này trong Python trông giống như sau :

Tính toán lỗi thành mục tiêu

Tiếp theo, chúng tôi muốn đo lường và thống kê sai số giữa tư thế của robot và vị trí tiềm năng .
phidesntic = arctan ( ygoal-y ) / ( xgoal – x )
Nơi phidesired được chúng tôi ý muốn hướng để có được vị trí tiềm năng được xác lập bởi xgoal và ygoal .
Từ đó, chúng tôi hoàn toàn có thể đo lường và thống kê lỗi tiêu đề :
errorheading = arctan2 ( sin ( phidesosystem-phi ), cos ( phidesosystem-phi ) )
Sử dụng arctangens2, chúng tôi bảo vệ rằng lỗi tiêu đề vẫn nằm trong – 𝜋 và 𝜋 và ngăn không cho rô-bốt của chúng tôi quay ngoài tầm trấn áp .
Tương tự, tất cả chúng ta hoàn toàn có thể đo lường và thống kê sai số X và Y :
errorx = xgoal-x
errory = ygoal-y
Trong mã Python :

Để tất cả chúng cùng nhau

Với cách đo lường và thống kê và update tư thế của rô-bốt khi chuyển dời và cách tính sai số giữa tư thế và vị trí tiềm năng, giờ đây chúng tôi hoàn toàn có thể thực thi hành vi của mình để giảm thiểu lỗi và đạt được vị trí tiềm năng. Chúng tôi sử dụng lớp Cerus để theo dõi những thông số kỹ thuật quan trọng :

Sau đó, chúng tôi xác lập một hàm moveRobot ( ), đọc những giá trị bộ mã hóa từ Arduino trải qua tiếp nối đuôi nhau, thống kê giám sát những tick của delta và gọi đo lường và thống kê allowPose ( ) với chúng. Cuối cùng, nó gọi tínhError ( ) và nhìn nhận xem lỗi trên X và Y có lớn hơn 5 cm hay không. Nếu đúng như vậy, nó sẽ đưa ra một lệnh chuyển dời bằng cách triển khai lệnh gọi đến twist ( ). Dung sai 5 cm rất quan trọng – không có dung sai ở đây hoàn toàn có thể khiến robot quay như điên khi đến vị trí tiềm năng .
Để đơn thuần hơn, chúng tôi lái xe đến vị trí tiềm năng với tốc độ cố định và thắt chặt constVel = 0,2 và chỉ đổi khác tốc độ góc của chúng tôi – giống như ngồi trong một chiếc xe hơi có mạng lưới hệ thống điều khiển hành trình dài, nơi chỉ điều khiển lái sang trái và phải .

Cũng cần chú ý quan tâm rằng chúng tôi nhìn nhận xem tài liệu tiếp nối đuôi nhau từ Arduino có nằm trong bộ đệm hay không bằng cách nhìn nhận ser. inWaiting ( ). Nếu bạn nhớ từ điều hai, chúng tôi gửi tài liệu tiếp nối đuôi nhau cứ sau 50 ms, khiến Jetson phải thống kê giám sát lại tư thế và lỗi sau mỗi 50 ms. Việc trọn vẹn chờ đón tài liệu tiếp nối đuôi nhau ngăn không cho Jetson làm những việc khác và thống kê giám sát lại tư thế quá tiếp tục gây ra đủ loại sai lầm đáng tiếc khi tôi đang thử nghiệm. Việc tiến hành này có vẻ như hoạt động giải trí tốt nhất. Nếu vì nguyên do nào đó mà vòng lặp chính Python của chương trình này chậm hơn 50 ms, rô bốt cũng sẽ không lái đúng cách .
Cuối cùng, chúng tôi chỉ cần lặp lại khi không ở vị trí tiềm năng và in thông tin khi chúng tôi đã đạt được tiềm năng :

while not atGoal:
moveRobot()
print(“Robot at goal position.”)

Bạn hoàn toàn có thể tìm thấy mã hoàn hảo tại đây, trên GitHub .

Phần kết luận

Với loạt bài này, chúng tôi đã thiết kế xây dựng phần cứng và những điều khiển cấp thấp cho rô bốt và đã tiến hành điều khiển từ xa thuận tiện và một hành vi đơn thuần tiên phong. Đây là một thời cơ học tập lớn cho bản thân tôi và tôi kỳ vọng bạn cũng thấy nó có ích .
Một cái nhìn thâm thúy chính là sự trôi bánh xe hoàn toàn có thể tác động ảnh hưởng đáng kể như thế nào đến hoạt động của một robot di động. Vì bánh xe Mecanum mà tôi chọn cho Cerus khá trơn và chiều dài cơ sở khá dài, tôi đã gặp phải hiện tượng kỳ lạ trôi dạt đáng kể khiến robot ” nghĩ rằng ” nó đã đến vị trí tiềm năng, trong khi thực tiễn là nó đã đến một nơi khác. Có nhiều cách để chống lại điều này, gồm có sử dụng bánh xe có độ bám cao hơn, rút ​ ​ ngắn chiều dài cơ sở hoặc sử dụng những cảm ứng khác để xác lập vị trí, gồm có cả IMU. Chúng là một phần của list dài những thứ mà tôi không hề đề cập đến trong loạt bài này, gồm có cả việc thao tác với ROS, hệ quản lý và điều hành robot và làm những điều mê hoặc hơn về quyền tự chủ, ví dụ điển hình như thêm tính năng tránh vật thể .

ROS là một khuôn khổ tuyệt vời cho các ứng dụng rô bốt có thể được lập trình bằng cả Python và C ++. Đó là kiến ​​trúc dựa trên nút và hệ thống nhà xuất bản và người đăng ký cho phép các tập lệnh chạy đồng thời trên robot của chúng tôi, tách hệ thống thành các hệ thống con dễ quản lý hơn. Điều này làm cho nó trở thành một lựa chọn đặc biệt khả thi khi bổ sung thêm nhiều cảm biến và bộ truyền động cho robot của chúng tôi.

Để có quyền tự chủ, tôi rất vui được thử chiêu thức tiếp cận dựa trên tầm nhìn tận dụng Máy học và kiến ​ ​ trúc GPU của Jetson. Ngoài ra, tôi mong ước thử cách tiếp cận dựa trên LiDAR, với máy quét laser 2D hiện có sẵn với giá dưới 100 đô la .
Với loạt bài này, tôi kỳ vọng rằng tôi đã khơi dậy sự chăm sóc của bạn so với người máy bằng loạt bài này. Chúc bạn thử nghiệm vui tươi !

Các bài viết liên quan

Viết một bình luận