라즈베리파이에서 yolov5와 서보모터 구동

라즈베리파이에서 yolov5와 mg996r 서보모터를 연동하고 싶습니다 모터 드라이버는 pca9685를 사용하고 로버플로우를 통해서 플라스틱,캔,페트,종이 4가지를 이미지 학습을 진행했고 분류하는거까지 확인했고 서보모터코드도 따로 실행시켜서 동작하는거 확인했습니다 그런데 서보모터 동작하는 코드와 객체인식 코드를 합치니 객체 인식은 되는데 서보모터가 동작하질 않습니다

동작은 기초동아으이ㅣㅌ서보1번은 40도, 서보2,3번은 100도이고 pet를 3초동안 같은걸로 인식하면 1번 서보모터를 0도로 돌리고 2초뒤에 제자리 각도, 2초뒤에 서보2번 25도로 돌렸다가 2초뒤에 다시 제자리로 돌아오고, 플라스틱으로 인식하면 서보1번이 80도 2초뒤에 제자리각도 2초뒤에 서보2번 175도 2초뒤에 다시 제자리, paper로 인식하면 서보 1번은 0도 갔다가 2초뒤에 제자리 서보3번이 25도 다시제자리,Can으로 인식하면 서보 1번은 80도 갔다가 제자리와서 서보3번 175도 갔다가 다시 제자리로 돌아오기 입니다

  • 아래 답변은 Anthropic의 Claude-3 Opus 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! YOLOv5와 서보 모터를 라즈베리파이에서 연동하는 것에 어려움이 있으시군요. 객체 인식은 잘 되는데 서보 모터가 동작하지 않는 문제를 해결하는 것이 목표인 것 같습니다.

YOLOv5로 객체 인식을 하면서 동시에 서보 모터를 제어하려면 멀티 스레딩(multi-threading)을 활용하는 것이 좋습니다. 객체 인식 작업과 모터 제어를 별도의 스레드로 분리하면 각각의 작업이 독립적으로 실행되어 간섭을 최소화할 수 있습니다.

아래는 YOLOv5 객체 인식과 서보 모터 제어를 멀티 스레딩으로 구현한 예제 코드입니다:

import time
import threading
from adafruit_servokit import ServoKit

# 서보 모터 초기화
kit = ServoKit(channels=16)

# 서보 모터 각도 설정 함수
def set_servo_angle(servo_num, angle):
    kit.servo[servo_num].angle = angle

# 객체 인식 결과에 따른 서보 모터 제어 함수
def control_servo(obj_class):
    if obj_class == 'pet':
        set_servo_angle(0, 0)  # 서보 1번 0도
        time.sleep(2)
        set_servo_angle(0, 40)  # 서보 1번 제자리
        time.sleep(2)
        set_servo_angle(1, 25)  # 서보 2번 25도
        time.sleep(2)
        set_servo_angle(1, 100)  # 서보 2번 제자리
    elif obj_class == 'plastic':
        set_servo_angle(0, 80)  # 서보 1번 80도
        time.sleep(2)
        set_servo_angle(0, 40)  # 서보 1번 제자리
        time.sleep(2)
        set_servo_angle(1, 175)  # 서보 2번 175도
        time.sleep(2)
        set_servo_angle(1, 100)  # 서보 2번 제자리
    elif obj_class == 'paper':
        set_servo_angle(0, 0)  # 서보 1번 0도
        time.sleep(2) 
        set_servo_angle(0, 40)  # 서보 1번 제자리
        set_servo_angle(2, 25)  # 서보 3번 25도
        time.sleep(2)
        set_servo_angle(2, 100)  # 서보 3번 제자리
    elif obj_class == 'can':
        set_servo_angle(0, 80)  # 서보 1번 80도
        time.sleep(2)
        set_servo_angle(0, 40)  # 서보 1번 제자리
        set_servo_angle(2, 175)  # 서보 3번 175도
        time.sleep(2) 
        set_servo_angle(2, 100)  # 서보 3번 제자리

