شِفر (کود) جستجو

درس ۹ از ۱۰: اجتناب از مانع با استفاده از خودروی هوشمند ۴ چرخ محرک Raspberry Pi Pico

درس ۹ از ۱۰: اجتناب از مانع با استفاده از خودروی هوشمند ۴ چرخ محرک Raspberry Pi Pico

مقدمه

این راهنما، بر اساس درس ۹ از ۱۰ دوره آموزشی Robojax، نحوه ساخت ربات اجتناب از مانع با استفاده از کیت خودروی هوشمند ۴ چرخ SunFounder Raspberry Pi Pico را نشان می‌دهد. این پروژه حساس(حس کننده) اولتراسونیک چرخان با سروو و کنترل موتور را ترکیب می‌کند تا رباتی بسازد که بتواند به‌طور مستقل در محیط حرکت کند. با چرخش حساس(حس کننده) مانند رادار، خودرو موانع را تشخیص می‌دهد و هوشمندانه مسیر باز را برای ادامه حرکت انتخاب می‌کند، که آن را به مقدمه‌ای عالی برای رباتیک، یکپارچه‌سازی حساس(حس کننده) و ناوبری مستقل تبدیل می‌کند.

راه‌اندازی Sunfounder_Pico4DW-09-Obstacle-avoidance با مانع روی زمین

این پروژه فقط یک اسباب‌بازی نیست؛ بلکه پایه‌ای برای بسیاری از کاربردهای عملی است. در اینجا چند ایده برای الهام گرفتن شما آورده شده است:

  • ربات اکتشاف مستقل: رباتی بسازید که بتواند یک اتاق یا منطقه بیرونی را بدون دخالت انسان نقشه‌برداری و کاوش کند.
  • جاروبرقی هوشمند: از همان اصول برای ساخت رباتی استفاده کنید که در حین تمیزکاری، در اتاق حرکت کرده و از مبلمان و دیوارها اجتناب کند.
  • ربات گشت امنیتی: خودرو را برنامه‌ریزی کنید تا محیطی را گشت‌زنی کند و از حساس(حس کننده) اولتراسونیک برای تشخیص و گزارش موانع یا نفوذهای غیرمنتظره استفاده کند.
  • پلتفرم آموزشی برای هوش مصنوعی: از این پروژه به‌عنوان پله‌ای برای یادگیری الگوریتم‌های پیچیده‌تر مانند مسیریابی و مکان‌یابی و نقشه‌برداری همزمان (SLAM) استفاده کنید.

این درس بر منطق اصلی و کدی تمرکز دارد که خودرو را قادر به تصمیم‌گیری می‌کند. خودرو از یک موتور سروو برای چرخاندن حساس(حس کننده) اولتراسونیک استفاده می‌کند که مانند رادار فاصله‌ها را از ۰ تا ۱۸۰ درجه اندازه‌گیری می‌کند. شِفر (کود) این داده‌ها را تحلیل می‌کند تا وسیع‌ترین مسیر خالی را پیدا کند و خودرو را بر این اساس به جلو، چپ یا راست هدایت کند. ویدیو کل فرآیند را از آزمایش اجزای جداگانه تا اجرای الگوریتم نهایی اجتناب از مانع در یک پیچ‌وخم واقعی نشان می‌دهد.

سخت‌افزار/قطعات

این پروژه بر اساس کیت خودروی هوشمند ۴ چرخ SunFounder Raspberry Pi Pico است. اجزای ضروری استفاده‌شده در این درس عبارتند از:

  • برد میکروکنترلر Raspberry Pi Pico
  • شاسی خودروی هوشمند ۴ چرخ SunFounder با چهار موتور
  • برد درایور موتور
  • حساس(حس کننده) فاصله اولتراسونیک (نوع HC-SR04)
  • موتور سروو (برای چرخاندن حساس(حس کننده) اولتراسونیک)
  • منبع تغذیه (باتری‌های خودرو)

راهنمای سیم‌کشی

کیت SunFounder برای مونتاژ آسان طراحی شده است و سیم‌کشی معمولاً از طریق یک برد توسعه اختصاصی از پیش متصل است. حساس(حس کننده) اولتراسونیک روی موتور سروو نصب شده است که سپس به برد کنترل اصلی متصل می‌شود. این راه‌اندازی به حساس(حس کننده) اجازه می‌دهد تا برای اسکن محیط بچرخد. برای نمودار سیم‌کشی دقیق مخصوص کیت خود، لطفاً به مستندات رسمی SunFounder مراجعه کنید.

