Header Ads

  • Breaking News

    Hướng dẫn lập trình robot giới thiệu

    Ghi chú của người biên tập: Vào ngày 16 tháng 10 năm 2018, bài viết này đã được đại tu để hoạt động với các công nghệ mới nhất.
    Hãy đối mặt với nó, robot rất tuyệt. Họ cũng sẽ điều hành thế giới vào một ngày nào đó và hy vọng rằng, vào thời điểm đó họ sẽ thương hại những người sáng tạo thịt mềm tội nghiệp của họ (hay còn gọi là nhà phát triển người máy ) và giúp chúng tôi xây dựng một không gian không tưởng đầy ắp. Tất nhiên là tôi đang nói đùa, nhưng chỉ đại loại thôi.
    Với tham vọng có một số ảnh hưởng nhỏ đến vấn đề này, tôi đã tham gia một khóa học về lý thuyết điều khiển robot tự động vào năm ngoái, với đỉnh điểm là tôi đã xây dựng một trình mô phỏng robot dựa trên Python cho phép tôi thực hành lý thuyết điều khiển trên một robot đơn giản, di động, có thể lập trình được. .
    Trong bài viết này, tôi sẽ trình bày cách sử dụng khuôn khổ rô bốt Python để phát triển phần mềm điều khiển, mô tả sơ đồ điều khiển mà tôi đã phát triển cho rô bốt mô phỏng của mình, minh họa cách nó tương tác với môi trường và đạt được các mục tiêu và thảo luận về một số những thách thức cơ bản của lập trình người máy mà tôi gặp phải trong quá trình này.
    Để làm theo hướng dẫn này về lập trình robot cho người mới bắt đầu, bạn nên có kiến ​​thức cơ bản về hai điều:
    • Toán học — chúng tôi sẽ sử dụng một số hàm lượng giác và vectơ
    • Python — vì Python là một trong những ngôn ngữ lập trình rô bốt cơ bản phổ biến hơn — chúng tôi sẽ sử dụng các thư viện và hàm cơ bản của Python
    Các đoạn mã được hiển thị ở đây chỉ là một phần của toàn bộ trình mô phỏng, dựa vào các lớp và giao diện, vì vậy để đọc mã trực tiếp, bạn có thể cần một số kinh nghiệm về Python và lập trình hướng đối tượng .
    Cuối cùng, các chủ đề tùy chọn sẽ giúp bạn làm theo hướng dẫn này tốt hơn là biết máy trạng thái là gì và cách hoạt động của cảm biến phạm vi và bộ mã hóa.

    Thử thách của Robot có thể lập trình: Nhận thức so với Thực tế và Tính mong manh của Kiểm soát

    Thách thức cơ bản của tất cả các robot là: Không thể biết được trạng thái thực sự của môi trường. Phần mềm điều khiển robot chỉ có thể đoán trạng thái của thế giới thực dựa trên các phép đo do cảm biến của nó trả về. Nó chỉ có thể cố gắng thay đổi trạng thái của thế giới thực thông qua việc tạo ra các tín hiệu điều khiển.
    Đồ họa có thể thể hiện sự tương tác giữa một vật lý robot và máy tính điều khiển khi thực thi Python robot.
    Phần mềm điều khiển robot chỉ có thể đoán trạng thái của thế giới thực dựa trên các phép đo do cảm biến của nó trả về.
    Do đó, một trong những bước đầu tiên trong thiết kế điều khiển là đưa ra một mô hình trừu tượng của thế giới thực, được gọi là mô hình , để giải thích các chỉ số cảm biến của chúng ta và đưa ra quyết định. Miễn là thế giới thực hoạt động theo các giả định của mô hình, chúng ta có thể phỏng đoán tốt và kiểm soát tốt. Tuy nhiên, ngay sau khi thế giới thực đi chệch hướng khỏi những giả định này, chúng ta sẽ không thể đưa ra những phỏng đoán chính xác nữa và sự kiểm soát sẽ mất đi. Thông thường, một khi mất quyền kiểm soát, nó không bao giờ có thể lấy lại được. (Trừ khi một thế lực bên ngoài nhân từ nào đó khôi phục nó.)
    Đây là một trong những lý do chính khiến việc lập trình robot rất khó khăn. Chúng ta thường thấy các video về robot nghiên cứu mới nhất trong phòng thí nghiệm, thực hiện những kỳ công tuyệt vời về sự khéo léo, điều hướng hoặc làm việc theo nhóm và chúng ta muốn hỏi, "Tại sao điều này không được sử dụng trong thế giới thực?" Chà, lần tới khi bạn xem một video như vậy, hãy xem môi trường phòng thí nghiệm được kiểm soát cao như thế nào. Trong hầu hết các trường hợp, các robot này chỉ có thể thực hiện những nhiệm vụ ấn tượng này miễn là các điều kiện môi trường vẫn nằm trong giới hạn hẹp của mô hình bên trong của nó. Do đó, một chìa khóa cho sự tiến bộ của công nghệ robot là sự phát triển của các mô hình phức tạp, linh hoạt và mạnh mẽ hơn — và nói rằng sự tiến bộ phụ thuộc vào giới hạn của các nguồn lực tính toán sẵn có.
    Một chìa khóa cho sự tiến bộ của công nghệ robot là sự phát triển của các mô hình phức tạp, linh hoạt và mạnh mẽ hơn.
    [Ghi chú bên lề: Các nhà triết học và tâm lý học đều lưu ý rằng các sinh vật sống cũng phải chịu sự phụ thuộc vào nhận thức bên trong của chúng về những gì các giác quan của chúng nói với chúng. Nhiều tiến bộ trong chế tạo người máy đến từ việc quan sát các sinh vật sống và xem cách chúng phản ứng với những kích thích bất ngờ. Hãy suy nghĩ về nó. Mô hình nội bộ của bạn về thế giới là gì? Nó khác gì với kiến, và cá? (Hy vọng.) Tuy nhiên, giống như con kiến ​​và con cá, nó có khả năng đơn giản hóa một số thực tế của thế giới. Khi những giả định của bạn về thế giới không đúng, nó có thể khiến bạn có nguy cơ mất kiểm soát mọi thứ. Đôi khi chúng tôi gọi đây là “nguy hiểm”. Giống như cách robot nhỏ của chúng ta đấu tranh để tồn tại trước vũ trụ vô danh, tất cả chúng ta cũng vậy. Đây là một cái nhìn sâu sắc mạnh mẽ cho các nhà chế tạo robot.]

    Trình mô phỏng Robot có thể lập trình

    Trình mô phỏng mà tôi đã xây dựng được viết bằng Python và được đặt tên rất thông minh là Sobot Rimulator . Bạn có thể tìm thấy v1.0.0 trên GitHub . Nó không có nhiều chuông và còi nhưng nó được xây dựng để làm rất tốt một điều: cung cấp mô phỏng chính xác của một robot di động và cung cấp cho một nhà robot có tham vọng một khuôn khổ đơn giản để thực hành lập trình phần mềm robot. Mặc dù luôn tốt hơn nếu có một robot thực để chơi cùng, nhưng một trình mô phỏng robot Python tốt dễ tiếp cận hơn nhiều và là một nơi tuyệt vời để bắt đầu.
    Trong robot thế giới thực, phần mềm tạo ra các tín hiệu điều khiển (“bộ điều khiển”) được yêu cầu chạy ở tốc độ rất cao và thực hiện các phép tính phức tạp. Điều này ảnh hưởng đến việc lựa chọn ngôn ngữ lập trình rô bốt nào tốt nhất để sử dụng: Thông thường, C ++ được sử dụng cho các loại tình huống này, nhưng trong các ứng dụng rô bốt đơn giản hơn, Python là sự thỏa hiệp rất tốt giữa tốc độ thực thi và tính dễ phát triển và thử nghiệm.
    Phần mềm tôi viết mô phỏng một robot nghiên cứu ngoài đời thực có tên là Khepera nhưng nó có thể được điều chỉnh cho phù hợp với nhiều loại robot di động với các kích thước và cảm biến khác nhau. Vì tôi đã cố gắng lập trình trình mô phỏng giống với khả năng của robot thực nhất có thể, nên logic điều khiển có thể được tải vào robot Khepera thực với sự tái cấu trúc tối thiểu và nó sẽ hoạt động giống như robot mô phỏng. Các tính năng cụ thể được triển khai đề cập đến Khepera III, nhưng chúng có thể dễ dàng điều chỉnh cho Khepera IV mới.
    Nói cách khác, lập trình một robot mô phỏng tương tự như lập trình một robot thực. Điều này rất quan trọng nếu trình mô phỏng được sử dụng để phát triển và đánh giá các phương pháp tiếp cận phần mềm điều khiển khác nhau.
    Trong hướng dẫn này, tôi sẽ mô tả kiến ​​trúc phần mềm điều khiển robot đi kèm với v1.0.0 của Sobot Rimulator và cung cấp các đoạn trích từ nguồn Python (với các sửa đổi nhỏ để rõ ràng). Tuy nhiên, tôi khuyến khích bạn nên đi sâu vào nguồn và lộn xộn xung quanh. Trình mô phỏng đã được phân nhánh và được sử dụng để điều khiển các rô bốt di động khác nhau, bao gồm cả Roomba2 từ iRobot . Tương tự như vậy, hãy thoải mái phân nhánh dự án và cải thiện nó.
    Logic điều khiển của rô bốt bị hạn chế đối với các lớp / tệp Python sau:
    • models/supervisor.py—Lớp này chịu trách nhiệm về sự tương tác giữa thế giới mô phỏng xung quanh robot và chính robot. Nó phát triển máy trạng thái robot của chúng tôi và kích hoạt bộ điều khiển để tính toán hành vi mong muốn.
    • models/supervisor_state_machine.py- lớp này đại diện cho các trạng thái khác nhau mà robot có thể ở, tùy thuộc vào cách diễn giải của nó đối với các cảm biến.
    • Các tệp trong models/controllersthư mục — các lớp này thực hiện các hành vi khác nhau của rô bốt với một trạng thái đã biết của môi trường. Đặc biệt, một bộ điều khiển cụ thể được chọn tùy thuộc vào máy trạng thái.

    Mục đích

    Robot cũng giống như con người, cần có mục đích sống. Mục tiêu của phần mềm điều khiển robot này của chúng tôi sẽ rất đơn giản: Nó sẽ cố gắng đi đến một điểm mục tiêu đã định trước. Đây thường là tính năng cơ bản mà bất kỳ rô bốt di động nào cũng phải có, từ ô tô tự động đến máy hút bụi rô bốt. Tọa độ của mục tiêu được lập trình trong phần mềm điều khiển trước khi kích hoạt rô bốt nhưng có thể được tạo ra từ một ứng dụng Python bổ sung để giám sát các chuyển động của rô bốt. Ví dụ, hãy nghĩ về nó lái xe qua nhiều điểm tham chiếu.
    Tuy nhiên, để làm phức tạp vấn đề, môi trường của robot có thể đầy chướng ngại vật. Robot KHÔNG THỂ va chạm với chướng ngại vật trên đường đến mục tiêu. Do đó, nếu robot gặp chướng ngại vật, nó sẽ phải tìm đường đi xung quanh để có thể tiếp tục trên đường đến mục tiêu.

    Robot có thể lập trình

    Mỗi robot đều có các khả năng và mối quan tâm kiểm soát khác nhau. Hãy làm quen với robot có thể lập trình mô phỏng của chúng tôi.
    Điều đầu tiên cần lưu ý là trong hướng dẫn này, robot của chúng ta sẽ là một robot di động tự động . Điều này có nghĩa là nó sẽ tự do di chuyển trong không gian và nó sẽ làm như vậy trong tầm kiểm soát của chính nó. Điều này trái ngược với, chẳng hạn như rô bốt điều khiển từ xa (không tự động) hoặc cánh tay rô bốt nhà máy (không di động). Robot của chúng ta phải tự tìm ra cách đạt được mục tiêu và tồn tại trong môi trường của nó. Điều này chứng tỏ là một thách thức khó khăn đáng ngạc nhiên đối với các lập trình viên người máy mới làm quen.

    Đầu vào điều khiển: Cảm biến

    Có nhiều cách khác nhau mà robot có thể được trang bị để giám sát môi trường của nó. Chúng có thể bao gồm bất cứ thứ gì từ cảm biến khoảng cách, cảm biến ánh sáng, cản, máy ảnh, v.v. Ngoài ra, robot có thể giao tiếp với các cảm biến bên ngoài để cung cấp cho chúng thông tin mà bản thân chúng không thể quan sát trực tiếp.
    Robot tham chiếu của chúng tôi được trang bị chín cảm biến hồng ngoại — mẫu mới hơn có tám cảm biến tiệm cận hồng ngoại và năm siêu âm — được sắp xếp thành một “váy” theo mọi hướng. Có nhiều cảm biến hướng về phía trước của rô bốt hơn là ở phía sau vì rô bốt thường quan trọng hơn những gì ở phía trước của nó hơn là những gì ở sau nó.
    Ngoài các cảm biến khoảng cách, robot có một cặp dấu bánh xe để theo dõi chuyển động của bánh xe. Những điều này cho phép bạn theo dõi số vòng quay mà mỗi bánh xe tạo ra, với một vòng quay hoàn toàn về phía trước của một bánh xe là 2.765 tích tắc. Quay ngược chiều đếm ngược, giảm số lần đánh dấu thay vì tăng. Bạn không phải lo lắng về những con số cụ thể trong hướng dẫn này vì phần mềm chúng tôi sẽ viết sử dụng quãng đường đã đi được biểu thị bằng mét. Sau đó, tôi sẽ chỉ cho bạn cách tính toán nó từ tick với một hàm Python dễ dàng.

    Đầu ra điều khiển: Tính di động

    Một số robot di chuyển bằng chân. Một số lăn như một quả bóng. Một số thậm chí còn trượt như một con rắn.
    Robot của chúng tôi là robot truyền động vi sai , nghĩa là nó lăn trên hai bánh. Khi cả hai bánh quay cùng tốc độ, rô bốt chuyển động trên một đường thẳng. Khi các bánh xe chuyển động với tốc độ khác nhau, robot sẽ quay. Do đó, việc kiểm soát chuyển động của robot này đi xuống để kiểm soát chính xác tốc độ quay của mỗi trong số hai bánh xe này.

    API

    Trong Sobot Rimulator, sự tách biệt giữa "máy tính" của robot và thế giới vật lý (được mô phỏng) được thể hiện bằng tệp robot_supervisor_interface.pytệp này xác định toàn bộ API để tương tác với các cảm biến và động cơ "robot thực":
    • read_proximity_sensors() trả về một mảng gồm chín giá trị ở định dạng gốc của cảm biến
    • read_wheel_encoders() trả về một mảng gồm hai giá trị cho biết tổng số lần đánh dấu kể từ khi bắt đầu
    • set_wheel_drive_rates( v_l, v_r ) nhận hai giá trị (tính bằng radian trên giây) và đặt tốc độ bên trái và bên phải của bánh xe thành hai giá trị đó
    Giao diện này sử dụng bên trong một đối tượng robot cung cấp dữ liệu từ các cảm biến và khả năng di chuyển động cơ hoặc bánh xe. Nếu bạn muốn tạo một robot khác, bạn chỉ cần cung cấp một lớp robot Python khác có thể được sử dụng bởi cùng một giao diện và phần còn lại của mã (bộ điều khiển, người giám sát và trình mô phỏng) sẽ hoạt động tốt!

    Trình mô phỏng

    Như bạn sẽ sử dụng một robot thực trong thế giới thực mà không chú ý quá nhiều đến các quy luật vật lý liên quan, bạn có thể bỏ qua cách robot được mô phỏng và chỉ cần bỏ qua trực tiếp cách lập trình phần mềm điều khiển, vì nó sẽ gần như giống nhau giữa thế giới thực và mô phỏng. Nhưng nếu bạn tò mò, tôi sẽ giới thiệu sơ qua ở đây.
    Tệp world.pylà một lớp Python đại diện cho thế giới mô phỏng, với các rô bốt và chướng ngại vật bên trong. Hàm bước bên trong lớp này chăm sóc việc phát triển thế giới đơn giản của chúng ta bằng cách:
    • Áp dụng các quy tắc vật lý cho chuyển động của robot
    • Xem xét va chạm với chướng ngại vật
    • Cung cấp các giá trị mới cho cảm biến robot
    Cuối cùng, nó gọi những người giám sát robot chịu trách nhiệm thực thi phần mềm não robot.
    Chức năng bước được thực hiện trong một vòng lặp để robot.step_motion()di chuyển robot bằng tốc độ bánh xe do người giám sát tính toán trong bước mô phỏng trước.
    # step the simulation through one time interval
    def step( self ):
    dt = self.dt
    # step all the robots
    for robot in self.robots:
    # step robot motion
    robot.step_motion( dt )
    
    # apply physics interactions
    self.physics.apply_physics()
    
    # NOTE: The supervisors must run last to ensure they are observing the "current" world
    # step all of the supervisors
    for supervisor in self.supervisors:
    supervisor.step( dt )
    
    # increment world time
    self.world_time += dt
    
    Các apply_physics()chức năng trong nội bộ cập nhật các giá trị của các cảm biến Robot gần gũi để người giám sát sẽ có thể ước lượng môi trường ở bước mô phỏng hiện hành. Các khái niệm tương tự cũng áp dụng cho các bộ mã hóa.

    Một mô hình đơn giản

    Đầu tiên, robot của chúng ta sẽ có một mô hình rất đơn giản. Nó sẽ đưa ra nhiều giả thiết về thế giới. Một số điều quan trọng bao gồm:
    • Địa hình luôn bằng phẳng và bằng phẳng
    • Chướng ngại vật không bao giờ là tròn
    • Bánh xe không bao giờ trượt
    • Sẽ không có gì có thể đẩy robot đi xung quanh
    • Các cảm biến không bao giờ bị lỗi hoặc cho kết quả đọc sai
    • Bánh xe luôn quay khi chúng được yêu cầu
    Mặc dù hầu hết các giả định này là hợp lý trong môi trường giống như một ngôi nhà, các chướng ngại vật tròn có thể xuất hiện. Phần mềm tránh chướng ngại vật của chúng tôi có cách triển khai đơn giản và đi theo ranh giới của các chướng ngại vật để đi xung quanh chúng. Chúng tôi sẽ gợi ý cho độc giả về cách cải thiện khung điều khiển của rô bốt của chúng tôi với một kiểm tra bổ sung để tránh chướng ngại vật hình tròn.

    Vòng điều khiển

    Bây giờ chúng tôi sẽ đi vào cốt lõi của phần mềm điều khiển của chúng tôi và giải thích các hành vi mà chúng tôi muốn lập trình bên trong robot. Các hành vi bổ sung có thể được thêm vào khuôn khổ này, và bạn nên thử các ý tưởng của riêng mình sau khi đọc xong! Phần mềm rô bốt dựa trên hành vi đã được đề xuất hơn 20 năm trước và nó vẫn là một công cụ mạnh mẽ cho rô bốt di động. Ví dụ, vào năm 2007, một tập hợp các hành vi đã được sử dụng trong Cuộc thi Đô thị DARPA — cuộc thi đầu tiên dành cho xe ô tô tự lái!
    Robot là một hệ thống động. Trạng thái của robot, số đọc của các cảm biến và ảnh hưởng của các tín hiệu điều khiển của nó luôn thay đổi. Kiểm soát cách sự kiện diễn ra bao gồm ba bước sau:
    1. Áp dụng các tín hiệu điều khiển.
    2. Đo lường kết quả.
    3. Tạo ra các tín hiệu điều khiển mới được tính toán để đưa chúng ta đến gần hơn với mục tiêu của mình.
    Các bước này được lặp đi lặp lại cho đến khi chúng ta đạt được mục tiêu. Càng nhiều lần chúng ta có thể làm điều này mỗi giây, chúng ta sẽ có quyền kiểm soát tốt hơn đối với hệ thống. Robot Sobot Rimulator lặp lại các bước này 20 lần mỗi giây (20 Hz), nhưng nhiều robot phải thực hiện điều này hàng nghìn hoặc hàng triệu lần mỗi giây để có đủ khả năng kiểm soát. Hãy nhớ phần giới thiệu trước của chúng tôi về các ngôn ngữ lập trình rô bốt khác nhau cho các hệ thống rô bốt khác nhau và các yêu cầu về tốc độ.
    Nói chung, mỗi khi rô-bốt của chúng tôi thực hiện các phép đo với các cảm biến của nó, nó sẽ sử dụng các phép đo này để cập nhật ước tính bên trong về trạng thái của thế giới — ví dụ: khoảng cách từ mục tiêu của nó. Nó so sánh trạng thái này với một giá trị tham chiếu của những gì nó muốn trạng thái là (đối với khoảng cách, nó muốn nó bằng 0) và tính toán sai số giữa trạng thái mong muốn và trạng thái thực tế. Một khi thông tin này được biết, việc tạo ra các tín hiệu điều khiển mới có thể được giảm thiểu thành vấn đề giảm thiểu lỗi , điều này cuối cùng sẽ di chuyển robot tới mục tiêu.

    Một mẹo nhỏ: Đơn giản hóa mô hình

    Để điều khiển robot mà chúng ta muốn lập trình, chúng ta phải gửi một tín hiệu đến bánh bên trái cho nó biết tốc độ quay và một tín hiệu riêng cho bánh bên phải cho biết nó quay nhanh như thế nào. Hãy gọi những tín hiệu L và R . Tuy nhiên, liên tục suy nghĩ về L và R là rất rườm rà. Thay vì hỏi, "Chúng ta muốn bánh bên trái quay nhanh bao nhiêu và chúng ta muốn bánh xe bên phải quay nhanh bao nhiêu?" tự nhiên hơn khi hỏi, "Chúng ta muốn rô-bốt di chuyển về phía trước nhanh bao nhiêu và chúng tôi muốn nó quay hay đổi hướng nhanh đến mức nào?" Hãy gọi các tham số này là vận tốc v và vận tốc góc (quay) ω(đọc là "omega"). Hóa ra chúng ta có thể dựa trên toàn bộ mô hình của mình dựa trên v và ω thay vì L và R , và chỉ khi chúng ta đã xác định được cách chúng ta muốn robot được lập trình của mình di chuyển, hãy biến đổi toán học hai giá trị này thành L và R mà chúng ta cần để thực sự điều khiển các bánh xe robot. Đây được gọi là mô hình điều khiển xe đạp một bánh .
    Trong lập trình robot, điều quan trọng là phải hiểu sự khác biệt giữa các mô hình truyền động một bánh và vi sai.
    Đây là mã Python thực hiện chuyển đổi cuối cùng trong supervisor.pyLưu ý rằng nếu ω bằng 0, cả hai bánh xe sẽ quay cùng tốc độ:
    # generate and send the correct commands to the robot
    def _send_robot_commands( self ):
      # ...
      v_l, v_r = self._uni_to_diff( v, omega )
      self.robot.set_wheel_drive_rates( v_l, v_r )
    
    def _uni_to_diff( self, v, omega ):
      # v = translational velocity (m/s)
      # omega = angular velocity (rad/s)
    
      R = self.robot_wheel_radius
      L = self.robot_wheel_base_length
    
      v_l = ( (2.0 * v) - (omega*L) ) / (2.0 * R)
      v_r = ( (2.0 * v) + (omega*L) ) / (2.0 * R)
    
      return v_l, v_r
    

    Trạng thái ước tính: Robot, Biết bản thân

    Sử dụng các cảm biến của nó, robot phải cố gắng ước tính trạng thái của môi trường cũng như trạng thái của chính nó. Những ước tính này sẽ không bao giờ là hoàn hảo, nhưng chúng phải khá tốt vì robot sẽ dựa trên tất cả các quyết định của nó về những ước tính này. Chỉ sử dụng cảm biến tiệm cận và mã bánh xe, nó phải cố gắng đoán những điều sau:
    • Hướng đến chướng ngại vật
    • Khoảng cách từ chướng ngại vật
    • Vị trí của robot
    • Tiêu đề của robot
    Hai thuộc tính đầu tiên được xác định bởi các số đọc của cảm biến tiệm cận và khá đơn giản. Hàm API read_proximity_sensors()trả về một mảng gồm chín giá trị, một giá trị cho mỗi cảm biến. Chúng tôi biết trước rằng số đọc thứ bảy, ví dụ, tương ứng với cảm biến hướng 75 độ về bên phải của robot.
    Do đó, nếu giá trị này hiển thị số đọc tương ứng với khoảng cách 0,1 mét, chúng ta biết rằng có một chướng ngại vật cách 0,1 mét, 75 độ bên trái. Nếu không có chướng ngại vật, cảm biến sẽ trả về giá trị đọc trong phạm vi tối đa là 0,2 mét. Do đó, nếu chúng ta đọc 0,2 mét trên cảm biến bảy, chúng ta sẽ cho rằng thực sự không có chướng ngại vật nào theo hướng đó.
    Do cách thức hoạt động của các cảm biến hồng ngoại (đo phản xạ tia hồng ngoại), các con số mà chúng trả về là sự biến đổi phi tuyến tính của khoảng cách thực được phát hiện. Do đó, hàm Python để xác định khoảng cách được chỉ định phải chuyển đổi các số đọc này thành mét. Điều này được thực hiện supervisor.pynhư sau:
    # update the distances indicated by the proximity sensors
    def _update_proximity_sensor_distances( self ):
        self.proximity_sensor_distances = [ 0.02-( log(readval/3960.0) )/30.0 for
            readval in self.robot.read_proximity_sensors() ]
    
    Một lần nữa, chúng tôi có một mô hình cảm biến cụ thể trong khuôn khổ robot Python này, trong khi trong thế giới thực, cảm biến đi kèm với phần mềm đi kèm sẽ cung cấp các chức năng chuyển đổi tương tự từ giá trị phi tuyến tính sang mét.
    Việc xác định vị trí và hướng đi của robot (còn được gọi là tư thế trong lập trình robot) có phần khó khăn hơn. Robot của chúng tôi sử dụng phép đo mùi để ước tính tư thế của nó. Đây là nơi xuất hiện các mã tín hiệu bánh xe. Bằng cách đo lường mức độ quay của mỗi bánh xe kể từ lần lặp cuối cùng của vòng điều khiển, có thể ước tính chính xác về cách tư thế của rô bốt đã thay đổi — nhưng chỉ khi thay đổi là nhỏ .
    Đây là một lý do quan trọng để lặp lại vòng điều khiển rất thường xuyên trong một robot thế giới thực, nơi các động cơ di chuyển bánh xe có thể không hoàn hảo. Nếu chúng tôi đợi quá lâu để đo các mốc của bánh xe, thì cả hai bánh xe có thể đã làm được khá nhiều và sẽ không thể ước tính được chúng tôi đã đi đến đâu.
    Với trình mô phỏng phần mềm hiện tại của chúng tôi, chúng tôi có thể đủ khả năng để chạy tính toán đo mùi ở 20 Hz - cùng tần số với các bộ điều khiển. Nhưng có thể là một ý kiến ​​hay nếu có một luồng Python riêng biệt chạy nhanh hơn để bắt các chuyển động nhỏ hơn của các mã.
    Dưới đây là chức năng đo mùi đầy đủ trong supervisor.pyđó cập nhật ước tính tư thế robot. Lưu ý rằng tư thế của rô bốt bao gồm các tọa độ xvà yvà tiêu đề theta, được đo bằng radian từ trục X dương. Dương xlà ở phía đông và tích cực ylà ở phía bắc. Do đó, tiêu đề 0chỉ ra rằng robot đang quay mặt trực tiếp về phía đông. Robot luôn giả định tư thế ban đầu của nó là (0, 0), 0.
    # update the estimated position of the robot using it's wheel encoder readings
    def _update_odometry( self ):
      R = self.robot_wheel_radius
      N = float( self.wheel_encoder_ticks_per_revolution )
      
      # read the wheel encoder values
      ticks_left, ticks_right = self.robot.read_wheel_encoders()
      
      # get the difference in ticks since the last iteration
      d_ticks_left = ticks_left - self.prev_ticks_left
      d_ticks_right = ticks_right - self.prev_ticks_right
      
      # estimate the wheel movements
      d_left_wheel = 2*pi*R*( d_ticks_left / N )
      d_right_wheel = 2*pi*R*( d_ticks_right / N )
      d_center = 0.5 * ( d_left_wheel + d_right_wheel )
      
      # calculate the new pose
      prev_x, prev_y, prev_theta = self.estimated_pose.scalar_unpack()
      new_x = prev_x + ( d_center * cos( prev_theta ) )
      new_y = prev_y + ( d_center * sin( prev_theta ) )
      new_theta = prev_theta + ( ( d_right_wheel - d_left_wheel ) / self.robot_wheel_base_length )
      
      # update the pose estimate with the new values
      self.estimated_pose.scalar_update( new_x, new_y, new_theta )
      
      # save the current tick count for the next iteration
      self.prev_ticks_left = ticks_left
      self.prev_ticks_right = ticks_right
    
    Giờ đây, rô-bốt của chúng tôi có thể tạo ra một ước tính tốt về thế giới thực, hãy sử dụng thông tin này để đạt được mục tiêu của mình.

    Không có nhận xét nào

    Post Top Ad

    ad728

    Post Bottom Ad

    ad728