# YOLOv5 객체 인식 함수 (생략)
def yolov5_detect():
    # YOLOv5 객체 인식 코드 작성
    # 객체가 3초 이상 인식되면 obj_class 변수에 클래스명 저장
    pass

# 메인 함수
def main():
    # 서보 모터 초기 각도 설정
    set_servo_angle(0, 40)
    set_servo_angle(1, 100)  
    set_servo_angle(2, 100)

    # 객체 인식과 서보 모터 제어를 위한 스레드 생성
    detect_thread = threading.Thread(target=yolov5_detect)
    detect_thread.start()

    while True:
        # 객체 인식 결과 확인
        if obj_class is not None:
            # 서보 모터 제어를 위한 스레드 생성
            servo_thread = threading.Thread(target=control_servo, args=(obj_class,))
            servo_thread.start()
            obj_class = None
        time.sleep(0.1)

if __name__ == '__main__':
    main()

위 코드에서는 yolov5_detect 함수에서 객체 인식을 수행하고, 인식된 객체에 따라 obj_class 변수에 클래스명을 저장합니다. 메인 함수에서는 객체 인식과 서보 모터 제어를 위한 스레드를 생성하고, 인식된 객체에 따라 control_servo 함수를 호출하여 서보 모터를 제어합니다.

멀티 스레딩을 활용하면 객체 인식과 서보 모터 제어가 독립적으로 실행되므로 간섭 없이 동작할 수 있습니다. 다만 라즈베리파이의 성능에 따라 처리 속도에 영향을 받을 수 있으니 주의가 필요합니다.

더 자세한 내용은 아래 링크를 참고하시면 도움이 될 것 같습니다:

제가 제안한 방법이 문제 해결에 도움이 되길 바랍니다. 만약 추가적인 정보가 필요하거나 코드에 오류가 있다면 알려주시기 바랍니다. 저의 답변이 부족하거나 잘못된 점이 있을 수 있으니 참고용으로만 활용해 주시길 부탁드립니다. 감사합니다!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 Google의 Gemini Pro 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

anony님, 해당 질문에 대해 도움을 드릴게요. 요청하신 내용을 요약하겠습니다. 라즈베리파이에서 YOLOv5 객체 탐지 모델과 서보모터를 통합하려고 하는 것으로 이해합니다. 특히, 서보모터가 특정 객체를 감지한 후 특정 방향으로 회전되도록 하고 싶은 것 같군요.

이 문제를 해결하려면 다음과 같은 단계를 따르는 것을 제안합니다.

  1. 객체 탐지 모델 로드: 먼저 라즈베리파이에 YOLOv5 모델을 로드해야 합니다. 이를 위해서는 PyTorch Hub를 사용할 수 있으며, 다음 명령어를 실행하면 됩니다.

    import torch
    model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
    
  2. 서보모터 제어 초기화: 다음으로, PCA9685 서보모터 드라이버를 초기화하여 서보모터를 제어해야 합니다. 이 작업은 Adafruit PCA9685 Python 라이브러리를 사용하여 수행할 수 있습니다.

    import adafruit_pca9685
    pca = adafruit_pca9685.PCA9685()
    pca.frequency = 60
    
  3. 주요 루프: 이제, 라즈베리파이 카메라에서 프레임을 캡처하고 YOLOv5 모델을 사용하여 객체를 감지할 수 있는 주요 루프를 작성해야 합니다. 감지된 객체가 지정된 클래스(플라스틱, 캔, 종이, PET)에 속하는 경우 다음과 같이 서보모터를 제어하는 코드를 추가할 수 있습니다.

    # 서보모터 제어 코드
    if detected_class == "plastic":
        pca.set_pwm(0, 0, int(4095 * 0.1))  # 서보모터 1번을 0도로 회전
        time.sleep(2)
        pca.set_pwm(0, 0, int(4095 * 0.5))  # 서보모터 1번을 제자리 각도로 회전
        time.sleep(2)
        pca.set_pwm(1, 0, int(4095 * 0.25))  # 서보모터 2번을 25도로 회전
        time.sleep(2)
        pca.set_pwm(1, 0, int(4095 * 0.5))  # 서보모터 2번을 제자리 각도로 회전
    elif detected_class == "can":
        pca.set_pwm(0, 0, int(4095 * 0.1))  # 서보모터 1번을 0도로 회전
        time.sleep(2)
        pca.set_pwm(0, 0, int(4095 * 0.5))  # 서보모터 1번을 제자리 각도로 회전
        time.sleep(2)
        pca.set_pwm(2, 0, int(4095 * 0.75))  # 서보모터 3번을 175도로 회전
        time.sleep(2)
        pca.set_pwm(2, 0, int(4095 * 0.5))  # 서보모터 3번을 제자리 각도로 회전
    # 나머지 클래스에 대한 코드 추가
    
  4. 정리: 모든 객체 클래스에 대해 서보모터 제어 코드를 구현하고 나면 라즈베리파이에서 YOLOv5 모델과 서보모터를 통합한 솔루션이 완성됩니다.