اتصالات اصلی شامل پایه‌های تریگر و اکو حساس(حس کننده) اولتراسونیک و پایه سیگنال موتور سروو است که همگی به پایه‌های GPIO خاصی روی Raspberry Pi Pico متصل می‌شوند. درایور موتور نیز برای کنترل چهار موتور محرک به Pico متصل است. ویدیو اشاره می‌کند که مستندات کامل، از جمله نمودارهای سیم‌کشی، برای دانلود با کیت موجود است.

Sunfounder_Pico4DW-09-Obstacle-avoidance_وقتی حساس(حس کننده) اولتراسونیک مانع را تشخیص می‌دهد

توضیح شِفر (کود)

این درس بر منطق موجود در مثال `obstacle_avoid` تمرکز دارد. شِفر (کود) به زبان MicroPython نوشته شده است. در حالی که برنامه کامل برای دانلود موجود است، ما بر پارامترهای کلیدی و قابل تنظیم توسط کاربر که رفتار خودرو را کنترل می‌کنند، تمرکز خواهیم کرد. این پارامترها معمولاً در بالای اسکریپت یافت می‌شوند.

در اینجا متغیرهای اصلی که می‌توانید برای تنظیم دقیق عملکرد ربات خود تنظیم کنید، آورده شده است:


# پارامترهای رادار و حرکت
radar_reference = 20  # حداقل فاصله بر حسب سانتی‌متر که ایمن در نظر گرفته می‌شود
step_angle = 10       # افزایش زاویه برای هر مرحله اسکن رادار
forward_speed = 30    # سرعت موتور برای حرکت به جلو (۰-۱۰۰)
turn_speed = 50       # سرعت موتور برای چرخش (۰-۱۰۰)
forward_scan_angle = 50  # زاویه‌ای که سروو هنگام عدم تشخیص مانع اسکن می‌کند
  • radar_reference: این فاصله ایمنی حیاتی بر حسب سانتی‌متر است. اگر مانعی نزدیک‌تر از این مقدار تشخیص داده شود، خودرو آن را "خطر" در نظر گرفته و مانور اجتناب را آغاز می‌کند. در ویدیو، این مقدار روی ۲۰ سانتی‌متر تنظیم شده است.
  • step_angle: این وضوح اسکن رادار را تعریف می‌کند. مقدار کوچکتر (مثلاً ۱۰ درجه) به معنای اسکن دقیق‌تر اما زمان‌برتر است. مقدار بزرگتر سریع‌تر خواهد بود اما ممکن است موانع باریک را از دست بدهد.
  • forward_speed و turn_speed: این‌ها قدرت ارسالی به موتورها را کنترل می‌کنند. می‌توانید آن‌ها را برای تغییر سرعت و چابکی کلی خودرو تنظیم کنید. سرعت چرخش معمولاً بالاتر تنظیم می‌شود تا اطمینان حاصل شود خودرو می‌تواند به‌طور مؤثر بچرخد.
  • forward_scan_angle: وقتی خطر فوری در جلو نیست، خودرو اسکن خود را به این زاویه (متمرکز بر جلو) محدود می‌کند تا موانع را بیشتر در مسیر مستقیم خود بررسی کند و حرکت رو به جلو نرم‌تری را امکان‌پذیر کند.

این ویدیو همچنین منطق اصلی تصمیم‌گیری را توضیح می‌دهد. یک تابع `get_direction()` فهرست خوانش‌های فاصله (که به ۱ و ۰ برای ایمن/ناایمن تبدیل شده‌اند) را تحلیل می‌کند تا وسیع‌ترین مسیر پیوسته از "۱"ها را پیدا کند. بر اساس محل این وسیع‌ترین مسیر، تابع یک جهت برمی‌گرداند: "جلو"، "چپ" یا "راست". حلقه اصلی سپس عمل مربوطه را اجرا می‌کند، ماشین را می‌چرخاند و دوباره اسکن می‌کند تا زمانی که مسیر جلو روشن شود.

پروژه/نمایش زنده

این ویدیو نمایش کاملی از پروژه ارائه می‌دهد. ابتدا با آزمایش حساس(حس کننده) اولتراسونیک به تنهایی شروع می‌شود تا نشان دهد چگونه فاصله را اندازه‌گیری می‌کند و مقادیر را در شل چاپ می‌کند. سپس مربی الگوریتم اجتناب از مانع را با استفاده از یک فلوچارت توضیح می‌دهد و فرآیند تصمیم‌گیری برای چرخش به چپ و راست را شرح می‌دهد. در نهایت، ماشین در یک پیچ‌وخم کوچک ساخته‌شده از جعبه‌ها قرار می‌گیرد تا رفتار کامل اجتناب از مانع را در عمل نشان دهد. ماشین با موفقیت در پیچ‌وخم حرکت می‌کند و به چپ و راست می‌چرخد تا مسیر روشنی به جلو پیدا کند.

