indy7 step 프로그래밍 문의



  • 사용 문의 드립니다.

    indy를 이용하여 거리 센서 데이터 수집과 함께, indy의 현 pos값을 받으며, 제어를 하려고 합니다.

    기존에는 ethernet을 통해 접근하는 방식으로 python에서 현재 pos값을 수신받고 명령을 보내는 식으로 진행 하였으나,

    통신 속도가 느린 문제로 데이터가 누락 되는 경우가 발생하였습니다. 그리하여 step을 이용하여 빠른 속도로 데이터 통신을 하려고합니다.

    step에서 할 수 있는 방법을 알려주시기 바랍니다.

    아래와 같이 프로그램을 구성할 예정입니다.

    --------------------------------------------------------------------------------------------------------------------------------------------

    참고사항으로

    task_move_to -> (이동 중 현재 pos 및 센서값 수집, 수집된 데이터를 바탕으로 다음 모션 결정) -> task_move_to

    -> (이동중 데이터 수집, 다음모션 결정)-> (반복) -> 종료

    데이터는 이동 중에 종료시까지 ( x, y, z, u, v, w, distance) 7가지의 데이터를 텍스트 파일로 저장할 예정입니다

    -------------------------------------------------------------------------------------------------------------------------------------------

    감사합니다.



  • @기건희 안녕하세요 뉴로메카 허영진 입니다

    딜레이 없이 데이터 통신을 수행하고 싶으신 경우 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()

    감사합니다