처음에는 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 부터 해봤다
그리고 터틀봇과의 소켓 통신으로 터틀봇이 일정 초간 다 움직이면 DOBOT에게 소켓으로 알림을 보내고 -> DOBOT이 다 움직이면 터틀봇에게 또 소켓으로 알림을 주는 동작이다
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()