자세한 내용은 다음 PyTorch 문서를 참조하세요.

이 답변이 도움이 되었기를 바랍니다. 제 답변이 부정확하거나 완전하지 않다면 알려주세요.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4o 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! 라즈베리파이에서 YOLOv5와 서보모터를 연동하려고 하시는군요. 문제를 잘 이해했습니다. YOLOv5를 이용해 객체를 인식하고, 그 결과에 따라 서보모터를 제어하려고 하는데, 두 코드를 합쳤을 때 서보모터가 동작하지 않는 문제가 발생하고 있군요.

이 문제를 해결하기 위해서는 YOLOv5의 객체 인식 코드와 서보모터 제어 코드를 잘 통합해야 합니다. 아래는 이를 위한 예제 코드입니다. 이 코드는 YOLOv5로 객체를 인식하고, 인식된 객체에 따라 서보모터를 제어하는 과정을 포함합니다.

import torch
import time
from adafruit_servokit import ServoKit

# YOLOv5 모델 로드
model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt')  # 학습된 모델 경로

# PCA9685 서보모터 설정
kit = ServoKit(channels=16)

# 서보모터 초기화
def initialize_servos():
    kit.servo[0].angle = 40
    kit.servo[1].angle = 100
    kit.servo[2].angle = 100

# 서보모터 제어 함수
def control_servo(label):
    if label == 'pet':
        kit.servo[0].angle = 0
        time.sleep(2)
        kit.servo[0].angle = 40
        time.sleep(2)
        kit.servo[1].angle = 25
        time.sleep(2)
        kit.servo[1].angle = 100
    elif label == 'plastic':
        kit.servo[0].angle = 80
        time.sleep(2)
        kit.servo[0].angle = 40
        time.sleep(2)
        kit.servo[1].angle = 175
        time.sleep(2)
        kit.servo[1].angle = 100
    elif label == 'paper':
        kit.servo[0].angle = 0
        time.sleep(2)
        kit.servo[0].angle = 40
        time.sleep(2)
        kit.servo[2].angle = 25
        time.sleep(2)
        kit.servo[2].angle = 100
    elif label == 'can':
        kit.servo[0].angle = 80
        time.sleep(2)
        kit.servo[0].angle = 40
        time.sleep(2)
        kit.servo[2].angle = 175
        time.sleep(2)
        kit.servo[2].angle = 100

# 객체 인식 및 서보모터 제어 루프
def main():
    initialize_servos()
    cap = cv2.VideoCapture(0)  # 카메라 캡처 시작

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break

        results = model(frame)
        labels = results.xyxyn[0][:, -1].numpy()
        names = results.names

        for label in labels:
            label_name = names[int(label)]
            control_servo(label_name)
            time.sleep(3)  # 3초 동안 같은 객체 인식

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

