안녕하세요. 충남대학교 컴퓨터공학과에 재학중인 김진섭입니다.
이번 포스팅에서는 uArm swift pro를 파이썬을 활용하여 제어하는 예제를 수행해 보도록 하려 합니다.
우선, 파이썬을 통해 제어에 대해 알아보기에 앞서, Gcode를 반드시 숙지해 주셔야한다는 점을 다시한번 강조드리는 차원에서 uArm Swift pro의 Gcode 예제를 살펴보며 시작할까 합니다.
uArm Swift Pro Gcode 예제
M2400 S0 G1 X200 Y0 Z130 F1000 G1 X200 Y0 Z30 F1000 M2231 V1 X200 Y0 Z130 F100 X150 Y-150 Z130 F1000 X150 Y-150 Z30 F1000 M2231 V0 X150 Y-150 Z130 F1000 X150 Y-150 Z30 F1000 M2231 V1 X150 Y-150 Z130 F1000 X200 Y0 Z130 F1000 X200 Y0 Z30 F1000 M2231 V0
위 코드는 정 사각형 물체를 들어서 다른 위치로 옮기는 Gcode의 예제입니다.
-> move 명령어 : G1 Xa Yb Zc Fk // (a,b,c)위치로 이동
-> Suction Cup 사용 명령어 : M2231 V(0 or 1) // 사용 여부에 따라 0 or 1
혹시나 위 Gcode를 보고 아직 이해가 되지 않으시다면, 이전에 포스팅하여 둔 영상을 확인해 주시길 바랍니다.
이제 uArm을 파이썬으로 제어하는 방법을 익혀보려합니다. 우선 uArm을 제어하기 위하여 Python SDK를 다운로드 받아야합니다.
Python-SDK Download
https://github.com/uArm-Developer/uArm-Python-SDK
위 링크를 클릭하여 Python-SDK를 다운로드 받을 수 있도록 합니다.
링크를 클릭하여 들어가면 보이는 화면으로 이동하게 되며 clone or download를 클릭하여 다운로드를 수행하도록 합니다.
(위 SDK는 uArm Swift Pro와 uArm Swift를 위한 SDK입니다.)
Gitbuh의 README파일에 SDK에 대한 많은 정보가 있으므로, 한번 읽어보시길 권장합니다. (특히 Caution 사항은 유의깊게 읽어보실 필요가 있습니다.)
uArmSwiftPro Python 제어 예제
파이썬SDK의 예제를 본격적으로 수행해보기에 앞서 저의 개발 환경에 대하여 간단하게 소개해 드리겠습니다.
위에서 보시는 것 처럼, 저는 Python 3.7.2 버전을 사용합니다.
또한 IDE는 파이참을 사용합니다.
파이썬 다운로드 - https://www.python.org/downloads
파이참 다운로드 - https://www.jetbrains.com/pycharm/download/#section=windows
만약, 파이썬이 없거나, IDE가 없으시면 위 링크를 이용하여 다운로드 받아주시길 바랍니다.(되도록 버전및 개발환경을 맞추길 권장합니다.)
이제 본격적으로 uArmSwiftPro를 파이썬을 활용하여 제어하는 예제를 수행하도록 하겠습니다.
우선, github에서 다운로드 받은 SDK파일을 열어줍니다.
파이참의 좌측 상단에 File을 선택한 후 Open을 클릭합니다.
그렇게 되면 위처럼 'Open File or Project'가 실행되고, 이전에 GitHub에서 다운로드 받은 SDK를 열어줍니다.
위 사진은, 열린 프로젝트에 대한 정보를 보여줍니다.
이번 포스팅에서 사용할 예제는 examples/api/single의 test_cmd와 test_move입니다.
그리고 추가적으로 test_cmd 파일을 확장하여 우리가 위에서 다루었던 Gcode 예제를 파이썬을 통해 제어하는 코드를 작성해 보도록 하겠습니다.
*소프트 웨어 라이선스 : BSD 라이선스
(BSD라이선스는 아무나 개작이 가능하며 수정한 것을 제한 없이 배포가 가능한 라이선스입니다.)
예제1.test_move.py
test_move.py 코드 분석
from uarm.wrapper import SwiftAPI #API import
- uArm의 API를 사용하기 위해 import를 수행하는 코드입니다.
swift = SwiftAPI(filters={'hwid': 'USB VID:PID=2341:0042'}) # swift 변수 생성 swift.waiting_ready(timeout=3) device_info = swift.get_device_info() # 연결된 uArm 정보 print(device_info) #정보 Console에 출력
- swift라는 변수를 생성하여, uArm을 제어하기 위한 API를 넣어줍니다.
- 연결되어있는 uArm에 대한 정보를 출력하여줍니다.
firmware_version = device_info['firmware_version'] #firmware version 정보 if firmware_version and not firmware_version.startswith(('0.', '1.', '2.', '3.')): swift.set_speed_factor(0.0005)
- firmware의 version 정보를 가져와 speed_factor를 조절하여줍니다.
- 해당 사항은 위 github의 Caution 사항을 지키기 위함을 알 수 있습니다.(GithHub 참조)
swift.set_mode(0) swift.reset(wait=True, speed=10000) swift.set_position(x=200, speed=10000) swift.set_position(y=100) swift.set_position(z=100) swift.flush_cmd(wait_stop=True) swift.set_polar(stretch=200, speed=10000) swift.set_polar(rotation=90) swift.set_polar(height=150) print(swift.set_polar(stretch=200, rotation=90, height=150, wait=True)) #동작 완료 후 'ok' swift.flush_cmd() time.sleep(60) #60초간 대기 swift.disconnect() #종료
- swift의 동작을 제어하는 코드
- set_position과 set_polar를 활용해 동작 제어가 가능하다.
실행 결과 uArm의 동작과정
예제2. test_cmd.py
test_cmd.py 코드 분석
from uarm.wrapper import SwiftAPI swift = SwiftAPI(filters={'hwid': 'USB VID:PID=2341:0042'}) swift.waiting_ready() device_info = swift.get_device_info() print(device_info) firmware_version = device_info['firmware_version'] if firmware_version and not firmware_version.startswith(('0.', '1.', '2.', '3.')): swift.set_speed_factor(0.00005)
- 이전 예제와 동일한 작업 처리 과정입니다.
- API를 사용하기 위해 import 받고, swift 변수에 API를 넣어줍니다.
- 해당 device의 정보를 콘솔창에 보여주고, 버전에 따라서 속도를 변경하여줍니다.(Caution 처리)
swift.send_cmd_sync('G0 X200 Y0 Z100 F5000') swift.send_cmd_async('M2210 F1000 T2000') swift.send_cmd_async('M2231 V1') print(swift.send_cmd_sync('M106', no_cnt=True)) time.sleep(2) swift.send_cmd_async('M2231 V0') print('pos:', swift.send_cmd_sync('P2220'))
- 위 코드는 move한 뒤 Suction Cup을 사용하는 예제입니다.
- cmd를 이용하여 전달하는 방식은 sysnc와 async가 있습니다.
- async는 비 동기적인 수행을 sync는 동기적 수행을 의미합니다.
- 동기적 수행을 하는 경우는 현 동작이 완료되지 않은 상태에서 다른 동작의 명령이 들어와도, 지금 동작을 완료할 때까지 들어온 동작에 대한 처리를 하지 않습니다. 그 예로는 move가 있습니다.(Mutual Exclution)
- 비 동기적 수행은 Suction Cup과 End-effector의 동작 제어와 같은 처리를 할 때 사용합니다.
- cmd는 G 코드를 사용하여 처리합니다.
실행 결과 uArm의 동작과정
직접 Python 코드를 작성하여 제어하기
이번에는 직접 Python 코드를 작성해 uArm을 제어하는 과정을 진행하려고 합니다.
uArm의 동작은 위에서 보여드린 예시 Gcode를 파이썬으로 처리하는 것을 보여드리도록 하겠습니다.
프로젝트 생성
해당 디렉토리 single에 마우스를 가져다 두고 오른쪽 버튼을 클릭한 뒤, New/Python File을 클릭하여 파이썬 파일을 생성합니다.
저는 파일 명을 make.py로 하였습니다.
코드 생성
from uarm.wrapper import SwiftAPI
- API를 사용하기 위하여 import를 수행합니다.
swift = SwiftAPI(filters={'hwid': 'USB VID:PID=2341:0042'}) swift.waiting_ready() device_info = swift.get_device_info() print(device_info) firmware_version = device_info['firmware_version'] if firmware_version and not firmware_version.startswith(('0.', '1.', '2.', '3.')): swift.set_speed_factor(0.00005)
- API를 사용하기 위해 swift 변수를 생성합니다.
- device 정보(현재 연결된 uArm의 정보)를 받아옵니다.
- Caution의 사항을 맞춰주기 위하여, speed를 설정합니다.
swift.send_cmd_async('M2400 S0') swift.send_cmd_sync('G1 X200 Y0 Z130 F10000') swift.send_cmd_sync('G1 X200 Y0 Z30 F10000') swift.send_cmd_async('M2231 V1') swift.send_cmd_sync('G1 X200 Y0 Z130 F10000') swift.send_cmd_sync('G1 X150 Y-150 Z130 F10000') swift.send_cmd_sync('G1 X150 Y-150 Z30 F10000') swift.send_cmd_async('M2231 V0') swift.send_cmd_sync('G1 X150 Y-150 Z130 F10000') swift.send_cmd_sync('G1 X150 Y-150 Z30 F10000') swift.send_cmd_async('M2231 V1') swift.send_cmd_sync('G1 X150 Y-150 Z130 F10000') swift.send_cmd_sync('G1 X200 Y0 Z130 F10000') swift.send_cmd_sync('G1 X200 Y0 Z30 F10000') swift.send_cmd_async('M2231 V0') swift.flush_cmd() swift.disconnect()
Gcode가 동기적인 명령이면 sync로 비 동기적인 명령이면(Suction의 사용) async로 수행하여 줍니다.
실행 결과
이번 포스팅을 통해서 파이썬을 활용하여 uArm을 제어하는 예제 코드를 분석하고 직접 동작시켜 보았습니다.
추가적으로 파이썬 코드를 직접 짜서 구동도 시켜보았습니다.
모두 만족스러운 결과를 내었습니다.
이상으로 포스팅을 마치도록 하겠습니다.
감사합니다.
'Etc > odds and ends' 카테고리의 다른 글
uArm 예제를 응용해 바둑돌 두는 동작 구현 (2) | 2019.01.10 |
---|---|
OpenMV가 바둑돌을 찾아내도록 코드를 구현해봅시다. (0) | 2019.01.04 |
uArmSwiftPro Open MV사용해보기 (2) | 2019.01.02 |
uArm을 아두이노 제어 (0) | 2018.12.27 |
uArm 소개 & uArm Studio 사용법 (1) | 2018.12.24 |