بخش‌های ویدیو

  • [00:00] مقدمه‌ای بر اجتناب از مانع
  • [01:31] مروری بر کیت ماشین هوشمند SunFounder و ویژگی‌ها
  • [02:47] نحوه عملکرد ویژگی اجتناب از مانع
  • [03:34] آزمایش حساس(حس کننده) اولتراسونیک
  • [07:45] توضیح الگوریتم اجتناب از مانع و فلوچارت
  • [12:49] تحلیل شِفر (کود) اصلی اجتناب از مانع
  • [15:43] نمایش زنده منطق اجتناب از مانع
  • [22:53] نمایش نهایی با پیچ‌وخم موانع
  • [24:35] نتیجه‌گیری و مراحل بعدی

تصاویر

pico-4wd_main
pico-4wd_main
PICOBOARDWHITEANGLE2_1200x857
PICOBOARDWHITEANGLE2_1200x857
Sunfounder_Pico4DW-09-Obstacle-avoidance setup with obstacle on the floor
Sunfounder_Pico4DW-09-Obstacle-avoidance setup with obstacle on the floor
Sunfounder_Pico4DW-09-Obstacle-avoidance_when ultrasonic detects obstacle
Sunfounder_Pico4DW-09-Obstacle-avoidance_when ultrasonic detects obstacle
909-Lesson 9/10 Pi Pico 4WD card Python code: obstacle avoid
زبان: C++
# Lesson 9/10 Pi Car Pico 4WD: Obstacle avoid
# Download and resource page https://robojax.com/RJT631
import pico_4wd as car
import time

car.RADAR_REFERENCE = 20
car.RADAR_STEP_ANGLE = 10
MOTOR_FORWARD_POWER = 30
MOTOR_TURNING_POWER = 50

FORWARD_SCAN_ANGLE = 50

car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
status = "Danger"

def get_dir(radar_data):
    # get scan status of 0, 1
    # print(radar_data)
    radar_data = [str(i) for i in radar_data]
    radar_data = "".join(radar_data)
    # Split 0, leaves the free path
    paths = radar_data.split("0")
    # print(paths)
    # print("paths: %s" % paths)
    length_list = []
    # Calculate where is the widest
    for path in paths:
        length_list.append(len(path))
    if max(length_list) < 4:
        return "left"
    # Calculate the direction of the widest 
    i = length_list.index(max(length_list))
    pos = radar_data.index(paths[i])
    pos += (len(paths[i]) - 1) / 2
    delta = len(radar_data) / 3
    
    if pos < delta:
        return "left"
    elif pos > 2 * delta:
        return "right"
    else:
        return "forward"

def main():
    global status
    # General
    while True:
        radar_data = car.radar_scan()
        # print("radar_data: %s" % radar_data)
        # If radar data return a int, means scan not finished, and the int is current angle status
        if isinstance(radar_data, int):
            if radar_data == 0 and status != "Danger":
                print("Danger!")
                status = "Danger"
                car.move("stop")
                car.set_radar_scan_angle(180)
            continue
        else:
            status = "Save"
        
        direction = get_dir(radar_data)

        if direction == "left":
            print("turn left")
            distance = car.get_radar_distance_at(-FORWARD_SCAN_ANGLE/2)
            time.sleep(0.5)
            car.move("left", MOTOR_TURNING_POWER)
            while True:
                distance = car.get_radar_distance_at(-FORWARD_SCAN_ANGLE/2)
                status = car.get_radar_status(distance)
                if status == 1:
                    break
            car.move("stop")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
        elif direction == "right":
            print("turn right")
            distance = car.get_radar_distance_at(FORWARD_SCAN_ANGLE/2)
            time.sleep(0.5)
            car.move("right", MOTOR_TURNING_POWER)
            while True:
                distance = car.get_radar_distance_at(FORWARD_SCAN_ANGLE/2)
                status = car.get_radar_status(distance)
                if status == 1:
                    break
            car.move("stop")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
        else:
            print("forward")
            car.set_radar_scan_angle(FORWARD_SCAN_ANGLE)
            car.move("forward", MOTOR_FORWARD_POWER)

try:
    main()
finally:
    car.move("stop")
    car.set_light_off()

مواردی که ممکن است به آن‌ها نیاز داشته باشید

منابع و مراجع

هنوز هیچ منبعی موجود نیست.

فایل‌ها📁

شِفر (کود) رزبری پای