Y
@기건희 안녕하세요 뉴로메카 허영진 입니다
딜레이 없이 데이터 통신을 수행하고 싶으신 경우 STEP 내에 공유메모리에 접근하는 방법이 있습니다. 아래 예제코드를 다운받아 주세요.https://s3.ap-northeast-2.amazonaws.com/download.neuromeka.com/Examples/indy_shm_test.zip
우선 첨부된 예제파일을 STEP 내부 경로로 이동시킨 후 (WinSCP 이용), SSH 터미널을 이용하여 실행해주시기 바랍니다 (Putty 이용).
indy_shm_test.py 코드 내부를 보시면,
아래 코드를 통해 공유메모리에 접근하여 딜레이없이 task pose, I/O 데이터 등을 받을 수 있는 indy_master 객체를 생성할 수 있습니다.
from indy_utils.indy_shm import *
indy_master = IndyShmCommand()
그리고 아래 코드는 Python IndyDCP client 를 로컬호스트에서 사용하기 위한 indy 객체 생성 입니다
from indy_utils import indydcp_client as client
indy = client.IndyDCPClient("localhost", "NRMK-Indy7")
indy.connect()
indy_shm_example.py 는 하나의 스레드 생성 후 100ms 주기로 joint pos, task pos, I/O 데이터를 받고 (indy_master 이용), digital input 값에 따라 로봇을 홈 위치 또는 제로 위치 (indy 이용)로 이동 시키는 예제입니다
time.sleep(0.1)을 0.001로 수정하시면 1ms 주기로 해당 명령을 실행합니다
아래는 indy_master를 통해 관절 각도, 작업공간 위치, I/O 보드로부터의 AIO, DIO 값을 받아오는 예시입니다.
j_pos = indy_master.get_joint_pos()
t_pos = indy_master.get_task_pos()
ai = indy_master.get_ai()
ao = indy_master.get_ao()
di = indy_master.get_di()
do = indy_master.get_do()
아래는 indydcp를 통해 로봇에게 이동 명령을 수행하는 부분입니다 (digital input 1번, 2번, 3번 각각이 켜졌을 때)
indy.joint_move_to(q), indy.task_move_to(p) 등도 사용하실 수 있습니다 (http://docs.neuromeka.com/2.3.0/kr/Python/section1/)
if do[0] == 1:
indy.stop_motion()
elif do[1] == 1:
if not indy.is_busy():
indy.go_home()
elif do[2] == 1:
if not indy.is_busy():
indy.go_zero()
감사합니다