로봇팔

Dobot Magician + 터틀봇 제어

haniru 2026. 4. 13. 12:43

처음에는 DobotLab을 사이트에서 받아서 사용했지만 여러가지 기능을 붙이려다보니 한계가 있었다

(프로그램 다운로드: https://www.dobot-robots.com/service/download-center)

 

그래서 DOBOT DLL을 사용해서 기능을 구현했다

 

사용한 DOBOT DLL 파일:

https://github.com/SERLatBTH/StarterGuide-Dobot-Magician-with-Python/tree/master

 

GitHub - SERLatBTH/StarterGuide-Dobot-Magician-with-Python: Dobot Magician with pure Python - Starter Guide

Dobot Magician with pure Python - Starter Guide . Contribute to SERLatBTH/StarterGuide-Dobot-Magician-with-Python development by creating an account on GitHub.

github.com

 

파이썬은 32bit 버전을 사용해야 함:

32 bit → Note that Python 3.10.11 cannot be used on Windows 7 or earlier.

https://www.python.org/ftp/python/3.10.11/python-3.10.11.exe

 

 

일단 도봇 매지션에 있는 석션으로 간단한 Pick And Place 부터 해봤다

https://youtu.be/cBSbV4C7d6U

 

그리고 터틀봇과의 소켓 통신으로 터틀봇이 일정 초간 다 움직이면 DOBOT에게 소켓으로 알림을 보내고 -> DOBOT이 다 움직이면 터틀봇에게 또 소켓으로 알림을 주는 동작이다

 

https://youtu.be/Ut5felQxtw8

 

https://youtu.be/Ut5felQxtw8

 

 

DOBOT 이라는게 교육용으로 나와서 그런지 팔을 움직이면 좌표값을 따올 수 있어서 좋았다

import DobotDllType as dType
import time

# 1. 연결 설정
api = dType.load()
state = dType.ConnectDobot(api, "", 115200)[0]

if state == dType.DobotConnect.DobotConnect_NoError:
    saved_points = []
    print("🚀 티칭 모드를 시작합니다.")
    print("[방법] 1. Unlock 버튼을 누르고 팔을 이동")
    print("       2. 기록하고 싶은 지점에서 'Enter' 키 입력")
    print("       3. 종료하려면 'q' 입력 후 Enter")
    print("-" * 50)

    try:
        while True:
            # 현재 위치 실시간 출력
            pose = dType.GetPose(api)
            x, y, z = pose[0], pose[1], pose[2]
            print(f"\r📌 현재 위치 -> X: {x:7.2f}, Y: {y:7.2f}, Z: {z:7.2f} | 저장된 지점: {len(saved_points)}개", end="")

            # 사용자 입력 확인 (Enter를 치면 기록, q를 치면 종료)
            # input()은 루프를 잠시 멈추기 때문에 정확한 지점 확보에 더 좋습니다.
            cmd = input("\n[명령] Enter(기록) / q(종료): ").lower()

            if cmd == '':
                # 현재 좌표 저장
                saved_points.append([round(x, 2), round(y, 2), round(z, 2)])
                print(f"✅ 지점 저장 완료: {saved_points[-1]}")
            elif cmd == 'q':
                break

    except KeyboardInterrupt:
        pass

    # 종료 후 결과 출력
    print("\n" + "=" * 50)
    print("📂 기록된 좌표 리스트 (복사해서 main.py에 붙여넣으세요)")
    print("=" * 50)
    for i, pt in enumerate(saved_points):
        print(f"지점 {i + 1}: {pt}")
    print("=" * 50)

    dType.DisconnectDobot(api)
else:
    print("❌ 도봇 연결 실패!")

 

사용한 코드:

DOBOT - https://github.com/iru-han/dobot_ws.git

 

GitHub - iru-han/dobot_ws

Contribute to iru-han/dobot_ws development by creating an account on GitHub.

github.com

 

터틀봇(Remote PC랑 라즈베리파이 둘다 사용 가능) - 

import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
import socket
import time

# [설정] 노트북 정보
LAPTOP_IP = '192.168.0.33' 
PORT = 9999

class TurtlebotMissionNode(Node):
    def __init__(self):
        super().__init__('turtlebot_mission_node')
        # 네임스페이스 반영된 토픽 이름 (/r3/cmd_vel)
        self.publisher = self.create_publisher(Twist, '/cmd_vel', 10)
        time.sleep(1.0) # 퍼블리셔 안정화 대기
        self.run_mission()

    def move_turtlebot(self, speed, duration, label):
        """지정된 속도로 지정된 시간만큼 이동하는 함수"""
        print(f">> {label}: 속도 {speed}로 {duration}초간 이동 시작")
        msg = Twist()
        msg.linear.x = speed
        
        start_time = time.time()
        while rclpy.ok() and (time.time() - start_time < duration):
            self.publisher.publish(msg)
            time.sleep(0.1) # 10Hz 주기로 발행
            
        # 정지 명령
        self.publisher.publish(Twist())
        print(f">> {label}: 정지 완료.")

    def run_mission(self):
        # 1. 도봇 앞으로 이동 (몸통 2개 거리만큼 0.01 속도로)
        # 약 27.6초 동안 이동 (0.01m/s * 27.6s = 0.276m)
        self.move_turtlebot(speed=0.01, duration=27.6, label="도봇으로 접근 중")

        # 2. 소켓 통신 (신호 보내기)
        print(">> Arrived at Dobot. Sending signal to Laptop...")
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.settimeout(60) # 도봇 작업 시간을 고려하여 타임아웃 넉넉히 설정
            s.connect((LAPTOP_IP, PORT))
            
            # 도착 신호 전송
            s.send("ARRIVED".encode())
            print(">> Waiting for Dobot to load object...")
            
            # 도봇으로부터 작업 완료(OK) 신호를 대기
            response = s.recv(1024).decode()
            
            if response == "OK":
                print(">> [SIGNAL RECEIVED] Dobot task finished!")
                
                # 3. 추가 이동 (몸통 반개 거리만큼 0.01 속도로)
                # 약 6.9초 동안 이동 (0.01m/s * 6.9s = 0.069m)
                self.move_turtlebot(speed=0.01, duration=6.9, label="추가 목적지로 이동 중")
                print(">> [MISSION COMPLETE] Arrived at final destination.")
            
            s.close()
        except Exception as e:
            print(f">> [ERROR] Connection or Task failed: {e}")

def main():
    rclpy.init()
    node = TurtlebotMissionNode()
    # 미션 완료 후 노드 종료
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()