이 코드는 YOLOv5 모델을 사용하여 객체를 인식하고, 인식된 객체에 따라 서보모터를 제어합니다. 각 객체에 대해 서보모터의 각도를 조정하고, 일정 시간 후에 원래 위치로 되돌리는 로직이 포함되어 있습니다.

더 자세한 내용은 PyTorch 공식 튜토리얼을 참고하시면 도움이 될 것입니다:

혹시 더 궁금한 점이 있거나 추가적인 도움이 필요하시면 언제든지 질문해 주세요. 제 답변이 틀릴 수도 있으니, 다른 자료도 참고하시길 권장드립니다. 좋은 하루 되세요!


  • 이 답변이 도움이 되셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4-Turbo 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! 라즈베리파이에서 YOLOv5와 MG996R 서보모터를 PCA9685 모터 드라이버를 통해 연동하는 과정에서 발생한 문제에 대해 질문해주셨군요. 객체 인식까지는 성공했으나, 서보모터가 동작하지 않는 문제를 겪고 계신 것으로 이해했습니다. 또한, 특정 객체를 인식했을 때 서보모터의 동작을 다르게 설정하고 싶어 하시는 것 같습니다.

이 문제를 해결하기 위해 몇 가지 접근 방법을 제안드리겠습니다. 먼저, YOLOv5 객체 인식 결과에 따라 서보모터를 제어하는 로직을 구현하는 방법에 대해 설명하겠습니다. 이를 위해 Python 코드를 사용하여 PCA9685 모터 드라이버를 제어하는 예제 코드를 제공하겠습니다.

서보모터 제어 예제 코드

먼저, PCA9685 모터 드라이버를 제어하기 위한 라이브러리를 설치해야 합니다. Adafruit의 PCA9685 라이브러리를 사용할 수 있습니다. 라즈베리파이에서 다음 명령어를 통해 설치할 수 있습니다.

pip install adafruit-circuitpython-servo

다음은 PCA9685를 사용하여 서보모터를 제어하는 기본적인 예제 코드입니다.

import time
from adafruit_servokit import ServoKit

# PCA9685 모듈 설정 (16채널 서보 드라이버)
kit = ServoKit(channels=16)

# 서보모터 번호와 각도를 설정하는 함수
def set_servo_angle(servo_number, angle):
    kit.servo[servo_number].angle = angle
    time.sleep(0.5)  # 서보모터가 움직이는 동안 대기

# 예제: 서보모터 0번을 90도로 설정
set_servo_angle(0, 90)

이제 YOLOv5 객체 인식 결과에 따라 서보모터를 제어하는 로직을 구현해야 합니다. 객체 인식 결과를 받아 해당 객체에 따라 set_servo_angle 함수를 호출하여 서보모터를 원하는 각도로 조정하는 코드를 추가하면 됩니다. 예를 들어, 'pet' 객체를 인식했을 때 서보모터 1번을 0도로 돌리는 코드는 다음과 같이 작성할 수 있습니다.

# 객체 인식 결과에 따른 서보모터 제어 로직
object_detected = 'pet'  # YOLOv5로부터 받은 객체 인식 결과

if object_detected == 'pet':
    set_servo_angle(1, 0)  # 서보모터 1번을 0도로 설정
    time.sleep(2)  # 2초 대기
    set_servo_angle(1, 40)  # 서보모터 1번을 원래 각도로 복귀

이 코드는 단순화된 예시이므로, 실제 YOLOv5 객체 인식 결과를 처리하는 부분과 연동하여 조건문 내에 적절히 배치해야 합니다.

추가적으로, PyTorch와 관련된 더 자세한 정보나 튜토리얼을 원하신다면 PyTorch 공식 튜토리얼 페이지를 참고하시기 바랍니다.

제가 제공한 해결 방안이 정확하지 않을 수도 있으니, 문제가 계속되면 추가적인 정보를 제공해주시면 더 구체적으로 도와드릴 수 있을 것 같습니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!